我在处理我的表单时遇到了一些问题。
我的表单布局如下:
用户(FOSUserBundle)
成员(自定义类)
地区(自定义类)
成员(member)表单是用户表单的子表单,区域表单是成员(member)表单的子表单。
首先,我得到的错误是:
Neither the property "region" nor one of the methods "setRegion()", "_set()" or "_call()" exist and have public access in class "Netsite\Bundle\AdminBundle\Entity\Member".
当我提交表单时会发生这种情况:
$form->handleRequest($request);
这里是所有相关代码:
成员.orm.yml
Netsite\Bundle\AdminBundle\Entity\Member:
type: entity
table: member
id:
id:
type: integer
generator:
strategy: AUTO
fields:
security_question:
type: string
length: 255
security_answer:
type: string
length: 255
----- SNIP -----
manyToMany:
region:
targetEntity: Region
cascade: ["persist", "remove"]
实体\成员.php
<?php
namespace Netsite\Bundle\AdminBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Member
*/
class Member
{
/**
* @var \Doctrine\Common\Collections\Collection
*/
private $region;
/**
* Constructor
*/
public function __construct()
{
$this->region = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Add region
*
* @param \Netsite\Bundle\AdminBundle\Entity\Region $region
* @return Member
*/
public function addRegion(\Netsite\Bundle\AdminBundle\Entity\Region $region)
{
$this->region[] = $region;
return $this;
}
/**
* Remove region
*
* @param \Netsite\Bundle\AdminBundle\Entity\Region $region
*/
public function removeRegion(\Netsite\Bundle\AdminBundle\Entity\Region $region)
{
$this->region->removeElement($region);
}
/**
* Get region
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getRegion()
{
return $this->region;
}
Form\MemberType.php
<?php
namespace Netsite\Bundle\AdminBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Validator\Constraints\NotBlank;
class MemberType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('region', new RegionType())
区域.orm.yml
Netsite\Bundle\AdminBundle\Entity\Region:
type: entity
table: region
id:
id:
type: integer
generator:
strategy: AUTO
fields:
region:
type: string
length: 255
实体\区域.php
<?php
namespace Netsite\Bundle\AdminBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Region
*/
class Region
{
/**
* @var integer
*/
private $id;
/**
* @var string
*/
private $region;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set region
*
* @param string $region
* @return Region
*/
public function setRegion($region)
{
$this->region = $region;
return $this;
}
/**
* Get region
*
* @return string
*/
public function getRegion()
{
return $this->region;
}
}
Form\RegionType.php
<?php
namespace Netsite\Bundle\AdminBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class RegionType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('region', 'entity', array(
'class' => 'Netsite\Bundle\AdminBundle\Entity\Region',
'property' => 'region',
'empty_data' => null,
'multiple' => true,
'expanded' => true,
'required' => false,
'label' => false
))
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver) {
$resolver->setDefaults(array(
'data_class' => 'Netsite\Bundle\AdminBundle\Entity\Region',
'cascade_validation' => true
));
}
public function getName() {
return 'RegionType';
}
}
我不知道我做错了什么。
最佳答案
我想你想在 MemberType.php 中替换:
$builder->add('region', new RegionType())
与
$builder->add('region', 'entity',
array(
'class' => 'YourBundle:Region',
'multiple' => true,
'expanded' => true,
'required' => true|false,
'property' => 'region',
'label' => 'your.label',
'error_bubbling' => true,
)
)
这将渲染一个带有标记为 Region::region 的复选框的区域(顺便说一句,令人困惑的命名方案。应该只是“名称”)。多个复选标记将反射(reflect)在多个 M2M 条目中。
关于php - Symfony2.3 多对多形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18720922/