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

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

Какие-либо предложения?

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

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

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

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

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

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

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

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

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

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

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

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

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