#forms #symfony
#формы #symfony
Вопрос:
Я обнаружил какое-то странное поведение с отображаемым контроллером, который отображает форму редактирования для моей сущности.
Но сначала о главном:
Я создаю шаблон с отображением сущности. Если вошедший в систему пользователь является тем же пользователем, что и владелец этого объекта, я также отображаю другой скрытый контроллер, содержащий форму редактирования для этого объекта. Пользователь может получить доступ к этому с помощью кнопки, которая запускает переключатель jQuery.
Объект имеет 2 текстовых поля, которые могут быть пустыми, описание и ситуация.
- Поэтому, если одно из двух или оба пустых, форма редактирования будет отображаться в текстовом
(null)
поле по умолчанию. Я этого не хочу! Как я могу это исправить, чтобы текстовые поля были пустыми, как и значение поля (чтобы был показан мой заполнитель).
Вот изображение, чтобы визуализировать это:
Но далее: этот объект (Poi) принадлежит другому объекту (Turn), поэтому 1 поворот -> много Poi. Вы можете перемещаться по poi на моем веб-сайте.
Но если владелец перемещается по ним (имейте в виду, форма редактирования будет отображаться, но не будет отображаться до нажатия кнопки), теперь отображаются все поля описания и ситуации (null)
, даже если он не сохранил редактирование. Это просто происходит само по себе.
Вот изображение, которое показывает это
- Почему это происходит? Что я могу с этим поделать? Может быть, есть что-то вроде
empty value
опции в типе формы?
Я искал решение, но не смог найти ничего, что было бы почти похоже на мою ситуацию.
Форма строится из моего типа формы:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', 'text', array(
'required' => false
))
->add('situation', 'textarea', array(
'required' => false
))
->add('description', 'textarea', array(
'required' => false
))
->add('isPrivateText', 'checkbox', array(
'required' => false
))
->add('isPrivateImage', 'checkbox', array(
'required' => false
))
;
}
Соответствующая часть моего edit.html.twig
<p class="edit_form"><span class="edit_left">{{ form_label(edit_form.situation, 'Situation') }} </span>
<span class="edit_right">{{ form_widget(edit_form.situation, { attr: {'placeholder': 'Törn Situation'} }) }}</span></p>
<p class="edit_form"><span class="edit_left">{{ form_label(edit_form.description, 'Beschreibung') }} </span>
<span class="edit_right">{{ form_widget(edit_form.description, { attr: {'placeholder': 'Törn Beschreibung'} }) }}</span></p>
Где мой showPoi.html.twig отображает контроллер формы:
<div class="col-md-6 col-sm-6 toggle_edit" style="display: none;">
<div>
{% render controller('MysailinglogMysailinglogBundle:Poi:edit', { id: poi[0].id , poi: poi}) %}
<!-- Don't worry about the 2 divs, i just shortened up the code -->
</div>
</div>
Ответ №1:
После множества дополнительных исследований я нашел решение, которое работает нормально
Я добавляю слушателя в свой FormType, который приводит к следующей функции:
function onPreSetData(FormEvent $event) {
$data = $event->getData();
if($data->getDescription() == "(null)"){
$data->setDescription('');
}
if($data->getSituation() == "(null)"){
$data->setSituation('');
}
return $event->setData($data);
}
Он просто берет данные из события, которое создаст форму, и является не чем иным, как объектом Poi. Там я просто проверяю, есть ли значение (null)
, и если оно есть, я устанавливаю его в пустую строку.
Регистрация слушателя также проста, это делается с помощью этой простой строки кода:
$builder->addEventListener(FormEvents::PRE_SET_DATA, array($this, 'onPreSetData'));
Это должно быть сделано с экземпляром FormBuilder, "onPreSetData"
имя которого должно совпадать с именем функции, указанной выше, которая будет запущена событием.
Важно отметить, что событие должно быть PRE_SET_DATA
событием в этой ситуации, потому что я хотел манипулировать данными до того, как они будут записаны в форму!
Ответ №2:
Вы можете настроить пустой атрибут данных в типе формы:
$builder->add('description', 'textarea', array(
'required' => false,
'empty_value' => 'Choose your gender',
'empty_data' => null
));
Комментарии:
1. Я уже нашел это, но затем я получаю
An exception has been thrown during the rendering of a template ("The option "empty_value" does not exist
исключение от twig