Мой пользовательский шаблон типа формы игнорируется при рендеринге формыPhp

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Мой пользовательский шаблон типа формы игнорируется при рендеринге формы

Сообщение Anonymous »

Я создал класс типа настраиваемого поля BootstrapToggleType расширяет AbstractType, который является дочерним для CheckboxType Я также добавил к нему префикс на всякий случай следующим образом

Код: Выделить всё

public function getBlockPrefix(): string
{
return 'bootstrap_toggle';
}

Код: Выделить всё

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$form = $event->getForm();
$config = $form->getParent()->get($form->getName())->getConfig();
$options = $config->getOptions();
$defaultDataOptions = $this->_bootstrapToggleDataDefaults;

$form->getParent()->add($form->getName(), CheckboxType::class, array_replace_recursive($options, [
'attr' => $defaultDataOptions,
]))
;
});
}
Я добавил собственную тему формы в twig.yaml form_themes: ['Form/custom_types.html.twig', 'bootstrap_4_layout.html.twig'] и создал указанный файл со следующим кодом

Код: Выделить всё

{% block bootstrap_toggle_row %}
{% for child in form.children if not child.rendered %}


{{ form_label(child) }}
{{ form_widget(child) }}
{{ form_help(child) }}
{{ form_errors(child) }}


{% endfor %}
{% endblock %}
Однако поле отображается с использованием стандартной темы, игнорирующей bootstrap_toggle_row. Что я делаю неправильно?

Проблема в основном связана с этой частью кода $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { . Однако мне нужно использовать такую ​​конструкцию для создания поля, используя имя, предоставленное FormType object $builder->add('is_published', BootstrapToggleType::class)

если я изменю эту часть кода на что-то подобное

Код: Выделить всё

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addChild('testName', CheckboxType::class);
}
мой собственный шаблон отображается правильно.

добавлен
Поскольку я повторно добавил еще одного дочернего элемента, мне необходимо указать правильный префикс блока.

Код: Выделить всё

$form->getParent()->add($form->getName(), CheckboxType::class, array_replace_recursive($options, [
'attr' => $defaultDataOptions,
'block_prefix' => 'bootstrap_toggle'
]));
Тогда в моем пользовательском шаблоне мне нужно напрямую ссылаться на переменную формы как на один дочерний элемент, а не на массив. Поэтому вместо того, чтобы перебирать детей

Код: Выделить всё

{% for child in form.children if not child.rendered %}
просто прямой звонок

Код: Выделить всё

{{ form_label(form) }}
{{ form_widget(form) }}
{{ form_help(form) }}
{{ form_errors(form) }}
Теперь это работает.

Подробнее здесь: https://stackoverflow.com/questions/610 ... ering-form
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»