0

Zend Framework 2 のフィールドセットに問題があります。ユーザーは個人データをフォームに保存できます。彼がすでにこれを保存している場合は、データベースからのデータが事前に入力されているはずです。これは単なるフォームだったので問題なく機能しましたが、プログラムの他の部分で使用できるように、フィールドセットに住所データが必要です。現在、入力フィールドは空のままです。

最初に、セッションで個人データを入力します。私のデータは次のようになります。

object(Application\Model\Product\PersonalData)#247 (3) { 
    ["tel":protected]=> string(0) "" 
    ["birthday":protected]=> string(10) "2013-01-01" 
    ["address":protected]=> object(Application\Model\Account\Addresses)#248 (15) {    
        ["firstname":protected]=> string(5) "Ernie" 
        ["surname":protected]=> string(6) "Muppet"    
        ...
    } 
} 

ご覧のとおり、データはすでに指定されたオブジェクトにバインドされており、PersonalData がメイン、Addresses がフィールドセットになっています。これはうまくいくようです。それから私はそれを私の形に入れました:

$oForm->setData($oForm->getHydrator()->extract($_SESSION->getPersonalData()));
return new ViewModel(array('form'=>$oForm));

addressFieldset にはハイドレーターとバインディングがあり、すべてのオブジェクトが完全に満たされているため、機能します。唯一の問題は、ページを開くと、入力フィールドが空で、フォームに直接ある誕生日と電話だけが入力されていることです

私のフォームは、次のように address-fieldset を実装しています。

$addressFieldset = new AddressFieldset($lang);
$addressFieldset->setUseAsBaseFieldset(true);
$addressFieldset->setName('address');
$this->add($addressFieldset);

フィールドセットの正しいアドレス指定に問題があるだけだと思いますが、データを投稿した後になぜ正しく入力されるのか説明できません。私が望むのは、彼が私の Fieldset に setData を入力することだけです。

あなたが私の質問を理解し、私を助けてくれることを願っています.
どうもありがとう、
スヴェンヤ

編集: もう少し分析しましたが、非常に奇妙で、何が問題なのかわかりません。デバッグすると、$fieldset->getValue() が必要なすべてのデータを返すことがわかります。そのため、バインディングが間違っている可能性があると考え、これを実行して段階的にデバッグしました。

$values = $this->form->get('address')->getValue();
$addressFieldset = $this->form->get('address');
$aValues = $addressFieldset->getHydrator()->extract($values);
$addressFieldset->bindValues($aValues);

私はFieldset.phpに行き、bindValuesはそれがすべきことを完全に行い(とにかく要約にすぎません(?))、ハイドレーターを呼び出してオブジェクトを埋めます。しかし、要素に表示すると、すべての値が NULL になります。私はすでに自分の要素を2回チェックしました。モデルと要素の唯一の違いは、宣言の順序が異なることです。フィールドセットとフォームでも setUseAsBaseField(true) メソッドを呼び出します。データが値ではなく要素である理由がわかりません。

4

2 に答える 2

0

私は何かを持っていて、それは良い仕事をしているので、それは非常に奇妙です。式 $_SESSION->getPersonalData() が望ましい結果を返すと確信していますか? 非常に奇妙なセッションを使用しています。 http://framework.zend.com/manual/2.1/en/modules/zend.session.container.html

編集するには(英語で申し訳ありません):

  1. ArraySerializable など、さまざまなタイプのハイドレーターを使用できます (デフォルトでは、エンティティには getArrayCopy() および exchangeArray() メソッドが必要です)。デフォルトでは、ArraySerializable がハイドレーターです。
  2. まず、エンティティ $form->bind(new Entity()); でフォームをバインドする必要があります。エンティティは基本フィールドセットにバインドされます。基本フィールドセットが指定されていない場合、フォームはフィールドセットを継承するため、エンティティはフォームにバインドされます。エンティティが集約である場合、つまり、そのプロパティに別のオブジェクトが含まれている場合、これらのオブジェクトのそれぞれが fildset である必要があります。この子フィールドセットのコンストラクターでは、 $this->setObject(new MyChildrenEntity()); を使用する必要があります。その結果、エンティティ プロパティがフォーム要素に抽出されます。
  3. その後、フォームのみを操作し、要素やフィールドセットは操作しないでください。
  4. フォーム内の任意のデータを渡すことができるため、フォーム要素はこの値を取得します。$form->setData($this->getRequest()->getPost()); このメソッドは、内部 populateValues() メソッドを使用します。フォームに適切な名前の要素がある場合、それらはこれらの値に割り当てられます。フォームにフィールドセットがある場合、それらもこれらの値に転送されます。
  5. フォームが検証に失敗する限り、これらの値のエンティティは割り当てられません。これらの値は、検証が成功した場合にのみエンティティに割り当てられます。IsValid () メソッドは、検証が成功した場合、内部メソッド bindValues () を使用します。
  6. 検証が成功したら、getData() メソッド $entity = $form->getData(); を使用してエンティティを取得できます。

PS: 複雑な「ハック」を行っている場合は、この単純な説明に腹を立てないでください。

于 2013-08-09T10:23:13.793 に答える