やっていること
Areaクラスにセレクトボックスを出力するgetSelect()メソッドを定義しました。
view側ではArea::getSelect()で出力できて、シンプルなのでとてもいいなと思っていました。
ところが別のviewで以下のように「すべて」の項目があるセレクトボックスを出力する必要が出て来ました。
html
1<select> 2 <option value="">すべて</option> 3 <option value="0">東</option> 4 <option value="1">西</option> 5</select>
困っていること
1、新たに「すべて」を含んだセレクトボックスを生成するメソッドを定義する
2、getSelect()に新たに引数を与えて関数内で対応する
二つの方法を思いつきました。
どちらでも対応できそうですが、この調子でまたちょっと違うセレクトボックスを出力したくなった時に1の方法ですと同じようなメソッドがどんどん増えていくような気がしますし、2の方法ですと与える引数がどんどん増えていくことが想像出来る為どちらもあまり良い方法ではないのではないかと考えています。
セレクトボックスをまるまる生成するメソッドは諦めてoptionのみ返すようにした方がいいのでしょうか?
そもそもこのようなメソッドをクラス内に定義するのは間違いですか?
良い方法があるのでしょうか?アドバイス、参考になるページやオススメの書籍などもあれば教えて頂けませんでしょうか。よろしくお願いします。
コード
PHP
1class Area 2{ 3 protected static $title = 'エリア'; 4 protected static $form_name = 'area'; 5 6 protected static $areas = array( 7 '0' => '東', 8 '1' => '西' 9 ); 10 11 public static function getData() 12 { 13 return self::$areas; 14 } 15 16 public static function getName($id) 17 { 18 $areas = self::getData(); 19 return $areas[$id]; 20 } 21 22 public static function getSelect($id = null) 23 { 24 $format = ' 25 <div class="form-group"> 26 <label for="%s" class="control-label">%s</label> 27 <select id="%s" class="form-control" name="%s"> 28 %s 29 </select> 30 </div>'; 31 32 $data = self::getData(); 33 34 foreach ($data as $key => $val) { 35 $options .= sprintf( 36 '<option value="%s" %s >%s</option>', 37 $key, 38 self::isSelected(strval($key), $id), 39 $val 40 ); 41 } 42 43 $select = sprintf( 44 $format, 45 self::$form_name, 46 self::$title, 47 self::$form_name, 48 self::$form_name, 49 $options); 50 51 return $select; 52 } 53 54 public function isSelected($key, $id) 55 { 56 if ($key === $i) { 57 return 'selected'; 58 } 59 } 60}
回答3件
あなたの回答
tips
プレビュー