【问题标题】:Symfony2 multiple select tags from one entitySymfony2 来自一个实体的多选标签
【发布时间】:2016-07-02 01:55:07
【问题描述】:

所以,问题如下:

我有实体 Group 与实体 Student (OneToMany) 相关。

Group1 有 Student1 和 Student2 Group2 有 Student3 和 Student4

我还有实体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;
    }
}

【问题讨论】:

    标签: php symfony


    【解决方案1】:

    你需要根据你的实体使用formType

    http://symfony.com/doc/current/reference/forms/types/form.html

    为此目的选择字段: http://symfony.com/doc/current/reference/forms/types/entity.html

    在 Symfony 控制台中,您可以使用教义命令生成 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 和使用 generate:doctrine:crud 的非 CRUD 控制器,这有助于您了解如何使用 formType :)

    编辑: 导致做表格: http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#cookbook-form-events-user-data 以这个例子为基础

    【讨论】:

    • 但是不允许只选择组,而不是组学生吗?
    • 你能发布你的实体吗?如果我是对的,你的组实体中有一个学生键,当你创建一个表单时,你使用一个实体,如果你使用第一个组,你有第一个组的学生。也许你的关系对你的问题不是更好。你能说出你形成的目的吗?
    • 谢谢,您的表单的目标是什么?你需要选择学生吗?
    • 我需要渲染这么多选择,因为有小组和学生可供选择。请参阅 HTML 示例。而且我需要将它保存在数据库中,就像班级与学生组一样。 | class_id | group_id |学生ID |或类似的东西
    • 这是我没看懂的部分,你需要保存一个有相关组和学生的班级吗?
    猜你喜欢
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 2014-09-24
    • 2012-04-28
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    相关资源
    最近更新 更多