从Symfony DateType :: class禁用日期和月份

时间:2016-11-07 10:50:58

标签: symfony symfony-forms

->add('attendFrom', DateType::class, array(
                'widget' => 'choice',
                'html5' => false,
                'months' => array(),
                'days' => array(),
                'attr' => array(
                    'placeholder' => 'Start year, e.g., 1980 ',
                )
            ))

我尝试禁用日期和月份的类型。我想只展示几年。这有可能吗?

我找到了一些隐藏日期和月份的解决方案,但我想知道是否可以从FormType中禁用它。

干杯

2 个答案:

答案 0 :(得分:4)

用户format选项,其值为yyyy

<强>形式:

->add('attendFrom', DateType::class, array(
    'format' => 'yyyy',
    'widget' => 'choice',
    'html5' => false,
    'attr' => array(
        'placeholder' => 'Start year, e.g., 1980 ',
    )
))
  

<强>更新-1

在树枝中隐藏月和日控制

<强> TWIG

{{ 
    form_widget(
        form.formName.attendFrom.day, 
        { 
            'attr': { 'style': 'display:none' }
        }
    )
    form_widget(
        form.formName.attendFrom.month, 
        { 
            'attr': { 'style': 'display:none' }
        }
    ) 
}}

参考:Link

答案 1 :(得分:1)

您只需使用

即可创建ChoiceType字段
...
'choices' => range(date('Y') - 10, date('Y') + 10),
...

但是,如果在提交表单后需要一个DateTime对象,则应该定义自己的View Transformer

在表单类型类中添加以下行:

public function buildForm(
    FormBuilderInterface $builder,
    array $options
)
{
    $builder
        ->add(
            $builder->create('attendFrom', DateType::class, [
                'widget' => 'choice',
            ])
            ->addViewTransformer(new IncompleteDateTransformer())
        );
}

另外,创建您自己的View Transformer:

/**
 * Class IncompleteDateTransformer.
 */
class IncompleteDateTransformer implements DataTransformerInterface
{
    /**
     * {@inheritdoc}
     */
    public function transform($value)
    {
        return $value;
    }

    /**
     * {@inheritdoc}
     */
    public function reverseTransform($value)
    {
        if (!is_array($value)) {
            return $value;
        }

        if (empty($value['year'])) {
            return $value;
        }

        $value['day'] = $value['day'] ?? 1;
        $value['month'] = $value['month'] ?? 1;

        return $value;
    }
}

然后,仅渲染attendFrom.year字段或通过form_row / form_widget函数中的attendFrom.month参数隐藏attendFrom.dayattr字段。有关隐藏其他字段的信息,请参见Gopal Joshi答案。