読者です 読者をやめる 読者になる 読者になる

そろそろ本気でSmartyを使いたい(2)

PHP Piece
<form method="post">
<input type="hidden" value="{$__flowExecutionTicket}" name="{$__flowExecutionTicketKey}" id="flowExecutionTicket" />

<p>
{piece_submit name="confirm" value="Back"}
{piece_submit name="save" value="Save"}
</p>
</form>


 上のようなテンプレートを書いたときに、

<form method="post">
<input type="hidden" value="xxxx" name="yyyy" id="flowExecutionTicket" />
<p>
<input type="submit" name="_event_confirm" value="戻る" />
<input type="submit" name="_event_save" value="保存" />
</p>
</form>

 のように国際化されているといいですよね。特に、「確認」「保存」「戻る」「次へ」「キャンセル」「削除」「追加」・・・のような、よくあるボタンが、標準で国際化されていると便利だと思います。Renderer_SmartyとRenderer_PHPならば、すぐにできるけど、Renderer_Flexyはどうすればいいのかな?

<?php
function smarty_function_piece_submit($params, &$smarty)
{
    $attrs = array();
    foreach($params as $k => $v) {
        switch($k) {
        case 'name':
            $eventNameKey = $smarty->get_template_vars('__eventNameKey');
            $name = isset($params['name']) ? $params['name'] : '';
            $attrs['name'] = sprintf('name="%s_%s"', $eventNameKey, htmlspecialchars($name, ENT_QUOTES));
            break;
        case 'value':
            $attrs['value'] = sprintf('value="%s"', htmlspecialchars($v, ENT_QUOTES));
            break;
        default:
            $attrs[$k] = sprintf('%s="%s"', htmlspecialchars($k, ENT_QUOTES), htmlspecialchars($v, ENT_QUOTES));
        }
    }
    
    if (!isset($attrs['type'])) {
        $attrs['type'] = 'type="submit"';
    }
    
    if (!isset($attrs['value'])) {
        $attrs['value'] = sprintf('value="%s"', isset($params['name']) ? htmlspecialchars($params['name'], ENT_QUOTES) : '');
    }
    
    echo '<input '. implode(' ', $attrs) .' />';
}
?>