2012-01-21 15 views
0

私はZend_Formを拡張するRecipeFormを拡張するLoginFormというフォームを持っています。 RecipeFromは私のデコレータだけを返します。Zend Frameworkでのカスタムバリデータの問題

フォームが送信されると、「メッセージ:メソッドaddValidatorが存在しません」というエラーが表示されます。

class Recipe_Form_LoginForm extends Recipe_Form_RecipeForm { 
    public function init() 
    { 
     parent::init(); 
     $this->setName('loginform') 
      ->setAction('/login'); 


     // Add Email Element 
     $email = $this->addElement('text', 'email', array(
      'label' => 'Email Addresses', 
      'required'=> true, 
      'size'=>12, 
      'filters'=>array('StringTrim'), 
      'decorators' => $this->getElementDecorator('email'), 

     )); 
     $email->addValidator(new Recipe_Validate_EmailAddress(), true, array(
      'messages' => array(
       Recipe_Validate_EmailAddress::INVALID => 
       'Please enter email in correct format', 
       Recipe_Validate_EmailAddress::EMAILISEMPTY => 
       'Please enter email address' 
     ))); 
} 

class Recipe_Validate_EmailAddress extends Zend_Validate_Abstract 
{ 
    const INVALID   = 'notvalid'; 
    const EMAILISEMPTY  = 'isempty'; 

    protected $_messageTemplates = array(
      self::INVALID => "Email is in invalid format", 
      self::EMAILISEMPTY => "You have to fill email field" 
     ); 

    public function isValid($value){ 
     $response = parent::isValid($value); 
     if(!$response){ 
      $this->_message = array(self::INVALID => "Please enter a valid email address"); 
     } 
     return $response; 
    } 
} 
?> 

答えて

1

あなたはZend_Formのオブジェクト内から$this->addElement()を呼び出すと、それはむしろ、作成したばかりの要素よりも、フォームオブジェクト自身を返します。

あなたは、次のいずれかの変更を行うことができます - > _メッセージ

$this->addElement('text', 'email', ...); 
$email = $this->getElement('email'); 
$email->addValidator(...); 

// or 

$email = new Zend_Form_Element_Text('email'); 
$email->addValidator(...) 
     ->setLabel(...) 
     ->setRequired(...); 
$this->addElement($email); 

はあなたのエラーメッセージを設定するには、私はあなたがこの代わりに$これを設定するのでやるべきだと思います。あなたのクラスはメッセージのみを上書きするZendの電子メールのバリデータを拡張しているように見えるので

$this->_error(self::INVALID); 

、あなたはこのようなZendのメッセージをオーバーライドして、クラスを拡張する必要はありませんすることができます。これは私のプロジェクトのバリデーターから取られているので、余分なものは無視して、EmailAddressバリデータのメッセージに注意してください。

$this->addElement('text', 'email', array(
     'label' => 'Email Address:', 
     'required' => false, 
     'filters' => array('StringTrim', 'StringToLower'), 
     'validators' => array(
      array('EmailAddress', true, array(
       'messages' => array(
        Zend_Validate_EmailAddress::INVALID_FORMAT => 
        "'%value%' is not a valid email address. Example: [email protected]", 
        Zend_Validate_EmailAddress::INVALID_HOSTNAME => 
        "'%hostname%' is not a valid hostname for email address '%value%'" 
       ) 
      )), 
      array('Db_RecordExists', true, array(
       'table' => 'accounts', 'field' => 'email', 
       'messages' => array(
        Zend_Validate_Db_RecordExists::ERROR_NO_RECORD_FOUND => 
        "No account with that email address was found" 
       ) 
      )) 
     ), 
     'decorators' => $this->elementDecorators 
    )); 
+0

drew010、あなたは絶対に正しいです!私はあなたの答えを受け入れるつもりです、今、私のバリデーターが呼び出されたからです。私のカスタムエラーメッセージを返すことができない理由を教えてもらえますか? '有効なメールアドレスを入力してください'と表示する代わりに、$ this - > _ message = array(self :: INVALID => "有効なメールアドレスを入力してください");表示されるのはデフォルトのZend Frameworkメッセージです。配列([email] => Array([0] => emailAddressInvalidFormat [1] => emailAddressInvalidFormat)[pswd] => Array()[submit] => Array()) – stevepop

+0

@stevepop 2番目の質問に答えるために私の答えを更新しました。希望が役立ちます。そうでない場合や、ご不明な点がありましたら、お気軽にコメントしてください。 – drew010

+0

HI drew010、新しい追加ありがとう。私はそれを試みたが、私はフォーム上でこのエラーが発生し続ける。 'メッセージ:無効なバリデータがaddValidatorに提供されました。文字列またはZend_Validate_Interface 'でなければなりません。なぜ私は文字列やオブジェクトとして 'EmailAddress'を見ていないのですか? Zend_Validate_EmailAddressを最初にインスタンス化してから、setMessages()を呼び出してメッセージの配列を渡すと、私はそれを動作させることができる唯一の方法であることが分かります。しかし、あなたのために上記の作品が、なぜ私はそのエラーを取得するのですか? – stevepop

関連する問題