如何在Twig中将基于整数的实体字段转换为人类可读的名称

时间:2014-12-09 00:47:48

标签: symfony

在Symfony 2.4+项目中,为一个字段注册一个值数组的最佳方法是什么,该字段可以保存为整数但需要在模板中显示人类可读的值?

我有一个实体,其属性填充了表示不同常量值的整数值:

/**
 * The repetition frequency for billing cycle:
 * @ORM\Column(type="smallint")
 */
protected $repetition = 0;

我想在某处存储这些值的名称,所以最初我将它们放在我的实体中并带有一个getter:

protected $repetitionName = array(
        0 => 'Setup',
        1 => 'Second',
        2 => 'Minute',
        3 => 'Hour',
        4 => 'Day',
        5 => 'Week',
        6 => 'Month',
        7 => 'Year'
    );

public function getRepetitionName() {
    return $this->repetitionName;
}

这似乎是价值观的重要中央存储库。

然后在我的树枝模板中,我不想显示整数,我想要相应的名称值。所以我这样翻译它们:

<div class="billingCycle">{{ entity.repetitionName[entity.repetition] }}</div>

在我的表单构建器中,我创建了一个引用该数组的字段:

$builder->add('repetition', 'choice', array(
    'label'         => 'Billing Cycle',
    'help'          => 'The repetition frequency when this service is billed.',
    'choices' => $builder->getData()->getRepetitionNamePer(),
    // default to monthly (the most common)
    'empty_data'    => 6,
    'required'  => TRUE
));

此方法的问题

1。翻译:如果我想在任何时候翻译它,它会在一个地方进行硬编码。

2。可重用性:如果我有其他具有重复的实体(例如事件日历),那么重用它会很好。

第3。可配置性:理想情况下,这些可以在配置文件中编辑,而不是实体代码。

替代解决方案:自定义表单类型为具有配置参数的全局服务

更好的选择似乎在配置文件中设置了一些默认参数:

parameters:
    gutensite_component.options.status:
        0: Inactive
        1: Active
    gutensite_component.options.repetition:
        0: Setup
        1: Second
        2: Minute
        3: Hour
        4: Day
        5: Week
        6: Month
        7: Year

然后创建一个自定义表单类型Gutensite\ComponentBundle\FormType\RepetitionType,从配置参数加载选项。 See the Documentation for a great example of this。然后只需参考这样的字段类型:

$builder->add('repetition', 'repetition', array(
        'label'         => 'Billing Cycle',
        'help'          => 'The repetition frequency when this service is billed.',
        // default to monthly (the most common)
        'empty_data'    => 6,
        'required'  => TRUE
    ));

此解决方案的一个不方便的部分是,您必须在配置中使用twig参数(即使您不需要它,每个模板都会膨胀),或者始终记得手动将参数传递给来自你的控制器的树枝。

// I add to the standard object `$controller->view` which gets passed to Twig
$controller->view->options['repetition'] = $this->container->getParameter('gutensite_component.options.repetition');

可以访问:

<div class="priceValue label label-primary">${{ entity.price }}/<span class="billingCycle">{{ view.options.repetition[entity.repetition] }}</span></div>

这比我想要的更笨重,但它是可重复使用的。也许其他人有better solutions to pass the configuration to twig than what is represented here

其他建议?

您是否有任何其他建议,最佳做法或经验教训?请分享。

2 个答案:

答案 0 :(得分:0)

我要做的是将这些值保存为新实体的对象,并设置从main entity(或任何其他实体calendar event entity)到repetition entity的manyToOne关系

如果是这样,您可以在每次需要时轻松添加新的重复项,或者使用任何特定的重复项来获取main entity的所有对象。

此外,您可以为main entity的新对象构建一个漂亮的表单,其中包含重复值的输入(人类可读):

$builder->add('repetition', 'entity', array(
    'class'         => 'AcmeDefaultBundle:Repetition', // This is your new 'repetition entity'
    'property'      => 'repetitionName', // The field of your 'repetition entity' that stores the name (the one that will show a human readable value instead of the id)
    'expanded'      => true, // True if you prefer checkbox instead of a dropdown list
    'label'         => 'Billing Cycle',
    'help'          => 'The repetition frequency when this service is billed.',
    'required'      => true,
));

现在,当您想要在树枝中显示重复的名称时,您将使用:

<div class="billingCycle">{{ entity.Repetition.repetitionName }}</div> (you can also translate that value later)

答案 1 :(得分:0)

更简洁的方法(如果仅将它用于此实体)是在实体中定义一个返回该数组的公共方法:

public function getRepetitionNames() {
    return array(
        0 => 'Setup',
        1 => 'Second',
        2 => 'Minute',
        3 => 'Hour',
        4 => 'Day',
        5 => 'Week',
        6 => 'Month',
        7 => 'Year'
    );
}

根据“重复”字段值检索标签的另一种方法:

/**
 * @param $key
 * @return null
 */
 function getRepetitionLabel(){
     $repetitions = $this->getRepetitionNames();
     return isset($repetitions[$this->repetition]) ? $repetitions[$this->repetition] : 0;
 }

现在更容易在枝条中访问它:

<div class="billingCycle">{{ entity.repetitionLabel }}</div>

最后,在您的表单中使用您的实体来检索值:

$object = $builder->getData();
$repetitionChoices = $object->getRepetitionNames();

$builder->add('repetition', 'choice', array(
    'label'         => 'Billing Cycle',
    'help'          => 'The repetition frequency when this service is billed.',
    'choices'       => $repetitionChoices
    'empty_data'    => 6,
    'required'  => TRUE
));

如果您计划在更多实体中使用它,您可以使用界面。