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 から扱える多次元配列でも可変長配列については上記状況は同じ。