2012-09-15 43 views
3

我正在基於Zend框架的項目工作。在用戶註冊時,我必須檢查唯一的電子郵件。我的代碼工作正常,當我註冊了用戶第一次,但是當我嘗試更新的用戶信息,並按下更新按鈕,它提供了錯誤信息:獨特的電子郵件檢查Zend框架不能正常工作

Email already taken 

請幫我解決這個問題。我的代碼被附加如下:

$this->addElement('text', 'email', array(
       'label'  => 'Your email address:', 
       'required' => true, 
       'filters' => array('StringTrim'), 
       'validators' => array(
         'EmailAddress', 
         array('Db_NoRecordExists', true, array(
           'table' => 'users', 
           'field' => 'email', 
           'messages' => array(
             'recordFound' => 'Email already taken' 
           ) 
         ) 
         ) 
       ) 
     )); 

我已經改變了我的控制器這樣的:

public function addAction() 
    { 
     $modelUsers = new Model_Users(); 
     $userId = $this->_getParam('userId'); 
     $form = $this->_getAddForm(); 

     if ($userId) {    
      $populateData = array(); 

      $user = $modelUsers->fetch($userId); 

      if ($user instanceof Model_User) { 
       $populateData = $user->toArray(); 
      } 

      $form->populate($populateData); 
     } 

     $request = $this->getRequest(); 

     if ($request->isPost()) { 
      $email = $this->getRequest()->getParam('email'); 
      if (strtolower(trim($email)) == $modelUsers->fetchByEmail($email)) { 
       // change $this->_user->getAccount()->getEmail() to retrieve the user's current email address 

       // remove validator from form 
       $form->getElement('email')->removeValidator('Db_NoRecordExists'); 
      } 

      $post = $request->getPost(); 

      if ($form->isValid($post)) { 
       $values = $form->getValidValues($post); 
       $data = array(
        'firstName'  => $values['firstName'], 
        'userTypeId' => 2, 
        'lastName'  => $values['lastName'], 
        'email'   => $values['email'], 
        'userName'  => $values['userName'], 
        'password'  => $values['password'], 
        'role'   => $values['role'] 
       ); 

       if ($userId) { 
        $user = $modelUsers->fetch($userId); 
        if ($user instanceof Model_User) { 
         $user->setFromArray($data); 
         $success = $user->save(); 
         if ($success) { 
          echo Zend_Json::encode(array('status' => self::STATUS_SUCCESS, 'message' => 'Successfully updated the user!')); 
          exit; 
         } 
        } 
       } else { 
        $user = $modelUsers->createRow($data); 
        $success = $user->save(); 
        if ($success) { 
         echo Zend_Json::encode(array('status' => self::STATUS_SUCCESS, 'message' => 'Successfully added the user!')); 
         exit; 
        } 

       } 
       echo Zend_Json::encode(array('status' => self::STATUS_FAILED, 'message' => 'user not added')); 
       exit;    
      } else { 

       $errors = array(); 
       $errors = $form->errors();    

       echo Zend_Json::encode(array('status' => self::STATUS_ERROR, 'data' => $errors)); 
       exit; 

      } 
     } 

     $this->view->form = $form; 
     $this->_helper->layout->disableLayout(); 

    } 

型號:

public function fetchByEmail($email) 
{ 
    $email=fetchOne('SELECT email FROM users WHERE email = $email'); 
    //$select->where('email=?',$email) ; 
    //$student = $this->fetchRow($select); 
    return $email; 
} 

但仍這是行不通的

+0

'$ userId'究竟來自哪裏? – RockyFord

+0

我想爲此編寫自定義驗證器類。但我不知道如何做到這一點:( – user1559230

回答

2

一個簡單的辦法是正在編輯的形式時,表單元素中刪除驗證。如果他們試圖更改他們的電子郵件地址,您可能還想保留驗證器,因爲他們不應該能夠將其電子郵件更改爲數據庫中已存在的電子郵件地址。

將您的Zend_Form課程中的驗證程序留下,僅在編輯用戶時才添加此代碼

if ($this->getRequest->isPost()) { 
    $email = $this->getRequest()->getParam('email'); // get email from form 

    // if email address has not changed, remove validator from form 
    if (strtolower(trim($email)) == $this->_user->getAccount()->getEmail()) { 
     // change $this->_user->getAccount()->getEmail() to retrieve the user's current email address 

     // remove validator from form 
     $form->getElement('email')->removeValidator('Db_NoRecordExists'); 
    } 

    // validate form 
    if ($form->isValid($this->getRequest()->getPost()) { 
     //... 
    } 
} 

那麼你正在做的是去除表單元素的Db_NoRecordExists驗證時,正在編輯的形式,只有當他們沒有試圖如果允許他們這樣做,以改變他們的電子郵件地址。

+0

我已經嘗試過你的解決方案,但它不起作用,我在帖子上附上了代碼,謝謝 – user1559230

+0

它不工作,因爲驗證程序沒有被刪除或你得到不同的錯誤?我不認爲你的fetchByEmail方法會起作用。如果他們改變他們的電子郵件,這將不會產生預期的效果。如果用戶已經登錄,則通過他們的ID而不是通過來自表單的電子郵件來獲取他們的電子郵件。 – drew010

1

它會給你通常會因爲使用驗證而出現此錯誤,該電子郵件是否存在於數據庫表中。

但電子郵件存在於數據庫中,這就是爲什麼它給出了錯誤。

刪除此驗證,它會幫助你。你可以解決這個問題

if(isset($_SESSION['session_id'])) 
{ 
    // code for update query 
} 
else 
{ 
    // code for insert query 
} 
+0

我不能刪除驗證。不允許重複輸入電子郵件 – user1559230

+0

當你使用插入語句的時候只使用驗證,更新時不要使用驗證。 –

+0

然後,我必須使用兩種不同的形式:一種是插入,另一種是更新,是不是? – user1559230