У меня есть функция
function do_something() { // process $this->load->view('some_view', $data); exec('mv /path/to/folder1/*.mp3 /path/to/folder2/'); }
Мое намерение состоит в перемещении файлов после вывода представления. Но, видимо, это делается перед визуализацией представления. Мой вопрос: $this->load->view();
должен быть последним шагом в функции?
Я сделал небольшое исследование и, похоже, мой вопрос похож на эту тему . Верный?
Почему бы вам просто не использовать 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}"); } }
Ознакомьтесь с руководством пользователя по крючкам для получения информации о его настройке. Они твои друзья!
EDIT: Что-то, о чем я только подумал …
Если вы собираетесь делать это только в одном методе контроллера, то, вероятно, лучше использовать подход Фила. Это позволило бы избежать вызова крюка для каждого запроса, который был бы лишним, если вам понадобится только один раз.
Еще одна вещь, которую вы могли бы сделать, если вам понадобится только один раз, – это использовать обработчик _output()
CI для контроллеров ( информация здесь ). Это будет работать следующим образом:
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}"); } } }
Отправьте вывод в браузер перед запуском команды:
function do_something() { // process echo $this->load->view('some_view', $data, TRUE); exec('mv /path/to/folder1/*.mp3 /path/to/folder2/'); }
В противном случае вы просто предоставляете данные классу Output, который будет запускаться сразу после завершения работы контроллера.
Нет. Фактически для некоторых веб-сервисов я просто использовал что-то вроде этого:
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.
<?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/'); } } ?>