symfony2可以在bindRequest之后更改editForm上的各个值吗?

时间:2013-12-28 23:02:05

标签: php forms validation symfony

这段代码不符合我的意图。

在最后一行,我为$ entity设置了一个值,期望它在添加了这个手动formError之后更改用户被发送回的editForm的值。

但是我意识到用户面临的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());
    }

1 个答案:

答案 0 :(得分:0)

使用Form Events。具体来说,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());

希望有所帮助。我相信还有很多其他方法可以实现这一目标。