Symfony 3: сделать поле TextareaType необязательным

#symfony

#symfony

Вопрос:

У меня есть форма с одним необязательным полем (примечание). По умолчанию все поля являются обязательными. Я хотел сделать поле ‘remark’ необязательным. Я перепробовал множество решений. Кажется, ни одно из них не работает. Как я могу сделать его необязательным?

Вот мой код

RequestItem.php

 /**
 * RequestItem
 *
 * @ORMTable(name="request_item")
 * @ORMEntity(repositoryClass="InventoryBundleRepositoryRequestItemRepository")
 */
class RequestItem
{
  /**
     * @var string
     *
     * @ORMColumn(name="remark", type="text", nullable=true)
     */
    private $remark;
  

RequestItemType.php

 class RequestItemType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('item', EntityType::class, array(
              'class' => 'InventoryBundle:Item',
              'choice_label' => 'name',
              'expanded' => false,
              'multiple' => false,
            ),
              array('attr' =>array('class' =>'form-control', 'style' =>'margin-bottom:15px; width:100px')))
            ->add('date', DateType::class, array('attr' =>array('class' =>'form-control', 'style' =>'margin-bottom:15px')))
            ->add('quantity', TextType::class,array('attr' =>array('class' =>'form-control', 'style' =>'margin-bottom:15px; width:75px')))
            ->add('client', TextType::class,array('attr' =>array('class' =>'form-control', 'style' =>'margin-bottom:15px; width:200px')))
            ->add('remark', TextareaType::class, array('attr' =>array('class' =>'form-control', 'style' =>'margin-bottom:15px', 'required' => false), 'empty_data'  => null))
        ;
    }
  

Я ввел ‘required’ => false в поле remark.

new.html.twig

 {% extends 'base.html.twig' %}

{% form_theme form _self %}

{% use 'form_div_layout.html.twig' with form_label as base_form_label %}
{% block form_label %}
  {{ block('base_form_label') }}
    {% if required %}
      <span class="required" title="This field is required" style="color:red">*</span>
    {% endif %}
{% endblock %}

{% block body %}
    <h1>Request Item creation</h1>
    {% if is_granted("ROLE_SUPER_ADMIN") %}

    {% if app.session.flashBag.has('warning') %}
        <div class="alert alert-danger" role="alert">
            {% for msg in app.session.flashBag.get('warning') %}
                {{ msg }}
            {% endfor %}
        </div>
    {% endif %}

    {{ form_start(form) }}
        {{ form_widget(form) }}
        {{ form_row(form.remark, {'required': false}) }}
        <input type="submit" value="Create" class="btn btn-primary" />
    {{ form_end(form) }}

    <hr />
    <a href="{{ path('requestitem_index') }}" class="btn btn-success">Back to the list</a>
    {% else %}
        <h4>Please <a href="{{ path('fos_user_security_login') }}" class="btn btn-default">login</a></h4>
    {% endif %}
{% endblock %}
  

Я добавляю {{ form_row(form.remark, {‘required’: false}) }} в файл twig.

Исходный вид страницы для поля примечания

 <div>  <label for="request_item_remark" class="required">Remark</label>
          <span class="required" title="This field is required" style="color:red">*</span>
    <textarea id="request_item_remark" name="request_item[remark]" required="required" class="form-control" style="margin-bottom:15px" ></textarea></div>
  

Поле textarea является обязательным.

Я также попытался добавить в новый файл.html.twig

 {% extends 'base.html.twig' %}

{% form_theme form _self %}

{% block textarea_widget %}
  <div class="textarea_widget">
    {% set required=required|default('not required') %}
    {{ block('form_widget_simple') }}
  </div>
{% endblock %}
  

Странно, поле textarea становится текстовым полем ввода, и оно по-прежнему требуется.

 <div>  <label for="request_item_remark" class="required">Remark</label>
          <span class="required" title="This field is required" style="color:red">*</span>
      <div class="textarea_widget">
        <input type="text" id="request_item_remark" name="request_item[remark]" required="required" class="form-control" style="margin-bottom:15px"  />
  </div>
  

Структура таблицы

 CREATE TABLE `request_item` (
  `id` int(11) NOT NULL,
  `item_id` int(11) DEFAULT NULL,
  `date` date NOT NULL,
  `quantity` int(11) NOT NULL,
  `client` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `remark` longtext COLLATE utf8_unicode_ci
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  

Комментарии:

1. Вы пробовали использовать команду для обновления структуры базы данных php app/console doctrine:schema:update --force ?

Ответ №1:

Не ставьте required в attr , оно должно быть на верхнем уровне в настройках.

 ...
 ->add('remark', TextareaType::class, array('required' => false, 'attr' =>array('class' =>'form-control', 'style' =>'margin-bottom:15px'), 'empty_data'  => null))
...
  

В противном случае, если вы установите этот элемент обязательным через атрибуты, и required опция не будет иметь смысла.

Комментарии:

1. Это работает. Большое вам спасибо. Но я все еще не понимаю, код, который я поместил в файл twig, не работает.