PHPのフレームワークです。オートローディング、ルーティング、ORマッパ、フォームバリデータ、その他ユーティリティがセットになっています。
リビジョン | 86 (tree) |
---|---|
日時 | 2021-01-21 15:19:01 |
作者 | tantancode |
HTML出力周りを修正
@@ -117,8 +117,7 @@ | ||
117 | 117 | * textarea <textarea> を作成する。 |
118 | 118 | * choice typeの値が select, radios, checks の場合に、選択肢の配列。options を指定した場合はそちらが優先される。 |
119 | 119 | * キーでvalueを、値で選択肢名を指定する。選択肢名は次のキーで操作することも出来る。 |
120 | - * label-format choice の選択肢名を生成するときの sprintf フォーマット文字列。%1$ が値、%2$ がキーとなる。 | |
121 | - * 省略した場合は "%1$s"。 | |
120 | + * label-format choice の選択肢名を生成するときの sprintf フォーマット文字列。%1$ が値、%2$ がキーとなる。省略した場合は "%1$s"。 | |
122 | 121 | * value typeの値が select, radios, checks の場合は、最初に選択状態になっている選択肢のキー。 |
123 | 122 | * textarea では最初に入力されている値。それ以外では、普通に <input> のvalue属性となる。 |
124 | 123 | * options choice を指定するならそちらから生成できるので省略できる。 |
@@ -20,18 +20,18 @@ | ||
20 | 20 | * │ offsetGet("error") |
21 | 21 | * │ offsetGet("caption") |
22 | 22 | * │ |
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") | |
32 | 32 | * |
33 | - * getChoiceHtml → offsetGet("input") | |
34 | - * offsetGet("choice") | |
33 | + * choice → offsetGet("choice") | |
34 | + * offsetGet("input") | |
35 | 35 | */ |
36 | 36 | class FormItem extends IndexerObject { |
37 | 37 |
@@ -178,47 +178,24 @@ | ||
178 | 178 | /** |
179 | 179 | * このフォーム項目を描画するHTML文字列を返す。エラーメッセージは含まれない。そちらも一緒に出力したい場合は scaffold() を使う。 |
180 | 180 | * |
181 | - * @param HtmlUtil::input() の引数と同じだが、基本的には type を指定するだけで良い。出力されるHTML要素に属性を設定したい場合にそれらを追加する | |
182 | - * 程度。default をここで指定することもできる。 | |
181 | + * @param 出力される <input> 等にHTML属性を付けたい場合はそれらの連想配列。 | |
183 | 182 | * なお、HtmlUtil::input() の choice キーはこの項目の choice 属性から取得されるので無視される。 |
184 | 183 | * @return 作成したHTML。 |
185 | 184 | */ |
186 | 185 | public function render($params = array()) { |
187 | 186 | |
188 | - // 渡されたパラメータでgetInputHtml()を呼び出す。文字列で返されている場合はそれを出力して終わり。 | |
189 | - $params = $this->getInputHtml($params); | |
190 | - if( is_string($params) ) | |
191 | - return $params; | |
187 | + $params = $this->getInputAttrs($params); | |
192 | 188 | |
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() で処理できる。 | |
212 | 189 | return HtmlUtil::input($params); |
213 | 190 | } |
214 | 191 | |
215 | 192 | /** |
216 | - * この項目を入力するためのコントロールを表すHTML文字列、あるいは、それを出力するための HtmlUtil::input() へのパラメータを返す。 | |
193 | + * この項目を入力するためのフォームコントロールを表すHTML文字列を出力するための HtmlUtil::input() へのパラメータを返す。 | |
217 | 194 | * |
218 | 195 | * @param デフォルトからカスタムしたいパラメータの連想配列。 |
219 | 196 | * @return 文字列ならHTMLそのものなのでそのまま出力されたい。連想配列の場合は HtmlUtil::input() のパラメータなのでそちらに渡して出力されたい。 |
220 | 197 | */ |
221 | - private function getInputHtml($params = array()) { | |
198 | + private function getInputAttrs($params = array()) { | |
222 | 199 | |
223 | 200 | // ここで初期値が指定される場合もあるので取り出して設定しておく。 |
224 | 201 | if( array_key_exists('default', $params) ) |
@@ -306,56 +283,45 @@ | ||
306 | 283 | } |
307 | 284 | } |
308 | 285 | |
286 | + //----------------------------------------------------------------------------------------------------- | |
309 | 287 | /** |
310 | - * この項目に choice 属性が設定されているとき、引数で指定されたキーを持つ選択肢を表すHTML文字列、 | |
311 | - * あるいは、それを出力するための HtmlUtil::choice() へのパラメータを返す。 | |
288 | + * この項目に choice 属性が設定されているとき、引数で指定されたキーを持つ選択肢を表すHTMLを出力するための HtmlUtil::choice() へのパラメータを返す。 | |
312 | 289 | * |
313 | 290 | * @param 出力したい選択肢のキー。 |
314 | 291 | * @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() のパラメータ。 | |
317 | 295 | */ |
318 | - public function getChoiceHtml($key, $params = array()) { | |
296 | + public function choice($key, $params = array()) { | |
319 | 297 | |
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 | + } | |
323 | 306 | |
324 | - // 必要なパラメータを取り出す。 | |
325 | - $format = @ArrayUtil::eject($params, 'format') ?? '%1$s'; | |
307 | + // 独自に処理するパラメータを取り出す。 | |
308 | + $format = @ArrayUtil::eject($params, 'label-format') ?? '%1$s'; | |
326 | 309 | |
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 | + ); | |
329 | 316 | |
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 | + }; | |
337 | 323 | |
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; | |
359 | 325 | } |
360 | 326 | |
361 | 327 | //----------------------------------------------------------------------------------------------------- |
@@ -2,12 +2,12 @@ | ||
2 | 2 | |
3 | 3 | /** |
4 | 4 | * セレクトボックスの <option> やチェックボックス・ラジオボタンなどの、選択肢を示すHTML文字列を出力する。 |
5 | - * 基本的に HtmlUtil::choice() や FormItem::getChoiceHtml() のラッパなので詳細はそちらを参照されたい。 | |
5 | + * 基本的に HtmlUtil::choice() や FormItem::choice() のラッパなので詳細はそちらを参照されたい。 | |
6 | 6 | * |
7 | 7 | * パラメータ) |
8 | 8 | * HtmlUtil::choice() に渡す引数をそのまま指定するが、以下のキーは特別に処理される。 |
9 | - * item このキーを指定した場合は FormItem::getChoiceHtml() を呼ぶ。その他のキーはその第二引数として渡される。 | |
10 | - * key item を指定している場合に、getChoiceHtml() の第一引数を指定する。 | |
9 | + * item このキーを指定した場合は FormItem::choice() を呼ぶ。その他のキーはその第二引数として渡される。 | |
10 | + * key item を指定している場合に、choice() の第一引数を指定する。 | |
11 | 11 | */ |
12 | 12 | function smarty_function_form_choice($params, $template) { |
13 | 13 |
@@ -14,14 +14,12 @@ | ||
14 | 14 | // item が指定されている場合は... |
15 | 15 | if(@$params['item']) { |
16 | 16 | |
17 | - // パラメータを取り出す。 | |
17 | + // 一部のパラメータを取り出す。 | |
18 | 18 | $item = ArrayUtil::eject($params, 'item'); |
19 | 19 | $key = ArrayUtil::eject($params, 'key'); |
20 | 20 | |
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); | |
25 | 23 | } |
26 | 24 | |
27 | 25 | return HtmlUtil::choice($params); |
@@ -418,6 +418,8 @@ | ||
418 | 418 | $form = new NovaForm([ |
419 | 419 | 'item1' => ['required', 'type'=>'ascii'], |
420 | 420 | ]); |
421 | + | |
422 | + // render() と scaffold() の基本挙動。 | |
421 | 423 | $this->checkHtml('NovaItem の render() による基本的なHTML出力。', $form['item1']->render(), [ |
422 | 424 | ['_tag'=>'input', 'required'=>true] |
423 | 425 | ]); |
@@ -441,6 +443,7 @@ | ||
441 | 443 | ['_tag'=>'tr'], |
442 | 444 | ]); |
443 | 445 | |
446 | + // validate() 後の挙動。 | |
444 | 447 | $form->validate(['item1'=>'いろは']); |
445 | 448 | $this->checkHtml('validate() 後のrenderに、与えた値が現れる。', $form['item1']->render(), [ |
446 | 449 | ['_tag'=>'input', 'required'=>true, 'value'=>'いろは'], |
@@ -451,5 +454,15 @@ | ||
451 | 454 | ['_tag'=>'/div'], |
452 | 455 | ['_tag'=>'input', 'required'=>true, 'value'=>'いろは'], |
453 | 456 | ]); |
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 | + ]); | |
454 | 467 | } |
455 | 468 | } |