Smartyプラグインの作り方

出典: SugarForum.jp

Smartyテンプレートの中で、よく使うパタンがあればSmartyプラグインにしておくべきです。

例えば、詳細ビューや編集ビューのレイアウト定義で'customCode'を使う場合、フォームをいちいちHTMLで記述するとコードが煩雑になり、見通しが悪くなります。また、プラグインの内部ではPHPコードがそのまま使えるため、より柔軟な条件分岐が出来ます。


目次

定義の場所

SugarRoot/include/smarty/plugins/function.@プラグイン名.php


書式

function smarty_function_<プラグイン名>($params, &$smarty) {
  $html = ;
  //ここに処理を書く
  return $html;
}

上記のファイルの中に、"smarty_function_<プラグイン名>"という名称の関数が含まれるようにします。HTML表現を返すようにすればOKです。

プラグインのインストール方法

所定の場所にファイルを置くだけです。

モジュールローダでインストール可能なモジュールに含める場合は、マニフェストで'copy'を指定すると良いでしょう。

サンプル : チェックボックスを表示するプラグイン

#SugarRoot/include/smarty/plugins/function.sugar_simle_checkbox.php
/**
 * Smarty {sugar_simple_checkbox} function plugin
 * Type:     function
* Name: sugar_simple_checkbox
* Purpose: 単一のチェックボックスを表示 * @author CogniTom Academic Design & Tsutomu Kawamura * @param array * @param Smarty */ function smarty_function_sugar_simple_checkbox($params, &$smarty) { if (!isset($params['name'])){ $smarty->trigger_error("sugar_simple_checkbox: missing 'name' parameter"); return ; } $name = $params['name']; if (isset($params['label'])){ $label = $params['label']; } else { $label = 'LBL_'.strtoupper($params['name']);//指定がない場合、フィールド名を大文字にしたものをラベルとする。 if (substr($label, -2) == '_C') $label = substr($label, 0, strlen($label)-2);//カスタムフィールドの場合、ラベルからは接尾辞'_c'を除く。 } $fields = $smarty->get_template_vars('fields'); $module = $smarty->get_template_vars('module'); $view = $smarty->get_template_vars('view'); if (isset($params['value'])){ $value = $params['value']; } elseif (array_key_exists($name, $fields)) { $value = $fields[$name]['value'];//value 未指定の場合、テンプレート変数fieldsから取得。 } else { $value = ; } $checked = $value ? ' checked="checked"' : ; $disabled = ($view == 'DetailView') ? ' disabled="disabled"' : ' ';//詳細ビューで使われた場合は、変更不可に。 $label = translate($label, $module); $html = ""; $html .= "<input name='{$name}' value='0' type='hidden'>";//チェックのない場合も、送信されるように。 $html .= "<input id='{$name}' name='{$name}' value='1' type='checkbox'{$checked}{$disabled}>"; $html .= "<label for='{$name}'>{$label}</label>"; return $html; }

Tips

  • $smarty->get_template_vars(<Smarty変数名>) で、Smartyにアサインした値を取得できる。
  • translate(<言語ファイルのラベル>)で、言語ファイルの文字列を取得できる。


使用例

編集ビューのレイアウト定義内で、下記のような使い方をする。チェックボックスが大量にある場合など、標準のレイアウトでは場所を取りすぎるため、このようにいくつかのチェックボックスをまとめておくと、編集ビューが格段に見やすくなる。

array(
  'name'=>'name',
  'label'=>'LBL_CHECKBOX_LIST',
  'customCode'=>'
    {sugar_simple_checkbox name="checkitem_1"}
    {sugar_simple_checkbox name="checkitem_2"}
    {sugar_simple_checkbox name="checkitem_3"}'
),

これを、プラグインなしで書くと以下のようになる。

array(
  'name'=>'name',
  'label'=>'LBL_CHECKBOX_LIST',
  'customCode'=>'
    <input name="checkitem_1" value="0" type="hidden">
      <input id="checkitem_1" name="checkitem_1" value="1" type="checkbox" {if $fields.checkitem_1.value == 1}checked="checked"{/if}>
      <label for="checkitem_1">{$MOD.LBL_CHECKITEM_1}</label>
    <input name="checkitem_2" value="0" type="hidden">
      <input id="checkitem_2" name="checkitem_2" value="1" type="checkbox" {if $fields.checkitem_2.value == 1}checked="checked"{/if}>
      <label for="checkitem_2">{$MOD.LBL_CHECKITEM_2}</label>
    <input name="checkitem_3" value="0" type="hidden">
      <input id="checkitem_3" name="checkitem_3" value="1" type="checkbox" {if $fields.checkitem_3.value == 1}checked="checked"{/if}>
      <label for="checkitem_3">{$MOD.LBL_CHECKITEM_1}</label>'
),

最終更新 04:10, 2009年11月21日 (土)。   このページは 8,814 回アクセスされました。