ユーザーが日付を入力するための3つのフィールド(日、月、年)があるとします。(おそらく最善の方法ではありませんが、この例ではそれを使用しています)。ユーザーのリクエストに応じようとすると、Symfonyはモデル上に存在しないメソッド$form->bind()
を探します。->setMonth()
strtotime()
以前に入力(または他の任意のコードやメソッド)を実行してから、新しい出力をマップすることをSymfonyに伝えるにはどうすればよいsetDate()
ですか?
まず、これらのフィールドには対応するEntityプロパティがないことをsymfonyに伝える必要があります。これは、「property_path」オプションで次のように実行されます。
$builder->add("field1", "text", array(
"property_path" => false
));
コントローラで、フォームが有効であることを確認したら、エンティティを永続化する前に、次のようなものを使用してこれらのフィールドの値を取得できます。
$field1 = $form->get('field1')->getData();
次に、これらの値を使用して、必要に応じてエンティティプロパティを作成します。次に例を示します。
$entity->setWhatever($field1.$field2.$field3);
これらのフィールドに対して何らかの検証を行う必要がある場合は、コールバックバリデーターを作成するのが最善のオプションです。
ユーザークラスの1つのプロパティ「date」に複数のhtmlフィールドを使用しないでください。
参照:http ://symfony.com/doc/current/reference/forms/types/date.html
オプション「widget」のおかげで、フィールドの日付を好きなようにレンダリングできます。
あなたの場合、3つのフィールドが必要で、値「choice」を設定する必要があります(3つの選択入力をレンダリングします。選択の順序はパターンオプションで定義されます)。
ここに、フォームクラスのコードがあります。
$builder->add('date', 'date', array(
'widget' => 'choice',
));
また、フォームの送信後にタイムスタンプ( "strtotime")を取得する必要があります。
$builder->add('date', 'date', array(
'widget' => 'choice',
'input' => 'timestamp',
));
たとえば、JS日付ピッカーをアクティブ化するテキストフィールドだけを取得するなど、他のオプションで遊ぶことができます。