0

出于某种原因,如果我将表单元素更改为隐藏,我的 ajax 表单将不起作用。如果我将它们更改为输入,它会如何工作。为什么会这样?

这是视图

<div id="price">
        <?php
        $this->Js->get('#phonepricearea');
        echo $this->Form->create('offer', array('url' => '/PhoneKarma/PhoneQueries/ajaxOffer', 'class' => 'custom'));
        echo $this->Form->hidden('phoneCapacity',array('value'=>''));
        echo $this->Form->hidden('phoneCondition',array('value'=>''));
        echo $this->Form->hidden('carrier',array('value'=>''));
        echo $this->Js->submit('Check', array('class' => 'button expand',
            'title' => 'Check',
            'url' => array(
                'action' => 'ajaxOffer'
            ),
            'update' => '#price'
        ));
        echo $this->Form->end();
        ?></div>

控制器

    public function ajaxOffer($capacity=null, $condition = null , $carrier = null) {
    if (!empty($this->data) && $this->request->is('ajax')) {
       //do stuff this doesn't effect the code..
        $this->render('ajaxOffer', 'ajax');
        } else {
         $this->set('offer', "0");
        }
    }

Javascript更改值

$('#offerPhoneCapacity').val(id);
4

1 回答 1

1

400 错误通常是安全组件的黑洞。文档说它会发出 404 错误,但这是错误的,如果没有配置,它会抛出一个错误。BadRequestException

如果某个操作受到安全组件的限制,它会被视为无效请求,默认情况下会导致 404 错误。$this->Security->blackHoleCallback您可以通过将属性设置为控制器中的回调函数来配置此行为 。

SecurityComponent::blackHole(object $controller, string $error)

黑洞包含 404 错误或自定义回调的无效请求。没有回调,请求将被退出。如果控制器回调设置为 SecurityComponent::blackHoleCallback,它将被调用并传递任何错误信息。

您的问题可能是由安全组件表单防篡改功能引起的。隐藏字段需要是静态的,因为它们的值用于生成安全令牌,如果值发生变化,生成的比较令牌将不同,因此表单将被视为无效。

默认情况下,SecurityComponent 会阻止用户篡改表单。它通过使用 FormHelper 并跟踪表单中的哪些文件来做到这一点。它还跟踪隐藏输入元素的值。所有这些数据都被组合起来并变成一个散列。提交表单时,SecurityComponent 将使用 POST 数据构建相同的结构并比较哈希。

如果您需要更改隐藏字段,则必须在unlockedFields属性/选项中或使用表单助手unlockField()方法定义它们。

示例(未经测试):

public $components = array
(
    'Security' => array
    (
        'unlockedFields' => array
        (
            'Offer.phoneCapacity',
            'Offer.phoneCondition',
            'Offer.carrier'
        )
    )
);


public function beforeFilter()
{
    $this->Security->unlockedFields => array
    (
        'Offer.phoneCapacity',
        'Offer.phoneCondition',
        'Offer.carrier'
    );
}


$this->Form->unlockField('Offer.phoneCapacity');
$this->Form->unlockField('Offer.phoneCondition');
$this->Form->unlockField('Offer.carrier');
于 2013-05-02T00:28:45.423 回答