[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: CodeIgniter Framework
TranceIT
CodeIgniter - шустрый и очень простой в освоении фрэймворк.

Данная тема предназначена не только для тех, кто только начинает знакомиться с фреймворком, но и для начинающих PHP программистов. Надеюсь, что старожилы PHP так же найдут в теме что-то полезное для себя.

Эта тема не мануал. Тут не будут рассматриваться азы работы с CI, для этого есть достаточно подробная документация где все расставлено по полочкам.
http://codeigniter.com/
http://code-igniter.ru/

Обсуждение

_____________
Безвозмездно помогаю только тем, кто сам пытается что-то сделать.

Остальным за WMR
Даже если там 10 строк кода!
Даже если мне это ничего не стоит!
Даже если вы нуб!

user posted image
TranceIT
Расширяем библиотеку Parser (/system/libraries/Parser.php)

Метод construct($folder)

Метод construct() служит для сбора HTML шаблона в случае, когда он разбит по частям (header.php, main.php, sidebar.php, footer.php и т.д.).

Метод construct() принимает один параметр:

/*
* $folder - string (По-умолчанию равен DIRECTORY_SEPARATOR)
* Указывается, если разбитый шаблон лежит не в /application/views/tpl,
* а глубже. Например: /application/view/admin/tpl.
*/



Структура папок для работы construct():
/application/views/tpl - директория с разбитым на части шаблоном (по умолчанию)
/application/models - директория, в которой construct() ищет модели (по умолчанию)

Если указан $folder:
/application/views/$folder/tpl - директория с разбитым на части шаблоном
/application/models/$folder - директория, в которой construct() ищет модели

Имена шаблонов и моделей:
Имя модели должно быть "имя части шаблона"_model.php.
Например для шаблона header.php construct() будет искать модель header_model.php.

Метод get_data() в подключаемых моделях:
Метод должен присутствовать во всех подключаемых моделях шаблонов и возвращать ассоциативный массив.

Основную часть шаблона можно оставить в /application/views/ - это значения не имеет, т.к. к нему подключаются части из /application/views/tpl непосредственно из контроллера.

Код:

public function construct($folder = DIRECTORY_SEPARATOR){

$CI =& get_instance();

$DS = DIRECTORY_SEPARATOR;
$empty['array'] = '';

$path['tpl'] = $folder != $DS ? $DS . $folder . $DS : $DS;
$path['model'] = $folder != $DS ? $folder . '/' : '/';
$path['parser'] = $path['model'] . 'tpl/';
$path['scandir'] = '.' . $DS . 'application' . $DS . 'views' . $path['tpl'] . 'tpl';

$files = scandir($path['scandir']);
unset($files[0]);
unset($files[1]);

foreach ($files as $file){

$name = substr($file, 0, -4);
$model = $name . '_model';

if(file_exists($path['model'])){
$CI->load->model($path['model'] . $model);
$data[$name] = $CI->$model->get_data();
}

$data[$name] = isset($data[$name]) ? $data[$name] : $empty;
$tpl[$name] = $CI->parser->parse($path['parser'] . $file, $data[$name], TRUE);
}

return $tpl;

}


Код с комментариями


public function construct($folder = DIRECTORY_SEPARATOR){

$CI =& get_instance(); // Получаем родной указатель (подробнее в документации)

$DS = DIRECTORY_SEPARATOR; // Разделитель директорий (для сокращения)
$empty['array'] = ''; // Пустой массив. Нужен для работы parser->parse(), если в шаблон не требуется передача данных.

$path['tpl'] = $folder != $DS ? $DS . $folder . $DS : $DS; // Путь к tpl (если $folder по умолчанию, равен разделителю директорий)
$path['model'] = $folder != $DS ? $folder . '/' : '/'; // Путь к моделям
$path['parser'] = $path['model'] . 'tpl/'; // Путь к tpl для парсера
$path['scandir'] = '.' . $DS . 'application' . $DS . 'views' . $path['tpl'] . 'tpl'; // Путь для сканирования директории с разбитым шаблоном

$files = scandir($path['scandir']); // Сканируем директорию с разбитым шаблоном
unset($files[0]); // Удаляем ссылку на предыдущую директорию
unset($files[1]); // Удаляем ссылку на текущую директорию

foreach ($files as $file){ // Для каждого полученного файла

$name = substr($file, 0, -4); // Отрезаем расширение
$model = $name . '_model'; // Имя модели, которую мы подключим, если она существует

if(file_exists($path['model'])){ // Если модель существует
$CI->load->model($path['model'] . $model); // Подключаем
$data[$name] = $CI->$model->get_data(); // Обращаемся к методу get_data() из модели, который возвращает одномерный, ассоциативный массив.
}

$data[$name] = isset($data[$name]) ? $data[$name] : $empty; // Если подключалась модель, то присваиваем массив, который вернул метод get_data(), иначе наш пустой массив.
$tpl[$name] = $CI->parser->parse($path['parser'] . $file, $data[$name], TRUE); // Парсим части шаблона и собираем в ассоциативный массив.
}

return $tpl; // Возвращаем массив

}



Пример работы construct()

/application/views/admin/tpl/header.php
  
<head>
<title>
{title}</title>
</head>



/application/views/admin/main_view.php

<html>
{header}
<body>
Контент
{footer}
</body>
</html>



/application/views/admin/tpl/footer.php

<div class="footer"></div>


/application/models/admin/header_model.php

class header_model extends CI_Model{

public function get_data(){
// Выборка из БД, бла-бла-бла
$data['title'] = 'Заголовок';
return $data;
}

}



/application/controllers/admin/main.php

class main extends CI_Controller{

public function index(){
$tpl = $this->parser->construct('admin');
$this->parser->parse('admin/main_view.php', $tpl);
}

}



Исходный код http://sitename/admin/main:

<html>
<head>
<title>
Заголовок</title>
</head>
<body>

Контент
<div class="footer">Подвал</div>
</body>
</html>




Просьба обсуждение вести в отдельной теме

_____________
Безвозмездно помогаю только тем, кто сам пытается что-то сделать.

Остальным за WMR
Даже если там 10 строк кода!
Даже если мне это ничего не стоит!
Даже если вы нуб!

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.