所以,问题如下:
我有与实体Student
(一对多)相关的实体Group
。
组 1 有学生 1 和学生 2第 2 组有学生 3 和学生 4
我还有实体Class
它是表单渲染的主要实体。表单应该像这样解析:
<input type="text" name="class[name]"> <-- this one easy
问题从这里开始:(我需要动态呈现这么多select
标签,Group
实体中有多少条记录,选项中有Student
条实体记录(相关)
<label>Group1</label>
<select name="class[group][0]"> <-- don't not exactly about `name` attr
<option value="1">Student 1</option>
<option value="2">Student 2</option>
</select>
<label>Group2</label>
<select name="class[group][student]"> <-- or something
<option value="3">Student 3</option>
<option value="4">Student 4</option>
</select>
等等..
我已经阅读了有关自定义字段类型的信息,但可以找到如何执行此操作的示例。并且不知道从哪里开始搜索。
任何帮助将不胜感激。
更新
class ClassType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
;
}
/**
* @param OptionsResolverInterface $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle'Entity'Class'
));
}
/**
* @return string
*/
public function getName()
{
return 'class';
}
}
组类型
class GroupType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
;
}
/**
* @param OptionsResolverInterface $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle'Entity'Group'
));
}
/**
* @return string
*/
public function getName()
{
return 'b';
}
}
特技类型
class StudentType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('group')
;
}
/**
* @param OptionsResolverInterface $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle'Entity'Student'
));
}
/**
* @return string
*/
public function getName()
{
return 'student';
}
}
类实体
class Class
{
/**
* @var integer
*
* @ORM'Column(name="id", type="integer")
* @ORM'Id
* @ORM'GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM'Column(name="name", type="string", length=255)
*/
private $name;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
* @return A
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
}
集团实体
class Group
{
/**
* @var integer
*
* @ORM'Column(name="id", type="integer")
* @ORM'Id
* @ORM'GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM'Column(name="name", type="string", length=255)
*/
private $name;
/**
* @ORM'OneToMany(targetEntity="Student", mappedBy="group")
*/
private $students;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
* @return B
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Constructor
*/
public function __construct()
{
$this->students = new 'Doctrine'Common'Collections'ArrayCollection();
}
/**
* Add students
*
* @param 'AppBundle'Entity'C $students
* @return B
*/
public function addStudent('AppBundle'Entity'C $students)
{
$this->students[] = $students;
return $this;
}
/**
* Remove students
*
* @param 'AppBundle'Entity'C $students
*/
public function removeStudent('AppBundle'Entity'C $students)
{
$this->students->removeElement($students);
}
/**
* Get students
*
* @return 'Doctrine'Common'Collections'Collection
*/
public function getStudents()
{
return $this->students;
}
}
学生实体
class Student
{
/**
* @var integer
*
* @ORM'Column(name="id", type="integer")
* @ORM'Id
* @ORM'GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM'Column(name="name", type="string", length=255)
*/
private $name;
/**
* @ORM'ManyToOne(targetEntity="Group", inversedBy="students")
*/
private $group;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
* @return C
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set group
*
* @param 'AppBundle'Entity'B $group
* @return C
*/
public function setGroup('AppBundle'Entity'B $group = null)
{
$this->group = $group;
return $this;
}
/**
* Get group
*
* @return 'AppBundle'Entity'B
*/
public function getGroup()
{
return $this->group;
}
}
您需要根据实体使用 formType
http://symfony.com/doc/current/reference/forms/types/form.html
用于此目的的选择字段:http://symfony.com/doc/current/reference/forms/types/entity.html
在 Symfony 控制台中,您可以使用 doctrine 命令生成 formType:
generate
generate:bundle Generates a bundle
generate:controller Generates a controller
--> generate:doctrine:crud Generates a CRUD based on a Doctrine entity
generate:doctrine:entities Generates entity classes and method stubs from your mapping information
generate:doctrine:entity Generates a new Doctrine entity inside a bundle
--> generate:doctrine:form Generates a form type class based on a Doctrine entity
使用 generate:doctrine:form 生成 formType 和 un CRUD 控制器 使用 generate:doctrine:crud 它可以帮助您了解如何使用 formType :)
编辑:导致做表格:http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#cookbook-form-events-user-data以此示例为基础