Использование программного обеспечения с открытым исходным кодом для проектирования, создания и развертывания Web-сайта для совместной работы, Часть 11: Использование таксономий в Drupal

В этой серии статей группа разработчиков IBM® Internet Technology Group проектирует, разрабатывает и развертывает Web-сайт для вымышленной компании International Business Council, используя набор свободно доступного программного обеспечения. В данной статье описывается использование системы таксономии Drupal для создания структуры Web-сайта. Структура затем может быть использована для поддержки навигации и организации содержимого.

Элистер Льюис-Боуэн, старший инженер-программист, IBM

Элистер Льюис-Боуэн (Alister Lewis-Bowen) работает старшим инженером-программистом в IBM Internet Technology Group. Он занимается Интернет и web-технологиями как сотрудник IBM UK с 1993. Элистер был переведен в США для работы над Web-сайтами спортивных событий, спонсируемых IBM, а затем как старший Web-мастер ibm.com. В настоящее время он помогает создавать семантические Web-прототипы.



Стефен Эванчик, инженер-программист, IBM

Стефен Эванчик (Stephen Evanchik) работает инженером-программистом в IBM Internet Technology Group. Он принимает участие во многих проектах с открытыми исходными кодами, самым известным из которых является его IBM TrackPoint-драйвер в ядре Linux. Стефен в настоящее время работает с появляющимися семантическими Web-технологиями.



Луис Вайцман, старший инженер-программист, IBM

Луис Вайцман (Louis Weitzman) работает старшим инженером-программистом в IBM Internet Technology Group. В течение 30 лет он работал на стыке дизайна и вычислений. Помогал разрабатывать XML, фрагментированную систему управления содержимым, используемую для ibm.com, а в настоящее время участвует в обеспечении процесса проектирования новых проектов.



30.05.2007

Введение

Одной из гибких функциональных возможностей Drupal является его система таксономии (taxonomy). Она обеспечивает возможность структуризации вашего Web-сайта; вы можете затем использовать эту структуру для поддержки навигации и организации содержимого. Многие люди говорят, что это одна из особенностей, отличающих Drupal от других систем управления содержимым.

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

Классификация

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

Таксономия Drupal позволяет администраторам Web-сайта создавать способ классификации содержимого Web-сайта и использовать эту классификацию в нескольких функциональных возможностях, которые будут улучшать работу пользователей. Вообще говоря, существует два способа предоставить классификацию: при помощи предопределенного набора фиксированных категорий или при помощи свободной маркировки (free tagging) и создания категорий "на лету".

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

Управляемый словарь - это список терминов, которые явно пронумерованы. Этот список управляется и доступен из службы регистрации управляемого словаря (controlled vocabulary registration authority). Все термины в управляемом словаре должны иметь недвусмысленное, неизбыточное определение. Это цель проектирования, но на практике все может быть не так.

Свободная маркировка
Drupal предоставляет сообществу возможность свободной маркировки, которая разрешает применять произвольные термины для классификации содержимого. Пользователи имеют возможность классифицировать или маркировать (оформлять тегами) содержимое самостоятельно и, следовательно, определять свои собственные схемы категоризации. Пользователи могут использовать привычную для себя категоризацию. Есть надежда, что другие пользователи стремятся иметь такой же набор категорий, поэтому связи между содержимым легко обнаружатся. Однако это срабатывает не всегда и может увеличить вероятность различной маркировки аналогичного содержимого, вследствие чего оно не появится в навигации, предоставляемой системой таксономии. Это компромисс между свободной классификацией и надежным приложением с фиксированными категориями для всех пользователей.

Web-сайты, позволяющие своему сообществу пользователей применять свободную маркировку данных, обычно называются фольксономиями (folksonomies). Многие современные Web-сайты позволяют пользователям классифицировать (маркировать) создаваемое ими содержимое. Flickr и del.icio.us - это два старых Web-сайта, которые популяризировали данную методику для изображений и закладок соответственно. Фольксономии позволяют своим сообществам пользователей создавать неформальный набор тегов для содержимого, а пользователи могут выбирать описания, которые подходят им наилучшим образом. Однако терминология одного пользователя может не совпадать с терминологией другого. Это актуальная тема, и в настоящее время широко обсуждаются все за и против данного подхода (см. Питер Мерхольц (Peter Merholz) и Луис Розенфельд (Louis Rosenfeld)).

Например, del.icio.us - это Web-сайт для хранения закладок. Хотя сохранение ваших закладок и доступ к ним из любого Web-браузера - это очень хорошая идея, мощь системы заключается в способности видеть закладки других людей и обращаться к ним через общую систему маркировки. Теги позволяют пользователям применять необходимое количество слов для идентификации их содержимого. del.icio.us описывает классификацию, или процесс маркировки (tagging), так:

"Тег - это просто слово, используемое для описания закладки. В отличие от папок вы можете создавать теги по мере необходимости и использовать их столько раз, сколько захотите. Результат - более удобный способ организации ваших закладок и отличный метод обнаружения интересных материалов в Web."

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

Прагматичный подход

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

Первоначально мы не использовали систему таксономии для Web-сайта IBC. В начале работы с Drupal она не является одной из тех вещей, которые пытаешься освоить. Вместо этого мы отобразили информационную архитектуру, описанную во второй части, в типы узлов, которые полагали нужными, а затем создали модули для обслуживания каждого типа узла. Для целей данной статьи мы перепроектировали и повторно реализовали модуль announcement (уведомлений) для использования преимуществ системы таксономии. Такой подход даст возможность пользователям быстро находить уведомления по конкретной теме и легко просматривать связанные с ней уведомления.

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

В оставшейся части данной статьи описывается терминология Drupal, относящаяся к таксономиям, а также их реализация. Мы будем использовать интерфейс администратора Drupal для создания словаря и его элементов. Затем, используя эту новую определенную таксономию, мы улучшим наш модуль announcement и реализуем свою навигацию и организацию содержимого. Мы также рассмотрим некоторые программные способы взаимодействия с системой таксономии и использование ее для стилевого оформления содержимого.

Таксономии в Drupal

Согласно Drupal, существуют три основные задачи, связанные с таксономиями на Web-сайтах:

  • Управление категориями в системе.
  • Организация содержимого в категории, для того чтобы пользователи могли видеть сходное содержимое.
  • Навигация по содержимому со сходными тегами.

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

Словари и термины

Базовой структурой таксономии в Drupal является словарь (vocabulary). Словари представляют собой совокупность данных, содержащую свойства и взаимосвязи, используемые для классификации содержимого. Единичной записью в словаре является термин (term). Термины представляют категории содержимого вашего сайта. При создании содержимого можно связать его с одним или более терминами, которые затем могут быть использованы пользователями, администраторами или модулями Drupal. Система таксономии поддерживает много словарей, каждый со своим собственным набором терминов. Это позволяет классифицировать содержимое по нескольким словарям, обеспечивая хорошую гибкость представления, взаимодействия и управления информацией.

В словаре имеется два типа взаимосвязей между терминами:

  • Иерархическая (вертикальная), являющаяся стандартной взаимосвязью предок-потомок. Иерархические взаимосвязи разрешаются администратором и выбираются редактором терминов.
  • Ассоциативная (горизонтальная), указывает на сходство терминов (тезаурусы). Ассоциативные взаимосвязи создаются путем создания синонимов терминов.

На рисунке 1 показаны связанные черными линиями термины словаря, находящиеся в иерархической взаимосвязи, а синими линиями - в ассоциативной.

Рисунок 1. Типичное представление словаря связанных терминов, иерархически (черные линии) и ассоциативно (синие)
Рисунок 1. Типичное представление словаря связанных терминов, иерархически (черные линии) и ассоциативно (синие)

Атрибуты словаря

При определении собственного словаря существует несколько атрибутов, которые можно изменить, в том числе:

Hierarchy (Иерархия)
Предположим, что для словаря указана древовидная структура. Можно запретить иерархию и работать с плоской структурой. Если иерархия разрешена, то существует два ее варианта: единичная и множественная. Единичная иерархия, например, браузер файловой системы, привычна для большинства пользователей. Множественные иерархии позволяют термину иметь более одного предка. Термин может появляться в нескольких местах древовидной структуры (например, ярлык, или символическая ссылка на папку или файл, появляющийся в нескольких местах в файловом браузере). Это обеспечивает более гибкий доступ к термину и его содержимому, но увеличивает риск того, что неопытные пользователи могут прийти в замешательство.
Related terms (Связанные термины)
Связанные термины, или синонимы, используются для связи в словаре различных терминов друг с другом. Они работают так, как в тезаурусе. Модуль glossary является примером использования синонимов.
Free tagging (Свободная маркировка)
В словаре может быть разрешена свободная маркировка. При выборе этого атрибута классификации создаются путем ввода пользователем имени термина, а не путем выбора из предопределенного списка терминов.
Multiple select (Множественный выбор)
Прекрасной возможностью данной системы является классификация содержимого путем разрешения множественного выбора в словаре. Используя метод множественных классификаций, можно обратиться к нескольким перспективам и отобразить их содержимое. Это предоставляет дополнительную гибкость в способах навигации и просмотра содержимого. Для разрешения данной функциональности при редактировании словаря отметьте флажок "multiple select". Он всегда отмечен при свободной маркировке.
Required (Обязательно)
Если при редактировании узлов выбран атрибут required, то для каждого типа узла, связанного с данным словарем, нужно указывать термин. Это даст гарантию того, что все узлы во время редактирования будут замаркированы (получат теги).

Атрибуты термина

Существуют два атрибута для определения нового термина:

Parent (Предок)
Можно указать термин, являющийся предком для данного термина. Представление этого атрибута зависит от того, как вы определили словарь. Если в словаре запрещена иерархия, вариант указания предка не отображается. Если указана единичная иерархия, атрибут отображается в виде ниспадающего списка. При множественной иерархии отображается список, из которого можно выбирать несколько терминов-предков, используя комбинацию клавиш Ctrl+Click. Если термин находится на самом верхнем уровне, в качестве предка выбирается <root>.
Synonyms (Синонимы)
Можно ввести синонимы для данного термина. Примерами использования синонимов являются аббревиатуры или альтернативное написание термина. Синонимы вводятся по одному на строку в диалоговом окне. Одним из возможных использований таких синонимов могла бы быть реализация ловушки search для вашего модуля (можно отмечать ключевые слова, сходные с данным ключевым словом, для расширения результатов поиска).

Создание таксономии

В данном разделе мы создадим наш первый словарь и термины. Во второй части данной серии статей рассмотрены методы создания понятной информационной архитектуры для Web-сайта, которая может быть использована как основа вашей таксономии. Мы будем использовать интерфейс администратора Drupal, показанный на рисунке 2, для создания словаря и терминов. Вызвать этот интерфейс можно из меню administer/categories (например, http://ibc.development/admin/taxonomy). На данный момент не определен ни один словарь.

Рисунок 2. Интерфейс администратора для управления категориями
Рисунок 2. Интерфейс администратора для управления категориями

В этом примере мы создадим словарь IBC для организации уведомлений на Web-сайте. Начнем с выбора Add Vocabulary, что вызовет появление панели для указания атрибутов словаря. Как показано на рисунке 3, мы назовем этот словарь IBC, разрешим его для типа узла Announcement, а также разрешим Single hierarchy и Multiple select для терминов данного узла.

Кроме того, администратор может сделать спецификацию терминов этого словаря необходимой при создании узла редактором. Также на рисунке 3 показано описание словаря IBC.

Рисунок 3. Создание словаря IBC для организации уведомлений на Web-сайте
Рисунок 3. Создание словаря IBC для организации уведомлений на Web-сайте

После создания словарь появляется в главном списке, что показано на рисунке 4.

Рисунок 4. Список словарей Web-сайта
Рисунок 4. Список словарей Web-сайта

Чтобы добавить термины в конкретный словарь, выберите на главной странице Add terms для данного словаря. На рисунке 5 показан интерфейс, позволяющий вводить несколько терминов. В нем вы можете указать:

  • Parent - термин-предок в данном словаре (выберите <root>, если находитесь на самом верхнем уровне).
  • Name - имя термина.
  • Description - описание, используемое другими модулями и фидами.
  • Synonyms - любые синонимы с различным написанием, акронимы и другие подобные термины.
  • Weight (вес) - термины с меньшим весом будут отображаться перед терминами с большим весом.

В данном примере словарь будет содержать термины General, Workgroup, Conference, Members и Website. Они будут использоваться для классификации уведомлений.


Рисунок 5. Редактирование терминов в словаре IBC
Рисунок 5. Редактирование терминов в словаре IBC

После добавления всех терминов можно вывести их список для конкретного словаря, выбрав List, как показано на рисунке 6. Здесь мы добавили термины Conference, General, Members, Website и Workgroup.

Рисунок 6. Список терминов в словаре IBC
Рисунок 6. Список терминов в словаре IBC

Таксономия и создание содержимого

Теперь, при создании уведомлений для Web-сайта можно связать узел с терминами из данного словаря. На рисунке 7 показан новый раздел в виде Edit, называемый Categories. Этот раздел позволяет связывать уведомление с одним или несколькими терминами из словаря IBC. Здесь мы связываем его с термином Conference.

Рисунок 7. Создание уведомления и связывание его с категорией
Рисунок 7. Создание уведомления и связывание его с категорией

Если конкретное уведомление связано с более чем одной категорией, можно выбрать несколько терминов, используя Shift+Click или Ctrl+Click, как показано на рисунке 8. В данном случае мы связываем его с терминами General и Website.

Рисунок 8. Создание уведомления и связывание его с несколькими категориями
Рисунок 8. Создание уведомления и связывание его с несколькими категориями

Теперь у нас определена таксономия и имеется содержимое, связанное с различными терминами. Система таксономии автоматически будет фильтровать содержимое на основе ID термина. На рисунке 9 мы перешли на http://ibc.development/taxonomy/term/13 для отображения всего содержимого, замаркированного тегами с термином Website. К сожалению, необходимо знать ID термина для использования этого метода отображения содержимого. Однако существуют способы указать псевдоним для URL-пути и использовать имя термина таксономии вместо ID. Можно также предоставить навигационные ссылки для перехода к именованным категориям.

Рисунок 9. Использование URL для отображения содержимого в общей категории
Рисунок 9. Использование URL для отображения содержимого в общей категории

В следующем разделе мы рассмотрим программный способ категоризации уведомлений по терминам с использованием нового модуля block.


Функции таксономии

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

Существует несколько функций для программной работы со словарями и терминами таксономии. Следующие функции помогают в доступе к информации таксономии:

taxonomy_get_childrenНайти всех потомков для данного ID термина.
taxonomy_get_parentsНайти всех предков для данного ID термина.
taxonomy_get_parents_allНайти всех предков всех уровней для данного ID термина.
taxonomy_get_relatedНайти все объекты term, связанные с данным ID термина.
taxonomy_get_synonymsВозвратить массив синонимов данного ID термина.
taxonomy_get_synonym_rootВозвратить объект term, имеющий синоним, равный данной строке.
taxonomy_get_termВозвратить объект term по ID термина.
taxonomy_get_term_by_nameПопробовать отобразить строку в существующий термин, как при использовании глоссария.
taxonomy_get_treeСоздать иерархическое представление словаря.
taxonomy_get_vocabulariesВозвратить массив всех объектов словаря.
taxonomy_get_vocabularyВозвратить объект vocabulary по данному ID словаря.

Для сохранения словарей и терминов доступны следующие функции:

taxonomy_save_termПрограммно сохранить термин.
taxonomy_save_vocabularyПрограммно сохранить словарь.

hook_taxonomy

Специальная ловушка hook_taxonomy позволяет модулям реагировать на изменения в таксономии. Эта ловушка активизируется при изменении термина или словаря. Указывается тип выполняемого действия и его объект - словарь или термин.

Дополнительная информация приведена в разделе "Функции таксономии".


Программное добавление в узел терминов таксономии

Упомянутые выше функции сохранения термина и словаря принимают в качестве аргумента массив для обновления или вставки в базу данных элемента термина или словаря. Массив содержит ID (ID термина или словаря), имя, описание и вес. Например, было бы хорошо иметь возможность добавлять или удалять термины словаря при добавлении или удалении узла. Во многом аналогично динамическому созданию меню навигации для рабочей группы (workgroup) или конференции (conference), мы могли бы автоматически добавлять или удалять рабочие группы или конференции как термины в словаре, используя эти функции.

В листинге 1 показано, как динамически создать термин при первом сохранении рабочей группы. Аналогичный код необходим для удаления термина при удалении рабочей группы. При удалении рабочей группы вы, возможно, захотите удалить также связи с узлами, классифицированными с использованием этого термина в таблице term_node.

Листинг 1. Динамическое добавление термина в словарь IBC
function workgroup_insert($node) {
  ...  
  $voc  = taxonomy_get_vocabulary_by_name('IBC');
  $vid  = $voc->vid;
  $edit = array ("vid" => $vid, "name" => $node->title);
  $msg  = taxonomy_save_term($edit); 
}

// вспомогательная функция для получения словаря по его имени (не по vid)
function taxonomy_get_vocabulary_by_name ($name) {
  $results = db_query('SELECT * FROM {vocabulary} WHERE name = "%s"', $name);
	if (db_num_rows($results) > 0) {
	 	return db_fetch_object($results);
	}
	else {
		return null;
	}
}

Новая функция taxonomy_get_vocabulary_by_name, соответственно, должна быть помещена в taxonomy.module.


Организация и навигация по содержимому

Drupal будет автоматически создавать вид для всех узлов, для которых указан тег конкретного термина. Если вы используете URL http://<yoursite>/taxonomy/term/13, он будет отображать все узлы, отмеченные тегом термина с ID 13, как показано на рисунке 9.

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

Сначала разрешим блок. На рисунке 10 панель administer -> blocks (http://<yoursite>/admin/block) показывает все возможные блоки, включая все определенные словари. Мы разрешим словарь IBC и добавим его к блоку правой панели с весом -9. Это поместит его в верхнюю часть правой панели прямо под недавно обновленными уведомлениями.

Рисунок 10. Указание месторасположения блока для словаря IBC и результат в правой панели
Рисунок 10. Указание месторасположения блока для словаря IBC и результат в правой панели

На рисунке 11 показан результат выбора Website (term 13) в панели. В панели перечислен каждый термин словаря IBC. Рядом с термином в скобках показано количество классифицированных узлов. За каждым термином следует список содержимого, классифицированного с использованием данного термина.

Рисунок 11. Новый модуль блока уведомлений - отображение словаря, его терминов и классифицированных уведомлений
Рисунок 11. Новый модуль блока уведомлений - отображение словаря, его терминов и классифицированных уведомлений

В данной демонстрации мы сделали несколько допущений. Словарь IBC предназначен только для классификации уведомлений, но мог бы легко использоваться для классификации дополнительных типов узлов. Кроме того, в данном примере мы не используем иерархию терминов. В терминах пользовательского интерфейса мы можем использовать либо блок последних уведомлений, либо блок словаря уведомлений, но не оба. С учетом этого переопределим блок announcement (первоначально определенный в шестой части серии статей в листинге 9) в листинге 2.

Листинг 2. Блок уведомлений с дополнительными функциями для поддержки навигации по словарю
function announcement_block($op = 'list', $delta = 0, $edit = array()) {
   global $user;
   if ($op == 'list') {
      $blocks[0]['info'] = t('Recently updated announcements');	
      $blocks[1]["info"] = t('List nodes in the IBC vocabulary');
      return $blocks;
   }
   else if ($op == 'view')	{
      $block	= array();
      switch ($delta) {
         case 0:
            $announcement_items = array();
            if (user_access('access content')) {
               $q = 'SELECT a€¦ '; 
               $now = time();
               $items = variable_get('announcement_block_max_list_count', 3);
               while (db_num_rows($announcements) > 0 and 
                      $announcement = db_fetch_object($announcements)) {	
                  $announcement_items[] = $announcement;			
               }
            }
            $block['subject'] = t('Announcements');
            $block['content'] = theme('announcement_block_list', $announcement_items);
            break;
         case 1:
            if (user_access("access content")) {
               $vocabulary = taxonomy_get_vocabulary_by_name('IBC');
               $block["subject"]= t('IBC');
               $block["content"]= _announcement_vocab($vocabulary->vid);
            }
      }
      return $block;
   }
}

В операции list мы регистрируем словарь IBC со значением delta равным 1. Это будет отображаться в интерфейсе administer/blocks, как показано на рисунке 10.

После разрешения операция view визуализирует термины словаря IBC в этой новой панели. Когда отображается блок словаря IBC, аргумент $delta для функции-ловушки block будет равен 1. Модуль taxonomy_dhtml использует другую технику, выполняя цикл по всем словарям и отображая каждый в отдельном блоке, проиндексированном по vid словаря. Здесь мы просто используем функцию taxonomy_get_vocabulary_by_name для получения словаря IBC и вспомогательную функцию _announcement_vocab(), показанную в листинге 3, выполняющую работу по выводу списка терминов.

Листинг 3. Вывод терминов для элемента словаря
function _announcement_vocab($vocabulary_id, $op = NULL) {
  $tree = taxonomy_get_tree($vocabulary_id);
  foreach ($tree as $term) {
  	$url = "taxonomy/term/$term->tid";
    if ($op) {
    	$url .= "/$op";
    }
    $link = l(t($term->name), $url, array("title" => t($term->description)));
    $out .= _taxonomy_depth($term->depth, "&nbsp;")."- $link";
    $count = taxonomy_term_count_nodes($term->tid);
    if ($count) {
    	$out .= " ($count)";
    	$out .= _announcement_by_terms($term->tid);
    }
    else {
    	$out .= " (0)";
    }
    $out .= "<br />";
  }
  return $out;
}

Для каждого элемента создается ссылка в панели этого термина. Нажатие на термин вызовет отображение страницы со всеми узлами, категоризированными с использованием этого термина. Для подсчета количества классифицированных узлов, которое отображается рядом с термином, используется функция таксономии taxonomy_term_count_nodes(). Затем для каждого термина мы подготавливаем ссылку для каждого классифицированного узла, используя функцию _announcement_by_terms(), показанную в листинге 4.

Листинг 4. Возвращает уведомления для представления, категоризированного по переданному ID термина
function _announcement_by_terms($tid) {
	$result = '';
	$tids   = array( $tid );
	$nodes  = taxonomy_select_nodes($tids, 'or', 0, FALSE);
	while ($r = db_fetch_object($nodes)) {
		$url = "announcements/". $r->nid;
		$result .= "<br/>&nbsp; - &nbsp;" . 
		           l($r->title, $url, array("title" => t($r->title)));
	}
	return $result;
}

Здесь мы используем функцию taxonomy_select_nodes() для получения всех узлов (которые в нашем случае будут только уведомлениями), классифицированных по ID термина $tid. Мы создаем ссылку, которая будет представляться с термином.

Ссылка на дополнительную информацию по использованию таксономий для навигации приведена в разделе "Ресурсы".


Таксономия, используемая для стилевого оформления

В седьмой части данной серии статей рассматривался метод установки значения атрибута class в элементе body, определенном в файле page.tpl.php. Этот метод использовался для автоматического изменения представления страницы, когда, например, отображается содержимое нового раздела. Этот метод использовал оператор PHP switch, который устанавливал значение для атрибута class на основе первого аргумента в URL. В листинге 6 седьмой части данной серии статей был приведен этот код.

В данном разделе мы представим метод, при помощи которого можно определить значение атрибута class, используя специально определенный словарь. Таким образом, мы будем контролировать стиль конкретных областей Web-сайта, используя этот словарь, управляемый через интерфейс администратора Drupal, вместо изменения кода в шаблоне page.tpl.php.

Давайте начнем с определения нового словаря, который будет описывать взаимосвязь типов содержимого IBC с основными разделами Web-сайта - home, workgroups, conferences и members. Пусть это будет словарь иерархии, который называется IBC Section Hierarchy. Мы создаем этот словарь, как описано ранее в данной статье. Затем мы добавляем термины для разделов Web-сайта, которые определили во время анализа во второй части данной серии статей. Потом мы добавляем термины, идентифицирующие имена типов узлов содержимого, которые появятся в этих разделах Web-сайта. На рисунке 12 показан список, на который может быть похож словарь.

Рисунок 12. Список терминов в словаре IBC Section Hierarchy
Рисунок 12. Список терминов в словаре IBC Section Hierarchy

Вы заметите, что уведомления появляются под термином home. В информационной архитектуре Web-сайта IBC мы сгруппировали в общий раздел home такое содержимое сайта, как уведомления, о сайте и контактную информацию. С точки зрения представления они оформлены так же, как страница home.

Вместо использования кода, представленного в седьмой части данной серии статей, мы будем использовать код, приведенный в листинге 6, чтобы продемонстрировать, как можно использовать этот словарь для определения значения атрибута class, использующегося в элементе BODY нашей Web-страницы.

Листинг 6. Использование словаря для установки значения атрибута class элемента body в page.tpl.php
...
<?php
  $page_type = '';
  if (!$is_front) {
    if (arg(0) == 'node' && arg(2) == NULL) {
      $terms = taxonomy_node_get_terms(arg(1));
    }
    else {
      $terms = taxonomy_get_term_by_name(arg(0));
    }
    foreach ($terms as $term) {
      $tid = $term->tid;
      break;
    }
    $parents = taxonomy_get_parents($tid);
    foreach ($parents as $parent) {
      $section = $parent->name;
      break;
    }
    $page_type = ($section?$section:$term->name);
  }
  else {
    $page_type = 'home';
  }
?>
<body class="<?php print $page_type; ?>" >
...

Если отображается первая страница, значение атрибута class устанавливается в home по умолчанию. Если первая страница не отображается, мы должны определить связанный термин таксономии для данного URL. В отличие от предыдущего метода мы проверяем стандартные URL-адреса Drupal, например, /node/123. Для них мы передаем ID узла в функцию taxonomy_node_get_terms(), чтобы получить массив объектов term, связанных с этим URL. Если это не стандартный URL Drupal, например, /announcements/123, то мы используем функцию taxonomy_get_term_by_name() для получения массива объектов term, связанных с этим URL.

ID термина ($tid) можно найти при помощи цикла foreach с извлеченным массивом объектов term. Теперь, поскольку у нас есть ID термина, связанного с данным URL, мы должны узнать, есть ли предок у этого термина. Мы передаем ID термина в функцию taxonomy_get_parents() для получения массива родительских объектов term. Используя аналогичный цикл foreach, мы можем установить переменную $section в имя родительского термина. То есть, например, для URL /announcements/123 для извлечения имени родительского термина home используется ID термина announcements.

Теперь переменная $page_type, которая используется для установки значения атрибута class, создана. Если найден родительский термин, используется его имя. Если нет, используется имя термина, связанного с URL. До тех пор, пока поддерживается словарь, подобный вышеописанному (с соответствием первого аргумента URL терминам связанного узла), мы можем управлять стилевым оформлением страницы.

Резюме

В данной статье рассматриваются таксономии и применение тегов, помогающих сделать работу пользователей с Web-сайтами более эффективной. Мы представили технологии, используемые в Drupal, а также несколько примеров того, что можно сделать при помощи гибкой системы таксономии. Мы попытались применить прагматичный подход, демонстрируя несколько методик, доступных разработчикам. Начав их использование, вы найдете новые способы воспользоваться преимуществами предоставляемой ими гибкости. Просмотрите информацию о многочисленных модулях, расширяющих систему таксономии (см. раздел "Ресурсы").

В следующей статье вы узнаете, как развернуть Web-сайт в рабочей среде.

Ресурсы

Научиться

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source
ArticleID=227223
ArticleTitle=Использование программного обеспечения с открытым исходным кодом для проектирования, создания и развертывания Web-сайта для совместной работы, Часть 11: Использование таксономий в Drupal
publish-date=05302007