smartyプラグイン

smartyを使ってるphperは多いと思いますが、プラグインを自作してる人はあんまりいないように思います。実はクソ簡単で超便利なので超おすすめです。ていうか、smartyの標準プラグインは色々微妙すぎるのでちょろっとカスタマイズするだけでsmartyの利便性が格段にあがります。
html_optionsなんかはまさにそうで、非常に使い勝手が悪いです。連想配列を渡すとselectを丸ごと生成してくれる機能もあるのですが、実際マスタからまるごと引っ張ってきたデータというのは連想配列ではないので、結局DBから取ってきた後に加工する必要があります。全然省力化してねえ! それならrowsをまるごと投げてforeachでやった方が早いぜ・・・ となってしまうわけです。そこで、rowsを丸ごと投げるとselectにしてくれるプラグインをちゃちゃっと作りました。

function smarty_function_select($params, &$smarty)
{
  $column_id = isset($params['column_id']) ? $params['column_id'] : 'id';
  $column_name = isset($params['column_name']) ? $params['column_name'] : 'name';
  $name = isset($params['name']) ? $params['name'] : '';
  $selected_value = isset($params['selected']) ? $params['selected'] : '';
  $notext = isset($params['no_text']) ? $params['no_text'] : '';
  $novalue = isset($params['no_value']) ? $params['no_value'] : '';

  print "<select ";
  if(isset($params['id'])){
    print " id=\"{$params['id']}\">";
  }
  print 'name="'.htmlspecialchars($name).'">';
  print '<option value="'.htmlspecialchars($novalue).'">'.htmlspecialchars($notext).'</option>';

  if (isset($params['from'])) {
    foreach ($params['from'] as $item) {
      $selected = ($item[$column_id] == $selected_value) ? 'selected="selected"' : '';
      print '<option value="'.htmlspecialchars($item[$column_id]).'" '.$selected.'>'.htmlspecialchars($item[$column_name]).'</option>';
    }
  }

  print "</select>";
}
  • before
<select name="hoge">
	<option value="0">選択なし</option>
	<option value="21"{ if $hoge == 21 } selected{ /if }>重電関係</option>
	<option value="22"{ if $hoge == 22 } selected{ /if }>治工具</option>
	<option value="23"{ if $hoge == 23 } selected{ /if }>工作機械</option>
	<option value="24"{ if $hoge == 24 } selected{ /if }>測定機械</option>
	<option value="25"{ if $hoge == 25 } selected{ /if }>産業用機械</option>
	<option value="26"{ if $hoge == 26 } selected{ /if }>AV機器</option>
	<option value="27"{ if $hoge == 27 } selected{ /if }>家電</option>
	<option value="28"{ if $hoge == 28 } selected{ /if }>OA機器</option>
	<option value="29"{ if $hoge == 29 } selected{ /if }>通信機器</option>
	<option value="30"{ if $hoge == 30 } selected{ /if }>電子部品</option>
	<option value="31"{ if $hoge == 31 } selected{ /if }>家具</option>
	<option value="32"{ if $hoge == 32 } selected{ /if }>厨房</option>
	<option value="33"{ if $hoge == 33 } selected{ /if }>建築土木資材</option>
	<option value="34"{ if $hoge == 34 } selected{ /if }>輸送機器</option>
	<option value="35"{ if $hoge == 35 } selected{ /if }>輸送機器電装品</option>
	<option value="36"{ if $hoge == 36 } selected{ /if }>医療機器</option>
	<option value="37"{ if $hoge == 37 } selected{ /if }>文房具雑貨</option>
	<option value="38"{ if $hoge == 38 } selected{ /if }>レジャー用品</option>
	<option value="39"{ if $hoge == 39 } selected{ /if }>照明器具</option>
	<option value="40"{ if $hoge == 40 } selected{ /if }>事務用機器</option>
</select>
  • after
$sql = 'select id, name from hoge';
$rs = $db->query($sql);
$hoges = pg_fetch_all($rs);
$smarty->assign('hoges ', $hoges);
$smarty->assign('hoge', $hoge);
{select name="hoge" from=$hoges selected=$hoge}