Как проверить и отобразить динамически расширяемую Zend-форму - PullRequest
1 голос
/ 26 февраля 2012

Мне нужна помощь с моей динамически расширяемой формой Zend.

У меня есть форма с подчиненной формой, которая содержит два элемента:

<form>
  <fieldset class="itemGroup">
    <label>
      Question
      <input type="text"  name="items[questions][]" value="">
    </label>
    <label>
      Answer
      <input type="text"  name="items[answers][]" value="">
    </label>
  </fieldset>
</form>

Я получил ее с помощью следующей процедуры:

$itemsSubform = new Zend_Form_SubForm();
$form->addSubForm($itemsSubform, 'items');
$itemsSubform->setElementsBelongTo('items');

$itemQuestion = new Zend_Form_Element_Text('questions', array(
    'label' => 'Question',
    'isArray' => true,
    'filters' => array(
        'stringTrim',
    ),
    'validators' => array(
        array('stringLength', array('max' => 255)),
    ),
));

$itemAnswer = new Zend_Form_Element_Text('answers', array(
    'label' => 'Answer',
    'isArray' => true,
    'filters' => array(
        'stringTrim',
    ),
    'validators' => array(
        array('stringLength', array('max' => 255)),
    ),
));

$itemsSubform->addDisplayGroup(array($itemQuestion, $itemAnswer), 'itemGroup');

Если необходимо, я просто копирую весь набор полей для расширенной формы с помощью javascript.

Все работает правильно, пока я не отправлю форму.Во время валидации не проверяется ни один элемент, и во время рендеринга формы, заполненной такими данными, я получаю сообщение об ошибке из класса Zend_View_Abstract, что экранирующее значение является массивом вместо строки (этот метод вызывается во время рендеринга элемента для экранирования его значения).1012 * Для завершения, если я вызову $ form-> getValues ​​();после проверки (по javascript добавлен еще один набор полей) я получаю следующее:

Array
(
    [items] => Array
        (
            [questions] => Array
            (
                [0] => lorem
                [1] => dolor
            )

            [answers] => Array
            (
                [0] => ipsum
                [1] => sit
            )

        )

)

Может кто-нибудь посоветовать мне, как вести себя в форме?Идеальным решением было бы, когда сами формы проверяли каждое значение отдельно и находили, сколько раз он должен отображать fieldset (displayGroup).

1 Ответ

0 голосов
/ 27 февраля 2012

Сначала ваши элементы не проходят проверку, потому что вы установили isArray => TRUE, а выбранный вами валидатор вычисляет строки.

Далее у вас возникнет проблема с заполнением формы, которая, я полагаю, связана с тем фактом, что вам необходимо предоставить данные для заполнения в том же многомерном массиве, который создается формой (массивы должны отображаться один в один).

Ссылка ниже на пример того, как динамически построить форму, вы должны иметь возможность использовать ее в качестве шаблона для создания формы, удовлетворяющей вашим потребностям.

Примерсоздание элементов формы с циклом

...