SOY2HTMLでラジオボタンやチェックボックスを設置する - HTMLCheckBox編でプラグインの設定用のテキストエリアの設置を見ました。
設定画面に必要なものと言えば、
あとはセレクトボックスだけなので
今回はセレクトボックスの設定を見てみます。
セレクトボックスを設置するために前回追加した入力フォームの下に下記のコードを追加します。
$this->createAdd("select", "HTMLSelect", array( "name" => "Config[select]", "options" => array("hoge" => "neko", "huga" => "inu"), "selected" => "hoge", ));
いつも通り、短縮形を見ておくと、
$this->addSelect("select", array( "name" => "Config[select]", "options" => array("hoge" => "neko", "huga" => "inu"), "selected" => "hoge", ));
これまた今回も前回同様、ダミープラグインには短縮形の方で記述します。
DummyPluginConfigPage.class.php
<?php class DummyPluginConfigPage extends WebPage { private $configObj; function __construct(){} function doPost(){ if(soy2_check_token()){ SOYShop_DataSets::put("dummy_plugin.config", $_POST["Config"]); $this->configObj->redirect("updated"); } $this->configObj->redirect("failed"); } function execute(){ parent::__construct(); /** 以前のタグは省略省略 **/ $this->addSelect("select", array( "name" => "Config[select]", "options" => array("hoge" => "neko", "huga" => "inu"), "selected" => "hoge", )); } function setConfigObj($configObj){ $this->configObj = $configObj; } }
続いて、対になるHTMLファイルの方に新たに作成したsoy:id付きテキストフォームを設置します。
DummyPluginConfigPage.html
<form soy:id="form"> <dl> <dt>タイトル</dt> <dd> <input type="text" soy:id="title"> </dd> <dt>本文</dt> <dd> <textarea soy:id="content"></textarea> </dd> <dt>ラジオ</dt> <dd> <input type="radio" soy:id="radio_neko"> <input type="radio" soy:id="radio_inu"> </dd> <dt>メールマガジン</dt> <dd> <input type="checkbox" soy:id="mail_magazine"> </dd> <dt>セレクトボックス</dt> <dd> <select soy:id="select"></select> </dd> </dl> <input type="submit" value="押す"> </form>
セレクトボックスのタグを追加できたら、実際に画面を確認してみて、
セレクトボックスが追加された事を確認します。
該当箇所のソースコードを確認してみると、
<select name="Config[select]"> <option selected="selected" value="hoge">neko</option> <option value="huga">inu</option> </select>
selectタグに子ノードのoptionタグが追加された形で出力されています。
$this->addSelect("select", array( "name" => "Config[select]", "options" => array("hoge" => "neko", "huga" => "inu"), "selected" => "hoge", ));
addSelectの第二引数の配列内で指定した値が反映されています。
nameはHTMLInputと同じなので省略します。
SOY2HTMLでテキストフォームを設置する - HTMLInput編
selectedはHTMLCheckBoxと同じなので省略します。
SOY2HTMLでラジオボタンやチェックボックスを設置する - HTMLCheckBox編
HTMLSelectクラスで新たに登場した値はoptionsで、
optionsに配列を渡すことで、配列内のインデックスと値を元にoptionタグが生成されます。
生成されたoptionタグ群に対して、selectedで指定した値と配列で指定したインデックスが一致すれば、
一致したオプションタグにselected属性を付与します。
optionsに渡す配列では、インデックスなしの配列も可なのですが、
ここらへんの話を書き始めると長いので、
他に何が出来るか知りたい場合は実際のコードに記載されているコメントをご覧ください。
というわけで、
今回も以前同様、HTMLSelectの実際のコードを見ておきます。
/common/lib/soy2_build.phpを開きclass HTMLSelectでテキスト検索して、
/** * HTMLSelect * @package SOY2.SOY2HTML * 使い方 * <select soy:id="test_select"></select> * * $this->createAdd("test_select","HTMLSelect",array( * "selected" => $selectedvalue, * "options" => array( * "りんご","みかん","マンゴー" * ), * "each" => array( * "onclick"=>"alert(this.value);" * ), * "indexOrder" => $boolean, * "name" => $name * )); * * indexOrderがtrueの場合、またはoptionsに指定した配列が連想配列の場合は * <option value="0">りんご</option> * <option value="1">みかん</option> * <option value="2">マンゴー</option> * または * <option value="apple">りんご</option> * <option value="mandarin">みかん</option> * <option value="mango">マンゴー</option> * に展開されます。 * * optionsに指定した配列が連想配列で無い場合(かつindexOrderがtrueでない場合)は * <option>りんご</option> * <option>みかん</option> * <option>マンゴー</option> * です。 * * optionsを多重配列にすることで<optgroup>を指定できます。 * * selectedを複数指定するときは配列にします。 */ class HTMLSelect extends HTMLFormElement { var $tag = "select"; const SOY_TYPE = SOY2HTML::HTML_BODY; var $options; var $selected;//複数指定するときは配列 private $multiple = false; var $indexOrder = false; var $property; var $each = ""; function setOptions($options){ $this->options = $options; } function setSelected($selected){ $this->selected = $selected; } function getMultiple() { return $this->multiple; } function setMultiple($multiple) { $this->multiple = $multiple; } function setIndexOrder(){ $this->indexOrder = true; } function setProperty($name){ $this->property = $name; } function setEach($each){ if(is_array($each) && count($each)){ $attr = array(); foreach($each as $key => $value){ $attr[] = htmlspecialchars((string)$key, ENT_QUOTES,SOY2HTML::ENCODING).'="'.htmlspecialchars((string)$value, ENT_QUOTES,SOY2HTML::ENCODING).'"'; } $this->each = implode(" ",$attr); } } function execute(){ $innerHTML = $this->getInnerHTML(); parent::execute(); $this->setInnerHTML($innerHTML.$this->getInnerHTML()); $multiple = ($this->multiple) ? "multiple" : null; $this->setAttribute("multiple",$multiple, false); } function getObject(){ $first = count($this->options) ? array_slice($this->options, 0, 1) : array(); if(is_array(array_shift($first))){ $twoDimensional = true; $isHash = false; }else{ $twoDimensional = false; $isHash = (array_keys($this->options) === range(0,count($this->options)-1)) ? false : true; } if($this->indexOrder){ $isHash = true; } $buff = ""; if($twoDimensional){ foreach($this->options as $key => $value){ if(is_array($value)){ $key = (string)$key; $buff .= '<optgroup label="'.htmlspecialchars((string)$key, ENT_QUOTES,SOY2HTML::ENCODING).'">'; $buff .= $this->buildOptions($value, $isHash); $buff .= '</optgroup>'; }else{ $buff .= $this->buildOption($key, $value, $isHash); } } }else{ $buff .= $this->buildOptions($this->options, $isHash); } return $buff; } function buildOptions($options, $isHash){ $buff = ""; foreach($options as $key => $value){ $buff .= $this->buildOption($key, $value, $isHash); } return $buff; } function buildOption($key, $value, $isHash){ $buff = ""; $selected = ''; $key = (string)$key; if(is_object($value) && $this->property){ $propName = $this->property; $funcName = "get" . ucwords($propName); if(method_exists($value,$funcName)){ $value = $value->$funcName(); }else{ $value = $value->$propName; } } if($isHash || !is_numeric($key)){ $selected = ($this->selected($key)) ? 'selected="selected"' : ''; }else{ $selected = ($this->selected($value)) ? 'selected="selected"' : ''; } $attributes = ""; if(strlen($selected)) $attributes .= " ".$selected; if(strlen($this->each)) $attributes .= " ".$this->each; if($isHash || !is_numeric($key)){ $attributes .= ' value="'.htmlspecialchars((string)$key,ENT_QUOTES,SOY2HTML::ENCODING).'"'; } $buff .= "<option".$attributes.">".htmlspecialchars((string)$value,ENT_QUOTES,SOY2HTML::ENCODING)."</option>"; return $buff; } /** * 値がselectedであるかどうか */ function selected($value){ if(is_array($this->selected)){ return in_array($value,$this->selected); }else{ return ($value == $this->selected); } } function setValue($value){ $this->setSelected($value); } }