CakePHP:将AJAX分页加载分离为<div>,而不是整个.ctp文件</div>

时间:2013-07-05 17:31:35

标签: cakephp cakephp-1.3

我正在使用CakePHP 1.3和http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js的jQuery脚本。我遇到的问题是,在AJAX调用重新加载页面的<div id="part2">时,它会重新加载test_page.ctp内的整个页面(<div id="part2">)。如何将更新隔离到<div id="part2">并且只加载了<div id="part2"> test_page.ctp部分?

test_page.ctp中的CakePHP代码:

// at the beginning of cpt file
$this->Paginator->options(array(
    'evalScripts' => true,
    'update' => '#part2',
    'before' => $this->Js->get('#loading')->effect('fadeIn', array('speed' => 'fast')),
    'complete' => $this->Js->get('#loading')->effect('fadeOut', array('speed' => 'fast'))
));

// at the very end of ctp file
echo $this->Js->writeBuffer();

初次加载时我的页面布局(.../controller_name/test_page):

- - - - - - - - - - - - - - - -
|  <div id="part1">...</div>  |
- - - - - - - - - - - - - - - -
|  <div id="part2">           |
|   ...                       |
|  <previous> 1 2.. 5 <next>  |
|  </div>                     |
- - - - - - - - - - - - - - - -

移到另一页后我的页面布局(.../controller_name/test_page):

- - - - - - - - - - - - - - - -
|  <div id="part1">...</div>  |
|  this <div> is not reloaded |
- - - - - - - - - - - - - - - -
|  <div id="part2">           |
|      <div id="part1">       |
|          entire next page   |
|      </div>                 |
|  </div>                     |
- - - - - - - - - - - - - - - -

我有一个问题,当我只想用test_page.ctp更新其内容时,AJAX调用会将整个<div id="part2">插入<div id="part2">

2 个答案:

答案 0 :(得分:1)

您需要创建另一个.ctp文件,其中包含/生成您要呈现的内容。然后在ajax布局中呈现该文件。 ajax布局本质上是一个空布局,只输出.ctp文件的内容。这是它的工作原理:

-----------------------------
|    OuterSection is your   |
|    Layout                 |
|  -----------------------  |
|  | Inner Section is    |  |
|  | your view file      |  |
|  |                     |  |
|  -----------------------  |
|---------------------------|

这就是渲染的工作方式,它将网站的布局与其所有不同的页面分开。 要在cake 1.3中的ajax布局内进行渲染,请使用:

$this->layout = 'ajax';

在您使用AJAX调用调用的控制器函数中。

答案 1 :(得分:1)

在我的情况下,我只是将此代码移至layout并且工作正常:

$this->Paginator->options(array(
    'evalScripts' => true,
    'update' => '#part2',
    'before' => $this->Js->get('#loading')->effect('fadeIn', array('speed' => 'fast')),
    'complete' => $this->Js->get('#loading')->effect('fadeOut', array('speed' => 'fast'))
));