Форма Symfony только для чтения

Как отображать поля, read-only помощью компонента формы Symfony?

Вот как я пытаюсь сделать это безрезультатно:

Symfony 2

$builder
    ->add('descripcion', 'text', array(
        'read_only' =>'true'
    ));
}

Symfony 3

$builder
    ->add('descripcion', TextType::class, array(
        'read_only' => 'true'
    ));
}

Ответ 1

Предоставленные ответы заканчиваются этим исключением на Symfony 3:

Неотображается PHP Exception Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException: "Опция" read_only "не существует.

Правильный способ сделать это - использовать свойство attr в поле:

->add('descripcion', TextareaType::class, array(
    'attr' => array(
        'readonly' => true,
    ),
));

Ответ 2

Вы указали свой атрибут только для чтения в строку, он должен быть логическим.

удалите кавычки вокруг true

вот так:

->add('descripcion','text',array('read_only' => true))

true, без кавычек.

Ответ 3

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

$builder->add(
    'description',
    TextType::class,
    ['disabled' => true]
);

Другое предложение использовать ['attr' => ['readonly' => true]] или ['attr' => ['disabled' => true]] сделает вас уязвимыми для поддельных запросов.

Оба последних параметра будут устанавливать атрибуты "только для readonly или " disabled в поле, но ваша форма будет по-прежнему принимать новое значение для этого поля, если оно включено в запрос.

Только первый вариант выше отключит поле формы, а также не позволит вашей Форме принять новое значение для поля в запросе.

Я проверил это с помощью Symfony Form 3.4. Я не знаю, если 4 ведет себя так же.

Ответ 4

read_only устарел с Symfony 2.8. Поэтому вместо этого используйте readonly. И предоставить логическое значение для этого атрибута

->add('','text',array('readonly' => true))

Ответ 5

Обновление. Начиная с Symfony 3.0, значение readonly должно быть установлено в параметре attr. http://symfony.com/doc/2.8/reference/forms/types/form.html#read-only

Вместо этого также можно использовать отключенную опцию.

Ответ 6

Symfony 4 позволяет использовать только "отключенную" опцию в поле формы. Но это что-то другое, что "только для чтения".

  • Отключено - пользователь не может редактировать поле, и его значение НЕ передается во время передачи формы.
  • Только для чтения - пользователь не может редактировать поле, но его значение передается во время передачи формы.

Единственное решение, которое я нашел для "только для чтения":

->add('fieldname', TextType::class, [
            'label' => false,
            'attr'=> [ 'readonly' => true ]
        ])

Ответ 7

Рекомендую использовать отключенную опцию, потому что любое отправленное значение будет игнорироваться в соответствии с документами: https://symfony.com/doc/current/reference/forms/types/text.html#disabled

$builder->add('descripcion', TextType::class, [
    'disabled' => 'true',
]);

Ответ 8

Если familia and proofedor - отношения к другому объекту, я думаю, что они не должны быть текстовыми. Попробуйте аннулировать их типы или изменить тип сущности и проверить, не сработало ли оно.

Ответ 9

Позвольте мне добавить что-то, с чем другие ответы не помогли. Обработка как поле, но "настройка" для отключения издания может работать во многих случаях. Тем не менее, по крайней мере, трудно сделать в некоторых форматах, которые полностью предотвращают выпуск (т.е. Рендер как метку).

Как это решить? То, что я сделал, - это определить поле как HiddenType, а в шаблоне - рендеринг с использованием {{ form.vars.value.myfield }} или {{ item.myfield }}, взяв "item" как объект объекта, заключенный во все, что вы можете думать, как любой другой элемент HTML.

Ответ 10

readonly для read_only readonly и не read_only. Вы должны сделать эту опцию в attr следующим образом:

->add('', TextType::class, array('attr'=> array('readonly' => true)))

Ответ 12

Только опция "отключен" не вызывает ошибку

$builder
    ->add('descripcion', TextType::class, array(
        'disabled' => 'true'
    ));
}

Ответ 13

Для отключенного поля типа объекта работает нормально

->add('organizacion', EntityType::class, array(
    'class' => 'AppBundle:Organizacion',
    'label' => 'Institución/Organización',
    'choice_label' => 'nombre',
    'disabled' => true
))