输入数据和隐藏表单类型的处理方式有什么区别?

时间:2013-06-21 18:49:21

标签: cakephp

最后,一个简单,直接回答的问题: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'

所以我的问题是,在正常的“输入”字段和“隐藏”字段之间处理数据的方式有何不同。为什么会出现这种差异,为什么这很重要?对于这个特殊问题,如何使隐藏数据的行为方式与普通输入数据相同?

1 个答案:

答案 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解决方案。多个隐藏的输入似乎更加混乱。