Symfony 4: передача пользовательских данных в прототип Form Collection - PullRequest
0 голосов
/ 25 декабря 2018

Поле CollectionType имеет специальную переменную 'prototype', когда для опции 'allow_add' установлено значение true.Эта переменная может использоваться для рендеринга прототипа html следующим образом:

data-prototype="{{ form_widget(form.collectionfieldname.vars.prototype)|e('html_attr') }}"

Похоже, что «prototype» - это просто экземпляр потомков коллекции FormView, созданный с частичными данными (например, name установлено в «__name__», в то время как большинстводругие переменные оставлены пустыми).

Где происходит вся эта магия?Можно ли изменить какие данные передаются в представление прототипа при создании формы?Например, я хотел бы изменить значение по умолчанию переменной «value» с пустого на «__val__» (вне шаблона Twig).

1 Ответ

0 голосов
/ 25 декабря 2018

Ответ на собственный вопрос - значения, определенные в настройке «entry_options», используются для построения прототипа.Можно передать эти значения в построитель форм следующим образом:

$builder
            ->add('email', CollectionType::class, array(
                ...
                'entry_options' => array(
                    'someoption' => 'somevalue',
                ),
                ...
                ))

Если этого недостаточно, поведение по умолчанию можно изменить, переопределив метод "buildForm" в классе "CollectionType", который отвечает за сбор параметрови прототип здания:

class CollectionType extends AbstractType
{
    ...

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        if ($options['allow_add'] && $options['prototype']) {
            $prototypeOptions = array_replace(array(
                'required' => $options['required'],
                'label' => $options['prototype_name'].'label__',
            ), $options['entry_options']);

            if (null !== $options['prototype_data']) {
                $prototypeOptions['data'] = $options['prototype_data'];
            }

            $prototype = $builder->create($options['prototype_name'], $options['entry_type'], $prototypeOptions);
            $builder->setAttribute('prototype', $prototype->getForm());
        }

        ...
    }
...
}
...