2016-07-19 12 views
0

私は以下のフォームを持っています。 devicepartsの両方のために、私は既にAjaxを通して選択肢を読み込むためにSelect2フックを使用しているので、SymfonyをHTMLにロードするのを抑制したいと思うし、選択肢を追加すると4000個以上の部分が追加されます。EntityTypeのSymfony Select2:HTMLのすべての選択肢を読み込まない

どうすればよいですか?私は'choices' => array()を追加しようとしましたが、実際には空のリストを提供していますが、有効な選択肢がないことを意味する無効な形式のbu結果が表示されます。

<?php 
public function buildForm(FormBuilderInterface $builder, array $options) { 
    $builder 
     ->add('device', EntityType::class, array('label' => 'Toestel', 'class' => 'AppBundle:Device', 'choice_label' => function($device) { 
       return $device->getBrand()->getName().' '.$device->getName(); 
     })) 
     ->add('parts', EntityType::class, array('label' => 'Onderdelen', 'class' => 'AppBundle:Part', 'choice_label' => 'name', 'multiple' => true)) 
     ->getForm(); 
} 
?> 

答えて

0

代わりにquerybuilderを使用してください。あなたのコメントによると

http://symfony.com/doc/current/reference/forms/types/entity.html#using-a-custom-query-for-the-entities

私はあなたが上記のリンクからそれを把握することができると思い

...

OK EDIT#2:これは、あなたに良い例を示します

使用してみてください以下に示す「選択肢」オプション:

public function buildForm(FormBuilderInterface $builder, array $options) { 
    $builder 
     ->add('device', EntityType::class, array(
       'label' => 'Toestel', 
       'class' => 'AppBundle:Device', 
       'choices' => $device->getBrand()->getName().' '.$device->getName(), 
     })) 
     ->add('parts', EntityType::class, array(
       'label' => 'Onderdelen', 
       'class' => 'AppBundle:Part', 
       'choice_label' => 'name', 
       'multiple' => true)) 
     ->getForm(); 
} 

これはあなたのためにはうまくいくとは限りませんが、 変数$deviceは、フォームオプションとして、またはオブジェクトAppBundle:Deviceを表す変数として渡す必要があります。

これを試してみてください!

編集#3: あなたのコメントに基づいています。私はあなたがAJAXを読み込むことによって何を意味するのか理解しています。あなたは何を使っていますか?身体のための「オンロード」でしょうか?あなたはコードを表示しません。

しかし、おそらく最良の解決策は空の配列を持つChoiceTypeです。空の配列が機能しない場合は、何かを入れてみてください。

これらの提案をお試しください。

ヌル配列:それでゴミと

public function buildForm(FormBuilderInterface $builder, array $options) { 
    $builder 
     ->add('device', ChoiceType::class, array(
       'label' => 'Toestel', 
       'choices' => array(
          //null 
        ), 
     })) 
     ->add('parts', EntityType::class, array(
       'label' => 'Onderdelen', 
       'class' => 'AppBundle:Part', 
       'choice_label' => 'name', 
       'multiple' => true)) 
     ->getForm(); 
} 

アレイ:

私は、私はあなたがそれを必要としている1(S)わからないことから、「デバイスのドロップダウンリストのためにそれをやりました
public function buildForm(FormBuilderInterface $builder, array $options) { 
    $builder 
     ->add('device', ChoiceType::class, array(
       'label' => 'Toestel', 
       'choices' => array(
          'Something' => true, 
        ), 
     })) 
     ->add('parts', EntityType::class, array(
       'label' => 'Onderdelen', 
       'class' => 'AppBundle:Part', 
       'choice_label' => 'name', 
       'multiple' => true)) 
     ->getForm(); 
} 

+0

ありがとう、Alvin、私はこの例で何が起こっているのか分かりません。それは比較的よく文書化されていません。どのような値を有効な選択肢として許可しながら、何も選択肢として渡されないことを確認するにはどうすればよいですか? – bluppfisk

+0

あなたのコメントに基づいて自分の投稿を編集しました。 bluppfiskを見てください。 –

+0

それは私が欲しいものではありません。私は選択肢が一切ないようにしたい。 'choices'に値を与えないと、自動的にすべてのデバイス名がchoicesオプションにロードされます。そうした場合は、すべての選択肢の*もロードされます。それから私の場合、4000に

0

種類の溶液が見つかりました。それは優れていませんが、4000個以上のHTMLオプションタグの読み込みに勝ちます。

私はそれがあったはずだと思いますが、alsatian/form-b​​undleでうまくいきました。コーダーからMore info on alsatian/form-bundleを読んでください。

特にMongoDBを使用していない場合は、少し微調整したいと思うでしょう。例えば。バンドルのservices.ymlに私がコメントアウトしなければならなかった:

- [setDocumentManager,["@doctrine.odm.mongodb.document_manager"]]

をともそれをインストールするために、あなたは作曲にminimum-stabilityを設定する必要があります。jsonをdevに変更し、他のすべてを破らないようにするには、prefer-stabletrueに設定する必要があります。

私のMySQLセットアップで動作するためです。それ以外の場合は、Select2要素のオプションを設定することもあまりよくありません。私はAbstractRoutableType.phpをちょっと微調整して別のリクエストメソッドを取ることもできましたが、JavaScriptを必要とするため高度なデータ解析はありません(HTML data-のプロパティが関数を伝えることはできません)。

最後に、私はまだこれらのすべてのオプションをTwigファイルの<script>タグの間に設定しています。

関連する問題