0

我收到错误“调用非对象上的成员函数 getAgent()”。

这是我在 AgentsType.php 中的代码:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('agents', 'entity', array(
            'class' => 'MyBundle:agents',
            'property' => 'name',));

    $formModifier = function(FormInterface $form, agents $agent) {
        $description = $agent->getDescription();
        $form->add('description', 'text');
    };

    $builder->addEventListener(
        FormEvents::PRE_SET_DATA,
        function(FormEvent $event) use ($formModifier) {
            $data = $event->getData(); //ERROR HERE, returns NULL
            $formModifier($event->getForm(), $data->getAgent()); // Exception HERE
        }
    );

    $builder->get('agents')->addEventListener(
        FormEvents::POST_SUBMIT,
        function(FormEvent $event) use ($formModifier) {
            $agent = $event->getForm()->getData();
            $formModifier($event->getForm()->getParent(), $agent);
        }
    );
}

$event->getData(); 是 NULL,我 var_dumped $event 并且它是一个非常大量的对象。

目的是在选择字段(在本例中为描述字段)中选择代理实体后动态生成表单。

谁能建议我如何处理此错误或为什么 getData() = NULL?

编辑:

这样做的主要目的是用户可以添加/禁用/更新代理。主要思想是只显示一个选择或下拉字段和一个“添加代理”按钮。如果用户从选择字段中选择一个名称,则代理实体的表单将填充其数据。这就是有一个 EventListener 的原因,它可以检测选择字段中的任何选择,然后根据用户选择显示数据。希望这能澄清一点目标。

4

1 回答 1

2

创建一个表单类型以显示所有代理。

// AgentsType.php
public function buildForm(FormBuilderInterface $builder, array $options)
{
  $builder
    ->add('agents', 'entity', array(
       'class' => 'MyBundle:Agent',
       'query_builder' => function(EntityRepository $rep) {
         // some query for agents
       };
       'attr' => array('onselect' => 'loadAgentForm(this);')
     )
  );
}

您将需要一些 javascript 来对另一个返回页面的控制器进行异步调用,该页面包含 AgentType 表单(不是 AgentsType)。

function loadAgentForm(sender) {
  // if you use jquery:
  $("div#form-container").load(
    ("http://myurl.com/agent/editform?id=" + sender.value)
  );
}

如果还有其他问题欢迎随时提问!!!

于 2013-10-24T13:52:51.933 回答