Форма Введите значение по умолчанию для пустого значения в отображаемой форме

#forms #symfony

#формы #symfony

Вопрос:

Я обнаружил какое-то странное поведение с отображаемым контроллером, который отображает форму редактирования для моей сущности.

Но сначала о главном:

Я создаю шаблон с отображением сущности. Если вошедший в систему пользователь является тем же пользователем, что и владелец этого объекта, я также отображаю другой скрытый контроллер, содержащий форму редактирования для этого объекта. Пользователь может получить доступ к этому с помощью кнопки, которая запускает переключатель jQuery.

Объект имеет 2 текстовых поля, которые могут быть пустыми, описание и ситуация.

  • Поэтому, если одно из двух или оба пустых, форма редактирования будет отображаться в текстовом (null) поле по умолчанию. Я этого не хочу! Как я могу это исправить, чтобы текстовые поля были пустыми, как и значение поля (чтобы был показан мой заполнитель).

Вот изображение, чтобы визуализировать это:

Описание Текстовое поле = (null)

Но далее: этот объект (Poi) принадлежит другому объекту (Turn), поэтому 1 поворот -> много Poi. Вы можете перемещаться по poi на моем веб-сайте.

Но если владелец перемещается по ним (имейте в виду, форма редактирования будет отображаться, но не будет отображаться до нажатия кнопки), теперь отображаются все поля описания и ситуации (null) , даже если он не сохранил редактирование. Это просто происходит само по себе.

Вот изображение, которое показывает это

Описание = (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:

Вы можете настроить пустой атрибут данных в типе формы:

Документация Symfony

 $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