Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
控制器中的cakephp刷新视图_Php_Cakephp - Fatal编程技术网

控制器中的cakephp刷新视图

控制器中的cakephp刷新视图,php,cakephp,Php,Cakephp,我是CakePHP新手。本来是一项简单的任务,但我遇到了问题。我有一个控制器,可以将遍历给定目录的记录放入数据库,一切都很顺利。现在在视图中,我想显示操作的进度有数千条记录,因此它将持续一段时间 我已经在控制器中有一个计数器$countFound、$countSaved、$countDiff,并将它们设置为视图中的output,但它没有更新。我试过了 $this->Session->setFlash() 但是这些闪烁只在操作完成后才会显示。您需要在控制器中使用Javascript和

我是CakePHP新手。本来是一项简单的任务,但我遇到了问题。我有一个控制器,可以将遍历给定目录的记录放入数据库,一切都很顺利。现在在视图中,我想显示操作的进度有数千条记录,因此它将持续一段时间

我已经在控制器中有一个计数器$countFound、$countSaved、$countDiff,并将它们设置为视图中的output,但它没有更新。我试过了

$this->Session->setFlash()

但是这些闪烁只在操作完成后才会显示。

您需要在控制器中使用Javascript和Ajax以及一些自定义方法来模拟视图中的实时更新

尝试使用Jquery的ajax方法定期检查是否有新记录setInterval+$。ajax将向自定义控制器方法提供最后显示的记录,控制器方法检查是否有任何新记录,如果有,则返回它或不返回,同时,在Jquery的ajax回调过程中,将显示控制器方法的结果并显示记录(如果有)

像这样的

    setInterval(function(){
      $.get(url, {lastrecordID:_id}, function(data){
        if(data !== "undefined") // append to the dom 
             dom.append(data).fadeIn();
      });
    },250);
url、_id和dom是js数据,您应该根据上下文动态填充这些数据

如果您希望只显示记录数,则每xx毫秒请求一次新记录并更新该字段

var dom = $('.directoriesCount');
setInterval(function(){
          $.get('directories/countupdate', {}, function(data){
            dom.empty().append(data);
          });
        },250);
在控制器的目录中:

public function countupdate() {
    return $this->Directory->find('count');
}

我没有考虑性能,因此如果频繁使用包含的视图,您可能需要优化计数查询或增加更新间隔。

PHP无法单独执行进度条之类的操作,因为一旦加载了仅PHP的页面,它就无法更改。进度条通常也使用Javascript编写。但是,当你做一个需要花费很长时间的操作时,特别是如果没有限制操作有多大的时候,你应该考虑PHP有一个最大的执行时间,这样你的脚本如果被占用太长时间就会被切断。简言之,PHP页面并不是真正用来做这样的大操作的。所以你可能想重新考虑你的设计。@Kai,谢谢你的回答。然而,它不需要是一个进度条;显示保存的记录数就足够了。在这种情况下,执行时间不是问题。我完全理解您显示的是一个数字而不是一个实际的条形图,但同样的情况仍然适用,因为这只是显示进度条的另一种方式,如果您知道我的意思的话?您需要在工作时将当前文件的状态保存到某个位置,如会话或数据库中,然后需要控制器操作在其中显示该数字。然后在启动操作的页面上,使用javascript定期获取进度页面并以某种方式显示。Kai,感谢您的解释!我看到CakePHP可以使用jQuery。我试试看。祝你晚上愉快奥利森:谢谢你,穆罕默德,这种方法对我很有效。通过在控制器循环之外使用CakePHP的“saveMany”,我甚至能够大大加快控制器的动作。再次感谢!