Каковы ваши стратегии создания шаблонов?
Я пытаюсь разработать свой собственный небольшой фреймворк. Для этого я хотел бы ознакомиться с некоторыми методами создания шаблонов. Я знаю, что создание шаблонов - действительно сложная тема, но знание некоторых стратегий может помочь найти правильный.
Пожалуйста, если вы упомянете одного из них, не пишите просто "умный", например. Напишите немного о концепции, лежащей в ее основе.
Позвольте мне начать с идеи: Чтобы упростить задачу, мои файлы шаблонов - это просто PHP-файлы, содержащие HTML. Шаблоны могут включать в себя другие шаблоны. Данные вставляются в шаблоны через переменную $data, которая представляет собой ассоциативный массив, содержащий все данные для шаблона.
Итак, на первом этапе контроллер выполняет некоторое действие и создает этот массив данных $. Затем будет включен соответствующий шаблон.
Проблемы: Шаблон может включать не только шаблоны, но и контроллеры. т.е. отображение хлебной крошки или меню (с довольно сложной логикой, слишком сложной для обработки в шаблон).
5 answers
Взгляните на раздел Шаблоны веб-презентаций , особенно Представление шаблона, Преобразование Представления, Двухэтапный просмотр. Для таких вещей, как рендеринг панировочных сухарей или разбивка на страницы, вы можете использовать вспомогательный шаблон Просмотр.
Мне действительно понравился подход zend-framework к этому, и я сам использовал его в нашей структуре. У вас будет класс представления, в котором будут такие вещи, как:
$view = new View();
$view->setTemplatesPath('.....');
$view->assign('name','value');
$view->render('index');
Метод визуализации возьмет все сохраненные переменные, сделает их свойствами и включит шаблон на основе набора путей, поэтому в ваших шаблонах у вас будет:
<?php echo $this->foo; ?>
....
<?php echo $this->load('header'); // this includes another template ?>
Именно так я это и делаю, вместо того, чтобы вызывать контроллер в представлении (ЧТО?!?) Я просто вычисляю все необходимые данные для представления в контроллере, который в первую очередь вызывает представление.
Представление никогда не должно вызывать контроллер/модель! НО, если необходимо, вы можете сделать что-то вроде этого:
function Controller($pathToControler) // instantiates and returns the Controller
function Model($pathToModel) // instantiates and returns the Model
Таким образом, в вашем представлении вы можете сделать что-то вроде этого:
$this->Controller('path/to/blog/tags.php')->List();
Опять же, вам не следует использовать этот шаблон, я просто даю вам решения, не поощряя их.
Аналогично, вы также можете вызвать другое представление из представления, например:
$this->View('path/to/views/header.php', array('title' => 'Hello World!'));
Моя стратегия заключается в следующем:
- Попробуйте использовать минимум PHP в шаблоне и, если возможно, не используйте его вообще.
- Я создал классы для различных компонентов, обычно встречающихся на веб-страницах, одним из них является tpanel, который я использую для демонстрации концепции ниже
- например, tpanel будет обрабатывать всю логику для создания меню, анализирует небольшой шаблон для "navigation_menu" и отправляет результат для окончательного включения в общий шаблон.
Фактически я создаю "блоки", очень похожие на то, что делает Drupal - если вы знакомы с ним.
$this->load->library('tpanel');
$s=$this->tpanel->get('date',$data);
$s.=$this->tpanel->get('navigation_menu',$data);
$s.=$this->tpanel->get('ajax_menu',$data);
$s.=$this->tpanel->get('spacer',$data);
$data['title']='List of Databases';
$post=$this->uri->segment(5);
$blog=(file_get_contents('../'.$dir.'/'.$post.'.dat'));
$s.=markdown($blog);
$data['content']=$s;
$view='/admin/admin_simple_view';
Система гораздо более гибкая, чем то, что я показал выше. Например, tpanel->get('ajax_menu, $data)
также обрабатывает настройки скрипта с помощью jQuery.
В последнее время я также присматриваюсь к Django, и у них есть несколько очень хороших идей по созданию шаблонов. Возможно, стоит взглянуть, даже если вы не программист на Python, особенно на то, как они обрабатывают наследование.
Это не имеет прямого отношения к вашему вопросу, но рассматривали ли вы возможность создания шаблонов на стороне клиента? У Джона Ресига есть хороший микрошаблон на Javascript, который будет работать с веб-сервисами и другими методами Ajax. Довольно просто выполнить получение или публикацию для шаблона, а затем выполнить еще одно получение/публикацию для ваших данных. Это довольно удобно.