如何使用 Symfony 表单处理 ChoiceType 的公共数据?
How to handle Common data of ChoiceType with Symfony form?
我将创建一个带有一列 ID 验证的表单。
有几个基于系统的选项,同Enum。
目标页面应该是:
这里我在实体中有 属性 作为:
/**
* @var array<string>
*
* @ORM\Column(name="id_verification_requirements", type="simple_array", nullable=true)
*/
private $idVerificationRequirements;
我不确定如何构建表单元素和存储相关数据。
我是否需要将数据库中的特定数据保存为常量table?
PHP好像不支持Enum。
同时我还必须处理表格中的频率类型。
我有一些建议来创建一个新的频率类型来处理数据,例如:
频率:
class Frequency{
private $count;
// $unit must be defined in FrequencyUnit
private $unit;
function __construct($c, $u)
{
$this->count = $c;
$this->unit = $u;
}}
然后频率单位:
abstract class FrequencyUnit
{
const PER_DAY = "PER DAY";
const PER_WEEK = "PER WEEK";
const PER_MONTH = "PER_MONTH";
const PER_YEAR = "PER_YEAR";
}
如何以 drop-down 列表的形式生成它,或者有其他更好的方法来处理这种事情?
还有一个问题,有什么方法可以像sub-title一样在表单中只显示一个标签?
非常感谢您的帮助。
++++++++++++++++++++++++++++++++++++++++++++++ +++++
目前我构建的表单类型如下:
->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
)
)
对于频率,我在下面添加了获取和设置函数来处理表单数据。
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 来管理选择。我不想在构建表单时将其列为数组。我可以从其他 class 获取数据吗?
非常感谢。
我建议创建一个 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');
...
希望对您有所帮助。很难给你一个好的彻底的答案,因为有很多方法可以做到这一点。
我将创建一个带有一列 ID 验证的表单。 有几个基于系统的选项,同Enum。
目标页面应该是:
这里我在实体中有 属性 作为:
/**
* @var array<string>
*
* @ORM\Column(name="id_verification_requirements", type="simple_array", nullable=true)
*/
private $idVerificationRequirements;
我不确定如何构建表单元素和存储相关数据。 我是否需要将数据库中的特定数据保存为常量table? PHP好像不支持Enum。
同时我还必须处理表格中的频率类型。 我有一些建议来创建一个新的频率类型来处理数据,例如:
频率:
class Frequency{
private $count;
// $unit must be defined in FrequencyUnit
private $unit;
function __construct($c, $u)
{
$this->count = $c;
$this->unit = $u;
}}
然后频率单位:
abstract class FrequencyUnit
{
const PER_DAY = "PER DAY";
const PER_WEEK = "PER WEEK";
const PER_MONTH = "PER_MONTH";
const PER_YEAR = "PER_YEAR";
}
如何以 drop-down 列表的形式生成它,或者有其他更好的方法来处理这种事情?
还有一个问题,有什么方法可以像sub-title一样在表单中只显示一个标签?
非常感谢您的帮助。
++++++++++++++++++++++++++++++++++++++++++++++ +++++
目前我构建的表单类型如下:
->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
)
)
对于频率,我在下面添加了获取和设置函数来处理表单数据。
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 来管理选择。我不想在构建表单时将其列为数组。我可以从其他 class 获取数据吗?
非常感谢。
我建议创建一个 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');
...
希望对您有所帮助。很难给你一个好的彻底的答案,因为有很多方法可以做到这一点。