Zend_Form + DHTML контент - PullRequest
       11

Zend_Form + DHTML контент

2 голосов
/ 04 февраля 2009

Какой лучший способ динамически добавлять NEW dhtml контент в форму, сгенерированную с помощью Zend_Form. Пример, скажем, форма создана так:

class formUser extends Zend_Form {
    public function __construct( $options = null ) {
        parent::__construct( $options );

        $page1 = new Zend_Form_Element_Text( 'page1' );
        $page1->setLabel( 'Page 1' );

        $submit = new Zend_Form_Element_Submit( 'submit' );
        $this->addElements( array( $page1, $submit ) );
    }
}

Здесь форма создает ОДИН и только ОДИН элемент, называемый "page1" , но что, если бы я хотел добавить кнопку "Добавить" в представление, которое бы динамически генерировало больше элементов , таких как page2, page3 , page4 и т. д. при интеграции его с Zend_Form?

Вот эффект, о котором я говорю

Это не я, но у него тот же вопрос, и, возможно, он сформулирован лучше

В моем случае, это на самом деле отношения детей и родителей. В этом районе у человека может быть 0 или 15 детей, и я не буду поднимать бровь.

Спасибо!

Ответы [ 4 ]

2 голосов
/ 06 февраля 2009

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

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

Вместо того, чтобы просто генерировать какую-то дополнительную разметку HTML, вам нужно будет выполнить Ajax-вызов на ваш сервер. Действие, вызываемое таким образом при нажатии кнопки «Добавить», изменит хранилище экземпляров Zend_Form в вашем сеансе. Вызов Ajax может затем вернуть либо дополнительную разметку для вставки, либо новую версию всей разметки формы.

В первом случае это будет зависеть от вашего кода JavaScript, чтобы гарантировать, что разметка будет вставлена ​​таким образом, чтобы отображение в браузере соответствовало представлению Zend_Form на сервере. В последнем случае - когда возвращается вся форма - пользовательский ввод должен был бы быть передан в вызове Ajax, или он был бы потерян, если форма заменена на новую версию.

1 голос
/ 22 марта 2009

реализация ответа "cg" найдена хорошо описанной здесь. http://www.jeremykendall.net/2009/01/19/dynamically-adding-elements-to-zend-form/

0 голосов
/ 04 февраля 2009

Я не думаю, что вам нужны какие-то специальные вещи Zend для решения этой проблемы - пример javascript, который вы разместили, добавит html на вашу страницу там, где вы хотите, а затем, когда вы отправите его, ваши данные будут опубликованы страница все та же. Просто следуйте схеме именования, которую вы используете при запуске. Вы даже можете использовать массив

$element->setIsArray(true);

для создания HTML, подобного этому

name="foo[]" id="foo"
0 голосов
/ 04 февраля 2009

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

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

Что-то вроде:

// PHP

$userForm = new formUser();

for ($i = 0; $i < $_POST['pageNumber']; ++$i)
{
  $element = new Zend_Form_Element_Text('page' . $i);
  $element->addValidator('SomeValidator');

  $userForm->addElement($element);
}

if ($userForm->isValid($_POST]) 
{
 // bla bla bla
}

// Javascript

function addNewInput ()
{
   pageNb = document.getElementbyId('pageNb').value;
   pageNb.value = ++pageNb;
   // here put the trick to create a new node/input element.
   newElement.id = pageNb.value;
}
...