我正在尝试使用日期字段构建表单,用户只能选择一个月和一年(没有一个月的日期),但我无法弄清楚如何实现这一点。
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add(
'month',
'date',
array(
'label' => 'Month & year',
'input' => 'array',
'widget' => 'choice',
));
$builder->add('submit',
'submit');
}
理想的结果是两个下拉列表:月份列表(数字表示)和年份列表(4位数,5年后)。
我想我可以使用2个选择类型的字段,但也许有更优雅的解决方案?
答案 0 :(得分:7)
您可以在twig文件中执行以下操作。
{{ form_widget(yourForm.month.month) }}
{{ form_widget(yourForm.month.year) }}
这将显示两个选项字段,一个用于月份,另一个用于年份。我建议将字段名称从月份更改为其他内容。我不确定但它可能会发生冲突。我希望这有帮助..!
编辑:要显示过去5年,请在“表单”构建器中
$builder->add(
'month',
'date',
array(
'years' => range(date('Y'), date('Y')-5)
'label' => 'Month & year',
'input' => 'array',
'widget' => 'choice',
));
答案 1 :(得分:1)
我认为你可以做一些对你的用户更好的事情,但对你来说更复杂。
您可以使用Bootstrap Datetimepicker(http://www.malot.fr/bootstrap-datetimepicker/)并将其设置为用户只能选择年份和月份的方式,如下图所示:
调用脚本时,请将格式设置为“mm-yyyy”或类似的内容。
<script>
$(function (){
$(".datepicker").datetimepicker({
weekStart: 1,
format : 'mm-yyyy'
});
});
</script>
必须进一步研究此解决方案的细节,但这是一般性的想法。
答案 2 :(得分:0)
你应该去语义并使用&#34;月&#34;输入。然后,当然,当客户端不支持此类输入类型时,您可以回退到任何javascript datepicker。这是一个超级简单(但完全正常)的代码示例(适用于Symfony 2.8或更高版本):
<?php
namespace AppBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\CallbackTransformer;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
/**
* Month Type.
*/
class MonthType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->addModelTransformer(new CallbackTransformer(
function ($dateTime) {
return empty($dateTime) ? null : $dateTime->format('Y-m');
},
function ($monthString) {
return new \DateTime("$monthString-01");
}
))
;
}
/**
* {@inheritdoc}
*/
public function finishView(FormView $view, FormInterface $form, array $options)
{
$view->vars['type'] = 'month';
}
/**
* {@inheritdoc}
*/
public function getParent()
{
return TextType::class;
}
}
答案 3 :(得分:0)
如果您不介意提交的日期,您可以通过类隐藏日期输入,这可能是您实现此目标的最简单方法:
{{ form_start(form) }}
{{ form_widget(form.date.day, {'attr': {'class': 'hide'}}) }}
{{ form_widget(form) }}
{{ form_end(form) }}