thaJezathの答えは良いですが、他にもいくつかあります:
すべての ajax に CakePHP Js ヘルパーを使用する方が簡単で、より DRY です。
<div id="output">
<?php
echo $this->Form->create();
echo $this->Form->input('input1');
echo $this->Form->input('input2');
echo $this->Js->submit('submit',array('update' => '#output');
?>
</div>
これにより、ajax送信を処理するバッファリングされたスクリプトが自動的に追加されます。ただし、レイアウトのタグecho $this->Js->writeBuffer();
の直前に行が必要になります。</body>
しかし、これはまだ返されます<div id="output">...
- に変更すると'update' => '#content'
、コンテンツ div 全体がリロードされます。
- 他のものではなくフォームだけを更新する必要がある場合:
ビューファイルで:
<div id="output">
<?php $this->start('ajax-content'); // this line starts new block ?>
<?php
echo $this->Form->create();
echo $this->Form->input('input1');
echo $this->Form->input('input2');
echo $this->Js->submit('submit',array('update' => '#output');
?>
<?php
$this->end(); // this line ends block
echo $this->fetch('ajax-content'); // this line print contents of block
?>
</div>
そして、あなたの /View/Layouts/ajax.ctp で:
<?php
// next 2 lines only ensure that ajax-content block exists
// if not it will be just empty string
$this->startIfEmpty('ajax-content');
$this->end();
echo $this->fetch('ajax-content'); // this line outputs ajax-content block (the form)
?>
つまり、このメソッドを要約すると、ビュー ブロック内の ajax コンテンツで返したいコンテンツを囲みます。次に、ビュー全体を印刷する代わりにajaxレイアウト($this->fetch('content');
)、ajax-contentブロックのコンテンツのみを印刷します($this->fetch('ajax-content');
)。このようにして、ajax リクエスト中に返したいすべてのコンテンツをすべてのビューでマークできます。
台詞:
$this->end(); // this line ends block
echo $this->fetch('ajax-content'); // this line print contents of block
便利ではないかもしれません - すべてのブロック記録コードを独自のヘルパーに入れて、単純に使用することをお勧めします。
<div id=...
$this->AjaxContent->start();
your form here
$this->AjaxContent->stop();
</div>
thaJezath がコメントで書いたように、JsHelper は将来のリリースで非推奨になるため、彼が言ったようにビュー ブロックを使用する方が安全です。HtmlHelper には、これを行う便利な方法があります。
<?php $this->Html->scriptStart(array('inline' => false)); ?>
$(document).ready(function(){
// your code here
});
<?php $this->Html->scriptStart(array('inline' => false)); ?>
これにより、スクリプトがviewBlockに追加"script"
され、デフォルトのレイアウトで印刷されます$this->fetch('script');