2

'正在尝试在表单中使用 setBelongsTo,但 Zend 不验证值并且不 setDefaults 该字段。在谷歌上搜索过,什么也没找到。任何想法?

形式:

$this->setName('form_tecnicos')
         ->setAttrib('onSubmit',"return validarForm()");



    $elementos['nome'] = new Zend_Form_Element_Text('nome');
    $elementos['nome']->setLabel('Nome')
        ->setRequired(true)
        ->setAttrib('maxlength','150');


        $elementos['telefone0'] = new Zend_Form_Element_Text('0');
        $elementos['telefone0']->setLabel('Telefones')
           ->setRequired(true)
           ->setAttribs(array('mascara'=>'tel','maxlength'=>14))
           ->setBelongsTo('telefones');

        $elementos['telefone1'] = new Zend_Form_Element_Text('1');
        $elementos['telefone1']->setLabel('Telefones')
           ->setRequired(true)
           ->setAttribs(array('mascara'=>'tel','maxlength'=>14))
           ->setBelongsTo('telefones');

$elementos['submit'] = new Zend_Form_Element_Submit('Entrar');
        $elementos['submit']->setLabel('Entrar');

    $this->addElements($elementos);

    $filters = array('StringTrim');
    $this->setElementFilters($filters);

    $this->setElementDecorators(array(
            'viewHelper',
            'Errors',
            array(array('data'=>'HtmlTag'), array('tag' => 'dd')),
            array('Label',array('tag'=>'dt')),
            array(array('row'=>'HtmlTag'),array('tag'=>'div','class'=>'grid_2'))
    ));


    $remover_label = array('submit');

    foreach($remover_label as $elementos)
        $this->$elementos->removeDecorator('label');

控制器

$form = new Application_Form_Tecnicos();
   $this->view->form = $form;

   if($this->getRequest()->isPost()):
        $dados = $this->getRequest()->getPost();

        if($form->isValid($dados)):
            //
        else:                   
            $form->setDefaults($dados);
        endif;
   endif;

打印_r($dados)

Array ( [nome] => [telefones] => Array ( [0] => (11) 1111-111 ) [Entrar] => Entrar )

我坚持下去

4

1 回答 1

2

您有两个问题实际上与setBelongsTo. 如果您只想要简短的答案,请将表单代码的相关部分更改为有效的:

$elementos['nome'] = new Zend_Form_Element_Text('nome');
$elementos['nome']->setLabel('Nome')
    ->setRequired(true)
    ->setAttrib('maxlength','150');

$elementos['telefone0'] = new Zend_Form_Element_Text('telefone0');
$elementos['telefone0']->setLabel('Telefones')
    ->setRequired(true)
    ->setAttribs(array('mascara'=>'tel','maxlength'=>14))
    ->setBelongsTo('telefones');

$elementos['telefone1'] = new Zend_Form_Element_Text('telefone1');
$elementos['telefone1']->setLabel('Telefones')
    ->setRequired(true)
    ->setAttribs(array('mascara'=>'tel','maxlength'=>14))
    ->setBelongsTo('telefones');

这是更长的解释:

有两种方法可以将表单元素添加到 Zend Form 对象。您可以实例化相关的表单元素对象并将其添加到表单中:

$form->addElement(new Zend_Form_Element_Text('name'));

或者您可以使用相关参数调用 addElement 并让它为您创建对象:

$form->addElement('text', 'name');

如果您使用第一种方法,它会从对象中获取元素名称。如果使用第二个,则将名称作为第二个参数传入。该名称是 Zend_Form 在内部用来存储元素的名称,也是它知道哪些提交的数据与哪个元素相关的方式。

当您一次添加所有元素时addElements(),它将使用数组键(如果非数字)作为名称。所以你的第一个问题是:

$elementos['telefone0'] = new Zend_Form_Element_Text('0');

将 name 存储为telefone0,但实际的表单元素使用 name 0。因此,当提交表单时,它总是验证失败,因为 Zend_Form 期望数据位于$_POST['telefone0'].

你的第二个问题要简单得多。表单元素名称需要用作 PHP 变量,因此您不能使用数字名称(例如电话字段的 0 和 1)。

在上面的工作代码中,所需要的只是更改两个电话元素的名称以匹配 in 的键$elemntos,从而解决了这两个问题。

于 2012-06-30T22:22:59.853 回答