2016-08-05 19 views
1

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 (:

Antwort

1

diese Frage alle 3 Tage kommen :)

Ich füge meine Antwort von here ein:

Ich schrieb ein Bündel (Alsatian/FormBundle), das tut, was Sie auf der Serverseite wollen.

die sumitted Auswahl in einem Formular Get :: PRE_SUBMIT Ereignis (auch PRE_SET_DATA, wenn Sie Verwenden Sie Ihr Formular zum Bearbeiten), und führen Sie diese Auswahl erneut in das Feld ein.

+0

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

+0

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

+0

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

Verwandte Themen