Предупреждение о Zend Form: htmlspecialchars () ... когда Element_Text установлен как массив - PullRequest
0 голосов
/ 01 марта 2012

Я постараюсь быть максимально ясным.Я использую 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 будет строкой,массив, указанный в /usr/local/zend/share/ZendFramework/library/Zend/View/Abstract.php в строке 905

Просматривая всюду в Интернете, я нашел причину, но не решение.Это связано с тем, что метод _escape () использует zend_form :: isValid (), который ожидает только строки.

Я нашел начало решения в DevNotes Роба Аллена здесь:

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

. Посмотрите на раздел: «Пример загрузки простого файла Zend_Form: снова»

Но когда я пытаюсь согнуть код для разрешениямоя проблема, она генерирует мне следующую ошибку:

Фатальная ошибка: класс 'App_Form_Element_Text' не найден в ...

Кстати, я сталкиваюсь с той же проблемойесли просто попытаться заполнить данные в одно и то же поле.

У кого-нибудь есть идеи?Большое спасибо.

ОБНОВЛЕНИЕ:

$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 ]

2 голосов
/ 01 марта 2012

Вот пример :

Создайте свой собственный тип элемента, который будет принимать массив значений, и затем декоратор, который будет выводить различные элементы ввода.

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; 
        } 
    } 
} 
0 голосов
/ 28 марта 2012

Этот код забыл функцию getValues.Также обязательно удалите ViewHelper Decorator.Поскольку ваш элемент не найден, вам нужно добавить его в путь к классу, а затем, вероятно,

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