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'
));
}
}
、私にとって、それは次のようになります
私は、これは私はそのように(同じ状況にある、誰かの役に立てば幸い:
私はバンドルを使用するか、独自のフォームフィールドに固執する必要があります。このフォームでは、 'ChoiceType'を拡張する必要があります。最初は 'ChoiceType'には選択肢がありません。 'PPE_SUBMIT'イベントでは、提出されたIDをDoctrine Entitiesにマップする必要があります。私がまだ理解していないのは、Symfonyが値を正しいものとしてどのように受け入れるかです。 – wawa
自分のバンドルを使用したり、ロジックをコピーすることができます。 PRE_SUBMITでは、あなたのエンティティタイプを再度追加する必要があります。また、 'choices'オプションとして、提出された選択肢を設定します。 – Alsatian
私のサービスではどこでイベントを登録する必要がありますか?あなたのバンドルでは、自分自身のビュー/ウィジェットを取得するために、拡張する必要がある 'ExtensibleEntityType'でしょうか? – wawa