Zend表单重复条目电子邮件例外

时间:2014-08-05 07:49:54

标签: php zend-framework2

在视图中有一个注册zend表单如下所示:

<?php 
    $form = $this->form;
    if(isset($form)) $form->prepare();
    $form->setAttribute('action', $this->url(NULL,
    array('controller' => 'register', 'action' => 'process')));
    echo $this->form()->openTag($form);
?>
<dl class="form-signin">
<dd><?php
    echo $this->formElement($form->get('name_reg'));
    echo $this->formElementErrors($form->get('name_reg'));
?></dd>

<dd><?php
    echo $this->formElement($form->get('email_reg'));
    echo $this->formElementErrors($form->get('email_reg'));
?></dd>

<dd><?php
    echo $this->formElement($form->get('password_reg'));
    echo $this->formElementErrors($form->get('password_reg'));
?></dd>

<dd><?php
    echo $this->formElement($form->get('confirm_password_reg'));
    echo $this->formElementErrors($form->get('confirm_password_reg'));
?></dd>
<br>
<dd><?php
    echo $this->formElement($form->get('send_reg'));
    echo $this->formElementErrors($form->get('send_reg'));
?></dd>
<?php echo $this->form()->closeTag() ?>

和RegisterController如下。

<?php
namespace Test\Controller;


use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Zend\Session\Container; 

use Test\Form\RegisterForm;
use Test\Form\RegisterFilter;

use Test\Form\LoginFormSm;
use Test\Form\LoginFilter;

use Test\Model\User;
use Test\Model\UserTable;

class RegisterController extends AbstractActionController
{
    public function indexAction()
    {
        $this->layout('layout/register');
        $form = new RegisterForm();
        $form_sm = new LoginFormSm();
        $viewModel = new ViewModel(array(
                            'form' => $form,
                            'form_sm' =>$form_sm,
                            ));
        return $viewModel;
    }


    public function processAction()
    {
        $this->layout('layout/register');

        if (!$this->request->isPost()) {
            return $this->redirect()->toRoute(NULL,
                array( 'controller' => 'index'
                )
            );
        }
        $form = $this->getServiceLocator()->get('RegisterForm');    
        $form->setData($this->request->getPost());

        if (!$form->isValid()) {
            $model = new ViewModel(array(
                'form' => $form,
            ));
            $model->setTemplate('test/register/index');
            return $model;
        }       

        // Creating New User
        $this->createUser($form->getData());
        return $this->redirect()->toRoute(NULL, array (
            'controller' => 'auth' ,
            ));
    }

    protected function createUser(array $data)
    {
        $userTable = $this->getServiceLocator()->get('UserTable');
        $user = new User(); 
        $user->exchangeArray($data);
        $userTable->saveUser($user);
        return true;
    }
}

还是一个RegisterForm,其中声明了索引中显示的所有变量。还注册RegisterFilter如下:

<?php
namespace Test\Form;
use Zend\InputFilter\InputFilter;
class RegisterFilter extends InputFilter
{
    public function __construct()
    {
        $this->add(array(
            'name' => 'email_reg',
            'required' => true,
            'filters' => array(
                array(
                    'name' => 'StripTags',
                ),
                array(
                    'name' => 'StringTrim',
                ),
            ),
            'validators' => array(
                array(
                'name' => 'EmailAddress',
                'options' => array(
                    'domain' => true,
                    'messages' => array(
                            \Zend\Validator\EmailAddress::INVALID_FORMAT => 'Email address format is invalid'
                        ),
                    ),
                ),
                array(
                'name' => 'AbstractDb',
                'options' => array(
                    'domain' => true,
                    'messages' => array(
                            \Zend\Validator\Db\AbstractDb::ERROR_RECORD_FOUND => 'Current Email Already registered'
                        ),
                    ),
                ),
            ),
        ));
        $this->add(array(
            'name' => 'name_reg',
            'required' => true,
            'filters' => array(
                array(
                    'name' => 'StripTags',
                ),
                array(
                    'name' => 'StringTrim',
                ),
            ),
            'validators' => array(
                array(
                    'name' => 'StringLength',
                    'options' => array(
                        'encoding' => 'UTF-8',
                        'min' => 2,
                        'max' => 140,
                    ),
                ),
            ),
        ));
        $this->add(array(
            'name' => 'password_reg',
            'required' => true,
            'validators' => array(
                array(
                    'name' => 'StringLength',
                    'options' =>array(
                        'encoding' => 'UTF-8',
                        'min' => 6,
                        'messages' => array(
                            \Zend\Validator\StringLength::TOO_SHORT => 'Password is too short; it must be at least %min% ' . 'characters'
                        ),
                    ),
                ),
                array(
                    'name' => 'Regex',
                    'options' =>array(
                        'pattern' => '/[A-Z]\d|\d[A-Z]/',
                        'messages' => array(
                            \Zend\Validator\Regex::NOT_MATCH => 'Password must contain at least 1 digit and 1 upper-case letter'
                        ),
                    ),
                ),
            ),
        ));
        $this->add(array(
            'name' => 'confirm_password_reg',
            'required' => true,
            'validators' => array(
                array(
                    'name' => 'Identical',
                    'options' => array(
                    'token' => 'password_reg', // name of first password field
                    'messages' => array(
                            \Zend\Validator\Identical::NOT_SAME => "Passwords Doesn't Match"
                        ),
                    ),
                ),
            ),
        ));
    }
}

问题 我需要的是当有人试图注册并且该电子邮件已经注册时抛出一条消息。尝试使用 \ Zend \ Validator \ Db \ AbstractDb ,并在RegisterFilter中将以下验证器添加到电子邮件中,如下所示

array(
    'name' => 'AbstractDb',
    'options' => array(
        'domain' => true,
         'messages' => array(
             \Zend\Validator\Db\AbstractDb::ERROR_RECORD_FOUND => 'Current Email Already registered'
         ),
    ),
),

但这似乎不起作用。

问题:有没有办法在RegisterController中实现这个验证器?

其他

我已从RegisterFilert验证器中删除并放入Module.ph

'EmailValidation' => function ($sm) {
    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
    $validator = new RecordExists(
        array(
        'table'   => 'user',
        'field'   => 'email',
        'adapter' => $dbAdapter
        )
    );
return $validator;
},

从RegisterController

调用它
    $validator = $this->getServiceLocator()->get('EmailValidation');    
    if (!$validator->isValid($email)) {
        // email address is invalid; print the reasons
        $model = new ViewModel(array(
            'error' => $validator->getMessages(),
            'form' => $form,
        ));
        $model->setTemplate('test/register/index');
        return $model;
    }

当我在视图中使用print_r来检查它是否显示。

数组([noRecordFound] =&gt;未找到与输入匹配的记录)。

我想回应一下'找不到匹配输入的记录'。

固定 在RegisterController中修改如下

    $validator = $this->getServiceLocator()->get('EmailValidation');    
    $email_ch = $this->request->getPost('email_reg');
    if (!$validator->isValid($email_ch)) {
        // email address is invalid; print the reasons
        $model = new ViewModel(array(
            'error' => 'Following email is already registered please try another one',
            'form' => $form,
        ));
        $model->setTemplate('test/register/index');
        return $model;
    }

我比较了

if (!$validator->isValid($email_ch))

之前什么都没有,这就是为什么我需要先添加

$email_ch = $this->request->getPost('email_reg');

2 个答案:

答案 0 :(得分:0)

您无需在控制器中执行此操作,只需在RegisterFilter课程中尝试此操作:

首先:添加$sm作为_construct()方法的参数:

public function __construct($sm) {....}

第二名:用以下内容替换电子邮件验证:

$this->add (  array (
            'name' => 'email_reg',
            'required' => true,
            'validators' => array(
                    array(
                            'name'    => 'Zend\Validator\Db\NoRecordExists',
                            'options' => array(
                                    'table' => 'user',
                                    'field' => 'email',
                                    'adapter' =>  $sm->get ( 'Zend\Db\Adapter\Adapter' ),
                                    'messages' => array(
                                    NoRecordExists::ERROR_RECORD_FOUND => 'e-mail address already exists'
                                    ),
                            ),
                    ),
            ),

    )

    );

当您致电RegisterFilter时,请不要忘记在控制器中传递serviceLocator作为参数:

$form->setInputFilter(new RegisterFilter($this->getServiceLocator()));

假设您在global.php文件(config \ autoload \ global.php)中有此内容:

'service_manager' => array(
 'factories' => array(
 'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory',

),    ),

答案 1 :(得分:0)

根据您之前的请求,(&#34;我只想回应一下这一点&#39;找不到与输入匹配的记录&#39;&#34;)

$validator = $this->getServiceLocator()->get('EmailValidation');    
$email_ch = $this->request->getPost('email_reg');
if (!$validator->isValid($email_ch)) {
    // email address is invalid; print the reasons
      foreach ($validator->getMessages() as $message) {
           $msg = $message;
        }
    $model = new ViewModel(array(
        'error' => $msg,
        'form' => $form,
    ));
    $model->setTemplate('test/register/index');
    return $model;
}