この記事を読みました: http://www.jeremykendall.net/2009/01/19/dynamically-adding-elements-to-zend-form/
それは非常に興味深く、うまく機能します。
同じことをする必要がありますが、サブフォームを使用します。つまり、ユーザーがボタンを押すと、ajax を介して、既存のフォームにサブフォームを追加、アタッチ、および表示するアクションを呼び出します。
例:
ユーザーが子供の名前と姓を入力する必要があるフォームがあるため、[子供を追加] ボタンがあります。ユーザーがそのボタンを押すと、サブフォームが既存のフォームに追加されて表示されます。送信すると、その記事の例とまったく同じように検証されます。唯一の違いは、そこに 1 つのフィールドを追加するだけであるということです。サブフォームを追加する必要がありますが、まったく同じ方法です。
アクションで次のことを試しました( Ajax によって呼び出されます):
public function clonerecursivegroupAction()
{
$this->_helper->layout->disableLayout();
$ajaxContext = $this->_helper->getHelper('AjaxContext');
$ajaxContext->addActionContext('clonerecursivegroup', 'html')->initContext();
$id = $this->_getParam('id', null);
$subform1 = new Zend_Form_SubForm();
$Element1 = $subform1->createElement('text', 'text1');
$Element1->setLabel('text1')->setRequired(true);
$Element2 = $subform1->createElement('text', 'text2');
$Element2->setLabel('text2')->setRequired(false);
$subform1->addElement($Element1);
$subform1->addElement($Element2);
$this->view->field = $subform1->__toString();
}
これはほとんど機能します。
このアクションのビューは、サブフォームの html コードを返すので、ajax 呼び出しが成功すると、それを表示するだけです。
問題は、送信時にフォームを検証しますが、追加したばかりの新しいサブフォームが失われていることです。これは、要素が 1 つだけの記事では発生しません。サブフォームを既存のフォームに追加するだけでよいと思いますが、どうすればよいでしょうか?