我在网站上有很多表格。它们都是以类似
的方式创建的<?php echo $this->Form->create('SysUser');?>
<fieldset>
<legend><?php echo __('Edit Basic Information'); ?></legend>
<?php
echo $this->Form->input('SysUser.first_name');
echo $this->Form->input('SysUser.family_name',array('label'=>__("Last Name")));
echo $this->Form->input('SysUser.mobile_phone_number');
echo $this->Form->input('SysUser.user_name',array('label'=>__("Screen Name")));
echo $this->Form->input('action', array('type'=>'hidden','value'=>'edit_basic_info'));
echo $this->Form->input('SysUser.id', array('type'=>'hidden','value'=>$user["id"]));
?>
</fieldset>
<?php echo $this->Form->end(__('Submit'));?>
但是一种形式的类型变成“放”,而不是“后”。当我创建这些表单时,我从未明确地将类型设置为“post”。我收集CakePHP设置发布的默认值。现在,我创建这种新特殊形式的方式似乎有些不对劲。奇怪的是,这是几天前工作的!
我不知道出了什么问题。这是它:
<?php echo $this->Form->create('Member'); ?>
<fieldset>
<legend><?php echo __('Basic Profile Setup'); ?></legend>
<?php
echo $this->Form->input('Member.gender_id');
$w = array();
for ($i = 40; $i < 120; $i++) {
$w[$i] = $i . " kg";
}
$h = array();
for ($i = 120; $i < 230; $i++) {
$h[$i] = $i . " cm";
}
echo $this->Form->input('Member.height', array(
'options' => $h,
'empty' => __("choose one")
));
echo $this->Form->input('Member.weight', array(
'options' => $w,
'empty' => __("choose one")
));
$options['minYear'] = date('Y') - 78;
$options['maxYear'] = date('Y') - 18;
echo $this->Form->input('Member.birthdate', $options);
echo $this->Form->input('Member.residential_location_id', array('label' => __("City/Location")));
echo $this->Form->input('Member.occupation_id',array('id'=>'MemberOccupationId'));
echo $this->Form->input('action', array('type' => 'hidden', 'value' => 'create_member'));
?>
</fieldset>
<?php
echo $this->Form->end(array("label" => __('Save')));
答案 0 :(得分:17)
当Request data
包含Model.id时,CakeRequest::method()
设置为put
。在cakephp中处理此问题的首选方法如下。
if ($this->request->is(array('post', 'put'))) {
// Code
}
您可以在baked控制器中看到此信息,编辑操作。
答案 1 :(得分:5)
不确定为什么会这样,但您可以这样设置表单类型:
<?php echo $this->Form->create('Member', array('type' => 'post')); ?>
答案 2 :(得分:3)
我也有这个问题。在我的情况下,当我遇到验证错误时就会发生这种情况。因此,对于第二次运行,脚本认为它是PUT请求而不是POST请求。现在,因为它是一个PUT,它甚至没有进入if-clause,我检查它是否是一个POST,所以它会返回输入并尝试创建一个POST请求。这是永远的循环。
解决方案?检查没有获得。
所以你会得到这样的东西:
if (!$this->request->is('get')){
//Save logic here
}
我在Cookbook中看到过这样的例子,但我找不到它。所以我觉得它已被更新,但就我而言,你必须使用这种方法。因此,您将涵盖PUT以及POST请求。
<强>更新强>
不建议使用此方法。如果在表单中设置了id
,则它是PUT / POST。因为我是根据请求的类型设置id,而不是实际存在,所以它反复切换。我在add
和edit
操作中使用了1个表单。他们都使用edit.ctp
,它只是设置得更灵活。
答案 3 :(得分:0)
来自the Cookbook:
如果
$this->request->data
包含以表单模型命名的数组元素,并且该数组包含模型主键的非空值,则FormHelper将为该记录创建一个编辑表单。
也许是这样的情况?什么是Member
的主键?
答案 4 :(得分:0)
我遇到了同样的问题,经过4个小时的搜索,我刚刚解决了它将模型名称附加到视图中的字段,如下所示:
<?php echo $this->Form->create('User');?>
<?php
echo $this->Form->input('User.id');
echo $this->Form->input('User.username', array('readonly' => true));
echo $this->Form->input('User.email', array('readonly' => true));
echo $this->Form->input('User.name');
echo $this->Form->input('User.phone');
echo $this->Form->input('User.gender');
echo $this->Form->input('User.locale', array('id' => 'locale_select', 'options' => array('es' => __('Spanish'), 'en' => __('English'))));
echo $this->Form->input('User.birthday', array('type' => 'date', 'dateFormat' => 'DMY', 'minYear' => date('Y') - 100, 'maxYear' => date('Y')));
?>
<?php echo $this->Form->end(__('Save', true));?>
好吧,我不得不说这个代码是插件,所以我不知道是否还有其他问题。但是该插件中的其他形式非常完美,而且这个形式需要具有模型名称。
答案 5 :(得分:0)
我处理这种情况的方法之一是创建我自己的探测器,定义后置或放置的上下文。这包含在AppController中的beforeFilter()
方法:
// add a simple form post detector
$this->request->addDetector('formPosted', array(
'env' => 'REQUEST_METHOD',
'options' => array('post', 'put')
));
然后,当您需要检查表单是否已发布(或“推出”)时,则:
if ($this->request->is('formPosted')) { ... }
由于在AppController中添加了检测器,因此可以从任何控制器方法中检查条件。