Отделение кода от макета в шаблоне - PullRequest
11 голосов
/ 12 января 2011

У меня есть приложение, построенное на основе шаблона MVC.Представление php, но в основном html с минимальным встроенным php-кодом, например:

Welcome <?php echo $USERNAME ?>

и

<table>
<?php foreach ($USERS as $row) : ?>
<tr><td><?php echo $row->name ?><td><?php echo $row->address ?></tr>
<?php endforeach ?>

Мне нужна только логика отображения макета в этом файле, и я хочубудь проще!

Это в основном работает для меня, но я борюсь за некоторые определенные аспекты.Например, посмотрите на таблицу в приведенном выше коде и представьте, что каждый столбец (имя и адрес) имеет заголовок NameAddress

Теперь представьте, что я хочу сделать столбцы сортируемыми.Поэтому я делаю что-то вроде -

<tr><th><a href="?sort=name">Name</a><td><a href="?sort=addr">

Но этого недостаточно.Мое представление должно посмотреть, по какому столбцу сортируются, и добавить стрелку вверх или вниз.Нужно изменить ссылку на отсортированный в данный момент столбец на? Sort = name_reverse, если этот столбец уже отсортирован, поэтому щелчок по нему сортирует его другим способом.Теперь это слишком сложно, чтобы написать хороший аккуратный код в моем шаблоне ...

Так что я могу заставить свой контроллер создавать переменные, содержащие -

<tr><th><?php echo $HEADING[0] ?><th><?php $HEADING[1] ?> 

и т. Д.НО это означает, что мой контроллер теперь генерирует настоящий HTML, который действительно является обязанностью шаблона страницы.Это устраняет возможность шаблона форматировать страницу несколькими различными способами ... И просто чувствует себя не так.

Но как мне лучше всего с этим справиться, когда я чувствую, что мой контроллер страницы должен генерировать переменные, содержащиеHTML ...

Есть предложения?

Ответы [ 4 ]

4 голосов
/ 12 января 2011

Разделите код для создания таблицы в ViewHelper.Настройте вызов метода из шаблона.Пусть ViewHelper отобразит фактическую таблицу со всеми необходимыми настройками.Ваш основной шаблон должен содержать только такую ​​строку:

<?php echo table($data, $sortOptions, $otherConfig) ?>

По сути, любая логика, необходимая для построения этой таблицы, будет содержаться в ViewHelper, поэтому вы можете захотеть сделать ее классом.Полная реализация зависит от ваших потребностей.

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

<th><?php echo sortLink('Name', $current); ?></th>

Таким образом, помощник sortLink будет решать, создавать ли и вставлять какие-либо ссылки на сортировку, и как это сделать, так что вам не нужно иметь эту логику или какие-либо условия в основном шаблоне.

2 голосов
/ 12 января 2011

Отличный вопрос, который очень редко встречается на этом сайте.

Прежде всего, вы ДОЛЖНЫ принять тот факт, что любой реальный шаблон никогда не будет простым. Вот и все. Это называется презентация логика и соответствует сложности самой презентации.

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

На самом деле, вы почти прибили это. Вы можете использовать предопределенные переменные, однако они не должны содержать HTML, а только значения для отображения.

<tr>
 <th>
  <a href="<?=$links['name']['url']?>">
   Name
   <?if($links['name']['dir']=='asc'):?><img src="arrow.gif"><?endif?>
   <?if($links['name']['dir']=='desc'):?><img src="reverse_arrow.gif"><?endif?>
  </a>
 <td>

заманчиво сделать из этого цикл, но я бы посоветовал против этого, потому что это приведет вас к изобретению какого-то HTML-компоновщика, который является другой историей и не настолько надежным, как сам чистый HTML.

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

1 голос
/ 12 января 2011

Если я могу добавить предложение, вы можете преобразовать весь вывод PHP в DOM / XML и передать его на процессор XSLT, где представление, каким бы сложным оно ни было, более согласованным, поскольку XSLT и XHTML основаны на XML. Вы действительно отделяете презентацию от контента с точки зрения физического местоположения и технологии, используемой для ее доставки.

0 голосов
/ 12 января 2011

Одним из решений является использование сортировки Javascript, есть несколько хороших для jQuery .

Если это невозможно, вы можете взглянуть на какое-нибудь шаблонное решение, например Smarty , для обработки шаблонов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...