Pull to refresh

Comments 30

UFO just landed and posted this here
В CI также, в кохане на эту тему значит нового ничего не придумали. Автор же хочет этого как раз избежать. Кстати можено просто внутри подгружаемого представления инклудить в начале файла жидер, а в конце, соответственно, футер(я делаю так:)).
Тоже использую метод Александра Макарова для всех проектов.

Ещё, пожалуй, стоит обратить вимание на Ocular — достаточно приятная библиотека, так и не прижившаяся по неизвестным причинам у нас.
Некоторое время назад решил потихоньку переходить на какой-нибудь framework. Сначала взгляд мой пал на simfony, но потом переключился на CodeIgniter.
Аналогичная история :)
CI крут безусловно.
Крутая документация и армия программистов в форуме решают .)
Извините, но так и не понял, что мешает использовать один шаблон, внутри которого делать include шапки и футера?
Иногда возникает необходимость передать какие-то данные в ту же шапку или футер. Если инклюдить, тогда вся прелесть MVC начинает куда-то исчезать.

Автору:
Кстати, можно по методу Александра Макарова загружать многие данные в кострукторе контроллера, дабы не повторяться. При желании в методах можно переписать используемые шаблоны и/или данные.

А для конкретно каждого проекта можно создать и вовсе свой View унаследованный от данного, только изменив, к примеру, конструктор класса.
Если буферизировать вывод работы контроллера, то из него нетрудно, посредством общего хранилища данных, передать данные в хедер или футер, в стиле $this->addJS('jquery-ui');
а в CI нет слотов, как в симфони?
UFO just landed and posted this here
Не пойму проблемы. У меня реализованно примерно так:

$data['header'] = «Это выводим в заголовке»;
$data['footer'] = «А это в подвале»;
$data['content'] = «Тут находится контент»;

$this -> load -> view('main', $data);

В main:

< ?php $this -> load -> view('_header');?>

< ?=$content;?>

< ?php $this -> load -> view('_menu');?>

< ?php $this -> load -> view('_footer');?>

Подобная структура подойдёт в том случае, если вы запросом получаете цельный контент.
А если контент страницы собирается, то уже ваш подход работать не будет.
Почему-же?

P.S.: хабр, как всегда, в своем репертуаре — дал рабочее решени, но минусуют =)
Ну возьмём простейшую структуру, новость + комменты.
При вашем подходе, вам придётся в контроллере генерить html для вывода комментов, а это не есть хорошо.

P.S. Минусование не практикую.
Нет, не придется. Будет цикл, выводящий комментарии, в самом шаблоне (или в хелпере, который будет подключен к шаблону). Такой подход используется почти во всех шаблонизаторах.

По поводу минусов — это не к вам обращение было, мысли вслух.
Извините, видимо, я вас неверно понял, меня смутило название переменной и показалось, что вы запихиваете весь контент в одну переменную.
Читаю книгу «Professional CodeIgniter», там приведен пример:

< ?php $this -> load -> view('_header');?>

< ?php $this -> load -> view($main);?>

< ?php $this -> load -> view('_menu');?>

< ?php $this -> load -> view('_footer');?>

, где $main название view которое, задается в контроллере и подгружается динамически.
Это самый простой вариант с кучей недостатков. Например, при смене шаблона на другую структуру (например, поменяется месторасположение меню) придется менять и код в контроллере.
Почему? Как мне кажется в контролере не нужно будет менять. У нас же поменлояь только местоположение, а содержание осталось то же.
Ааа… Проглядел. Приношу извинения — такой способ действительно можно использовать.
Что-то топик минусуют. Видимо задал дилетантский вопрос…

Спасибо всем кто откликнулся.
Довольно тепичная ситуация когда для всего сайта используется один шаблон и меняются только данные которые передаются в центральную часть.
Такую проблему я реализовал следующим образом.
1) Подключаем библиотеку для работы с шаблонами Smarty (мне почему то больше нравится)
2) Перегружаем стандартный класс контролера собственным (class MY_Controller extends Controller)
3) В собственном контроллере создаем метод render — что то наподобие
function render($body_data='') {
if (is_array($body_data)){
foreach ($body_data as $key => $item){
$this->s->assign($key, $item);
}
} else {
$this->s->assign('body',$body_data);
}
$this->s->assign('css_tag', link_tag('css/templates.css'));
$this->s->render('site');

}

4) Теперь все пользовательские контроллеры наследуем от MY_Controller
5) Для вывода текущих данных используем такую вещь
$body_data = $this->load->view('/default/site/article/editor',$params,TRUE);
$jsinclude_data = $this->load->view('/default/site/article/jsi_editor',array(),TRUE);
$jspinclude_data = $this->load->view('/default/site/article/jsp_editor',array(),TRUE);

$template_param = array(
'body' => $body_data,
'js_include' => $jsinclude_data,
'js_page_function' => $jspinclude_data,
'css_add_tag' => '/>'
);
parent::render($template_param);

Если нет необходимости загрузки дополнительной информации можно просто использовать
parent::render($body_data);
Тогда данные из view будут загружены в центральную часть шаблона, а остальные данные останутся пустыми.

Сам шаблон выглядит следующим образом
{$title}
{$meta_tag}
{$css_tag}
{$css_add_tag}
{$js_include}
{$js_page_function}

{$menu}

{$body_data}

{$menu }

{$footer}

HTML таги в шаблоне порезало — но они там будут. Так же в 'css_add_tag' => 'загрузка отображения с дополнительными css файлами'
Перебор. Во-первых, при такой сложности, можно использовать $this -> load -> vars. Во-вторых, загрузка дополнительных view в контроллере — плохой ход. Если понадобится менять шаблон — придется править контроллер. Лучше все эти вызовы вставить в основной шаблон.

P.S.: а еще лучше — расширить стандартный view.
Ой, вот только не надо про SMARTY:) Код на CI поганить Smarty нехорошо.
Плюсик. Согласен с вами.
Не знаю почему, но SMARTY не прижился у меня. Не вижу смысла писать шаблон для того, чтобы php перевел его опять же в php…

SMARTY
{$var}

PHP
<?=$var?>

Практически одно и то же…
У меня всякие хедеры/футеры/меню лежат в отдельной папке и на каждой странице view подключаются там же $this->load->view('design/header');
есть библиотека layout для этих целей… по аналогии с RoR
Sign up to leave a comment.

Articles