【问题标题】:How does one create a validator that depends on more than one value for Zend_Form?如何创建一个依赖于多个 Zend_Form 值的验证器?
【发布时间】:2011-11-07 06:12:34
【问题描述】:

我有一个包含单个文本字段的表单(用于公司):

class Cas_Form_Company extends Zend_Form
{

    public function init()
    {
        $this->addElement('hidden', 'id');
        $this->addElement('text', 'name', array('label' => 'Name'));
        $this->addElement('submit', 'submit', array('label' => 'Create'));

        $name = $this->getElement('name');
        $name->addValidator('stringLength', false, array(2,45));
        $name->addValidator(new Cas_Model_Validate_CompanyUnique());

        $this->setMethod('post');
        $this->setAction(Zend_Controller_Front::getInstance()->getBaseUrl() . '/Company/Submit');
    }

    public function SetFromExistingCompany(Cas_Model_Company $company)
    {
        $this->getElement('id')->setValue($company->GetId());
        $this->getElement('name')->setValue($company->GetName());
        $this->getElement('submit')->setLabel('Edit');
        $this->addElement('submit', 'delete', array('label' => 'Delete', 'value' => 'delete'));
    }

    public function Commit()
    {
        if (!$this->valid())
        {
            throw new Exception('Company form is not valid.');
        }

        $data = $this->getValues();
        if (empty($data['id']))
        {
            Cas_Model_Gateway_Company::FindOrCreateByName($data['name']);
        }
        else
        {
            $company = Cas_Model_Gateway_Company::FindById((int)$data['id']);
            $company->SetName($data['name']);
            Cas_Model_Gateway_Company::Commit($company);
        }
    }
}

我还创建了一个小验证器,强制我希望公司拥有唯一的名称:

class Cas_Model_Validate_CompanyUnique extends Zend_Validate_Abstract
{
    protected $_messageTemplates = array(
        'exists' => '\'%value%\' is already a company.'
    );

    /**
     * @param string $value
     * @return bool
     */
    public function isValid($value)
    {
        $this->_setValue($value);
        $company = Cas_Model_Gateway_Company::FindByName($value);
        if ($company)
        {
            $this->_error('exists');
            return false;
        }

        return true;
    }
}

现在,这非常适合创建新公司。当我想允许编辑公司时,问题就来了。这是因为对于编辑操作,虽然公司名称需要是唯一的,但包含已经与给定 ID 相关的名称的表单根本不是编辑(因此是有效的)。也就是说,如果该名称在数据库中尚不存在,或者给定的名称与已分配给该 ID 的名称匹配,则该表单有效。

但是,将其编写为验证器似乎有问题,因为验证器只获取它正在处理的值,而不是相关 ID。

如何为这类事情编写验证器?

【问题讨论】:

标签: zend-framework zend-form zend-validate


【解决方案1】:

您可以将记录不充分的第二个$context 参数用于isValid()

查看http://framework.zend.com/manual/en/zend.form.elements.html#zend.form.elements.validators 并向下滚动到注释“验证上下文”

【讨论】:

  • 不! Zend 框架?记录不充分?我从来没有猜到。谢谢!
【解决方案2】:

我认为此链接可能会对您有所帮助。 Zend Form Edit and Zend_Validate_Db_NoRecordExists

您必须对用户 Db 不存在记录,但要进行编辑,您可以在验证中指定排除属性。

【讨论】:

    猜你喜欢
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 2010-10-06
    • 1970-01-01
    相关资源
    最近更新 更多