В предыдущий раз мы рассмотрели кастомизацию цикла вывода записей. До этого научились работать с опциями и я показал, как можно их можно использовать для настроек шаблона.
Теперь вы узнаете, что для записей есть еще один механизм, позволяющий указывать дополнительные данные - метаполя.
Строго говоря, метаполя не являются только прерогативой записей. Технически метаполя можно использовать для расширения любой другой таблицы базы данных. Например для комюзеров мета используются для организации метода подписки на комментарии. Реализация таких вещей требует некоторого программирования, но что касается записей, то здесь MaxSite CMS предоставляет вебмастеру весьма удобный и простой механизм управления, аналогичный опциям.
Для тех, что пока не понял, что такое метаполя, отдельное объяснение. В админке под текстом записи находятся несколько дополнительных полей: Титул страницы (title), Описание страницы (description), Ключевые слова страницы (keywords) и т.д. Это и есть метаполя. При выводе записи, метаполя будут выведены определённым образом. Например титул страницы попадет в title, а «Играет музыка» появится перед текстом.
Работа с метаполями очень напоминает работу с опциями. Метаполя задаются в шаблонном meta.ini. Формат этого ini-файла практически полностью совпадает с options.ini, который мы уже рассмотрели в одной из предыдущих статей. В отличие от опций, метаполя автоматически подключают вначале «базовые» мета, потом из шаблона default и уже после этого meta.ini из текущего шаблона.
Для вывода метаполя используется функция mso_page_meta(). Вот так она объявлена в MaxSite CMS:
mso_page_meta( $meta = '', // ключ мета $page_meta = array(), // все метаполя записи $do = '', // текст перед выводом метаполя $posle = '', // текст после $razd = ', ', // разделитель метаполей $echo = true) // нужно ли сразу выводить врезультат
Если указанного метаполя нет, то возвращается пустая строка.
В отличие от опций, метаполя можно использовать только в цикле вывода записей (это некоторое упрощение - данные доступны в любой части шаблона - см. пояснение в конце статьи). Да и по другому не получится - ведь метаполя - часть записи. Поэтому, если есть желание использовать мета, то придется использовать их в type_foreach-файлах.
Например в type_foreach/page.php метаполя выводят Настроение и Музыку:
mso_page_meta('nastr', $page_meta, '<br><span>' . t('Настроение') . ':</span> ', ''); mso_page_meta('music', $page_meta, '<br><span>' . t('В колонках звучит') . ':</span> ', '');
При этом в meta.ini указано:
[Моё настроение] options_key = nastr type = textfield description = "Укажите свое настроение" default = "" [Играет музыка] options_key = music type = textfield description = "Какая играет музыка?" default = ""
Вывод простой текстовой информации к записи самый простой вариант использования метаполей. Из других вариантов наиболее популярными будут:
- Указание ссылки на источник - ссылка в этом метаполе будет преобразована в html-ссылку и автоматом добавлена в конце статьи.
- Адрес картинки к статье - адрес можно скопировать со страницы Загрузок. На странице же адрес будет прописан в виде img с заданный форматированием.
- Какие-то особые отметки записи, например Избранное, Любимое и т.п. При отображении, автоматически будет меняться оформление записи. Например при наличие метаполя Любимое, обрамлять текст в розовый фон. :-)
Поскольку вариантов использования метаполей великое множество, то я покажу лишь базовый принцип работы с ними. Перво-наперво, задаём их в meta.ini. После этого в соответствующем type_foreach-файле задаём вывод или получение метаполя. Вывод делаем с помощью mso_page_meta(), а вот если метаполе используется в качестве некоей отметки, вроде «любимя запись», то тут делаем немного по-другому. Рассмотрим этот вариант.
В meta.ini добавляем:
[Любимая запись] options_key = love type = checkbox description = "Отметьте, если это ваша любимая запись в блоге" default = "0"
Зайдём в редактирование (или сделаем новую страницу) и убедимся, что добавленное метаполе отображается под текстом записи.
После этого скопируем type_foreach-файл в свой шаблон type_foreach/page.php. Поскольку от значения метаполя будет зависеть визуальный вывод, то есть смысл менять класс (или стиль) в блоке div.page_only. (Для простоты мы будем прописывать стиль.)
... if (mso_page_meta('love', $page_meta, '', '', '', false)) $style = ' style="background: #FFB7F6"'; else $style = ''; echo NR . '<div class="page_only"' . $style . '>' . NR; ...
То есть мы вначале анализируем значение метаполя love и, в зависимости от результата, формируем к div.page_only нужный style.
Обратите внимание на последний параметр в mso_page_meta() - false. Это заставляет функцию не выводить значение метаполя в браузер, а просто вернуть значение по return.
Усложним задачу. Пусть будут три вида записей: обычная, любимая и избранная. Обычную запись мы будем выводить без изменений, для любимой использовать розовый цвет, а избранной - желтый.
Меняем meta.ini:
[Любимая запись] options_key = love type = select values = " ||Обычная # love||Любимая # favorite||Избранная" description = "Отметьте, если это любимая или избранная запись в блоге" default = ""
Убедимся, что появилось поле select с указанными вариантами.
Меняем type_foreach/page.php своего шаблона:
... $love = mso_page_meta('love', $page_meta, '', '', '', false); if ($love == 'love') $style = ' style="background: #FFB7F6"'; elseif ($love == 'favorite') $style = ' style="background: #FFFCB7"'; else $style = ''; echo NR . '<div class="page_only"' . $style . '>' . NR; ...
Вначале получаем значение метаполя, а после пропускаем его через несколько условий. Конечно, вариант со style несколько надуман, и лучше в таких случаях использовать дополнительный class. Кстати, если прописать название класса в values метаполя, то можно подставлять его сразу в div.page_only.
Наш пример довольно простой, думаю, что для верстальщика более чем достаточен. Единственное, хотелось бы отметить, что с помощью метаполей можно делать довольно сложные вещи, например каталог.
Небольшое пояснение
Выше я написал, что метаполя следует использовать только в цикле вывода. Это вроде как накладывает некоторые ограничения на то, чтобы использовать строго определённые type_foreach-файлы. На самом же деле, метаполя (как и любые другие данные страниц) доступны в любой части шаблона после того, как данные получены с помощью mso_get_pages(). Просто в цикле вывода, предварительно будет проверенно, полученны ли данные (а не 404-страница), будет запущен цикл по исходному массиву (foreach), а также проведен extract($page), который в цикле преобразует ключи массива в обычные переменные. Но эти же самые операции можно проделать в любой другой части шаблона, просто код будет несколько сложней.
Предположим с помощью метаполя мы указываем какой-то специфичный текст (опция,- всё-равно) до цикла вывода страницы. Для таких дел предназначен type_foreach-файл page-do.php. Но поскольку этот файл подключается до цикла вывода, то предыдущий код, где мета-данные уже получены, нам не подходит. Вместо этого у нас будет переменная $pages, в которой, собственно и хранятся данные для вывода. Соответственно работать будем с ней.
Вот код, который объясняет каждую строчку:
if ( isset( $pages[0] ) // существует ли первый элемент массива and $pages[0] // и он имеет какое-то значение (есть ли данные) ) { // да, можно работать $page_meta = $pages[0]['page_meta']; // получаем массив метаданых // дальше обычная работа с метаполями $love = mso_page_meta('love', $page_meta, '', '', '', false); // ... далее по коду }
То есть все манипуляции свелись к тому, чтобы получить первый элемент массива ($pages[0]) и взять его метаданные (ключ page_meta). Поскольку формат массива страниц всегда един, то дополнительные проверки на мета не нужны.
Точно также можно получить и другие данные страниц. Чтобы визуально увидеть структуру массива, используйте отладочную функцию pr().
pr($pages);
В завершающей статье немного поговорим о файлах и структуре каталогов шаблона.
Комментариев: 3 RSS
1Аноним19-11-2010 05:25
Постоянно сталкиваюсь с тем, что надо добавлять метаполя, которые используются вне цикла вывода записи. Например, необходимо в самом начале страницы добавлять конкретное предложение, предназначенное именно для конкретной записи, по аналогии с description. Из type_foreach-файла не имею доступа к шаблону страницы.
Выкручиваюсь программными способами, но это требует внимания при обновлении версии системы.
Как предложение.. Добавить в исходники три запасных служебных поля (по аналогии с keywords), которые при желании можно было бы использовать при выводе записей на сайт.
За статью спасибо! Увидел новый способ использования метаполей, который раньше не учитывал в проектах.
2Аноним19-11-2010 13:59
Вообще-то доступ к метаполям, да и вообще к любым данным любой страницы возможен в любой части шаблона после mso_get_pages(), то есть когда из базы сделана выборка. Поскольку в MaxSite CMS вначале type-файла получаются данные из базы и уже после этого подключаются файлы шаблона, то в принципе нет ничего сложного, чтобы их использовать. Сейчас дополню статью. :)
3Аноним21-08-2013 09:49
Здравствуйте, а возможно ли создать мета-поле в виде галочки и настройкой на странице настройки шаблона в одной из вкладок? Если да, как это можно реализовать. Опробовал кучу вариантов - ничего не вышло.