下記のようにセレクトボックスのソースを書くと、2つめの選択肢はフォーカスが当てれません。
optgroupを使ったインデントのような表現もあるのですが、1次元でもこのように表現する事によって、jqueryでの制御も扱い易いです。

1
2
3
4
5
<select>
<option value="1">aaa</option>
<option value="2" disabled="">bbb</option>
<option value="3">ccc</option>
</select>

今回、PHP + Smarty で開発中に「html_options」で上記の事を実現する必要に駆られました。
まず、普通にセレクトボックスを生成する場合、下記のように書けばいいのですが、html_optionsはoptionのdisabledに対応していません。

■PHP側

1
2
3
4
5
6
$options = array(
    '1' => 'aaa',
    '2' => 'bbb',
    '3' => 'ccc',
);
$smarty->assign('options', $options);

■Smartyテンプレート側

1
2
3
<select>
    {html_options options=$options}
</select>

そこで調べてみたところ、Smarty拡張クラスを改造して公開しているサイトがありました。

Smarty {html_options} plugin with ‘disabled’ support – justin hileman dot info

http://justinhileman.info/article/smarty-html-options-plugin-with-disabled-support/function.html_options.php.txt

上記リンク先の内容を「function.html_options.php」というファイル名で保存し、サーバ上に同名のファイル名があるので上書きします。
そして、下記のように書き直すことで同様の動作にすることができました。

■PHP側

1
2
3
4
5
6
7
$options = array(
    '1' => 'aaa',
    '2' => 'bbb',
    '3' => 'ccc',
);
$smarty->assign('options', $options);
$smarty->assign('disabled', array(2));

■Smartyテンプレート側

1
2
3
<select>
    {html_options options=$options disabled=$disabled}
</select>

※この記事は、なかの人(piro556)が書いています。