Обработка Zend_Form динамически генерируемых элементов - PullRequest
0 голосов
/ 22 июня 2011

Мне нужно создать форму, в которую элементы (texbox, select, ..) будут динамически вставляться.Прямо сейчас я создал пустой файл формы с просто скрытым элементом, и они в моем контроллере. Я иду вставлять элементы в соответствии с определенными условиями.

Мой файл формы:

class Form_Questions extends Zend_Form {
    public function __construct()  {
        parent::__construct($options);
        $this->setName('Questions');

        // Hidden Label for error output        
        $hiddenlabel = new Zend_Form_Element_Hidden('hiddenlabel');
        $hiddenlabel->addDecorator(new Form_Decorator_HiddenLabel());

        $this->addElements( array($hiddenlabel) );
   }
}

В контроллереУ меня есть что-то вроде:

...

$form = new Form_Questions();       
$request = $this->getRequest();

if ($request->isPost())
{
  $formData = $request->getPost();

  if ($form->isValid($request->getPost()))
  {
    die(var_dump($form->getValues()));
  }
}
else
{
  //... add textbox, checkbox, ...

  // add final submit button
  $btn_submit = new Zend_Form_Element_Submit('submit');
  $btn_submit->setAttrib('id', 'submitbutton');
  $form->addElement($btn_submit);

  $this->view->form = $form;
}

Форма отображается нормально, но проверка доставляет мне большие проблемы.Мой var_dump () показывает только скрытый элемент, который статически определен в файле формы.Он не сохраняет динамические элементы, поэтому, хотя я могу заставить их читать, что происходит через POST, я не могу сделать что-то вроде

$form->getValue('question1');

Это ведет себя так, как если бы Zend использовал файл Form для хранения значений при отправкеслучается, но поскольку элементы создаются динамически, они не сохраняются (ни их значения) после публикации, поэтому я не могу обработать их, используя стандартный метод getValue ().

Буду признателен за любые идеи о том, как сделатьони «живут» до публикации, поэтому я могу читать их как в обычном виде.

Ответы [ 3 ]

1 голос
/ 22 июня 2011

Форма, для которой вы вызываете методы isValid() и getValues(), на самом деле является вашей "пустой" формой - вы создали ее всего несколькими строками и не добавили в нее никаких элементов.

Помните, что POST отправляет только массив типа fieldName => fieldValue, фактически он не отправляет объект Zend_Form.

Трудно предложить новое решение, не зная, чего вы пытаетесь достичь.Как правило, лучше сразу добавить все возможные элементы в ваш Zend_Form, а затем использовать только те, которые вам нужны в скриптах вида, т.е. echo $this->form->myField;.Это позволит isValid() обрабатывать все элементы формы.

0 голосов
/ 24 июня 2011

Хорошо, самое простое решение, которое я придумал, - для моего случая и учитывая реальный код, с которым я сейчас играю, - это загрузить все вопросы, которые мне нужны, из базы данных, используя метод из моей Модели (что-то вроде fetchQuestions)), они в моем контроллере проходят через набор записей и создают элементы формы в соответствии с текущим вопросом набора записей.Элементы укладываются в массив, который передается моему конструктору Form.В конструкторе формы я читаю массив и генерирую все динамические элементы.Я просто повторил форму в представлении.

Мне не кажется, почему было бы плохой идеей переопределить конструктор Form, так как я также не мог использовать какой-либо из методов set / get, чтобы передать это моемуформа.

0 голосов
/ 22 июня 2011

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

Если предположить, что это так, тоЯ бы не добавил поля вопросов в контроллере.Вместо этого я передаю вопросы в форму в конструкторе, а затем добавляю поля вопросов и валидаторы в метод init() формы.Затем в контроллере, просто стандартная обработка isPost() и isValid() после этого.

Или, если вы говорите, что вопросы, которые будут добавлены в форму, каким-то образом являются следствием скрытой подписи,возможно, вам нужны две формы и два действия: одно для скрытой формы поля, а другое для вопросов.

...