如何为表单助手生成的日期时间输入设置自定义名称?
How to set custom names for datetime inputs generated by the form helper?
你做了什么
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]);
预期行为
我原以为当提交表单时,我得到的 url 看起来像 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 name 属性,或者防止 get 表单被转义,我会很感兴趣,这样我的 url 就不会看起来那么乱了。
URL 是否编码显示,取决于您的浏览器。例如,Firefox 将以未编码的方式显示它,而 Chromes 将以编码方式显示它。
日期小部件使用嵌套名称,因此 date/time 列的 date/time 解析器接收从中解析和构造对象所需的一切。
根据日期小部件当前的工作方式,无法更改名称的构建方式。例如,您可以为该输入使用自定义 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>'
]
]);
你做了什么
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]);
预期行为
我原以为当提交表单时,我得到的 url 看起来像 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 name 属性,或者防止 get 表单被转义,我会很感兴趣,这样我的 url 就不会看起来那么乱了。
URL 是否编码显示,取决于您的浏览器。例如,Firefox 将以未编码的方式显示它,而 Chromes 将以编码方式显示它。
日期小部件使用嵌套名称,因此 date/time 列的 date/time 解析器接收从中解析和构造对象所需的一切。
根据日期小部件当前的工作方式,无法更改名称的构建方式。例如,您可以为该输入使用自定义 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>'
]
]);