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

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

Но обо всем по порядку:

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

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

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

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

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

Но далее: Эта Сущность (Пои) принадлежит другой Сущности (Повороту), поэтому 1 Поворот -> много Пои. Вы можете перемещаться по pois на моем сайте.

Но если владелец перемещается по ним (имейте в виду, форма редактирования будет отображаться, но не отображаться до тех пор, пока кнопка не будет нажата) все поля описания и ситуации теперь отображают (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>

person KhorneHoly    schedule 25.06.2014    source источник


Ответы (2)


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

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

$builder->add('description', 'textarea', array(
    'required'    => false,
    'empty_value' => 'Choose your gender',
    'empty_data'  => null
));
person vobence    schedule 25.06.2014
comment
Я уже нашел это, но затем я получаю исключение An exception has been thrown during the rendering of a template ("The option "empty_value" does not exist от twig - person KhorneHoly; 25.06.2014

После большого количества дополнительных исследований я нашел решение, которое отлично работает

Я добавляю прослушиватель к моему 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, потому что я хотел манипулировать данными до того, как они будут записаны в форму!

person KhorneHoly    schedule 25.06.2014