Каковы ваши стратегии шаблонов?

Я стараюсь развить свои собственные рамки. Для этого я хотел бы прочитать некоторые шаблонные методы. Я знаю, что шаблоны – очень сложная тема, но знание некоторых стратегий поможет найти правильный.

Пожалуйста, если вы упомянули один, не просто напишите «smarty», например. Напишите немного о концепции, стоящей за ней.

Позвольте мне начать с идеи: сделать все просто, мои файлы шаблонов – это просто файлы PHP, содержащие HTML. Шаблоны могут содержать другие шаблоны. Данные вставляются в шаблоны через переменную $ data, которая представляет собой ассоциативный массив, содержащий все данные для шаблона.

Итак, на первом этапе контроллер выполняет какое-то действие и создает массив $ data. Затем будет включен соответствующий шаблон.

Проблемы. Шаблон может включать не только шаблоны, но и контроллеры. т.е. отображение палитры или меню (с довольно сложной логикой, слишком сложной для обработки в шаблоне).

Взгляните на раздел « Шаблоны веб-презентации» , особенно « Просмотр шаблона» , « Преобразовать представление» , « Двухэтапный просмотр» . Для таких вещей, как рендеринг панировочных сухарей или разбиение на страницы, вы можете использовать шаблон помощника вида .

Мне очень понравился подход zend-framework к этому, и он сам использовал его в наших рамках. У вас будет класс вида с такими вещами, как:

$view = new View(); $view->setTemplatesPath('.....'); $view->assign('name','value'); $view->render('index'); 

метод render принимает все сохраненные переменные и делает их свойствами и включает шаблон на основе набора Path, поэтому в ваших шаблонах вы будете иметь:

 <?php echo $this->foo; ?> .... <?php echo $this->load('header'); // this includes another template ?> 

Именно так я это делаю, вместо вызова контроллера в представлении ( WHAT?!? ) Я просто вычисляю все необходимые данные для представления в контроллере, который вызывает представление в первую очередь.

A View никогда не должен вызывать контроллер / модель! НО, если вы должны сделать что-то вроде этого:

 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!')); 

Моя стратегия такова:

  1. Попробуйте использовать минимальный PHP в шаблоне и, если возможно, до нуля.
  2. Я создал классы для различных компонентов, обычно встречающихся на веб-страницах, один из них – это tpanel, который я использую, чтобы продемонстрировать концепцию ниже
  3. Например, 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. Достаточно просто получить или отправить шаблон для шаблона, а затем сделать еще один get / post для ваших данных. Это очень удобно.