首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在检索时定制symfony2表单?

如何在检索时定制symfony2表单?
EN

Stack Overflow用户
提问于 2012-10-29 06:30:03
回答 2查看 626关注 0票数 1

我有一个案例,我们为体育赛事建立注册。

注册包含一些特定于每项运动的字段。其中一些将被命名为类似的,虽然他们将是不同的每项运动。例如:“外地最喜欢的位置”:

对篮球来说,这是一个在以下两种情况下的选择:

  • 控球后卫
  • 射击护卫
  • 等等。

对于棒球来说,这将是相同的选择,但有一些不同的选择:

  • 内野
  • 外野
  • ..。

当第一次创建表单(用于显示)时,该项运动将作为注册数据的一部分传递:

代码语言:javascript
复制
$registration = new Registration;
$registration->setEvent($event);

$event->getSport();则会为那项赛事回报这项运动。

到目前为止,在我的表单生成中添加了一个听者,我只能设置特定于该运动的字段:

代码语言:javascript
复制
public static function getSubscribedEvents()
{
    return [FormEvents::POST_SET_DATA => 'preSetData'];
}

/**
 * @param event DataEvent
 */
public function preSetData(DataEvent $event)
{
    $form = $event->getForm();

    if (null === $event->getData()) {
        return;
    }

    // (The get event here means the real life sports gathering)
    $sport = $event->getData()->getEvent()->getSport();
    /**
     * Then I customize the fields depending on the current sport
     */
}

当用户将此表单提交回时,就会出现问题。在这种情况下,$event->getData()->getEvent()null

"event“(real )是注册表单中的document_id字段(此处使用MongoDB )。

如果我听的是::BIND事件而不是::PRE_SET_DATA,那么我可以访问所有的东西,但是定制表单已经太晚了,因为它已经绑定了。::PRE_BIND::PRE_SET_DATA做的一样。

如何在这里正确检索我的事件和体育文档,以便定制我的表单并对其进行适当的验证?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-30 06:11:26

所以..。最后,找到了如何做这个properly.It需要订阅两个不同的事件。

第一次构建表单时,一些数据被传递给它,因此,PRE_SET_DATA事件包含了该数据,一切都很好,正如问题中所解释的那样。

在表单提交的那一刻,它首先是在没有数据的情况下创建的,因此在PRE_SET_DATA中访问的数据为null。在本例中,我们跳过表单定制:

代码语言:javascript
复制
public function preSetData(DataEvent $event)
{
    $myEvent = $event->getData()->getEvent();

    if (null === $myEvent) {
        return;
    }

    $this->customizeForm();
}

这确保我们在提交表单时不会遇到问题,也不会传递任何数据,但是getData()将返回一个空对象而不是NULL。

现在,当表单提交时,我们将把它绑定到接收到的数据。那是我们想要干涉的时候。因此,我们还将订阅PRE_BIND事件:

代码语言:javascript
复制
public static function getSubscribedEvents()
{
    return [
        FormEvents::PRE_BIND => 'preBind',
        FormEvents::PRE_SET_DATA => 'preSetData',
    ];
}

在预绑定中,我们接收的数据只是一个值数组,而不是一个对象图。但是,如果我们在侦听器中注入对象管理器,那么我们就可以找到我们的对象并使用它们:

代码语言:javascript
复制
public function preBind(DataEvent $event)
{
    $data = $event->getData();
    $id = $data['event'];
    $myEvent = $this->om
                ->getRepository('Acme\DemoBundle\Document\Event')
                ->find(new \MongoId($id));
    if($myEvent === null){
        $msg = 'The event %s could not be found';
        throw new \Exception(sprintf($msg, $id));
    }

    $this->customizeForm();
}
票数 0
EN

Stack Overflow用户

发布于 2012-10-29 08:04:50

为什么你需要一个事件来完成这样的任务?可以在表单类的buildForm()操作中定义字段。要访问事件对象,只需使用$options['data']->getEvent()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13116862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档