symfony2 могу ли я изменить отдельные значения в editForm после bindRequest?

Этот фрагмент кода не делает то, что я хотел.

В последних строках я устанавливаю значение для $entity, ожидая, что оно изменит значение editForm, на которое возвращается пользователь после добавления этого ручного formError.

Но я понимаю, что editForm, с которым сталкивается пользователь, — это тот же самый editForm, к которому уже был привязан предыдущий запрос (и это то, что вам нужно, поскольку другие значения могли быть изменены, значения, которые мы разрешаем изменять).

Теперь можно установить значение для editForm, например $editForm->setWidth() или что-то подобное, чтобы выполнить то, что мне нужно?

    $originalEntity = clone $entity;

    $editForm   = $this->createForm(new ContainerType($tempCompany), $entity);

    $request = $this->getRequest();

    $editForm->bind($request);

    //if container is a screen user is not allowed to change resolution
    if ( !$entity->getIsGroup() && ( $entity->getWidth() != $originalEntity->getWidth() || $entity->getHeight() != $originalEntity->getHeight() ) ) {
        $error = new FormError("Eftersom detta är en skärm och ingen grupp tillåts du inte ändra upplösningen, detta kan endast göras av cloudsign support (som konfigurerat skärmen).");
        $editForm->get('width')->addError($error);
        $entity->setWidth($originalEntity->getWidth());
        $entity->setHeight($originalEntity->getHeight());
    }

person Matt Welander    schedule 28.12.2013    source источник
comment
stackoverflow.com/questions/11697560/   -  person coma    schedule 29.12.2013
comment
Не совсем то, что я хочу, я вижу, вы предлагаете лучший способ проверки. Мне нравится оставлять валидацию там, где она есть, по разным причинам. Просто спрашиваю, есть ли способ вручную установить ЗНАЧЕНИЕ полей ФОРМЫ по умолчанию перед рендерингом?   -  person Matt Welander    schedule 30.12.2013
comment
Я не предлагаю лучший способ проверки, заголовок вопроса: Какое место рекомендуется для изменения данных связанной формы в Symfony? и ответ Бернхарда правильный, вы можете изменить данные формы перед ее рендерингом и после привязки отправленных данных в событии PRE_SUBMIT (кстати, начните использовать $form-›submit($request)).   -  person coma    schedule 31.12.2013
comment
Ой, я не тот заголовок поставил, странно..   -  person Matt Welander    schedule 01.01.2014


Ответы (1)


Используйте события формы. В частности, событие PRE_SUBMIT. Вы можете создать такой класс, как ContainerScreenSubscriber, который расширяет Symfony\Component\EventDispatcher\EventSubscriberInterface.

use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class ContainerScreenSubscriber implements EventSubscriberInterface
{
    /**
     * @return array
     */
    public static function getSubscribedEvents() {
        return array(FormEvents::PRE_SUBMIT => 'preSubmit');
    }

    /**
     * @param \Symfony\Component\Form\FormEvent $event
     */
    public function preSubmit(FormEvent $event)
    {
        $data = $event->getData();
        $form = $event->getForm();

        // do your checks and manipulate the form data here
    }
}

В вашем типе формы

$builder->addEventSubscriber(new ContainerScreenSubscriber());

Надеюсь, это немного поможет. Я уверен, что есть много других способов добиться этого.

person Johnny    schedule 29.12.2013
comment
Не совсем то, что я хочу, я вижу, вы предлагаете лучший способ проверки. Мне нравится оставлять проверку там, где она есть, по разным причинам (например, я использую для проверки значения, которые не являются частью данных формы). Просто спрашиваю, есть ли способ вручную установить ЗНАЧЕНИЕ полей ФОРМЫ по умолчанию перед рендерингом? - person Matt Welander; 30.12.2013
comment
Прекратите копировать/вставлять этот комментарий и начните уточнять свой вопрос (или попробуйте наш ответ). - person coma; 31.12.2013
comment
Есть несколько способов установить значение по умолчанию. Обычный способ, если это новая запись, которая еще не сохранена, заключается в установке значения по умолчанию для свойств вашего объекта. Это отвечает на ваш вопрос? - person Johnny; 31.12.2013
comment
Я знаю, что это именно та функция, к которой я хочу получить доступ, но после привязки запроса. Мне нужно получить данные формы для проверки, и если я обнаружу ошибку в пользовательском вводе, я хочу отправить пользователя обратно в форму с некоторыми значениями, сброшенными по умолчанию, и не сохранять в форме те ошибочные значения, которые ввел пользователь . Можно ли это сделать? Я могу взломать его с помощью JavaScript, но я не хочу - person Matt Welander; 01.01.2014