如何使用Symfony表单处理ChoiceType的公共数据?

时间:2017-03-02 05:39:46

标签: symfony symfony-forms

我将创建一个包含一列ID验证的表单。 基于该系统有几种选择,与Enum相同。

目标页面应为:

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的选择。我不想在构建表单时列为数组。我能从其他班级获得数据吗?

非常感谢。

1 个答案:

答案 0 :(得分: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');
...

希望这会有所帮助。很难给你一个完整的答案,因为有很多方法可以做到这一点。