最后,一个简单,直接回答的问题:D
背景:我的公司改变了使用某些网站时的处理方式。以前,某些网站仅在特定周内发送;现在,每个网站每周都会提供。他们要求我在他们的“添加新网站”表格中删除周数字段。然而,周和站点之间的链接仍然是代码工作所必需的,所以我试图隐藏该字段并每隔一周填充它。
自动填充它很简单。我这样做:
echo $this->Form->input('Week', array('value'=>array('1','2','3','4','5')));
当我调试从表单发送的数据时,我得到以下内容,这正是我希望它工作的方式。
'Week' => array(
'Week' => array(
(int) 0 => '1',
(int) 1 => '2',
(int) 2 => '3',
(int) 3 => '4',
(int) 4 => '5'
)
所以下一步就是隐藏输入。容易,对吗?我只是在表单中执行以下两项操作之一:
echo $this->Form->hidden('Week', array('value'=>array('1','2','3','4','5')));
或
echo $this->Form->input('Week', array('value'=>array('1','2','3','4','5'), 'type'=>'hidden'));
我所做的就是将类型更改为隐藏。但是现在,从表单调试数据返回的数据如下所示:
'Week' => array(
'Week' => '1 2 3 4 5'
所以我的问题是,在正常的“输入”字段和“隐藏”字段之间处理数据的方式有何不同。为什么会出现这种差异,为什么这很重要?对于这个特殊问题,如何使隐藏数据的行为方式与普通输入数据相同?
答案 0 :(得分:0)
正如您在评论中所说,Week
是一个多选输入,这就是为什么价值处理的差异。如果输入是允许多项选择的东西(如多个选择或复选框),那么它的逻辑是所有值都是一个数组。但隐藏的类型基本上是一个隐藏的文本输入(好吧,也许不是,但我正在简化)。看,如果你把
echo $this->Form->input('Week', array('type'=>'text', 'value'=>array('1','2','3','4','5')));
你将获得与输入字段相同的字符串,因此它不是隐藏的问题。
现在,对于您的情况,您可以将周值添加为字符串,并将更改处理post值的方式更改为字符串而不是数组。
但是,如果由于某种原因不太可能(更改代码太多等等),那么保留现有的相同代码,并用css隐藏它。像
这样的东西echo $this->Form->input('Week', array('value'=>array('1','2','3','4','5'),
'div'=>array('style'=>'display:none')));
应该做的伎俩(可能需要添加更多样式,先尝试一下)。
我不太喜欢css解决方案,浏览器可以解释css不同的方式等等......但它符合您的需求,您无需更改其他任何内容。
修改强>
第二,虽然可以用隐藏的字段实现相同的数组输出。虽然它不漂亮。你必须改变每个输入的名称来告诉php它是一个数组,比如这个
echo $this->Form->input('Week1', array('type'=>'hidden', 'value'=>1, 'name'=>'data[Week][Week][]'));
echo $this->Form->input('Week2', array('type'=>'hidden', 'value'=>3, 'name'=>'data[Week][Week][]'));
echo $this->Form->input('Week3', array('type'=>'hidden', 'value'=>4, 'name'=>'data[Week][Week][]'));
重要的部分是每个输入的名称选项,请参阅数组引用?特别是最后一个空[]
。这实际上是cakephp如何将所有数据作为数组发送。您是否尝试在没有FormHelper蛋糕的情况下创建表单?除非为所有表单字段设置输入名称,否则不会在$this->request->data['form_name']
中获取发布数据。
Cake通过使用$data
命名所有输入来发送<input name="data[ModelName][field_name]"
数组中的所有发布数据,并且对于多个输入是<input name="data[ModelName][field_name][]"
(最后使用空数组,因此它在数字上得到索引)。您可以在使用cakehelper in cake创建的任何其他表单上看到使用任何html检查器。
我希望很清楚......我会坚持使用css解决方案。多个隐藏的输入似乎更加混乱。