Я стараюсь развить свои собственные рамки. Для этого я хотел бы прочитать некоторые шаблонные методы. Я знаю, что шаблоны – очень сложная тема, но знание некоторых стратегий поможет найти правильный.
Пожалуйста, если вы упомянули один, не просто напишите «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!'));
Моя стратегия такова:
Фактически я создаю «блоки», очень похожие на то, что делает 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 для ваших данных. Это очень удобно.