Разделение кода из макета в шаблоне

У меня есть приложение, построенное вокруг шаблона 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...

Любые предложения?

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

Фактически, вы почти прибили его. вы можете использовать предопределенные переменные, однако они не должны содержать 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.

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

Ответ 3

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

Ответ 4

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

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