2017-03-02 119 views
0

我要创建一个带有一列ID验证的表单。 有几个基于系统的选项,与Enum相同。如何使用Symfony格式处理ChoiceType的常用数据?

目标页面应该是:

enter image description here

这里我作为实体的属性:

/** 
* @var array<string> 
* 
* @ORM\Column(name="id_verification_requirements", type="simple_array", nullable=true) 
*/ 
private $idVerificationRequirements; 

我不知道如何建立表单元素并存储相关数据。 我是否需要将特定数据作为常量表保存在数据库中? 似乎PHP不支持Enum。

同时我也必须在表单中处理频率类型。 我有一些建议,以创建一个新的频率类型来处理类似的数据:

频率:

class Frequency{ 
private $count; 
// $unit must be defined in FrequencyUnit 
private $unit; 
function __construct($c, $u) 
{ 
    $this->count = $c; 
    $this->unit = $u; 
}} 

然后FrequencyUnit:

abstract class FrequencyUnit 
{ 
    const PER_DAY = "PER DAY"; 
    const PER_WEEK = "PER WEEK"; 
    const PER_MONTH = "PER_MONTH"; 
    const PER_YEAR = "PER_YEAR"; 
} 

如何像一个形式产生这种下拉列表还是有其他更好的方法来处理这种事情?

还有一个问题是,有没有什么方法可以在表单中只显示一个标签,就像子标题一样?

非常感谢您的帮助。

++++++++++++++++++++++++++++++++++++++++++++++ ++++

目前,我有建立如下表单类型:

 ->add('frequencyCount', IntegerType::class,array('label' => 'Max Load Frequency')) 
     ->add('frequencyUnit', ChoiceType::class,array(
      'choices' => array(
       'Per Day' => 'Per Day', 
       'Per Week' => 'Per Week', 
       'Per Month' => 'Per Month', 
       'Per Year' => 'Per Year' 
      ), 
      'expanded' => false, 'multiple' => false 
     )) 
     ->add('idVerificationRequirements', ChoiceType::class, array(
       'label' => 'ID Verification Requirements', 
       'choices' => array(
        'Front' => 1, 
        'Back' => 2, 
        'Both' => 3 
       ), 
       'expanded' => true, 'multiple' => true 
      ) 
     ) 

频率我有下面添加get和set函数来处理表单数据。

public function setFrequencyCount($count) 
{ 
    $this->loadFreq->setCount($count); 
    return $this; 
} 

public function getFrequencyCount() 
{ 
    return $this->loadFreq->getCount(); 
} 

public function setFrequencyUnit($unit) 
{ 
    $this->loadFreq->setUnit($unit); 
    return $this; 
} 

public function getFrequencyUnit() 
{ 
    return $this->loadFreq->getUnit(); 
} 

它似乎工作。 我不确定这应该是解决方案还是更好的方法。

现在,我只是想知道是否有某种方式来管理ChoiceType的选择。构建表单时,我不想将其列为阵列。我可以从其他班级获得数据吗?

非常感谢。

+0

我们是否应该假定您已经阅读了[Symfony Forms文档](https://symfony.com/doc/current/forms.html)和{Doctrine Documentation](https://symfony.com/doc) /current/doctrine.html)?如果是这样,你有没有尝试过制作表格课程? –

+0

非常感谢。我现在列出了我正在做的事情。但仍然有一些问题。 – Bob

+0

你好鲍勃。确保你赞成Stackoverflow上的任何评论。如果他们遇到同样的问题,我会帮助人们找出有用的建议。我会看看我能否回答你关于frequencyUnit的问题。 –

回答

0

我建议创建一个FrequencyUnit实体例如是这样的:

<?php 

// src/AppBundle/Entity/Unit.php 
namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="unit") 
*/ 
class Unit 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(name="unit_id", type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $unit_id; 

    /** 
    * @ORM\Column(name="value", type="string") 
    */ 
    protected $value; 

    /** 
    * Set value 
    * 
    * @param string $val 
    * 
    * @return Unit 
    */ 
    public function setValue($val) 
    { 
     $this->value = $val; 

     return $this; 
    } 

    /** 
    * Get value 
    * 
    * @return string 
    */ 
    public function getValue() 
    { 
     return $this->value; 
    } 
} 

然后在您的形式使用的EntityType像这样:

... 
->add('unit', EntityType::class, array(
    'class' => 'AppBundle:Unit', 
    'query_builder' => function (EntityRepository $er) { 
     return $er->createQueryBuilder('u'); 
    }, 
    'choice_label' => 'value', 
)) 
... 

您将需要仍然添加值到实体。也许在你的控制器?

$unit = new Unit(); 
$unit->setValue('PER DAY'); 
... 

希望有帮助。很难给你一个好的彻底答案,因为有很多方法可以做到这一点。

+0

非常感谢,Alvin。我将根据您的建议创建一个新表来处理所有这些信息。我认为这应该是处理这些选择的正确方法。 – Bob

+0

很高兴帮助! –