如何在Zend \ Form中创建单独的元素并为它们设置选项

时间:2012-12-25 02:47:57

标签: zend-form zend-framework2

我想将它们创建为对象,然后分配选项,如:

$name = new Zend\Form\Element\Text('name');
$name->setLabel('Your name:');
$name->setRequired(true); // does not work?
$this->add($name);

如何设置“必需”选项,如何设置验证器? Framework为setRequired()创建了异常“No method exists”。

P.S。我真的不想使用数组样式,当你在一个数组中有大量代码时,它会非常烦人。我的意思是:

$this->addElement('text', 'email', array(
        'label'      => 'Your email address:',
        'required'   => true,
        'filters'    => array('StringTrim'),
        'validators' => array(
            'EmailAddress',
        )
    ));

2 个答案:

答案 0 :(得分:2)

你误解了一件事,默认情况下验证器不是元素的一部分。

如果您希望元素本身包含一些验证器。您需要使元素实现InputProviderInterface,例如

use Zend\Form\Element;
use Zend\InputFilter\InputProviderInterface;
class MyElement extends Element implements InputProviderInterface
{
    public function getInputSpecification()
    {
        $spec = array(
            'name' => $this->getName(),
            'required' => true,
            'validators' => array(
                'EmailAddress',
            )
        );

        return $spec;
    }
}

当表单验证开始时,表单的InputFilter将从表单元素中收集所有验证器并合并到最终验证器中。

但是,您也可以通过句柄形式InputFilter添加/删除表单验证器:

$form = new \Zend\Form\Form();
$form->add($yourElement);
$filter = $form->getInputFilter();
$filter->remove('email');
$filter->add(array(
    'name' => 'email',
    'required' => true,
    'validators' => array (
        'EmailAddress'
    ),
));
$form->setInputFilter($filter);
$form->setData(array(
    'email' => 'abc',
));
$form->prepare();
echo $form->isValid();
print_r($form->getMessages());

答案 1 :(得分:0)

Zend表单选项setRequired只有带有选项验证器的worknig。你必须像这样定义这个元素的验证规则。

$this->review->addValidators(

array('NotEmpty',true, array( 'messages' => array( 'isEmpty' => "Please enter product Review.") ) )

);