создание layout/view system в CodeIgniter похожей cakephp
я довольно долго использовал cakephp и мне нравиться DRY (Don't Repeat Yourself) , которая кстати есть и Ruby on Rails (RoR).что то подобное я хотел бы иметь и в CodeIgniter. погуглив пару дней
я нашел несколько хороших библиотек. например эту layout_library
эту View или эту Template Library
но всё ровно они были не DRY надо было писать постоянно что то типа
$this->layout->view('/shop/view_cart', $data);
в cakephp всё это делается автоматически. в default или определённый
в контроллере layout вставляется скомпилированный view,который
находится в папке "view/{название контроллера}/{имя функции}"
что бы действительно сделать DRY и cake-like layout/view system
проанализировав CI возможности я понял что для этого есть 2 пути :
1. используя механизм Hooks
2. написать MY_Loader
сейчас я рассмотрю первую возможность механизм Hooks.
- 1. в файле application/config/config.php
$config['enable_hooks'] = TRUE;
- 2. application/config/config.php
$autoload['libraries'] = array('template');
- 3. в файле "application/config/hooks.php" добавляем
// $hook['display_override']
$hook['post_controller'] = array(
'function' => 'display',
'filename' => 'template_display.php',
'filepath' => 'hooks'
);
Технология хуков в CI позволяет изменять ход работы фреймворка без изменения файлов ядра. Среди доступных типов хуков есть также pre_system
pre_controller,display_override,post_system и другие.
-4. в "application/hooks" создаем template_display.php
function display()
{
$CI =& get_instance();
$controller = $CI->router->fetch_class(); //
$this
->router->fetch_directory().
$CI->router->fetch_class()$action = $CI->router->fetch_method(); // $this->uri->segment(2, ‘index’);
$data['content_for_layout'] = $CI->load->view($controller.'/'.$action,$CI->template->vars_for_view,true);
$CI->load->view('layouts/'.$CI->template->layout, $data);
}
- 5. в "application/libraries" создаем Template.php
class Template{
puplic $layout = 'default';
puplic $vars_for_view;
puplic $vars_for_layout;
public function set($key,$value,$layout = false){
if ($layout) $this->vars_for_layout[$key] = $value;
else $this->vars_for_view[$key] = $value;
}
public function set_layout($layout)
{
$this->layout = $layout;
}
.....
ну вот и всё - можно использовать :
* Controller
function index(){
// ....
$this->template->set('bla',22);
}
* View
OK [$bla]
* Layout default.php
.... template
[?=$content_for_layout?]
.....
"$CI->load->view($controller.'/'.$action,$CI->template->vars_for_view,true);" - не всегда бывают такие ситуации, так что ваш вариант реализации DRY, на мой взгяд не подходит, ведь в CI есть routers, и controller/action при помощи роутерс может превратиться просто в action. Мое мнение: DRY не место в CI
ОтветитьУдалить