2016-08-05 1 views
1

symfonyにEntityTypeフォーム要素を取得する方法はありますか?すべてのエントリをプリロードせずにそのまま受け入れますか?プリフォロードのないsymfonyフォームのエンティティタイプ

背景:これは画像セレクタのためのもので、おそらく1000以上の画像が保存されます。フィールドがレンダリングされるたびに、DBに負荷をかけたくありません。フォームには、カスタムのフロントエンドがあり、Javascriptの隠しフィールド(画像のページリストをロードするため)を使用します。

現在の実装では、それが必要として、動作しますが、それはEntityTypeを拡張するようChoiceTypeを使用しているとき、あなたが意味するであろう選択肢としてそれらを与える、しない限り、フォームが(値を受け付けませんが、それは、すべてのプリロードを行いますDBからすべてのエントリを読み込む)

----------------------- EDIT -------------- ---------

私は提案されたbundleで作業しています。私がそうであるように、あなた自身のビュー(ウィジェット)を持つ必要性を感じた場合、あなたはそれが非常に簡単achiveことができます。

あなたが作曲を使用する場合は、バンドルで composer require alsatian/form-bundle dev-master

を実行しているすべての必要なファイルを簡単なインストールすることができます

をあなたは、この手順に従うことができますインストールさ:
まず、あなた自身のフォームフィールドを(私はこのようになります)を作成する必要があります。

<?php 

namespace AppBundle\Form\Fields; 

use Symfony\Component\Form\AbstractType; 
use Alsatian\FormBundle\Form\ExtensibleEntityType; 


class UploadFileType extends AbstractType 
{ 
    /** 
     * {@inheritdoc} 
     */ 
    public function getParent() { 
     return ExtensibleEntityType::class; 
    } 

    /** 
     * {@inheritdoc} 
     */ 
    public function getName() { 
     return 'app_upload_file'; 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function getBlockPrefix() 
    { 
     return 'app_upload_file'; 
    } 
} 

注:あなたはちょうどあなたがそこに置か覚えて、あなたがgetBlockPrefixで好きなものを置くことができます。

{%- block app_upload_file_widget -%} 
    {{ dump(form) }}{# output some debug info #} 
    {% if not expanded %} 
     {# example for some fake entries #} 
      {% if multiple %} 
       <input type="hidden" name="{{ full_name }}" value="1" /> 
       <input type="hidden" name="{{ full_name }}" value="2" /> 
       <input type="hidden" name="{{ full_name }}" value="3" /> 
      {% else %} 
       <input type="hidden" name="{{ full_name }}" value="1" /> 
      {% endif %} 
    {% else %} 
     {{- block('choice_widget') -}} 
    {% endif %} 
{%- endblock app_upload_file_widget -%} 

注:

次は、フォームのテーマ(doc)を変更し、あなた自身のウィジェットを追加する必要がありますここでは、私たちのgetBlockPrefixを必要とし、それに_widgetを追加します!

最後に、私たちは私たちのいずれかの形式にそれを追加することができます

/** 
* @ORM\ManyToOne(targetEntity="File") 
* @ORM\JoinColumn(name="logo_id", referencedColumnName="id") 
*/ 
private $logo; 
:私たちは私たちの実体に参加持っている必要があります。もちろん、

<?php 

namespace AppBundle\Form\Admin; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 

class CompanyType extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('logo', \AppBundle\Form\Fields\UploadFileType::class, array(
       'class' => \AppBundle\Entity\File::class, 
       'choice_label' => 'originalName', 
      )) 
     ; 
    } 

    /** 
    * @param OptionsResolver $resolver 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\Company' 
     )); 
    } 
} 

、私にとって、それは次のようになります

私は、これは私はそのように(同じ状況にある、誰かの役に立てば幸い:

答えて

1

この質問は3日おきに来る:)

私は答えを貼り付けますhere

私はあなたがサーバー側で何をしているバンドル(Alsatian/FormBundle)を書きました。

フォームに堤出さ選択肢を取得します:: PRE_SUBMITイベント(もPRE_SET_DATAあなたの場合フォームを使用して編集する)、これらの選択肢をフィールドに再投入します。

+0

私はバンドルを使用するか、独自のフォームフィールドに固執する必要があります。このフォームでは、 'ChoiceType'を拡張する必要があります。最初は 'ChoiceType'には選択肢がありません。 'PPE_SUBMIT'イベントでは、提出されたIDをDoctrine Entitiesにマップする必要があります。私がまだ理解していないのは、Symfonyが値を正しいものとしてどのように受け入れるかです。 – wawa

+0

自分のバンドルを使用したり、ロジックをコピーすることができます。 PRE_SUBMITでは、あなたのエンティティタイプを再度追加する必要があります。また、 'choices'オプションとして、提出された選択肢を設定します。 – Alsatian

+0

私のサービスではどこでイベントを登録する必要がありますか?あなたのバンドルでは、自分自身のビュー/ウィジェットを取得するために、拡張する必要がある 'ExtensibleEntityType'でしょうか? – wawa

関連する問題