Symfony2 从一个实体中选择多个标签


Symfony2 multiple select tags from one entity

所以,问题如下:

我有与实体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以此示例为基础