2012-02-28 75 views
0

我在用戶映射器類userExist($username)中寫了一個函數,其return true如果我的數據庫表中不存在相同的用戶名。現在我想在擴展Zend_Form的Add_User_Form類中使用這個函數。Zend表單驗證器回調:如何排除用戶名?

我想用:

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

我可以使用映射類userExist($username)功能回調函數? 如果我在執行中遇到問題,請告訴我。如果用戶已經註冊並阻止表單提交,我只想顯示錯誤消息。

謝謝。

回答

2

而不是使用回調驗證的,你可以使用標準驗證

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

Db_NoRecordExists允許你檢查你的數據庫的特定表中是否有記錄。

如果用戶想要編輯他的配置文件,您可能想要檢查一條記錄是否存在,除了它本身。那麼你應該使用相同的驗證如下:

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

在這些例子中,users是數據庫表的名稱。 username是您的列名,$username是您想要排除的用戶名。

+0

嘿@Liyali我在擴展zend窗體抽象類的內部。我怎樣才能得到這個值$用戶名?對不起,如果傻問題。 – 2012-02-28 13:28:16

+0

你是什麼意思?我想你在談論Zend_Form。 '$ username'只是當前用戶的用戶名,你可以使用它的構造函數將它傳遞給你的表單。請注意,如果您只是試圖檢查用戶是否存在,則不需要使用它。 – Liyali 2012-02-28 13:33:50

+0

請參閱我正在添加新用戶。我只使用如果($ form-> isValid($ request-> getPost()))全部由此isvalid方法處理。那麼我怎樣才能得到輸入的用戶名值呢,它添加了用戶表單類。我可以通過使用$ this-> getValue('username')來獲得它 – 2012-02-28 13:43:40

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); 

如果你有自己的類,在它的自定義驗證器,那麼你可以這樣做:

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

在我創建的自定義驗證方法相同的窗體類:

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; 
} 

或者如果您使用自己的班級:

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

如果方法不是public回調將不會找到它們。