cake-like layout/view system for CodeIgniter

создание 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?]
.....

1 комментарий:

  1. "$CI->load->view($controller.'/'.$action,$CI->template->vars_for_view,true);" - не всегда бывают такие ситуации, так что ваш вариант реализации DRY, на мой взгяд не подходит, ведь в CI есть routers, и controller/action при помощи роутерс может превратиться просто в action. Мое мнение: DRY не место в CI

    ОтветитьУдалить