Темизация вывода полей CCK

Главные вкладки

Аватар пользователя direqtor direqtor 7 августа 2008 в 11:02

Утверждается, что в Drupal можно темизировать всё. Вернее то, что проходит обработку функциями темизации. А это практически все, что мы видим на сайте.

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

Принципы работы

То, как выглядит информации из поля обычно задается на вкладке Display fields в настройках типа материала. У каждого поля мы видим выпадающий список, который дает возможность выбрать несколько форматов вывода информации из поля. Список этот определяется в модуле поля CCK хуком hook_field_formatter_info(). Обычно каждому формату соответствует одна функция темизации. Иногда используется одна функция для всех форматов. Все эти варианты описываются в хуке модуля hook_theme().

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

Для этого смотрим код хука модуля hook_theme(). Отдельные функции являются ключами возвращаемого хуком массива. Имена этих ключей обычно выглядят так: MODULENAME_formatter_FORMATNAME. Хук возвращает массив индексированный строками ключи которого являются системными именами форматов. Если массив, соотнесенный с ключом, не содержит в себе элемента "function", то это означает, что при выборе на странице Display fields для поля MODULENAME формата с системным именем FORMATNAME будет вызвана функция темизации с именем по умолчанию theme_MODULENAME_formatter_FORMATNAME, которая должна присутствовать в коде модуля. В случае если в массиве у данного ключа определен элемент "function", то вызываться будет именно указанная в нем функция, и она обычно находится в том же модуле.

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

Дальнейшее просто.

В папке темы открываем файл template.php (если отсутствует, то создаем его). Определяем в нем функцию с именем phptemplate_MODULEDNAME_formatter_FORMATNAME. Имя функции должно быть именно таким, даже если в параметре "function" хука hook_theme() находится другое имя. В этом случае при показе поля в материале и установленном формате вместо функции описаной в модуле будет вызываться пользовательская.

Теперь осталось немного. Список аргументов и код копируем из соответствующей функции темизации исходного модуля. Далее изменяем его. Каким образом? Это зависит только от исходного модуля и от ваших пожеланий.

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

Примеры

Чтобы было понятно, приведу пару практических примеров. Рабочий код всегда понятнее голой теории. Особенно, когда терминология еще не перевелась и не устоялась, а автор заметки совсем не Достоевский или Толстой.

Устранение ошибок в модуле Imce CCK Image

Выводим десятичные величины как градусы, минуты и секунды дуги

Источники

Статья в блоге автора

Комментарии

Аватар пользователя seaji seaji 9 августа 2008 в 11:47

В принципе четыре с плюсом поставить можно.
В некоторых местах для меня осталось загадкой значение слова "модуль".
Например тут:
Все эти варианты описываются в хуке модуля hook_theme()
hook_theme() - это такой модуль?

PS. В пятерке было как то по проще. В коде модулей ищите функции, которые начинаются так: "theme_". Целиком копируете эту функцию в файл template.php, изменяете имя функции таким макаром: "theme_xxx" -> "имя_темы_xxx". Ну и меняете вывод этой функции по своему усмотрению.

Аватар пользователя dfaker dfaker 9 августа 2008 в 16:11

В этом каталоге cck\theme\ есть ридми, по нему все просто получается, без хуков, хотя особо в это не вникал