2016-10-26 3 views
0

にデフォルトのデータを変更することはだから私はCategoryCategoryが多くProductエンティティを持っているProductエンティティを持っていると言います。マイCategoryフォームビルダは、次のようになります。symfonyは - プロトタイプ

public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name', TextType::class) 
      ->add('products', CollectionType::class, array(
      'entry_type' => ProductType::class, 
      'allow_add' => true, 
      'by_reference' => false, 
      'allow_delete' => true, 
      'prototype' => true, 
      'prototype_name' => '__product_prot__')) 
      ->add('save', SubmitType::class)) 
     ; 
    } 

そして、私のProductフォームビルダは、次のようになります。私が知りたいのですがどのような

public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name', TextType::class) 
      ->add('dateAdded', DateType::class) 
     ; 
    } 

がいるのでいつでも新しいdateAddedの値を設定する方法ですプロトタイプが追加され、今日の日付が表示されますか?

エンティティ__construct()関数を使用してデフォルトを作成することを推奨している人もいますが、これはプロトタイプでは機能しません。私はまた、placeholderオプションを見つけたが、私はそれが常に今日の日付を持つようにそれを使用するかどうかはわかりません - これが表示されない、すなわち、動作するように:

->add('addDate', DateType::class, array(
    'placeholder' => new \DateTime(); 
)) 

誤りがあるとして:Attempted to call function "DateTime" from the global namespace

さらに、CollectionTypeフィールドにprototype_dataフィールドがありますが、データを1つのフィールドに入れて動的にする方法を指定する方法がわかりません。

誰かが私に最良の使用方法と正しい構文を教えてもらえますか?

編集:

Categoryエンティティのために正常に動作します
public function __construct() 
{ 
    $this->addDate = new \DateTime(); 
} 

(私はそれをテストのために日付フィールドを与える場合)ではなく、試作さProductエンティティ:

だから私の__construct()がどのように見えます。私が作成したProductエンティティと新しいフォームをロードする場合興味深いことに、私も見つけた

{% block _category_products_entry_row %} 
    <li> 
     {{ form_row(form.name) }} 
     {{ form_row(form.dateAdded) }} 
    </li> 
{% endblock %} 

:私はフォームにプロトタイプをロードすると、私はちょうどプロトタイプがどのように見える1月1日、2011年のデフォルトの日付を取得しますすでにCategoryコントローラでは、原因に表示されますdateAddedフィールド:それはデフォルト値だとして

{% for product in form.products %} 
    {{ form_row(product) }} 
{% endfor %} 

は、今日の日付を持っています。これは、チュートリアルのHow to Embed a Collection of Formsと同じ方法で行われるプロトタイプの読み込みが原因であることを示唆しています。

+1

を 'お役に立てば幸いです。あなたのコンストラクタはどのように見え、エラーは何ですか? – Rhono

+0

私のコンストラクタを追加しました。その中に 'DateTime'を設定しようとするとエラーは発生しません。デフォルト値は基本値です。もし 'DateTime'に' now'や 'today'のような引数を与えても同じことです。 – Darkstarone

+0

ええ、あなたはコンストラクタが正常です、それは良いです。どんな基本的な価値が設定されていますか? – Rhono

答えて

1

デフォルト値をフォームフィールドに設定するには、 "data"プロパティを使用し、FormEventを使用して更新時にフォームを処理できます。結果は以下のようになります。

use Symfony\Component\Form\FormEvent; 
use Symfony\Component\Form\FormEvents; 

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('name', TextType::class) 
     ->add('dateAdded', DateType::class, array(
      'data' => new \DateTime(), 
     )) 
    ; 

    $builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event) { 
     $product = $event->getData(); 
     $form = $event->getForm(); 

     if (!$product) { 
      return; 
     } 

     if ($dateAdded = $product->getDateAdded()) { 
      $form->add('dateAdded', DateType::class, array(
       'data' => $dateAdded, 
      )); 
     } 
    }); 
} 

PRE_SET_DATAでは、取得したデータでdateAddedフィールドのデフォルト値を上書きできます。詳細情報については

、あなたがhttp://symfony.com/doc/current/reference/forms/types/date.html#datahttps://symfony.com/doc/current/form/events.html

を訪問することができますが、それはフォームビルダのプロトタイプと連携__construct`

+0

そのアプローチの問題は、フォームを編集しようとすると、保存されたデータを ''data''の形式で上書きすることです。 – Darkstarone