Frage Erstellen Sie ein Formular mit einem Kontrollkästchen für jede Entität in einer Doktrin-Sammlung


Ich zeige eine HTML-Tabelle für eine gefilterte Sammlung von Entitäten an und ich möchte ein Kontrollkästchen in jeder Zeile als Teil eines Formulars anzeigen, das die ausgewählten Entitäten zu einer Sitzungsvariablen hinzufügt.

Ich denke, dass jedes Kontrollkästchen die Entitäts-ID als Wert haben sollte und ich werde ein Array von IDs aus den Formularfelderdaten erhalten (ok, also sollte der Wert ein indirekter Verweis auf die Entität sein, aber wegen Einfachheit).

Ich habe versucht, einen Formulartyp mit einem einzelnen Entitätstypfeld zu erstellen, der der ID-Eigenschaft der Entität zugeordnet und in ein anderes Formulartyp eingebettet ist, der über ein Sammlertypfeld verfügt.

class FooEntitySelectByIdentityType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('foo_id', 'entity', array(
            'required'  => false,
            'class'    => 'MeMyBundle:FooEntity',
            'property' => 'id',
            'multiple' => true,
            'expanded' => true
        ));
    }

# ...

und

class FooEntitySelectionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('identity', 'collection', array(
            'type'   => new FooEntitySelectByIdentityType,
            'options'  => array(
                'required' => false,
                'multiple' => true,
                'expanded' => true,
                'attr'     => array('class' => 'foo')
            ),
        ));
    }

# ...

und in einem Controller wird das Formular mit einer Sammlung von Entitäten als Anfangsdaten erstellt

$form = $this
    ->createForm(
        new \Me\MyBundle\Form\Type\FooEntitySelectionType,
        $collection_of_foo
    )
    ->createView()
;

Wenn das Formular gerendert wird, gibt es ein einzelnes Label für das Identitätsfeld, aber keine Widgets.

Ist es überhaupt möglich, Entity- und Collection-Type-Felder auf diese Art zu verwenden? Wenn ja, was könnte ich falsch machen?


11
2018-02-01 02:31


Ursprung


Antworten:


Ich denke, das wird deine Frage beantworten.

Vergiss das FooEntitySelectionType. Füge hinzu ein property_path Feldoption zu FooEntitySelectByIdentityType und setze die data_class Option zu null:

class FooEntitySelectByIdentityType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('foo_id', 'entity', array(
            'required'      => false,
            'class'         => 'MeMyBundle:FooEntity',
            'property'      => 'id',
            'property_path' => '[id]', # in square brackets!
            'multiple'      => true,
            'expanded'      => true
        ));
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class'      => null,
            'csrf_protection' => false
        ));
    }

# ...

und baue den Controller in deinem Controller auf FooEntitySelectByIdentityType:

$form = $this
    ->createForm(
        new \Me\MyBundle\Form\Type\FooEntitySelectByIdentityType,
        $collection_of_foo
    )
    ->createView()
;

und dann in der Controller-Aktion, die die POST-Daten empfängt:

$form = $this
    ->createForm(new \Me\MyBundle\Form\Type\FooEntitySelectByIdentityType)
;
$form->bind($request);
if ($form->isValid()) {
    $data = $form->getData();
    $ids  = array();
    foreach ($data['foo_id'] as $entity) {
        $ids[] = $entity->getId();
    }
    $request->getSession()->set('admin/foo_list/batch', $ids);
}

und schließlich in deiner Zweigvorlage:

{# ... #}
{% for entity in foo_entity_collection %}
    {# ... #}

    {{ form_widget(form.foo_id[entity.id]) }}

    {# ... #}

8
2018-02-01 19:11



Wenn jemand eine Lösung für Symfony sucht> = 2.3

Du musst das ändern:

    $data = $form->getData();
    $ids  = array();
    foreach ($data['foo_id'] as $entity) {
        $ids[] = $entity->getId();
    }

zu diesem:

    $data = $form['foo_id']->getData();
    $ids = array();
    foreach ($data as $entity) {
        $ids[] = $entity->getId();
    }

3
2018-04-12 09:23



Ich erschaffe ein symfony Bündel um eine Sammlung von Entitäten als Checkbox-Tabelle in einer konfigurierbaren Weise darzustellen. Obwohl es eine Weile her ist, seit diese Frage gestellt wurde, hoffe ich, dass dies anderen mit diesem gleichen Problem helfen kann.


2
2018-04-18 14:00