1

私はこれに対する答えを見つけようと一日中グーグルしてきましたが、ついに敗北を認めました。

可変データ長を処理できる必要がある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);
    }
}
4

1 に答える 1

1

次のような形式でデータを利用できるようにすることができます

My_Form extends Zend_Form 
{

protected $_myCustomData; 

public function __construct($options = null,$myCustomData)
{
   $this->_myCustomData = $myCustomData;
    parent::__construct($options);  //Its important you call parent after above line or init will get call before initilizing customData
}

public function init()
{
  $this->_myCustomData ; //here you are free to use your custom data 

}

}
于 2012-05-16T15:07:00.590 に答える