Как настроить прототип коллекции Symfony 3.4 - PullRequest
0 голосов
/ 10 мая 2018

Я знаю, что я не первый, кто задает этот вопрос.Но я попробовал все, чтобы заставить его работать.

Сначала у меня есть сущность с именем Assignment и другая сущность unit.Assignment имеет отношение manyToMany к Unit, называемое units.

. Это создает форму:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('pickupTime', DateTimeType::class, [
            'required' => true,
            'label' => 'Zeitpunkt Abholung',
            'date_widget' => 'single_text',
            'time_widget' => 'single_text',
        ])
        ->add('deliverTime', DateTimeType::class, [
            'required' => true,
            'label' => 'Zeitpunkt Lieferung (geplant)',
            'date_widget' => 'single_text',
            'time_widget' => 'single_text',
        ])
        ->add('customer', EntityType::class, [
            'required' => true,
            'label' => 'Kunde',
            'class' => Customer::class,
            'query_builder' => function (EntityRepository $er) use ($options) {
                return $er->createQueryBuilder('cu')
                    ->leftJoin('cu.client', 'c')
                    ->where('c.id = :cid')
                    ->setParameter('cid', $options['client_id'])
                    ->orderBy('cu.companyName', 'DESC');
            },
        ])
        ->add('pickupAddress', AddressType::class, [])
        ->add('deliverAddress', AddressType::class, [])
        ->add('units', CollectionType::class, [
            'entry_type' => UnitType::class,
            'allow_add' => true,
            'prototype' => true,
            'attr' => array(
                'class' => 'assignment-units',
            ),
        ]);
}

А вот шаблон для части формы units:

        <div class="row">
            <div class="col">
                {{ form_label(form.units) }}
                <table class="table table-bordered table-light collection-form-wrapper">
                    <thead>
                    <tr>
                        <th>Bez.</th>
                        <th>Stück</th>
                        <th>Gewicht</th>
                        <th>Breite</th>
                        <th>Höhe</th>
                        <th>Tiefe</th>
                        <th></th>
                    </tr>
                    </thead>
                    <tbody>
                    {% for unit in form.units %}
                        <tr>
                            <td>{{ form_row(unit.name) }}</td>
                            <td>{{ form_row(unit.pieces) }}</td>
                            <td>{{ form_row(unit.weight) }}</td>
                            <td>{{ form_row(unit.width) }}</td>
                            <td>{{ form_row(unit.height) }}</td>
                            <td>{{ form_row(unit.depth) }}</td>
                            <td>
                                <a href="#" class="btn btn-danger btn-sm btn-delete" data-id="{{ loop.index }}"><i
                                            class="fa fa-trash"></i></a>
                            </td>
                        </tr>
                    {% else %}
                        <tr>
                            <td colspan="7" class="text-center">
                                <div class="p2">
                                    <i>
                                        <small>Noch keine Einträge vorhanden</small>
                                    </i>
                                </div>
                            </td>
                        </tr>
                    {% endfor %}
                    </tbody>
                    <tfoot>
                    <tr>
                        <td colspan="7">
                            <a href="#" class="btn btn-primary btn-sm" id="add-item"><i class="fa fa-plus"></i>
                                Hinzufügen</a>
                            <a href="#" class="btn btn-danger btn-sm" id="delete-all"><i class="fa fa-trash"></i> Tabelle leeren</a>
                        </td>
                    </tr>
                    </tfoot>
                </table>
            </div>
        </div>

{% form_theme form _self %}

{% block _units_entry_widget %}
    <tr>
        <td>{{ form_row(form.name) }}</td>
        <td>{{ form_row(form.pieces) }}</td>
        <td>{{ form_row(form.weight) }}</td>
        <td>{{ form_row(form.width) }}</td>
        <td>{{ form_row(form.height) }}</td>
        <td>{{ form_row(form.depth) }}</td>
        <td>
            <a href="#" class="btn btn-danger btn-sm btn-delete"><i
                        class="fa fa-trash"></i></a>
        </td>
    </tr>
{% endblock %}

Но это не работает - это соответствует документации Symfony (http://symfony.com/doc/master/form/form_customization.html#how-to-customize-a-collection-prototype) - но я получаю сообщение об ошибке Neither the property "name" nor one of the methods "name()", "getname()"/"isname()"/"hasname()" or "__call()" exist and have public access in class "Symfony\Component\Form\FormView"..

Что со мной?Я не понимаю, в чем проблема. Когда я пытаюсь переопределить виджет units с помощью form_theme, отладчик не отображает поля коллекции units. Когда я удаляю деталь с помощью form_theme, отображаются поля.

РЕДАКТИРОВАТЬ: Код UnitType:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name')
        ->add('quantity')
        ->add('weight')
        ->add('width')
        ->add('height')
        ->add('depth');
}

1 Ответ

0 голосов
/ 10 мая 2018

Я думаю, что проблема связана с именем блока , который вы используете для настройки представления элементов коллекции.

Первая часть должна быть именем родительской формы .

Вторая часть имени поля коллекции .

Третья часть всегда должна быть _entry_row .

Итак (в зависимости от названия ваших форм) вы должны написать что-то вроде:

{% block _assignment_units_entry_row %} вместо {% block _units_entry_widget%}

...