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


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

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

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

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

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

Author: openfrog, 2009-12-22

5 answers

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

 3
Author: Gordon, 2009-12-22 21:05:56

Мне действительно понравился подход 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 ?>
 3
Author: Gabriel Solomon, 2009-12-22 19:57:19

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

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

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!'));
 0
Author: Alix Axel, 2009-12-22 20:03:18

Моя стратегия заключается в следующем:

  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, особенно на то, как они обрабатывают наследование.

 0
Author: yannis, 2009-12-22 21:30:34

Это не имеет прямого отношения к вашему вопросу, но рассматривали ли вы возможность создания шаблонов на стороне клиента? У Джона Ресига есть хороший микрошаблон на Javascript, который будет работать с веб-сервисами и другими методами Ajax. Довольно просто выполнить получение или публикацию для шаблона, а затем выполнить еще одно получение/публикацию для ваших данных. Это довольно удобно.

 0
Author: David Robbins, 2009-12-22 21:51:07