如何使用 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');
...

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