2012-02-28 7 views
0

User MapperクラスuserExist($username)に1つの関数を書いていますが、return trueのユーザー名はデータベーステーブルに存在しません。 Zend_Formを拡張したAdd_User_Formクラスでこの関数を使いたいと思います。Zend Form Validatorコールバック:ユーザー名を除外する方法?

私が使用したい:

$username = $this->createElement('text','username'); 
$username->setLabel('Username:') 
     ->addValidator('Callback', true, array('callback'=>userExist???)); 

私はコールバック関数としてマッパークラスuserExist($username)機能を使用することはできますか? 私の実装に間違っていることを教えてください。ユーザーが既に登録されている場合にエラーメッセージを表示し、フォームの送信を防ぎたいだけです。

ありがとうございます。

$element->addValidator('Db_NoRecordExists', true, array('users', 'username')) 

Db_NoRecordExistsあなたはレコードがデータベースの特定のテーブルに存在するかどうかをチェックすることができます:

答えて

2

代わりにコールバックバリデータを使用して、あなたは標準バリデータを使用することができます。

ユーザがプロファイルを編集する場合は、以外のレコードが存在するかどうかを確認することができます。。その後、あなたは次のように同じバリデータを使用する必要があります。これらの例では

$where = array('users', 'username', array('field' => 'username', 'value' => $username)); 
$element->addValidator('Db_NoRecordExists', true, $where) 

を、usersは、データベースのテーブルの名前です。 usernameはカラム名、除外するユーザ名は$usernameです。

+0

Hey @Liyali私はzend form abstractを拡張したクラスの中にいます。その値$ usernameを取得するにはどうすればよいですか?もし愚かな質問を申し訳ありません。 –

+0

どういう意味ですか?私はあなたがZend_Formについて話していると思います。 '$ username'は現在のユーザのユーザ名です。コンストラクタを使ってフォームに渡すことができます。ユーザーの存在を確認しようとしているだけの場合は、これを使用する必要はありません。 – Liyali

+0

新しいユーザーを追加していますか? ($ form-> isValid($ request-> getPost()))すべてがこのisvalidメソッドによって処理されます。だから私はどのように私はユーザフォームクラスを追加するユーザー名の値を入力することができます。$ this-> getValue( 'username')を使用して取得できますか? –

1

少し遅れていますが、これはあなたの質問に対する可能な回答かもしれません。

日付要素の例:

私は同じフォームクラスのメソッドを呼び出すカスタムコールバックバリでの日付要素を作成しました。あなたはそれでカスタムバリデータを使用して独自のクラスを持っている場合

// Date picker from 
$datePickerFrom = new Zend_Form_Element_Text('date_picker_from_date'); 
$datePickerFrom->setRequired(true) 
    ->setDecorators($this->elementDecorators) 
    ->setLabel('Valid From') 
    ->addFilter('StripTags') 
    ->addFilter('StringTrim') 
    ->setValue(date("d/m/Y",strtotime(Zend_Date::now()))) 
    ->addValidator('Callback',true, array('callback' => array($this, 'dateCheck')); 
$datePickerFrom->getValidator('Callback')->setMessage("'%value%' Cannot be in the past."); 
$this->addElement($datePickerFrom); 

は、あなたがこれを行うことができます:

public function dateCheck($value, $elements, $option) 
{ 
    $now = new DateTime(); 
    $fromDate = new DateTime(str_replace('/', '-', $elements['date_picker_from_date']));   

    if ($fromDate < $now) { 
     $this->getElement('date_picker_from_date')->getValidator('Callback')->setMessage("'%value%' Cannot be in the past."); 
     return false; 
    } else (SomethingElse) { 
      $this->getElement('date_picker_from_date')->getValidator('Callback')->setMessage("Some other message."); 
    } 

    return true; 
} 

:同じフォームクラスで

$myValidatorClass = new \SomeValidaotrClass(); 
->addValidator('Callback',true, array('callback' => array($myValidatorClass, 'dateCheck')); 

を私はカスタム検証メソッドを作成しましたまたは、自分のクラスを使用している場合:

class SomeValidaotrClass 
{ 
    public function dateCheck($value, $elements, $option) 
    { 
     // Validation code... 
    } 
} 

メソッドがpublicでない場合、コールバックはメソッドを見つけられません。

関連する問題