Gibt es eine Möglichkeit, ein Formularelement in Symfony zu erhalten, die nicht alle Einträge vorlädt, aber sie dennoch akzeptiert?Symfony Form EntityType ohne Vorladung
Hintergrund: Es ist für einen Bildwähler, wo möglicherweise 1000 Bilder gespeichert werden. Ich möchte die DB nicht jedes Mal laden, wenn das Feld gerendert wird. Das Formular verfügt über ein benutzerdefiniertes Frontend mit versteckten Feldern und Javascript (um eine ausgelagerte Liste von Bildern zu laden).
Die aktuelle Implementierung funktioniert, wie es sollte, aber da es die EntityType
erweitert sie die Vorbelastung hat das alles, während, wenn eine ChoiceType
das Formular akzeptieren nicht die Werte (es sei denn, man sie als Entscheidungen geben, was bedeuten würde, um alle Einträge aus dem DB zu laden)
----------------------- EDIT -------------- ---------
Ich arbeite mit dem vorgeschlagenen bundle. Wenn Sie das Bedürfnis verspüren, Ihre eigene Meinung zu haben (Widget) wie ich, kann man das achive ganz einfach:
Wenn Sie Komponisten verwenden, können Sie einfach alle benötigten Dateien installieren composer require alsatian/form-bundle dev-master
Mit dem Bündel läuft installiert Sie diese Schritte folgen:
Zuerst müssen Sie Ihr eigenes Formularfeld erstellen (meine so aussieht):
<?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';
}
}
Hinweis: Sie können in getBlockPrefix
, nur nicht vergessen, was Sie dort alles, was Sie gerne setzen setzen .
Als nächstes müssen Sie Ihr Formular Thema (doc) ändern und fügen Sie besitzen widget:
{%- 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 -%}
Hinweis: Hier müssen wir unsere getBlockPrefix
und nur _widget
, um es hinzuzufügen!
Schließlich haben wir es mit einem unserer Formen hinzufügen:
<?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'
));
}
}
Natürlich brauchen wir ein in unserem Unternehmen haben, kommen Sie, für mich sieht es so etwas wie folgt aus:
/**
* @ORM\ManyToOne(targetEntity="File")
* @ORM\JoinColumn(name="logo_id", referencedColumnName="id")
*/
private $logo;
ich hoffe, das hilft jemand, dass in der gleichen Situation wie ich bin (:
Verstehe ich es richtig, ich muss entweder dein Bündel verwenden oder ich kann bei meinem eigenen Formularfeld bleiben, in dem ich einen 'ChoiceType' erweitern muss. Anfänglich hat der 'ChoiceType' keine Auswahlmöglichkeiten. Im Ereignis "PPE_SUBMIT" muss ich die übergebenen IDs Doctrine Entities zuordnen. Was ich immer noch nicht verstehe, ist, wie akzeptiert Symfony die Werte als richtig? – wawa
Sie können mein Bündel verwenden oder seine Logik kopieren;). In PRE_SUBMIT müssen Sie -> Ihren Entitätstyp erneut hinzufügen und als Auswahloption die übermittelten Auswahlmöglichkeiten festlegen. – Alsatian
Wo muss ich die Veranstaltung in meinen Diensten registrieren? In deinem Bündel wäre es der 'ExtensibleEntityType', den ich erweitern müsste, um meine eigene Ansicht/Widget zu bekommen, oder? – wawa