2

环境: Apache 2.4 Windows 8 PHP 5.4.14 Zend 1.12

我在我的表单上做了一个非常非常非常简单的操作,在我的一个元素上添加了一条错误消息:

$form->getElement('elemetnid')->addError('error'); 

它对其他人产生了奇迹,但就我而言,它发出警告,内容如下:

Warning: Invalid argument supplied for foreach() in ...\library\Zend\Form\Element.php on line 2247

这只发生在我尝试在 MultiSelect 元素上设置错误时,但如果我在另一个元素(如 Text)上这样做,那么一切都很好,并且不会发出警告。所以我去检查警告上的行,并意识到问题是该元素的“getValue()”返回“NULL”,这不是框架代码中 foreach 循环的正确值。但那是我的责任吗?

我的问题是,如果有人知道如何在不弹出此警告的情况下为 multiSelect 添加错误消息。

谢谢

4

1 回答 1

1

我无法重新创建您的错误:Apache 2.2.16、Php 5.3.7 和 Zf 1.12.5。

不过,这种行为相当奇怪。如果我在验证表单之前使元素无效(通过向元素添加错误),看起来它会使表单验证短路,并且错误消息不会应用于表单输出。

如果我尝试通过 URL 强制输入一个无效值,一个不在我的多选中的值,我会收到重复的错误消息,并且我之前设置的错误消息会覆盖在 haystack 消息中找不到“X”。

$form = new Zend_Form;
$form->setMethod('GET');

$listOptions = array('one','two', 'three');
$select = new Zend_Form_Element_Multiselect('options', array(
        'multiOptions' => $listOptions,
         'validators'   => array(
                array('InArray',
                      false,
                      array(array_keys($listOptions)))
            )
    ));
$submit = new Zend_Form_Element_Submit('submit', array(
        'label' => 'Do something'
    ));
$form->addElements(array($select, $submit));

if(isset($_GET) && count($_GET)) {
    if(true)
        $select
            ->addError('The form will never validate.')
            ->addError('Two wrongs don\'t make a right.');

    $form->isValid($_GET);
}

$form->setView(new Zend_View);
echo $form;

if ($form->isErrors()) {
    echo 'Form did not validate';
    var_dump($form->getErrors());
}
于 2014-03-07T17:10:32.223 回答