3

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

しかし、それでもこれは機能していません

4

2 に答える 2

2

この問題を解決する簡単な方法の1つは、フォームの編集時にそのフォーム要素からバリデーターを削除することです。また、電子メールをデータベースにすでに存在するものに変更することはできないため、電子メールアドレスを変更しようとしている場合は、バリデーターを保持することをお勧めします。

クラスにバリデーターを残し、ユーザーが編集されているときにのみ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、フォームが編集されているときに、フォーム要素からバリデーターを削除します。変更が許可されている場合は、メールアドレスを変更しようとしない場合に限ります。

于 2012-09-15T07:31:40.447 に答える
1

検証を使用しているため、電子メールがDBテーブルに存在するかどうかに関係なく、常にこのエラーが発生します。

しかし、電子メールはデータベースに存在するため、エラーが発生します。

この検証を削除すると、役に立ちます。

if(isset($_SESSION['session_id']))
{
     // code for update query
}
else
{
     // code for insert query
}
于 2012-09-15T06:03:34.103 に答える