Каковы ваши шаблонные стратегии? - PullRequest
4 голосов
/ 22 декабря 2009

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

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

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

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

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

Ответы [ 5 ]

3 голосов
/ 22 декабря 2009

Мне очень понравился подход 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 голосов
/ 22 декабря 2009

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

0 голосов
/ 23 декабря 2009

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

0 голосов
/ 23 декабря 2009

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

  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.

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

0 голосов
/ 22 декабря 2009

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

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

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!'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...