如何在zf2中的排除条件的运行时添加Db \ NoRecordExists过滤器?

时间:2014-05-05 10:44:19

标签: php zend-framework2 zend-inputfilter

如何在 zf2 中添加 Db \ NoRecordExists 输入过滤器,以便它可以通过匹配数据库中的值(不包括我们正在编辑的条目)来验证发布的数据。

$validator = new Zend\Validator\Db\NoRecordExists(
    array(
        'table' => 'users',
        'field' => 'username',
        'exclude' => array(
            'field' => 'id',
            'value' => $user_id
        )
    )
);

这对我不起作用.. !!

2 个答案:

答案 0 :(得分:2)

我找到了解决这个问题的方法。基本上,默认的NoRecordExists验证器期望在配置参数中排除值和列。这可以在控制器中更改为mentioned by Ritesh;我玩了一会儿并得到了这个解决方案。

我正在使用isValid函数中可用的上下文数组变量。您不必发送id值,而是发送表单字段的值以从

中选取 在InputFilter中

你有以下

$this->add ( array (
    'name'  => 'user_email',
    'required' => true,
    'filters' => array (
        array ( 
            'name' => 'StringTrim',
        ),
        array ( 
            'name' => 'StripTags',
        ),
    ),
    'validators' => array (
        array (
            'name' => 'EmailAddress',
            'options' => array (
                'domain' => true,
            )
        ),
        array (
            'name' => 'Application\Validator\NoRecordExists',
            'options' => array (
                'table' => 'user',
                'field' => 'user_email',
                'adapter' => \Zend\Db\TableGateway\Feature\GlobalAdapterFeature::getStaticAdapter( ),
                'exclude' => array(
                    'field' => 'user_id',
                    'formValue' => 'user_id',
                ),
            )
        ),

    )
) );

在表单中放置一个隐藏元素user_id;在检查元素是否有效时使用设置的值。

<?php

namespace Application\Validator;

class NoRecordExists extends \Zend\Validator\Db\NoRecordExists {

    public function isValid( $value, $context=array( ) ) {

        $exclude = $this->getExclude();

        if( is_array( $exclude ) ){
            if ( array_key_exists( 'formValue', $exclude ) ) {
                $formValue = $exclude[ 'formValue' ];
                $exclude[ 'value' ] = $context[ $formValue ];
                $this->setExclude( $exclude );
            }
        }

        return parent::isValid( $value );

    }

}

希望这有帮助

答案 1 :(得分:0)

要实现此目的,请在您的控制器中尝试此操作,并从模型中删除无记录存在的验证:

private function getUserTable()
{
    if (!$this->stateTable) {
        $sm = $this->getServiceLocator();
        $this->userTable = $sm->get('Admin\Model\UserTable');
    }

return $this->userTable;
}

在编辑操作中添加以下行 -

$user = $this->getUserTable()->getUser($id);

$user->getInputFilter()->get('username')->getValidatorChain()->attach(new \Zend\Validator\Db\NoRecordExists(array('table' => 'users','field' => 'username','adapter' => $this->getServiceLocator()->get('Zend\Db\Adapter\Adapter'), 'exclude' => array('field' => 'id','value' => $id))));

其中$ id是您正在执行编辑的当前用户ID .. !!它对我来说很完美.. !!