smartyカスタム関数のhtml_optionsを使うと、htmlのドロップダウンリスト(プルダウンメニュー)を作成することができる。じゃあこれを拡張して、リストボックス表示や複数選択を可能にするにはどうするか。
smarty_function_html_options()のソースを追えばわかるけど、指定されたパラメータ名が name / options / values / output / selected 以外で、かつそのパラメータ値が配列以外の場合は、パラメータ名="パラメータ値"の形式でselectタグ内に追記してくれる仕様になっている。これを利用すれば、プラグインに手を入れるまでもなく対応が可能だ。
リストボックス表示を実現するには、selectタグにsize="n" (nはリスト表示したい行数)が指定できさえすればいい。選択肢が以下のように定義されており、
$options = array( 1=>'1. ガーガー', 2=>'2. ギーギー', 3=>'3. わんわん', 3=>'4. にゃんにゃん', 5=>'5. ぐるっぱぐるっぱ' );
さらにこの配列が$optionsという変数名でsmartyテンプレートに渡されている場合は、こんな感じで指定できる。
{html_options name="list" options=$options selected=$list size=$options|@count }
$optionsにcount修飾子(配列の要素数をカウントするphp関数【count()】)をあてているのだけど、@マークを付けないと配列全体に対して修飾子が作用してくれないので、ここは忘れずに指定しよう。
では次に、複数選択可能にするための指定方法。こっちはmultiple属性をつければいいだけなので、こんな感じになる。
{html_options name="list" options=$options selected=$list size=$options|@count multiple="multiple" }
ただし複数選択を使いこなせるのは一部の利用者に限られると思うので、あえて複数選択をさせたい場合は、リストボックスではなくチェックボックスで実装した方がベター(だと思う)。