2010-05-23 58 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/'); 
     } 
    } 
?> 
相關問題