如何为表单助手生成的日期时间输入设置自定义名称?

时间:2016-03-10 12:57:36

标签: html forms cakephp cakephp-3.0 formhelper

你做了什么

echo $this->Form->create(null, [
    'type' => 'get', 
    'url' => ['controller' => 'Holidays', 'action' => 'calendar']
]);
echo $this->Form->month('month', ['empty' => 'Select month', 'value' => @$month]);
echo $this->Form->year('year', ['minYear' => date('Y'), 'maxYear' => 2020, 'empty' => 'Select year', 'value' => @$year]);

预期行为

我期待在提交表单时,我生成的网址会显示为example.com/holiday/calendar?month=03&year=2016

实际行为

example.com/holidays/calendar?month%5Bmonth%5D=03&year%5Byear%5D=2016

首先想到

首先想到的是使用name选项。

echo $this->Form->month('month', ['name' => 'foo', 'empty' => 'Select month', 'value' => @$month]);

哪个会生成具有相同问题的<select name="foo[month]"..

第二个想法

自定义表单输入模板。这不允许自定义名称标记,因为它被传递给{{name}}所以当它到达模板时已经太晚了。

第三个想法

使用数组并将字段命名为相同。

echo $this->Form->month('month', ['name' =>'when', 'empty' => 'Select month', 'value' => @$month]);
echo $this->Form->year('year', ['name' => 'when', 'minYear' => date('Y'), 'maxYear' => 2020, 'empty' => 'Select year', 'value' => @$year]);

我希望example.com/holidays/calendar?when[month]=03&when[year]=2016,但你实际上得到/holidays/calendar?when%5Bmonth%5D=02&when%5Byear%5D=2016

结论

不幸的是,有三种不同的方法,我无法解决这个用例。如果有人知道如何自定义表单助手生成的html名称属性,或者阻止获取表单被转义,我会感兴趣,这样我的网址看起来就不那么混乱了。

1 个答案:

答案 0 :(得分:1)

URL是否以编码方式显示,取决于您的浏览器。例如,Firefox会将其显示为未编码,而Chromes会将其显示为编码。

日期窗口小部件使用嵌套名称,以便日期/时间列的日期/时间解析器接收从中解析和构造对象所需的所有内容。

使用日期窗口小部件的工作方式,无法更改名称的构建方式。您可以做的是例如为该输入使用自定义select模板,或者自行创建包含必要选项的select类型输入。

你可能已经尝试过使用全局模板的前者,这就是它失败的原因。你需要使用本地的,因此你必须使用FormHelper::input()才能让表单助手使用它们,比如

echo $this->Form->input('month', [
    'type' => 'month',
    'empty' => 'Select month',
    'value' => @$month,
    'templates' => [
        'select' => '<select name="month"{{attrs}}>{{content}}</select>'
    ]
]);
echo $this->Form->input('year', [
    'type' => 'year',
    'minYear' => date('Y'),
    'maxYear' => 2020,
    'empty' => 'Select year',
    'value' => @$year,
    'templates' => [
        'select' => '<select name="year"{{attrs}}>{{content}}</select>'
    ]
]);