cakephp $ this-> request-is(“post”)只为一个表单返回false,这很奇怪?

时间:2013-02-05 17:22:55

标签: cakephp

我在网站上有很多表格。它们都是以类似

的方式创建的
<?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')));

6 个答案:

答案 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,而不是实际存在,所以它反复切换。我在addedit操作中使用了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中添加了检测器,因此可以从任何控制器方法中检查条件。