Zend_Form を使用してフォームを作成しています ... フォームにいくつかのフィールドを動的に追加する必要があります (jquery/ajax) ... 実行時に作成する必要があるフィールドのセットごとにサブフォームを作成しました ...のような正しい名前を持つ配列内の要素subform1[index][element]
、私はさらに2つのサブフォームを追加しました: サブフォーム1: フィールドセットとしてレンダリングされたラッパー サブフォーム2:index
名前要素の一部を再生するコンテナ サブフォーム: これは要素を保持するメインサブフォームです
subform2 と elements の部分は、新しい要素のセットごとに繰り返されます...
フォームが作成され、ビューでレンダリングされると、すべてが正常に機能するようになりました。正しい名前を取得します ( subform1[index][element]
) ...
しかし、ajaxを使用して新しい要素を生成する場合、フォームをレンダリングしてsubform2部分を正しい名前で取得する方法がわかりません...
これはサブフォームを作成する関数です:
private function makeSubForm($id, $legend)
{
$wrapper = new Zend_Form_SubForm();
$wrapper->setOptions(array('legend' => $legend, 'class' => 'ui-corner-all multi_value'))
->setIsArray(true);
$array = $this->_getArray($id);
//-------------------------LOOP--------------------------
$form_name = "Application_Form_Employ_$id";
// var_dump($array);
foreach ($array as $key => $value) {
$form = new $form_name();
$container = new Zend_Form_SubForm();
$container->setOptions(array('class' => 'subform'))
->setIsArray(true)
->addSubForm($form, 'xxxxx');
$wrapper->addSubForm($container, $key);
}
Zend_Registry::get('session')->{$id} = $array;
//----------------------------------------------------------
$this->addSubForm($wrapper, $id);
}
これが私のアクションメソッドです:
public function newElementAction()
{
$this->_disableView();
$id = $this->getRequest()->getParam('id');
$form = new Application_Form_Employment();
$params = array();
$keys = Zend_Registry::get('session')->{$id};
$lastKey = end(array_keys($keys));
$keys[++$lastKey] = array();
$params[$id] = $keys;
// var_dump($params);
$form->create($params);
// $form->render();
$this->_response->appendBody($form->getSubForm($id)->getSubForm($lastKey));
}
このコードで私subform2[element]
は私の名前として取得します...しかし、コメントを外す$form->render();
と取得しますsubform1[subform2][subform1][subform2][element]
どうすれば正しい名前の 2 番目のサブフォームの HTML を取得できますか?
欲しいものを手に入れるためのハックを見つけましたが、もっと良い方法を探しています...
public function newElementAction()
{
$this->_disableView();
$id = $this->getRequest()->getParam('id');
$form = new Application_Form_Employment();
$params = array();
$keys = Zend_Registry::get('session')->{$id};
$lastKey = end(array_keys($keys));
$keys = array(++$lastKey => array());
$params[$id] = $keys;
$form->create($params, $id);
$this->_response->appendBody($form->{$id});
}
私は最後の子だけを作成して親を出力し、クライアント側ではページに挿入する前に親のマークアップを削除しました...
親のインデックスをそのままにしてサブフォームをレンダリングする確実な方法が必要です!!??