自作していて、よく使うsmartyプラグインの第2弾。
今回は、カテゴリ・ジャンルのような、たいがいのサイトで存在する概念で、よく検索の条件の一つになったりする要素をテーマにしてみる。
こういうのは、まず、コード化されることがほとんどで、view側でselectボックスしたかったり、model側でエンコード・デコードしたかったりといろんなところに出てくるケースが多い。
そんなときに僕がよく使う自分の中での常套手段。こういうの「常套」って使うのかわかんないけど。
今回は、カテゴリ・ジャンルのような、たいがいのサイトで存在する概念で、よく検索の条件の一つになったりする要素をテーマにしてみる。
こういうのは、まず、コード化されることがほとんどで、view側でselectボックスしたかったり、model側でエンコード・デコードしたかったりといろんなところに出てくるケースが多い。
そんなときに僕がよく使う自分の中での常套手段。こういうの「常套」って使うのかわかんないけど。
余談ですけど、チーム開発でよくありがちなのが、コードマスタ的な定数クラスが複数できてたり、コードマスタをDBからとってくるのがめんどくさかったのかデコード処理をべた書きしてたりという惨状。マスタを書き換えても反映されない箇所とかあったりしてね。
ちなみに、こういうのは起きるのが普通で、起きないのはリーダークラスが優秀なチームと思っていいと思う。
「そんなのあたりまえだろ」という人、僕もそう思いますが最近の"普通"はそのレベルに達してないように思います。
「んなことねーよ。リーダーが管理できねーか ら、俺がカバーしてるんだよ」という人、それはあなたがリーダーです。
「その割りには給料が少ねーよ」という人、それはシラネーヨ。
さて、話を戻して今回は、クイズのジャンルを例にしてみる。
また、とーぜんのようにZend Frameworkを使ってる前提。たぶん関係ないけど。
簡単に構成を話すと、コードマスタを定数クラスにまとめて、smartyのプラグインでは、それを元にセレクトボックスなりラジオボタンなりを作る処理を書きましょうという感じ。
ということで、定数クラスであるところのConst.phpとsmartyプラグインであるところのfunction.html_genre.phpが今回の登場人物。
Const.php
public static function getGenreArray(){
return array(
'1' => array('ja' => 'スポーツ', 'en' => 'sports'),
'2' => array('ja' => '歴史', 'en' => 'History'),
'3' => array('ja' => 'アニメ&ゲーム', 'en' => 'animation & games'),
'4' => array('ja' => 芸能', 'en' => 'Entertainment'),
'5' => array('ja' => '雑学', 'en' => 'General knowledge')
);
}
こんな感じで配列にしておく。なぜか多言語対応を意識。
この配列のようなデータはDBに格納したい、という人は、DBにしまっておいて、ここでは、DBから取り出してキャッシュするような処理を書いておけばいいと思う。
そのうちそういう処理を書くことになるので、書いたらまたアップします。
そして、検索で使用するときにselectタグのoptionタグ生成をするsmartyプラグイン
function.html_genre.php
<?php
function smarty_function_html_genre($params, &$smarty){
$selected = $params['selected'];
$locale = $params['locale'];
if(!$locale){
$locale = 'ja';
}
require_once dirname(__FILE__).'/../models/Const.php';
$array = Const::getGenreArray();
$_output = '';
foreach($array as $key => $value){
$_output .= '<option value="'.$key.'"';
if($key == $selected){
$_output .= ' selected="selected"';
}
$_output .= '>'.$value[$locale]."</option>\n";
}
return $_output;
}
こんな感じでviewに組み込む。
hoge.tpl
<select name="genre" id="genre" size="1"><option value="" ></option><{html_genre selected=$p.genre}></select>
もしかしたら、viewでデコードだけしたこともあるかもしれない。入力画面→確認画面のときとかに。
そういう場合はmodifierを作る。
modifier.genre.php
<?php
function smarty_modifier_genre($code, $locale = 'ja')
{
require_once dirname(__FILE__).'/../models/Const.php';
$array = Const::getGenreArray();
$text = $array[$code];
return $text[$locale];
}
<{$code|genre}>みたいにして使う。
こんな感じで、特にコード値との対応をとるようなものは上記の応用で手軽にviewとの連携ができるのと、DBなりConstのハッシュなりのマスタの一元化が保てるので、最近はこの組み合わせをよく使っている。
普通はどうしてるのかな。
コメントする