2010-05-23 96 views
1

我有一个函数CodeIgniter是否必须在最后一步加载视图?

function do_something() { 
    // process 
    $this->load->view('some_view', $data); 
    exec('mv /path/to/folder1/*.mp3 /path/to/folder2/'); 
} 

我的目的是输出视图后,移动文件。但显然它是在渲染视图之前完成的。我的问题是,$this->load->view();必须是功能的最后一步吗?

我做了一点研究,看起来像我的问题类似于this topic。正确?

回答

2

为什么不使用post_system挂钩?它在最后一页发送到浏览器之后调用,这样您就可以正常加载视图,而不会将它们回显出来。

下面是一个例子控制器:

class Home extends Controller { 

    function index() 
    { 
     $this->move_audio = TRUE; 
     $this->old_folder = "/path/to/folder/"; 
     $this->new_folder = "/path/to/folder2/"; 

     $this->load->view("some_view"); 
    } 

} 

和示例钩:

function post_system() 
{ 
    $CI =& get_instance(); 

    if(isset($CI->move_audio) && $CI->move_audio === TRUE) 
    { 
     // Trim, then add trailing slash for consitency 
     $old_folder = rtrim($CI->old_folder, "/")."/*.mp3"; 
     $new_folder = rtrim($CI->new_folder, "/")."/"; 

     exec("mv {$old_folder} {$new_folder}"); 
    } 
} 

退房的hooks user guide对它们设置信息。他们是你的朋友!

编辑:东西我只是想的...

如果你只是一个控制器方法里面可以这样做......它可能会更好地使用菲尔的做法。这样可以避免每次请求挂钩,如果你只需要一次就不需要了。

如果您只需要一次,可以使用CI的_output()处理程序(info here)。这将工作是这样的:

class Home extends Controller { 

    // Initalize the var to avoid having to 
    // check if it's set or not 

    var $move_audio = FALSE; 

    // CONTROLLER METHOD  
    function index() 
    { 
     $this->move_audio = TRUE; 
     $this->old_folder = "/path/to/folder/"; 
     $this->new_folder = "/path/to/folder2/"; 

     $this->load->view("some_view"); 
    } 

    // OUTPUT HANDLER 
    function _output($output = "") 
    { 
     echo $output; 

     if($this->move_audio === TRUE) 
     { 
      // Trim, then add trailing slash for consitency 
      $old_folder = rtrim($this->old_folder, "/")."/*.mp3"; 
      $new_folder = rtrim($this->new_folder, "/")."/"; 

      exec("mv {$old_folder} {$new_folder}"); 
     } 
    } 
} 
+0

谢谢!这看起来有希望。 – zihaoyu 2010-05-24 19:46:16

+0

它应该有所帮助,但我编辑了一些答案,因为如果您只需要一个控制器和一个方法的功能,那么这种方法就没有意义 – bschaeffer 2010-05-25 04:11:50

1

发送输出到浏览器在运行命令之前:

function do_something() 
{ 
    // process 
    echo $this->load->view('some_view', $data, TRUE); 
    exec('mv /path/to/folder1/*.mp3 /path/to/folder2/'); 
} 

否则,你只是给数据输出类,将尽快控制器完成运行。

+0

任何想法为什么这是-1?在CodeIgniter方法中使用echo没有任何问题。 – 2010-05-24 09:17:04

0

号其实对于某些Web服务我刚使用这样的事情:

function get_json_search() { 
    $results = $this->My_model->get_stuffs(); 
    echo json_encode($results); 
} 

你也可以有控制功能,这是从网上完全私有的。只需以'_'作为前缀。你永远不会将这些视为页面。

function _upload_photo($filepath) { //resize it and so on 

也许你误解了MVC。控制器是模型和视图之间的中介。同样,你也不需要使用模型。控制器只是从模型中获取东西并使用视图将其打印出来。没有理由(虽然这将是不好的风格),您不能使用控制器内或其他来源的数据,也不能从控制器打印出您的页面。

我不明白为什么它不起作用,如果你先加载视图。虽然我会反过来做,所以你可以给用户提供反馈。如果文件无法移动,您应该向他们显示错误。如果是性能密集型考虑使用队列或cron作业。

0
<?php 
    while (ob_get_level()) { 
     ob_end_flush(); 
    } 
    // start output buffering 
    if (ob_get_length() === false) { 
     ob_start(); 
    } 

    class Something extends Controller { 

     function do_something() { 
      $this->load->view('some_view', $data); 
      ob_flush(); flush(); 
      exec('mv /path/to/folder1/*.mp3 /path/to/folder2/'); 
     } 
    } 
?> 
相关问题