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 に答える