代码之家  ›  专栏  ›  技术社区  ›  547n00n

带有formType的Symfony枚举类型

  •  1
  • 547n00n  · 技术社区  · 9 年前

    我有一个symfony实体,它有一个枚举类型字段,我想为它生成一个表单类型。

    这是我的实体:

    <?php
    
    namespace EvalBundle\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * SessionEvaluation
     *
     * @ORM\Table(name="session_evaluation")
     * @ORM\Entity(repositoryClass="EvalBundle\Repository\SessionEvaluationRepository")
     */
    class SessionEvaluation
    {
        /**
         * @var int
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
    
        /**
         * @var string
         *
         * @ORM\Column(name="name", type="string", length=255, unique=true)
         */
        private $name;
    
        /**
         * @var \DateTime
         *
         * @ORM\Column(name="startDate", type="datetime")
         */
        private $startDate;
    
        /**
         * @var \DateTime
         *
         * @ORM\Column(name="endDate", type="datetime")
         */
        private $endDate;
    
        /**
         * @var string
         *
         * @ORM\Column(name="type", type="string", columnDefinition="enum('annual', 'intermediate')")
         */
        private $type;
    
        /**
         * One SessionEvaluation has Many PerformanceEvaluation.
         * @ORM\OneToMany(targetEntity="PerformanceEvaluation", mappedBy="sessionEvaluation")
         */
        private $performanceEvaluations;
    
        /**
         * One SessionEvaluation has Many Evaluation.
         * @ORM\OneToMany(targetEntity="Evaluation", mappedBy="sessionEvaluation")
         */
        private $evaluations;
    
        /**
         * Get id
         *
         * @return int
         */
        public function getId()
        {
            return $this->id;
        }
    
        /**
         * Set name
         *
         * @param string $name
         *
         * @return SessionEvaluation
         */
        public function setName($name)
        {
            $this->name = $name;
    
            return $this;
        }
    
        /**
         * Get name
         *
         * @return string
         */
        public function getName()
        {
            return $this->name;
        }
    
        /**
         * Set startDate
         *
         * @param \DateTime $startDate
         *
         * @return SessionEvaluation
         */
        public function setStartDate($startDate)
        {
            $this->startDate = $startDate;
    
            return $this;
        }
    
        /**
         * Get startDate
         *
         * @return \DateTime
         */
        public function getStartDate()
        {
            return $this->startDate;
        }
    
        /**
         * Set endDate
         *
         * @param \DateTime $endDate
         *
         * @return SessionEvaluation
         */
        public function setEndDate($endDate)
        {
            $this->endDate = $endDate;
    
            return $this;
        }
    
        /**
         * Get endDate
         *
         * @return \DateTime
         */
        public function getEndDate()
        {
            return $this->endDate;
        }
    
        /**
         * Set type
         *
         * @param string $type
         *
         * @return SessionEvaluation
         */
        public function setType($type)
        {
            $this->type = $type;
    
            return $this;
        }
    
        /**
         * Get type
         *
         * @return string
         */
        public function getType()
        {
            return $this->type;
        }
    
        public function __toString() {
            return $this->name;
        }
    }
    

    <?php
    
    namespace EvalBundle\Form;
    
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
    use Symfony\Component\Form\Extension\Core\Type\DateType;
    use Symfony\Component\Form\Extension\Core\Type\SubmitType;
    use Symfony\Component\Form\Extension\Core\Type\TextType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolver;
    
    class SessionEvaluationType extends AbstractType
    {
        /**
         * {@inheritdoc}
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->add('Name', TextType::class, array(
                'attr'=> array('class'=>'form-control')
            ))
                    ->add('startDate', DateType::class, array(
                        'format' => 'yyyy MM dd'
                    ))
                    ->add('endDate')
                    ->add('type', ChoiceType::class, array(
                        'choices' => array(
                            'Annuel' => true,
                            'Itérmidaire' => false,
                        ),
                        'attr' => array('class' => 'dropdown')
    
                    ))
                ->add('Lancer', SubmitType::class, array(
                    'attr' => array('class' => 'btn btn-primary')));
    
        }
    
        /**
         * {@inheritdoc}
         */
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'EvalBundle\Entity\SessionEvaluation'
            ));
        }
    
        /**
         * {@inheritdoc}
         */
        public function getBlockPrefix()
        {
            return 'evalbundle_sessionevaluation';
        }
    
    
    }
    

    枚举类型为的字段为:type

    1 回复  |  直到 9 年前
        1
  •  1
  •   Gabriel Diez    9 年前

    可以像在实体中使用注释一样设置枚举类型。但是,您必须确保在函数setType中传递的字符串是安全的,以确保它是枚举的一部分。

    你应该这样做

    public function setType($type)
    {
        if (!in_array($type, array('annual', 'intermediate'))) {
            throw new \InvalidArgumentException("Invalid type");
        }
        $this->type = $type;
    }
    

    否则,您仍然可以使用另一个解决方案,该解决方案包括为您的枚举创建一个可以找到的特定类型 here 或 here

    推荐文章