Zend表单警告:htmlspecialchars()...当Element_Text设置为数组时

时间:2012-03-01 11:34:18

标签: zend-framework warnings zend-form zend-form-element

我会尽量保持清醒。 我正在使用带有文本元素的zend表单,该文本元素使用 - > setIsArray(true);

$submenu2 = new Zend_Form_Element_Text('submenu2');
$submenu2->setValue('Sous menu 2')
     ->setIsArray(true)
     ->setAttrib('class', 'cloneSub')
     ->setAttrib('id', 'sub1')
     ->setAttrib('onFocus', 'javascript:myFocus(this); return;')
     ->setAttrib('onBlur', 'javascript:myBlur(this); return;');
$this->addElement($submenu2);

我将元素设置为数组,因为我使用javascript动态添加新元素 在html中,它意味着:

<input type="text" name="submenu2[]" />

我的问题:当我提交表单时,它会产生以下错误

  

警告:htmlspecialchars()要求参数1为字符串,数组在第905行的/usr/local/zend/share/ZendFramework/library/Zend/View/Abstract.php中给出

在网上到处查找后,我找到了原因,但没有找到解决方案。这是由于zend_form :: isValid()使用的_escape()方法,它只是期待字符串。

我在Rob Allen的DevNotes中找到了解决方案的开始:

  

http://akrabat.com/page/29/?flattrss_redirect&id=31&md5=b369e042145cc83b1dd4b0031132b801

查看以下部分:“简单的Zend_Form文件上载示例重新访问”

但是当我尝试弯曲代码来解决我的问题时,它会产生以下错误:

  

致命错误:在...中找不到“App_Form_Element_Text”类

顺便说一句,如果只是尝试将数据填充到同一类型的字段中,我会遇到同样的问题。

有没有人有任何想法? 非常感谢。



UPDATE:

$submenu2 = new Custom_Elements_ArrayElement('submenu2');
$submenu2->setValue('Sous menu 2')
     ->setIsArray(true)
     ->setAttrib('class', 'cloneSub')
     ->setAttrib('id', 'sub1')
     ->setAttrib('onFocus', 'javascript:myFocus(this); return;')
     ->setAttrib('onBlur', 'javascript:myBlur(this); return;');
$this->addElement($submenu2);

我在“APPLICATION_PATH”/../library/Custom/Elements“中创建了你给我的课程 我明白了:

  

致命错误:未找到“Custom_Elements_ArrayElement”类

2 个答案:

答案 0 :(得分:2)

以下是example

创建自己的元素类型,接受一组值,和 然后是一个装饰器,它将输出各种输入项。

class My_Element_ArrayElement extends Zend_Form_Element 
{ 
    public function init() 
    { 
        $this->addPrefixPath('My_Decorator', 'My/Decorator/', 'decorator'); 
    } 

    public function setValue($value) 
    { 
        $this->_value = (array) $value; 
    } 

    public function getValues() 
    { 
        return $this->_value; 
    } 


    public function loadDefaultDecorators() 
    { 
        if ($this->loadDefaultDecoratorsIsDisabled()) { 
            return; 
        } 

        $decorators = $this->getDecorators(); 
        if (empty($decorators)) { 
            $this->addDecorator('ArrayElement'); 
        } 
    } 

} 

class My_Decorator_ArrayElement extends Zend_Form_Decorator_Abstract 
{ 
    public function render($content) 
    { 
        $element = $this->getElement(); 
        $view    = $element->getView(); 
        $markup  = ''; 
        $name    = $element->getName() . '[]'; 

        foreach ($element->getValues() as $value) { 
            $markup .= $view->formHidden($name, $value) . "\n"; 
        } 

        $separator = $this->getSeparator(); 
        switch ($this->getPlacement()) { 
            case 'PREPEND': 
                return $markup . $separator . $content; 
            case 'APPEND': 
            default: 
                return $content . $separator . $markup; 
        } 
    } 
} 

答案 1 :(得分:0)

该代码忘记了getValues函数。此外,请务必删除ViewHelper装饰器。 至于你的元素没有被找到,你需要将它添加到你的类路径然后可能

$this->addPrefixPath(
                     'Custom_Zend_Form_Element', 
                     'Custom/Zend/Form/Element', 
                     'element'
                   );