Symfony4 Forms - Как вы условно отключаете поле формы? - PullRequest
0 голосов
/ 20 мая 2018

Так каков наилучший способ заставить форму эффективно и вновь отображать одну и ту же форму, с условно отключенными полями, основанными на значениях свойств объекта?

У меня есть объект счета-фактуры, и мне нужна форма длясоздание счета, а также одной и той же формы с различными полями, отключенными на разных этапах процесса выставления счетов (сгенерированный, отправленный, оплаченный и т. д.).

Я думаю, что самый простой ответ - это динамическое отключение их в шаблоне веточки с помощьюПараметры form_row, но, несомненно, это повлияет на проверку формы на стороне сервера, поскольку он не знает, что поле было отключено?

Каков наилучший способ отменить поле на основе значения в базе данных?

РЕДАКТ. 1:

Изменен вопрос с Dynamically disable a field in the twig template or seperate class for each form? на Symfony4 Forms - How do you conditionally disable a form field?

1 Ответ

0 голосов
/ 20 мая 2018

Благодаря @ Cerad .Ответ на самом деле События формы

В типе формы (для меня App\Form\InvoicesType) добавьте вызов метода в конец построителя:

public function buildForm(FormBuilderInterface $builder, array $options)
{

    $plus_thirty_days = new \DateTime('+28 days');

    $builder
        ->add('client', EntityType::class, array(
            'class' => Clients::class,
            'choice_label' => 'name',
            'disabled' => false,
        ) )
        // the event that will handle the conditional field
        ->addEventListener(
            FormEvents::PRE_SET_DATA,
            array($this, 'onPreSetData')
        );;
}

а затем в том же классе создайте открытый метод с именем, совпадающим со строкой в ​​массиве (onPreSetData для этого примера):

public function onPreSetData(FormEvent $event)
{

    // get the form
    $form = $event->getForm();

    // get the data if 'reviewing' the information
    /**
     * @var Invoices
     */
    $data = $event->getData();


    // disable field if it has been populated with a client already
    if ( $data->getClient() instanceof Clients )
        $form->add('client', EntityType::class, array(
            'class' => Clients::class,
            'choice_label' => 'name',
            'disabled' => true,
        ) );

}

Здесь вы можете обновить поле, чтобы оно было любым допустимым FormType и укажите все допустимые параметры, как для обычного элемента формы в From Builder, и он заменит предыдущий, оставив его в той же исходной позиции в форме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...