我收到错误“在非对象上调用成员函数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);
}
);
}
$事件 - >的getData();是NULL,我var_dumped $ event,它是一个非常大的对象。
目的是在选择字段中选择代理实体后动态生成表单,在本例中为描述字段。
任何人都可以建议我如何处理此错误或为什么getData()= NULL ??
编辑:
这样做的主要目的是用户可以添加/禁用/更新代理。主要思想是只显示一个选择或下拉字段和一个“添加代理”按钮。如果用户从选择字段中选择一个名称,则代理实体的表单将填充其数据。这就是为什么要有一个EventListener来检测select字段中的任何选择,然后根据用户选择显示数据的原因。希望这能澄清一点目标。
答案 0 :(得分: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)
);
}
如果还有其他问题请随时询问!!!