2017-08-07 15 views
0

私は必要なのは簡単ですが、私はPHPで作ることができますが、私はFormBuilderを使いたいです。 私はこれがあります。symfony3クエリ結果で入力データを設定する方法

$builder 
     ->add('number',NumberType::class, array(
      'label' => 'Number', 
      'attr' => array(
       'readonly' => "readonly" 
       ) 
      ) 
     ) 
     ->add('year',NumberType::class, array(
      'label' => 'Year', 
      'data' => date('Y'), 
      'attr' => array(
       'readonly' => "readonly" 
       ) 
      ) 
     ) 

そして、私は必要ではこのyearの最後numberを検索し、次のものを追加することです。今年の番号がない場合は、1と表示されます。あなたはすでにあなたのクエリの結果を持っていると仮定すると、事前

+0

そうでなければ望ましい結果のためのロジックを示してください。 'search'と' add the next one'という用語を理解するのは難しいです。私はあなたが '2017'を意味すると思っています。検索された数字は '7 'で、次のもの(' 2018')は '8'なので' 8 + 7'です。 – fyrye

+0

こんにちは、お時間をいただき、ありがとうございます。あなたが見ることができるように 'year'は常に実際の年です。 2017-1,2017-2,2017-3({year} - {number})のテーブルにあれば、その入力の中に2017-4を表示する必要があります。それはあなたにとって理にかなっていますか? –

答えて

0

おかげで、フォームにカスタムデータを渡すためにFormType::buildForm$options引数を使用することができます。

configurOptionsメソッドでカスタムオプションを定義して、それらを受け入れる必要があります。 setDefaultsを使用すると、options配列にオプションが指定されていない場合、定義された値が設定されます。

class FormType extends \Symfony\Component\Form\AbstractType 
{ 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      //... 
      ->add('number',NumberType::class, array(
       'label' => 'Number', 
       'data' => $options['number'], 
       'attr' => array(
        'readonly' => "readonly" 
        ) 
       ) 
      ) 
      ->add('year',NumberType::class, array(
       'label' => 'Year', 
       'data' => $options['year'], 
       'attr' => array(
        'readonly' => "readonly" 
        ) 
       ) 
      ); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults([ 
      'year' => date('Y'), 
      'number' => 1 
     ]); 
    } 

    //... 

} 

その後、あなたのコントローラにクエリを実行し、フォームビルダオプションにカスタムデータを渡します。あなたは[DataTransformer](https://symfony.com/doc/current/form/data_transformers.html)を希望している考える

public function formAction(Request $request) 
{ 
    $options = ['year' => date('Y')]; 
    /** 
    * query data 
    * @returns integer|null default: 1 
    */ 
    $options['number'] = $em->getRepository('app:Entity')->filterYearNumber($options['year']) ?: 1; 
    $form = $this->createForm(FormType::class, $data, $options); 
    $form->handleRequest($request); 
    if ($form->isSubmitted() && $form->isValid()) { 
     //... handle submission 
    } 

    return $this->render('form.html.twig', ['form' => $form->createView()]); 
} 
+0

実際には良い答えです、ありがとうございます。しかし、FormTypeクラスの中にクエリを追加することは可能ですか?私が見る別の問題は、オプション番号またはオプション年を送ることができないということです。私はこのリストのオプションだけを送ることができます:https://symfony.com/doc/current/reference/forms/types/form.html –

+0

確かに、あなたのフォームをサービスとして作成し、エンティティマネージャまたはエンティティを注入することができますリポジトリをクラスに追加して直接呼び出すことができます。 –

+0

可能ですが、EntityManagerが常に必要となるようにFormTypeクラスを維持する必要はありません。 'configureOptions'を宣言すると、Formを展開して任意の値を受け入れることができます。たとえば、同じFormTypeオブジェクトを使用して、目的のモデルの作成、編集、削除、または特殊なユースケースのフォームを維持します。したがって、各操作に別々のクラスは必要ありません。このように、フォームはフォームになる必要があるものだけを持ち、他の場所では展開が容易です。 – fyrye

関連する問題