• R/O
  • SSH
  • HTTPS

コミット

タグ
未設定

よく使われているワード(クリックで追加)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

PHPのフレームワークです。オートローディング、ルーティング、ORマッパ、フォームバリデータ、その他ユーティリティがセットになっています。


コミットメタ情報

リビジョン86 (tree)
日時2021-01-21 15:19:01
作者tantancode

ログメッセージ

HTML出力周りを修正

変更サマリ

差分

--- lib/HtmlUtil.php (revision 85)
+++ lib/HtmlUtil.php (revision 86)
@@ -117,8 +117,7 @@
117117 * textarea <textarea> を作成する。
118118 * choice typeの値が select, radios, checks の場合に、選択肢の配列。options を指定した場合はそちらが優先される。
119119 * キーでvalueを、値で選択肢名を指定する。選択肢名は次のキーで操作することも出来る。
120- * label-format choice の選択肢名を生成するときの sprintf フォーマット文字列。%1$ が値、%2$ がキーとなる。
121- * 省略した場合は "%1$s"。
120+ * label-format choice の選択肢名を生成するときの sprintf フォーマット文字列。%1$ が値、%2$ がキーとなる。省略した場合は "%1$s"。
122121 * value typeの値が select, radios, checks の場合は、最初に選択状態になっている選択肢のキー。
123122 * textarea では最初に入力されている値。それ以外では、普通に <input> のvalue属性となる。
124123 * options choice を指定するならそちらから生成できるので省略できる。
--- lib/extension/form/FormItem.php (revision 85)
+++ lib/extension/form/FormItem.php (revision 86)
@@ -20,18 +20,18 @@
2020 * │ offsetGet("error")
2121 * │ offsetGet("caption")
2222 * │
23- * └→ render → getInputHtml ┬→ getRecommendedType → offsetGet("choice")
24- * │ offsetGet("choice.multi")
25- * │ offsetGet("type")
26- * │ offsetGet("oneliner")
27- * │
28- * └→ offsetGet("name") → offsetGet("key")
29- * offsetGet("input")
30- * offsetGet("label")
31- * offsetGet("label-format")
23+ * └→ render → getInputAttrs ┬→ getRecommendedType → offsetGet("choice")
24+ * │ offsetGet("choice.multi")
25+ * │ offsetGet("type")
26+ * │ offsetGet("oneliner")
27+ * │
28+ * └→ offsetGet("name") → offsetGet("key")
29+ * offsetGet("input")
30+ * offsetGet("label")
31+ * offsetGet("label-format")
3232 *
33- * getChoiceHtml → offsetGet("input")
34- * offsetGet("choice")
33+ * choice → offsetGet("choice")
34+ * offsetGet("input")
3535 */
3636 class FormItem extends IndexerObject {
3737
@@ -178,47 +178,24 @@
178178 /**
179179 * このフォーム項目を描画するHTML文字列を返す。エラーメッセージは含まれない。そちらも一緒に出力したい場合は scaffold() を使う。
180180 *
181- * @param HtmlUtil::input() の引数と同じだが、基本的には type を指定するだけで良い。出力されるHTML要素に属性を設定したい場合にそれらを追加する
182- * 程度。default をここで指定することもできる。
181+ * @param 出力される <input> 等にHTML属性を付けたい場合はそれらの連想配列。
183182 * なお、HtmlUtil::input() の choice キーはこの項目の choice 属性から取得されるので無視される。
184183 * @return 作成したHTML。
185184 */
186185 public function render($params = array()) {
187186
188- // 渡されたパラメータでgetInputHtml()を呼び出す。文字列で返されている場合はそれを出力して終わり。
189- $params = $this->getInputHtml($params);
190- if( is_string($params) )
191- return $params;
187+ $params = $this->getInputAttrs($params);
192188
193- // 選択肢から選ぶ項目の場合は、getChoiceHtml() を使って options を生成する。
194- if( in_array(strtolower($params['type']), ['select', 'radios', 'checks']) && !@$params['options'] ) {
195-
196- // 細目を表示する入力コントロールを決定。
197- $subtype = array('select'=>'option', 'radios'=>'radio', 'checks'=>'check')[ strtolower($params['type']) ];
198-
199- // 各細目を表すHTMLを配列として $options に取得。
200- $options = array();
201- foreach($this['choice'] as $key => $dummy) {
202- $pars = $this->getChoiceHtml($key, array('type'=>$subtype, 'format'=>@$params['label-format'], 'checkif'=>@$params['value']));
203- $options[] = is_string($pars) ? $pars : HtmlUtil::choice($pars);
204- }
205-
206- // 後の流れに合わせてパラメータを調整する。
207- $params['options'] = $options;
208- unset($params['label-format']);
209- }
210-
211- // あとは HtmlUtil::input() で処理できる。
212189 return HtmlUtil::input($params);
213190 }
214191
215192 /**
216- * この項目を入力するためのコントロールを表すHTML文字列、あるいは、それを出力するための HtmlUtil::input() へのパラメータを返す。
193+ * この項目を入力するためのフォームコントロールを表すHTML文字列を出力するための HtmlUtil::input() へのパラメータを返す。
217194 *
218195 * @param デフォルトからカスタムしたいパラメータの連想配列。
219196 * @return 文字列ならHTMLそのものなのでそのまま出力されたい。連想配列の場合は HtmlUtil::input() のパラメータなのでそちらに渡して出力されたい。
220197 */
221- private function getInputHtml($params = array()) {
198+ private function getInputAttrs($params = array()) {
222199
223200 // ここで初期値が指定される場合もあるので取り出して設定しておく。
224201 if( array_key_exists('default', $params) )
@@ -306,56 +283,45 @@
306283 }
307284 }
308285
286+ //-----------------------------------------------------------------------------------------------------
309287 /**
310- * この項目に choice 属性が設定されているとき、引数で指定されたキーを持つ選択肢を表すHTML文字列、
311- * あるいは、それを出力するための HtmlUtil::choice() へのパラメータを返す。
288+ * この項目に choice 属性が設定されているとき、引数で指定されたキーを持つ選択肢を表すHTMLを出力するための HtmlUtil::choice() へのパラメータを返す。
312289 *
313290 * @param 出力したい選択肢のキー。
314291 * @param HtmlUtil::choice() へのパラメータのうち、特別に指定したいパラメータの連想配列。以下のキーも追加で処理される。
315- * format label を生成するための sprintf フォーマット文字列として処理される。%1$ が値、%2$ がキーとなる。省略した場合は "%1$s"。
316- * @return 文字列ならHTMLそのものなのでそのまま出力されたい。連想配列の場合は HtmlUtil::choice() のパラメータなのでそちらに渡して出力されたい。
292+ * type HtmlUtil::choice()() に従って option, radio, check, checkbox のいずれかだが、省略時は項目の type 設定に従う。
293+ * label-format 選択肢名を生成するときの sprintf フォーマット文字列。%1$ が値、%2$ がキーとなる。省略した場合は "%1$s"。
294+ * @return HtmlUtil::choice() のパラメータ。
317295 */
318- public function getChoiceHtml($key, $params = array()) {
296+ public function choice($key, $params = array()) {
319297
320- // "type" のデフォルトは "radio" とする。
321- if( !@$params['type'] )
322- $params['type'] = 'radio';
298+ // "type" が指定されていない場合は項目に設定されている値に従う。
299+ if( !isset($params['type']) ) {
300+ $params['type'] = match($this['type'] ?? $this->getRecommendedType()) {
301+ 'checks' => 'check',
302+ 'select' => 'option',
303+ 'radios', default => 'radio',
304+ };
305+ }
323306
324- // 必要なパラメータを取り出す。
325- $format = @ArrayUtil::eject($params, 'format') ?? '%1$s';
307+ // 独自に処理するパラメータを取り出す。
308+ $format = @ArrayUtil::eject($params, 'label-format') ?? '%1$s';
326309
327- // 基底としてはこんな感じ。
328- switch($params['type']) {
310+ // どの選択肢型でもこうだが...
311+ $tag = array(
312+ 'value' => $key,
313+ 'checkif' => $this['input'],
314+ 'label' => sprintf($format, $this['choice'][$key], $key),
315+ );
329316
330- case 'option':
331- $preset = array(
332- 'value' => $key,
333- 'checkif' => $this['input'],
334- 'label' => sprintf($format, $this['choice'][$key], $key),
335- );
336- break;
317+ // nameの指定方法は異なる。
318+ $tag['name'] = match($params['type']) {
319+ 'option' => null,
320+ 'radio' => $this['name'],
321+ 'check', 'checkbox' => $this['name'] . '[]',
322+ };
337323
338- case 'radio':
339- $preset = array(
340- 'name' => $this['name'],
341- 'value' => $key,
342- 'checkif' => $this['input'],
343- 'label' => sprintf($format, $this['choice'][$key], $key),
344- );
345- break;
346-
347- case 'check':
348- case 'checkbox':
349- $preset = array(
350- 'name' => $this['name'] . '[]',
351- 'value' => $key,
352- 'checkif' => $this['input'],
353- 'label' => sprintf($format, $this['choice'][$key], $key),
354- );
355- break;
356- }
357-
358- return $params + (array)$preset;
324+ return $params + $tag;
359325 }
360326
361327 //-----------------------------------------------------------------------------------------------------
--- resources/smarty.plugin/function.form_choice.php (revision 85)
+++ resources/smarty.plugin/function.form_choice.php (revision 86)
@@ -2,12 +2,12 @@
22
33 /**
44 * セレクトボックスの <option> やチェックボックス・ラジオボタンなどの、選択肢を示すHTML文字列を出力する。
5- * 基本的に HtmlUtil::choice() や FormItem::getChoiceHtml() のラッパなので詳細はそちらを参照されたい。
5+ * 基本的に HtmlUtil::choice() や FormItem::choice() のラッパなので詳細はそちらを参照されたい。
66 *
77 * パラメータ)
88 * HtmlUtil::choice() に渡す引数をそのまま指定するが、以下のキーは特別に処理される。
9- * item このキーを指定した場合は FormItem::getChoiceHtml() を呼ぶ。その他のキーはその第二引数として渡される。
10- * key item を指定している場合に、getChoiceHtml() の第一引数を指定する。
9+ * item このキーを指定した場合は FormItem::choice() を呼ぶ。その他のキーはその第二引数として渡される。
10+ * key item を指定している場合に、choice() の第一引数を指定する。
1111 */
1212 function smarty_function_form_choice($params, $template) {
1313
@@ -14,14 +14,12 @@
1414 // item が指定されている場合は...
1515 if(@$params['item']) {
1616
17- // パラメータを取り出す。
17+ // 一部のパラメータを取り出す。
1818 $item = ArrayUtil::eject($params, 'item');
1919 $key = ArrayUtil::eject($params, 'key');
2020
21- // HTML用の情報を取得。文字列で返されている場合はそれを出力して終わり。
22- $params = $item->getChoiceHtml($key, $params);
23- if( is_string($params) )
24- return $params;
21+ // HtmlUtil::choice() へのパラメータを取得。ただし指定されたパラメータを優先する。
22+ $params += $item->choice($key, $params);
2523 }
2624
2725 return HtmlUtil::choice($params);
--- sites/test/nova/FormAction.php (revision 85)
+++ sites/test/nova/FormAction.php (revision 86)
@@ -418,6 +418,8 @@
418418 $form = new NovaForm([
419419 'item1' => ['required', 'type'=>'ascii'],
420420 ]);
421+
422+ // render() と scaffold() の基本挙動。
421423 $this->checkHtml('NovaItem の render() による基本的なHTML出力。', $form['item1']->render(), [
422424 ['_tag'=>'input', 'required'=>true]
423425 ]);
@@ -441,6 +443,7 @@
441443 ['_tag'=>'tr'],
442444 ]);
443445
446+ // validate() 後の挙動。
444447 $form->validate(['item1'=>'いろは']);
445448 $this->checkHtml('validate() 後のrenderに、与えた値が現れる。', $form['item1']->render(), [
446449 ['_tag'=>'input', 'required'=>true, 'value'=>'いろは'],
@@ -451,5 +454,15 @@
451454 ['_tag'=>'/div'],
452455 ['_tag'=>'input', 'required'=>true, 'value'=>'いろは'],
453456 ]);
457+
458+ // choice() の挙動。
459+ $form = new NovaForm([
460+ 'item1' => ['required', 'type'=>'select', 'choice'=>['a'=>'A', 'b'=>'B', 'c'=>'C']],
461+ ]);
462+ $this->checkHtml('choice() によって単一の選択肢が適切に出力される。', $form['item1']->choice('a'), [
463+ ['_tag'=>'option', 'value'=>'a'],
464+ 'A',
465+ ['_tag'=>'/option'],
466+ ]);
454467 }
455468 }