私はこれに対する答えを見つけようと一日中グーグルしてきましたが、ついに敗北を認めました。
可変データ長を処理できる必要があるZendFrameworkのフォームに取り組んでいます。処理が簡単ないくつかの一般的なパラメーター(アイテム名、言語など)を指定するいくつかの一般的なフィールドを持つフォームがありますが、可変数のキー/値の隠れ家を保持するパラメーターと呼ばれるサブフォームもあります。一般的なパラメータをデータに追加できます。デモンストレーションフォームは次のとおりです。
<form>
<input type="text" name="item_name" />
<input type="text" name="item_lang" />
<!-- etc -->
<input type="text" name="parameters[1][key]" />
<input type="text" name="parameters[1][value]" />
<input type="text" name="parameters[2][key]" />
<input type="text" name="parameters[2][value]" />
<input type="text" name="parameters[3][key]" />
<input type="text" name="parameters[3][value]" />
<input type="text" name="parameters[4][key]" />
<input type="text" name="parameters[4][value]" />
<!-- and so on -->
</form>
注:上記は、実際のフォームを大幅に簡略化したものです。また、zend_formによって生成されるのではなく、手動で構築されます。
パラメータの数は異なる可能性があり、javascriptを使用してクライアント側で処理できますが、更新のために既存のデータからフォームを入力するときに、フォームを初期化するのに本当に苦労しています。
アイテムごとに2つのパラメーターが格納されている場合があり、20が格納されている場合があり、まったくない場合があります。したがって、データの初期状態に応じて、フォームに2つまたは20のパラメーターを入力するか、パラメーターを入力しないようにする必要があります。残念ながら、データはinit()で使用できません。これは、setDefaults()を呼び出すまでデータがフォームにないためです。
これは、フォームの初期状態でforeach()を実行して、既存のデータに適切な数の入力ボックスを生成できないことを意味します。
明らかな何かが欠けているに違いないと確信していますが、Zendのドキュメントはかなり恐ろしく、このユースケースの例は見つかりません。zend_formでサポートされていないほど珍しいことではありません。フォームの初期状態を可変にできる状態でフォームを生成するにはどうすればよいですか?
ETA:私のフォームのinit()メソッドは次のようになります(例に一致するように簡略化されています):
public function init ()
{
parent::init ();
$this -> addElement ('text', 'item_name');
$this -> addElement ('text', 'item_lang');
$this -> addSubForm (new Zend_Form_SubForm (), 'parameters');
foreach ($phantom_data as $key => $val)
{
$params = new Zend_Form_SubForm ();
$params -> addElement ('text', 'key');
$params -> addElement ('text', 'value');
$this -> parameters -> addSubForm ($params, $key);
}
}