tohokuaikiのチラシの裏

技術的ネタとか。

Ethnaの選択肢妥当性チェックプラグイン

Symfonyでchoiceっていうのがあるので、Ethnaでも同じように。

ActionFormのフォーム定義

ありがちなこんなの。Smartyプラグインでレンダラー使ってる人はform_optionsを適当なものに差し替える。以降のでも同じ操作必要だけど。

<?php
    $form = array(
        'config_status' => array(
            'name' => '状態',
            'type' => VAR_TYPE_INT,
            'form_type' => FORM_TYPE_RADIO,
            'required' => true,
            'form_options' => array(
                '0' => '使わない', 1 => '使用する'
                ),
            ),
        );

ActionFormの_getPluginDefのオーバーライド

<?php
    /**
     * @brief form_typeのValidatorを作る
     * @param 
     * @return
     */
    function _getPluginDef($form_name)
    {
        $plugin_def = parent::_getPluginDef($form_name);
        
        $form_def = $this->getDef($form_name);
        
        if (isset($form_def['form_options'])){
            $plugin_def['choice'] = array(
                'choices' => $form_def['form_options'],
                'error' => isset($form_def['form_options_error']) ? $form_def['form_options_error'] : '{form}に不正な値が入っています'
                );
        }
        
        return $plugin_def;
    }

こんな感じ。

で、プラグイン

Tinycms_Plugin_Validator_Choice.php

<?php
// {{{ Tinycms_Plugin_Validator_Choice
/**
 *  フォームの選択肢タイプチェックプラグイン
 *
 *  @author     
 *  @access     public
 *  @package    Ethna
 */
define('E_FORM_INVALID_CHOICE', 1001);
class Tinycms_Plugin_Validator_Choice extends Ethna_Plugin_Validator
{
    /**
     *  フォームの選択肢チェックを行う
     *
     *  @access public
     *  @param  string  $name       フォームの名前
     *  @param  mixed   $value        フォームの値
     *  @param  array   $params     プラグインのパラメータ
     */
    function &validate($name, $value, $params)
    {
        if (in_array($value, array_keys($params['choices']))){
            return true;
        }
        
        return Ethna::raiseNotice($params['error'], E_FORM_INVALID_CHOICE);
    }
}
// }}}
?>

これで不正な選択肢を投稿できないようになる。

プロジェクトPrefixは適当に変更してください。