Сегодня поговорим о том, как модифицировать шаблон внутри цикла вывода записей.
В MaxSite CMS цикл вывода находится в type-файлах, которые «скрыты» от вебмастера. Однако если вдруг возникла ситуация, когда нужно поменять формат вывода именно внутри цикла, то вместо корректировки сложного type-файла, MaxSite CMS предоставляет механизм в виде использования type_foreach-файлов.
Как вы уже знаете из предыдущих статей (раз, два, три), type-файлы имеют «вставки» в виде type_foreach-файлов. Изначально идея была в том, чтобы предоставить вебмастеру возможность произвольно менять формат вывода непосредственно в цикле вывода (foreach - именно поэтому такое название). Но постепенно мы расширили идею и теперь type_foreach-файлы позволяют менять вывод и в других частях type-файлов.
Скажу больше, в последних версиях системы с помощью type_foreach-файлов можно менять даже параметры получения страниц (файлы ...-mso-get-pages.php). Для пользователей WordPress - это невиданнейшая наглость! :)
Для примера пусть нам нужно поменять формат вывода обычной страницы. Стандартно там выводится заголовок, рубрика, метки, дата и т.д. Если мы хотим поменять этот порядок или указать свою HTML-структуру, то нужно использовать соответствующий type_foreach-файл.
Заготовки type_foreach-файлов находятся в default-шаблоне в каталоге type_foreach. Все они начинаются в префикса «_» (подчеркивание), которое после копирования в свой шаблон, нужно убрать. Стандартно type_foreach-файлы содержат тот же самый код вывода, что и в type-файлах.
Имя type_foreach-файла состоит из имени type-файла плюс что-то «поясняющее». Например, файл page-do.php подключается до начала вывода записи, а page-posle.php - после.
Основной цикл вывода содержится в type_foreach-файлах, совпадающих с именем type-файла. Например type/page.php (type-файл) - type_foreach/page.php.
Для использования type_foreach-файлов нужно сделать в своём шаблоне каталог type_foreach, скопировать в него необходимые type_foreach-файлы, не забыв удалить «_» в начале. Всё. Дальше MaxSite CMS их автоматически «подхватит».
Теперь рассмотрим один type_foreach-файл для примера. Пусть это будет type_foreach/page.php (вывод одиночной записи). Скопируем в свой шаблон и откроем его.
В коде мы увидим вывод html-кода и некоторые php-функции, о значении которых, несложно догадаться. Например mso_page_title() - вывод заголовка записи; mso_page_cat_link() - вывод рубрик записи; mso_page_tag_link() - метки; mso_page_date() - даты и т.п.
С помощью этих функций можно сформировать вывод с учетом некоторых особенностей. Например, на самой странице нет смысла выводить заголовок в виде ссылки на себя же. Поэтому в функции mso_page_title() один из параметров ($link) устанавливается в false.
Конечно же, вебмастеру доступны и «голые» исходные переменные, например заголовок это $page_title, короткая ссылка - $page_slug и т.д.
Часто в файлах встречается закомментированная функция pr(), например - pr($page). Это функция отладки. Если убрать комментирование, то вы увидите на странице форматированный вывод указанной переменной. В нашем случае это будет массив, ключи которого после extract($page) превращаются в самостоятельные переменные. Таким образом вебмастер может визуально увидеть что доступно для использования.
Функций вывода записей довольно много, но я не буду их здесь приводить, поскольку несколько раньше я их опубликовал в другой статье: см. подзаголовок «Функции вывода записей». При желании вы сможете посмотреть их полное описание.
Теперь несколько советов.
- В своих публичных шаблонах никогда не используйте type-файлы. Я уже писал, что type-файлы могут поменяться в будущих версиях MaxSite CMS и пользователи такого шаблона окажутся лишенными новых возможностей. Если же вы делаете шаблон на заказ, то type-файлы допустимо менять, правда оправдываться перед заказчиком придется уже вам.
- Не копируйте в свой шаблон все type_foreach-файлы. Берите только те, которые действительно меняете.
- Перед тем, как решить использовать type_foreach-файлы, проверьте, возможно задачу можно решить с помощью обычного CSS: в MaxSite CMS практически каждый блок вывода имеет свой class.
- В type_foreach-файлах можно смело использовать опции и, тем самым, создавать различные комбинации вывода данных. На быстродействии это никак не скажется, поскольку все опции автоматически кэшируются в памяти.
Иногда бывают задачи, которые можно решить без использования type_foreach-файлов. В предыдущей статье мы рассматривали как сделать вывод отключаемого рекламного блока. Мы его расположили в main-start.php и тем самым сделали вывод на всех страницах сайта. Но, заказчик может захотеть видеть такой блок только на некоторых страницах сайта, например только в рубриках и странице одиночной записи.
Теперь, зная о type_foreach-файлах, верстальщик разместит код вывода именно в них (category-do.php и page-do.php). Это будет хорошее решение, но не совсем точное.
Когда нужен вывод в зависимости от разных типов данных, то можно использовать функцию is_type('тип') в самом шаблоне. Например так:
# если это рубрика или одиночная страница if (is_type('category') or is_type('page')) { ... тут вывод ... }
В данном случае нам достаточно будет использовать один код вывода под разные условия. При этом, я могу еще посоветовать выносить какие-то общие блоки в отдельные файлы. Скажем код вывода рекламы можно было бы разместить в файле шаблона adv-blok.php (где и указывать HTML-вывод, получение опций, прочие условия) и подключать его одной строчкой:
... <div class="content-all"> <?php require(getinfo('template_dir') . 'adv-blok.php'); ?> ...
Такой подход упрощает шаблон и делает его читабельней и удобней для дальнейшей поддержки, а пользователю не придётся разбираться с дублирующимся кодом в type_foreach-файлах.
В следующей стетье я расскажу о других возможностях MaxSite CMS для разработчиков шаблонов.
Комментариев: 3 RSS
1Аноним17-11-2010 12:55
Когда ждать продолжение???
2Аноним24-11-2010 10:15
Какой type_foreach-файл использовать, если нужно поменять способ вывода всплывающей подсказки для плагина категорий? Например, в данный момент я это реализую за счет изменения файла application/maxsite/common/common.php: вместо строчки
вставляю чуть ниже (после объявления $descr).3Аноним24-11-2010 10:50
Type_foreach-файл здесь не при чём. Это уровень плагина и системы.