Приветствую!
Данная статья будет скорее полезна для новичков, но, с учетом отсутствия обширной документации по фреймворку, таких немало и поэтому я решил все-таки опубликовать ее.
На написание этой статьи меня также сподвигло множество вопросов, связанных с работой с медиа-файлами в Kohana и некоторые куски кода во многих просматренных мной исходниках проектов на Ko3 (люблю рассматривать реализации различных проектов на этом фреймворке — за отсутствием документации порой сильно помогает).
И так, что же мы будем делать?
Мы напишем контроллер, который будет обрабатывать запросы вида media/css/default и возвращать нам (кэшированный, если есть) файл views/.../media/css/default.css, например.
Код на 90% позаимствован из модуля userguide.
И так, код:
Вот, собственно, и все. Теперь, чтобы загрузить views/default/media/css/default.css достаточно обратиться к media/css/default, а чтобы загрузить картинку из, скажем, views/default/media/img/logo.png обращаемся к media/img/logo.png
А за это у нас будет отвечать вот такой вот маршрут:
Жду ваших комментариев и надеюсь, что этот небольшой пост кому-нибудь, да поможет.
Данная статья будет скорее полезна для новичков, но, с учетом отсутствия обширной документации по фреймворку, таких немало и поэтому я решил все-таки опубликовать ее.
На написание этой статьи меня также сподвигло множество вопросов, связанных с работой с медиа-файлами в Kohana и некоторые куски кода во многих просматренных мной исходниках проектов на Ko3 (люблю рассматривать реализации различных проектов на этом фреймворке — за отсутствием документации порой сильно помогает).
И так, что же мы будем делать?
Мы напишем контроллер, который будет обрабатывать запросы вида media/css/default и возвращать нам (кэшированный, если есть) файл views/.../media/css/default.css, например.
Код на 90% позаимствован из модуля userguide.
И так, код:
class Controller_Media extends Kohana_Controller{ public function action_index($path, $file) { $this->request->check_cache(sha1($this->request->uri)); //В папках media/css и media/js у нас лежат только файлы с расширением .css и .js соответственно, значит расширение = имени директории if($path == 'css' || $path == 'js') { $ext = $path; } else { $ext = pathinfo($file, PATHINFO_EXTENSION); $file = substr($file, 0, -(strlen($ext) + 1)); } //У меня функция View::GetTplName() возвращает имя текущего шаблона, то есть медиа-файлы шаблона default, например, лежат в views/default/media/... Если вам это не нужно - достаточно просто убрать View::GetTplName() и один слэш в пути. if ($file = Kohana::find_file('views/'.View::GetTplName().'/media/'.$path, $file, $ext)) { // Возвращаем в качестве ответа содержимое файла, если он существует $this->request->response = file_get_contents($file); // Ну а тут устанавливаем соответствующие файлу заголовки $this->request->headers['Content-Type'] = File::mime_by_ext($ext); $this->request->headers['Content-Length'] = filesize($file); $this->request->headers['Last-Modified'] = date('r', filemtime($file)); } else { // Или ошибку 404, если файл не найден $this->request->status = 404; } } }
Вот, собственно, и все. Теперь, чтобы загрузить views/default/media/css/default.css достаточно обратиться к media/css/default, а чтобы загрузить картинку из, скажем, views/default/media/img/logo.png обращаемся к media/img/logo.png
А за это у нас будет отвечать вот такой вот маршрут:
Route::set('media', 'media/<path>/<file>', array('file' => '.*')) ->defaults(array( 'controller' => 'media', 'action' => 'index' ));
Жду ваших комментариев и надеюсь, что этот небольшой пост кому-нибудь, да поможет.
