Приветствую!
Данная статья будет скорее полезна для новичков, но, с учетом отсутствия обширной документации по фреймворку, таких немало и поэтому я решил все-таки опубликовать ее.
На написание этой статьи меня также сподвигло множество вопросов, связанных с работой с медиа-файлами в 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'
));
Жду ваших комментариев и надеюсь, что этот небольшой пост кому-нибудь, да поможет.