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);
	}
}