2009-02-03 2 views
2

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

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)); 
    } 
} 

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

Here is the effect I'm talking about

This isn't me, but he's got the same question and maybe worded it better

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

Спасибо!

+0

Можете ли вы опубликовать прецедент или более подробную информацию о том, когда/почему вы хотите/должны иметь страницы 1, стр. 2 и т. Д.? – cbrulak

+0

Я отправил пример страницы – 2009-02-03 23:36:10

ответ

0

Подсказка для выполнения вашей задачи может заключаться в определении скрытого ввода, в котором вы можете увеличивать свой «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; 
} 
+0

, заинтересованной в аспекте dhtml или javascript. Без загрузки страницы – 2009-02-04 02:09:40

+0

Что значит? –

0

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

$element->setIsArray(true); 

создать HTML, как этот

name="foo[]" id="foo" 
2

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

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

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

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