« 画像を縮小する(paint) | メイン | ethnaのフォーム定義をDBから取得する その1 »

ethna

ethnaでformの配列を個別にチェックしたい

formの配列長が可変長だったっ場合、普通に作ると

メアド入力欄
  • メアドを正しく入力してください。

    となるところを

    メアド入力欄
  • メアドを正しく入力してください。
  • メアドを正しく入力してください。

    のように、どの配列インデックスで間違いがあったか分かるようにする為、次のような応急処置。

  • class APPID_ActionForm extends Ethna_ActionForm で
    var $form_template = array(
        'mail'=>array(
            'name'     => 'メアド',
            'required' => false,
            'form_type'=> FORM_TYPE_TEXT,
            'type'     => array(VAR_TYPE_STRING), ///★
            'custom'   => 'checkMailaddressArray',///★
            'filter'   => 'ltrim,rtrim,ntrim',
        ),
    );
    さらに、checkMailaddress を改造して
    function &checkMailaddressArray($name){
        $null = null;
        $error_msg = '{form}を正しく入力してください。';
        $form_vars = $this->check($name);
        if($form_vars == null){
            return $null;
        }
        foreach($form_vars as $k => $v){
            if($v === "") continue;
            if(Ethna_Util::checkMailaddress($v) == false) {
                $this->form[$name]['error'][$k]=true; ///★
                $null = $this->ae->add("{$name}", $error_msg, E_FORM_INVALIDCHAR); ///★
            }
        }
        return $null;
    }
    オリジナルの checkMailaddress はエラーがあれば配列の途中で return するところを
    エラー発生したインデックス全てのフォーム定義に 'error'=true をセット。

    実は、テンプレートでフォーム定義の内容を参照するため
    class APPID_ViewClass extends Ethna_ViewClass で
    function _setDefault(&$renderer){
        $smarty =& $renderer->getEngine();
        $smarty->assign_by_ref( 'formDef', $this->action_form->getDef() );
    }
    としているので、例えば $formDef['meil']['name']等として「メアド」を動的に表示している。
    従って、$formDef['meil']['error'] で、フォーム配列のどのインデックスでエラーがあったかを判別できる。
    メアド入力欄
    {section name=a start=0 loop=$form.mail|@count}
        <li><input type="text" name="mail[{$smarty.section.a.index}]" value="{$form.mail[$smarty.section.a.index]}" />
        {if $formDef.mail.error[$smarty.section.a.index]}<span style="color:red;">{message name="mail"}</span>{/if}
    {/section}
    本当は、フォームオブジェクトを配列前提でカスタマイズすべきところかもしれない。
    もちろん、配列数の要件が変ることなく 数が少なければ
    var $form_template = array(
        'mail[0]'=>array(
            :
        ),
        'mail[1]'=>array(
            :
        ),
        'mail[2]'=>array(
            :
        ),
            :
    );
    と書きまくってもよい。
    Ethna 2.5 から扱える多次元配列でも可変長配列については上記状況は同じ。

    トラックバック

    このエントリーのトラックバックURL:
    https://www.remix.asia/cgi/mt/mt-tb.cgi/6592

    コメントを投稿

    (いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)