Symfony - Форма с несколькими объектами сущности - PullRequest
0 голосов
/ 13 марта 2020

Я работаю Symfony 3.4 LTS и у меня есть сущность Attribute:

<?php

class Attribute
{

    private $id;
    private $code;
    private $value;
    private $active;

    // My getters and setters

Ниже таблицы базы данных:

enter image description here

Я бы хотел получить в форме все строки с code == 'productstatus'. Я попытался:

<?php

$attributes = $this->getDoctrine()->getRepository(Attribute::class)->findBy(['code' => 'productstatus']);
// $attributes contains array with 3 objects 'Attribute'
$form = $this->createFormBuilder($attributes);
$form->add('value', TextType::class);
$output = $form->getForm()->createView();

Если я дам дамп () $output var в Twig:

enter image description here

... I Я не могу заставить oop отобразить 3 поля со значениями.

{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}

Результат:

enter image description here

My Цель состоит в том, чтобы позволить пользователю редактировать все значения указанных атрибутов c в одной форме (или нескольких формах, но на одной странице). Я уже пытался с CollectionType без успеха.

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

Я нашел решение: создайте 2 вложенные формы и используйте CollectionType. Надеюсь, это поможет.

<?php

// Controller

$attributes = $this->getDoctrine()->getRepository(Attribute::class)->findBy(['code' => 'productstatus']);
$form = $this->createForm(AttributeForm::class, ['attributes' => $attributes]);

// AttributeForm

$builder
    ->add('attributes', CollectionType::class, [
        'entry_type' => AttributeValueForm::class,
        'allow_add' => true,
        'by_reference' => false,
        'allow_delete' => true,
    ]);

// AttributeValueForm

$builder
    ->add('value', TextType::class, ['label' => false, 'required' => false])
    ->add('active', CheckboxType::class, ['label' => false, 'required' => false])

// Twig view

{{ form_start(form) }}
    {% for attribute in form.attributes.children %}
        <tr>
            <td>{{ form_widget(attribute.value) }}</td>
            <td>{{ form_widget(attribute.active) }}</td>
        </tr>
    {% endfor %}
{{ form_end(form) }}
0 голосов
/ 17 марта 2020

Вы используете оператор if в типе AttributeType, как в примере ниже:

$builder->add('entree',EntityType::class,array('class'=>'cantineBundle:plat','choice_label'=>function($plat){if($plat->getType()=='Entree'&&$plat->getStatus()=="non reserve"){return $plat->getNomPlat();}},'multiple'=>false))
...