cardformプラグイン

CardForm用のformを挿入します。

このプラグインについて

引数として指定したページformpageの内容に従いフォームを出力します。 このフォームにより入力された値は引数として渡したbasenameを元に、 bugtrackプラグインの様にbasename/数字というページに保存されます。 ただし、savepageが指定されていればsavepageに保存されます。

  • 第1引数にformpageを指定します。
  • 第2引数にbasenameを指定します。
  • 第3引数にsavepageが指定できます。
  • basenameが省略された場合はformpageが使われます。
{{cardform formpage,basename,savepage}}

formpageではformtext、formsubmit等のプラグインを使って 実際のフォーム要素を配置します。 formstart,formendなどはcardformプラグインにより追加されるため、 これらのプラグインは置かないでください。

このフォームを使って送られたデータはbasename/数字というページに 保存されます。 ただし、CGIパラメータpageがある場合はその値が保存ページ名となります。 savepageがあればこの値をCGIパラメータpageに設定し、保存ページ名とします。

savepageを指定した場合、すでにそのページがあればその内容をフォームの 初期値とします。savepageがない、または指定されていない場合、basename/0と いうページがあればそのページ内容を初期値とします。

このフォームにより作られるページはbasename、もしくはformpageの内容を 元に作られます。 新しく作られるページは元のページの、%パラメータ名%またはパラメータ名に 対応するフォームプラグインをパラメータ値で置換した内容となります。 また、basenameというページがなければ::と:::を使ってCGIパラメータをすべて 保存します。

CGIパラメータは、ユーザが使う任意のパラメータのほか、幾つかの機能をもつ パラメータが存在します。以下にそれを説明します。

action
cardformプラグインのアクションハンドラを呼び出すために"CARDFORM" である必要があります。本プラグインにより自動的に付けられます。
basename
アクションハンドラに保存に使用すべきbasenameを通知するために必要 です。本プラグインにより自動的に付けられます。
page
このパラメータは通常アクションハンドラに渡す必要がありません。 アクションハンドラにこのパラメータが渡されていない場合、 アクションハンドラはbasenameより保存すべきページ名を求め、 このパラメータに設定します。 このパラメータがすでに設定されていた場合はそのままそのページ名が 使われます。(すでに存在していれば上書きされます)
time
このパラメータは通常アクションハンドラに渡す必要がありません。 アクションハンドラにこのパラメータが渡されていない場合、 アクションハンドラは現在日時をこのパラメータに設定します。 これにより保存ページに保存日時を残す事ができます。
debug
このパラメータは通常アクションハンドラに渡す必要がありません。 アクションハンドラにこのパラメータが渡された場合、 アクションハンドラはデバッグモードで動作します。 アクションハンドラは通常のように動作し、保存すべき内容を 生成し、クライアントに送信しますが、実際には保存しません。 保存される値やページ内容を確認するために使用できます。 なお、パラメータ値は評価されません。

CardFormプラグイン全般について

内容

FreeStyle Wikiでカード型データベースを実現するプラグイン群です。

入力
プラグインにより(wiki書式の範囲で)自由なレイアウトのフォームを 作ることができます。
保存
フォームにより入力されたデータは雛型となるページを元に1件毎に、 バグトラックのようなbasename/数字というページとして保存されます。
利用
basename/数字形式のページ群をカード型データベースとみなして表を 作ったり合計したりできます。

使用方法1:簡単な例

まず、データ入力用のフォームが必要です。

form*プラグインによるフォームの記述

フォームの記述はformで始まるフォーム記述用のプラグインによって行ないます。

*名前: {{formtext name}}
*年代: {{formselect age,10代,20代,30代,40代,50代}}
*好きな物: {{formtext favor,size=30}}
{{formsubmit 投票}}{{formreset リセット}}

これをFavoriteというページに保存します。 え?フォームが表示されない?それで正常です。慌てずに。

cardformプラグインによるフォームの表示

次にフォームを表示したい所に以下のように書きます。

{{cardform Favorite}}

これで、フォームを表示するためのプラグインcardformにより、 先ほどのフォームを記述したページをインクルードしフォームとして表示します。

データの入力

先ほどのフォームに値を記入して投票ボタンを押してください。 そうするとFavorite/1というページができ、 先ほど入力した値が保存されていると思います。

使用方法2:保存用レイアウトを別にする

先ほどの様に入力用フォームを配置したページを作ります。

入力用フォーム配置ページ

以下のような内容をBugTrackFormというページに保存します。

,,
,投稿者,{{formtext user}}
,サマリ,"{{formtext subject,size=60}}"
,カテゴリ,"{{formselect category,本体,プラグイン,ドキュメント}}"
,優先度,"{{formselect rate,緊急,重要,普通,低}}"
,状態,"{{formselect stat,提案,着手,完了,リリース済,保留,却下}}"
,内容,"{{formtextarea msg,rows=10,cols=60}}"
{{formsubmit 投票}}{{formreset リセット}}

入力データレイアウトページ

次に、入力データを保存するページをレイアウトします。

!!!%subject%
*投稿者: %user%
*カテゴリ: %category%
*優先度: %rate%
*状態: %stat%
*日時: %time%
{{bugstate}}
!!内容
%msg%
!!コメント
{{comment}}

これをBugTrack-testとして保存します。

フォームの使用

それではフォームを使用してみましょう。

{{cardform BugTrackForm,BugTrack-test}}

使用方法3:入力データを利用する

入力されたデータの利用方法です。

入力データの一覧表示

利用方法1のフォームから入力した値を一覧表示するには次のように書きます。

{{cardlist Favorite,名前:*名前: ,年代:*年代: ,好きな物:*好きな物: ,}}

20代のデータのみ、名前順に表示したい場合は次のように書きます。

{{cardlist Favorite,*年代: ==20代,%sortby_alphabet%:*名前: ,名前:*名前: ,年代:*年代: ,好きな物:*好きな物: ,}}

わかりにくいですね。実はこの方法は推奨できません。 入力データを扱う場合は利用方法2の保存レイアウトを別にする方法を用いた方が わかりやすくなります。 利用方法2の場合、次のようになります。

{{cardlist BugTrack-test,%sortby_alphabet%:stat,ページ:%cardform_pagename%,カテゴリ:category,優先度:rate,状態:stat,投稿者:user,サマリ:subject}}

最初の「BugTrack-test」はBugTrack-test/数字ページが対象で、 そのフォーマットはページBugTrack-testが元になっている事を示しています。

次の「%sortby_alphabet%:stat」はstatをアルファベット順 (正確には文字コード順)にソートするという事です。

次の「ページ:%cardform_pagename%」からは実際の表示内容です。 この時、%cardform_pagename%はページ名を表します。

入力件数の表示

利用方法1で「20代の件数/全体の件数」という表示をしてみましょう。

{{cardcount Favorite,*年代: ==20代}}/{{cardcount Favorite}}

利用方法2の場合、次のようになります。

現在全{{cardcount BugTrack-test}}件中
{{cardcount BugTrack-test,stat提案}}件が提案状態で、
そのうち優先度が緊急は{{cardcount BugTrack-test,stat提案,rate==緊急}}件、
重要は{{cardcount BugTrack-test,stat提案,rate==重要}}件、
普通は{{cardcount BugTrack-test,stat提案,rate==普通}}件、
低は{{cardcount BugTrack-test,stat提案,rate==低}}件です。

サンプル

http://typer.sakura.ne.jp/wiki/wiki.cgi/cardform?page=FrontPage にて、ここに上げた例を書いています。 おいおい、他の例なども書く予定です。

ライセンス

GPLとします。

更新履歴

var.3からvar.4alpha1までの主な変更点

  • cardlist,cardcount,cardsum各プラグインで対象データの条件指定をできる ようにした。
  • cardlistプラグインでソート指定できるようにした。
  • mod_perl時キャッシュ内容が残り、更新されないバグを修正した。
  • その他幾つかバグフィックスしたけど省略

var.4alpha1からvar.4alpha2までの主な変更点

  • 初期値取得機能の追加
    • cardformのヘルプに初期値取得に関する説明を追加
    • cardformに初期値取得先の判定と登録を行なう部分を追加
    • ラベル値取得正規表現キャッシュを保存するハッシュ変数のキーを変更
    • CardFuncBaseに初期値取得用情報を保存するハッシュ変数を追加
    • CardFuncBase::do_page_cacheの引数numに"init"を渡すと登録した 初期値取得先から値をキャッシュするように変更
    • CardFuncBaseにset_initpage,is_set_initpage,unset_initpage, get_initdataを追加
    • FormFuncBaseがCardFuncBaseを継承
    • 前のパラメータを優先するようにFormFuncBase::get_paramを変更
    • form*プラグインに初期値取得と設定を行なう部分を追加
  • 複数行も取得できるようラベル値取得正規表現を変更
    • 正規表現マッチにsオプション追加
    • 必ず値取得部分の前後に文字を入れる
  • cardlistにセルの最大文字数指定機能を追加
  • 幾つかインデントを修正
  • cardformプラグインのヘルプにあった誤記2件を修正

var.4alpha2からvar.4alpha3までの主な変更点

  • サンプル設置サイトのアドレス変更
  • cardlistのセル内最大文字数指定機能において末尾の文字列処理厳格化と 3バイト文字への対応
  • 値取得時の生成正規表現をすこし改良

var.4alpha3からvar.4alpha4までの主な変更点

  • 日付入力フォームの設置・処理をやりやすくするformdatepickerプラグイン の追加
  • formselectプラグインで初期値(selected)が設定できなかったバグの修正

var.4alpha4からvar.4alpha5までの主な変更点

  • 修正フォーム時にもformdatepickerプラグインの初期値が現在日時とないって いたバグの修正

var.4alpha5からvar.4alpha6までの主な変更点

  • 修正フォーム時にformdatepickerプラグインの初期値取得がうまくいって いなかったバグの修正

var.4alpha6からvar.4beta1までの主な変更点

  • 今更ですがβ版とした
  • fromcheckbox、formradioプラグインにaccesskey設定オプションを追加した
  • 扱うページに対し権限がない場合はエラーとするようにした
    • cardformにおいてフォームページが存在するが参照権限を持たない場合は エラーメッセージを表示しフォームを出力しない
    • cardformにおいて以下の場合にはエラーメッセージを表示しフォームの 送信ボタンを無効にする
      • ベースページが存在するが参照権限を持たない
      • 保存ページ指定時にページ名に使用できない文字が含まれる
      • 保存ページが存在するが参照権限を持たない
      • 保存ページの編集権限または新規ページ作成権限を持たない
    • データ送信時にベースページが存在するが参照権限を持たない場合は エラーメッセージを表示し処理を中断する
    • ページ更新または新規作成時に以下の場合はエラーメッセージと 送信データのプレビュー表示のみ行ない、ページの保存は行なわない
      • ページ名に使用できない文字が含まれる
      • 保存ページが存在するが参照権限を持たない
      • 保存ページの編集権限または新規ページ作成権限を持たない
    • cardcount、cardsumにおいてベースページが存在するが参照権限を持たない 場合はエラー扱いとして文字を返さない
  • 新規にページを作成した場合、ベースページが存在していれば、 その参照権限、編集権限を継承するようにした
  • ベースページ等の各ページを読んでパースするループ部分を改良した