2009-12-22 3 views
4

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

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

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

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

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

+0

Соответствующий и заслуживающий внимания: http://stackoverflow.com/questions/1424268/template-language-vs-straight-php – KiNgMaR

ответ

0

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

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

Нет причин, почему View не должен позволять обращаться к Модели, поскольку поскольку это не изменяет состояние модели. На том же основании вы можете вызвать Controller из View, например, для агрегирования вывода из нескольких действий контроллера, тем самым способствуя повторному использованию кода. – Gordon

+0

@ Гордон: Да, конечно. Но это не так, как должен запускаться шаблон MVC. –

+1

Ну, немного странно утверждать, что MVC никогда не предполагалось запускать * таким образом, когда он никогда не был задуман с учетом сети вообще. Образец восходит к 1979. Если что-то, то * предполагаемый путь * определенно не тот, как каждый использует MVC сегодня. Вся поездка через HTTP от браузера в FrontController к контроллеру в модель и обратно к контроллеру, который создает и устанавливает весь новый вид (вместо модели, уведомляющей представление об изменениях в ней и самого обновления), не является частью оригинала Концепция MVC. – Gordon

3

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

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

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

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

Он уже делает это аналогичным образом, то, что он хочет, не имеет к этому никакого отношения. –

0

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

  1. Try и использовать минимум 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

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

Смежные вопросы