Forms Symfony2-使用事件订阅服务器时字段不存在
我正在尝试实现可靠的表单,我遵循了它,但它似乎没有找到字段 视图: 注意:我没有使用示例中使用的“位置”模型,因为我不需要额外的字段或其他实体。(至少我认为我没有) 我使用的是2.3版 我试图做到的是:用户选择公司,用户字段应该只填充属于所选公司的用户 表格: 公司认购人:Forms Symfony2-使用事件订阅服务器时字段不存在,forms,events,symfony,Forms,Events,Symfony,我正在尝试实现可靠的表单,我遵循了它,但它似乎没有找到字段 视图: 注意:我没有使用示例中使用的“位置”模型,因为我不需要额外的字段或其他实体。(至少我认为我没有) 我使用的是2.3版 我试图做到的是:用户选择公司,用户字段应该只填充属于所选公司的用户 表格: 公司认购人: class AddCompanyFieldSubscriber implements EventSubscriberInterface { private $factory; public function
class AddCompanyFieldSubscriber implements EventSubscriberInterface
{
private $factory;
public function __construct(FormFactoryInterface $factory)
{
$this->factory = $factory;
}
public static function getSubscribedEvents()
{
return array(
FormEvents::PRE_SET_DATA => 'preSetData',
FormEvents::PRE_BIND => 'preBind'
);
}
private function addCompanyForm($form, $company)
{
$form->add('company', 'entity', array(
'class' => 'UserBundle:Company',
'mapped' => false,
'data' => $company,
'empty_value' => 'Company',
'attr' => array(
'class' => 'company_selector',
),
'query_builder' => function (EntityRepository $repository) {
$qb = $repository->createQueryBuilder('company');
return $qb;
}
));
}
public function preSetData(FormEvent $event)
{
$data = $event->getData();
$form = $event->getForm();
if (null === $data) {
return;
}
$accessor = PropertyAccess::getPropertyAccessor();
$user = $accessor->getValue($data, 'user');
$company = ($data->getUser()) ? $data->getUser()->getCompany() : null ;
$this->addCompanyForm($form, $company);
}
public function preBind(FormEvent $event)
{
$data = $event->getData();
$form = $event->getForm();
if (null === $data) {
return;
}
$company = array_key_exists('company', $data) ? $data['company'] : null;
$this->addCompanyForm($form, $company);
}
用户订户:
类AddUserFieldSubscriber实现EventSubscriberInterface
{
私人工厂
public function __construct(FormFactoryInterface $factory)
{
$this->factory = $factory;
}
public static function getSubscribedEvents()
{
return array(
FormEvents::PRE_SET_DATA => 'preSetData',
FormEvents::PRE_BIND => 'preBind'
);
}
private function addUserForm($form, $user, $company)
{
$form->add($this->factory->createNamed('user','entity', null, array(
'class' => 'UserBundle:User',
'empty_value' => 'Select User',
'data' => $user,
'auto_initialize' => false,
'attr' => array(
'class' => 'user_selector',
),
'query_builder' => function (EntityRepository $repository) use ($company) {
$qb = $repository->createQueryBuilder('user')
->innerJoin('user.company', 'company');
if ($company instanceof Company) {
$qb->where('user.company = :company')
->setParameter('company', $company);
} elseif (is_numeric($company)) {
$qb->where('company.id = :company')
->setParameter('company', $company);
} else {
$qb->where('company.name = :company')
->setParameter('company', null);
}
return $qb;
}
)));
}
public function preSetData(FormEvent $event)
{
$data = $event->getData();
$form = $event->getForm();
if (null === $data) {
return;
}
$accessor = PropertyAccess::getPropertyAccessor();
$user = $accessor->getValue($data, 'user');
$company = ($data->getUser()) ? $data->getUser()->getCompany() : null ;
$this->addUserForm($form, $user, $company);
}
public function preBind(FormEvent $event)
{
$data = $event->getData();
$form = $event->getForm();
if (null === $data) {
return;
}
$company = array_key_exists('company', $data) ? $data['company'] : null;
$user = array_key_exists('user', $data) ? $data['user'] : null;
$this->addUserForm($form, $user, $company);
}
}
我在这里遗漏了什么?只是一个想法,但是您是否尝试过在您的细枝模板中{{dump()}}查看有哪些变量可用 这只是一个很长的目标,但是在preBind()函数中,您正在检查$data中是否存在键“user”和“company”,因此我猜,在您的细枝模板中,您应该使用
{{ form_row(company) }} {# instead of {{ form_row(form.company) }} #}
{{ form_row(user) }} {# instead of {{ form_row(form.user) }} #}
class AddCompanyFieldSubscriber implements EventSubscriberInterface
{
private $factory;
public function __construct(FormFactoryInterface $factory)
{
$this->factory = $factory;
}
public static function getSubscribedEvents()
{
return array(
FormEvents::PRE_SET_DATA => 'preSetData',
FormEvents::PRE_BIND => 'preBind'
);
}
private function addCompanyForm($form, $company)
{
$form->add('company', 'entity', array(
'class' => 'UserBundle:Company',
'mapped' => false,
'data' => $company,
'empty_value' => 'Company',
'attr' => array(
'class' => 'company_selector',
),
'query_builder' => function (EntityRepository $repository) {
$qb = $repository->createQueryBuilder('company');
return $qb;
}
));
}
public function preSetData(FormEvent $event)
{
$data = $event->getData();
$form = $event->getForm();
if (null === $data) {
return;
}
$accessor = PropertyAccess::getPropertyAccessor();
$user = $accessor->getValue($data, 'user');
$company = ($data->getUser()) ? $data->getUser()->getCompany() : null ;
$this->addCompanyForm($form, $company);
}
public function preBind(FormEvent $event)
{
$data = $event->getData();
$form = $event->getForm();
if (null === $data) {
return;
}
$company = array_key_exists('company', $data) ? $data['company'] : null;
$this->addCompanyForm($form, $company);
}
public function __construct(FormFactoryInterface $factory)
{
$this->factory = $factory;
}
public static function getSubscribedEvents()
{
return array(
FormEvents::PRE_SET_DATA => 'preSetData',
FormEvents::PRE_BIND => 'preBind'
);
}
private function addUserForm($form, $user, $company)
{
$form->add($this->factory->createNamed('user','entity', null, array(
'class' => 'UserBundle:User',
'empty_value' => 'Select User',
'data' => $user,
'auto_initialize' => false,
'attr' => array(
'class' => 'user_selector',
),
'query_builder' => function (EntityRepository $repository) use ($company) {
$qb = $repository->createQueryBuilder('user')
->innerJoin('user.company', 'company');
if ($company instanceof Company) {
$qb->where('user.company = :company')
->setParameter('company', $company);
} elseif (is_numeric($company)) {
$qb->where('company.id = :company')
->setParameter('company', $company);
} else {
$qb->where('company.name = :company')
->setParameter('company', null);
}
return $qb;
}
)));
}
public function preSetData(FormEvent $event)
{
$data = $event->getData();
$form = $event->getForm();
if (null === $data) {
return;
}
$accessor = PropertyAccess::getPropertyAccessor();
$user = $accessor->getValue($data, 'user');
$company = ($data->getUser()) ? $data->getUser()->getCompany() : null ;
$this->addUserForm($form, $user, $company);
}
public function preBind(FormEvent $event)
{
$data = $event->getData();
$form = $event->getForm();
if (null === $data) {
return;
}
$company = array_key_exists('company', $data) ? $data['company'] : null;
$user = array_key_exists('user', $data) ? $data['user'] : null;
$this->addUserForm($form, $user, $company);
}
}
{{ form_row(company) }} {# instead of {{ form_row(form.company) }} #}
{{ form_row(user) }} {# instead of {{ form_row(form.user) }} #}