Новости и анонсы

Теги в Joomla – уже реальность?

Joomla
Добавление в избранное
Сохранить

Теги в Joomla

Предыстория

Все началось с обсуждения Multiple Categories в Группах Google. В этом обсуждении участвовали более 20 человек, итогом которого стало появление концепции компонента com_tags. Но в первую очередь стоит поблагодарить Elin Waring. Именно она сформулировала эту концепцию и воплотила её в начало разработки компонента.

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

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

Концепция тегов в Joomla

Теги являются другими по отношению к категориям, которые есть сейчас в Joomla. Теги НЕ контейнеры для других элементов. Это значит, что иерархия тегов заканчивается тегами, и в конце у них нет других листьев, которые являются элементами, например, такими как материалы. Элементы ничего не наследуют от тегов, в то время как от категорий (и других категорий) элементы наследуют ACL и статус публикации. А значит, если тег неопубликован или имеет ограничения для менеджеров, то привязанные к нему элементы в свою очередь не должны иметь таких ограничений по доступам и не обязательно должны быть неопубликованы.

Мне кажется, что некоторое недопонимание в терминологии приходит от людей, работающих с WordPress, который имеет то, что я называю тегигории (tagegories). Это своего рода комбинированная система с одной таблицей, в которой есть категории (могут быть вложенными) и теги (которые не могут быть вложенными). Концепция тегов пришла после концепции категорий, по большей части из-за проблем с масштабированием при большом количестве категорий. Вот почему WordPress поощряет сокращение лимита использования категорий, и вместо этого подталкивает на большее использование тегов. По большому счету WordPress использует систему категорий, которая очень похожа на то, что было у нас в 1.5 или на то, что мы сейчас имеем для маппинга в умном поиске. Он не использует вложенность, и именно поэтому он не очень хорошо масштабируется.

Концепция компонента

Вот основные тезисы концепции, которые сформулировала Elin Waring:

  • Возможность группировки элементов, которая позволяет создавать несколько связей к одному и тому же элементу (тегу);
  • Возможность вложения тегов;
  • Возможность создавать ссылку меню (или просто ссылку), которая получала бы все элементы конкретного тега;
  • Возможность применять теги к любому типу контента (элементам), в том числе и к элементам расширений сторонних разработчиков.

Заметки к подходу разработки

Существует несколько общих заметок о том, как работает компонент тегов:

  • в панели управления теги сами по себе являются простым типом контента. Единственным отличием является то, что они вложены. Родителем тега может быть корень или другой тег, но родитель всегда должен быть;
  • интеграция с другими расширениями достигается с помощью хука после сохранения (post save hook) и общего поля тег;
  • информация о теге для элементов контента хранится в специальной таблице;
  • сложной частью тегов является получение списка всех элементов с заданным набором тегов. Так как поддержка списков с мультитегами была приоритетом, списки одного тега рассматриваются как особый случай списков с мультитегами;
  • список ID тегов обрабатывается как массив, поэтому модели и представления фронтенда имеют некоторые отличия от других представлений списков;
  • при запросе отдельного тега существует возможность показать описание тега, картинку (и т.п.) по схожей с com_content системе. Но для мультитегов это работать не будет, вы будете попадать прямо на список тегов.

Описание компонента Тегов

Представления

У компонента есть два представления: тег (tag) и теги (tags).

Тег (Tag)

Отображает список всех элементов (из всех компонентов), которые были отмечены конкретным тегом или набором тегов. При необходимости может включать в себя те элементы, которые были отмечены дочерними тегами выбранных тегов. Когда выбрано несколько тегов, можно настроить сочетание «AND» (И) или «OR» (ИЛИ).

Теги в Joomla - список элементов тега

Теги (Tags)

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

Пока есть два шаблона: default (по умолчанию) и compact (компактный). Шаблон по умолчанию отображает что-то похожее на шаблон блога:

Теги в Joomla - стандартный щаблон списка тегов

Компактный шаблон отображает многоколоночный список названий тегов:

Теги в Joomla - компактный щаблон списка тегов

Модули

Похожие теги (Similar Tags)

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

Популярные теги (Popular Tags)

Отображает список самых популярных тегов, те с которыми связано самое большое количество элементов.

Настройки в панели управления

При входе в компонент Tags мы видим список тегов:

Теги в Joomla - список тегов в панели управления

В настройках компонента параметры разделены на две группы.

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

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

Теги в Joomla - настройки компонента com_tags

В настройках пункта меню Вы можете выбрать один или более тегов. Есть возможность ограничить количество отображаемых элементов для конкретных типов (например, материалы или контакты). Также в дополнительных настройках Вы можете указать максимальное количество элементов (по умолчанию 200).

Теги в Joomla - настройка пункта меню тега

Использование тегов в сторонних расширениях

1. Создайте тип контента

Сначала определите таблицы, содержащие данные, которые будут отмечены тегами. Также определите имя представления, которое отображает одиночный элемент и использует эти таблицы. Например:
#__contact_details - это таблица, из которой берутся данные для отображения контакта компонента com_contact

Для каждой таблицы/представления необходимо сделать запись в таблице #__content_types. Вот так выглядит таблица типов контента:

`type_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `title` varchar(255) NOT NULL DEFAULT '',
 `alias` varchar(255) NOT NULL DEFAULT '',
 `table` varchar(255) NOT NULL DEFAULT '',
 `rules` text NOT NULL,
 `field_mappings` text NOT NULL

  • Имя представления находится в поле alias.
  • Поле title потенциально будет использоваться, несмотря на то, что на данный момент реализации не существует. Обычно начинается с большой буквы, если указывается на английском.
  • Правила (rules) скорее всго будут содержать правила для этого типа, но это также не реализовано.
  • Поле field_mappings содержит соответствия имен конкретных полей вашей таблицы и стандартных полей. Вот так выглядит это поле для типа weblink (ссылка):
    {"id":"id","title":"title","published":"state","alias":"alias","created_date":"created","modified_data":"modified","body":"description","hits":"hits","publish_up":"publish_up","publish_down":"publish_down","access":"access"} 

    Обратите внимание на то, что weblink использует state для базового поля published.

2. Добавьте в контроллер хук после сохранения

В контроллере типа контента необходимо добавить метод postSaveHook(), если такого еще нет. Если он есть, то просто добавьте строки, которые относятся к тегам:

/**
 * Function that allows child controller access to model data after the data has been saved.
 *
 * @param   JModelLegacy  $model      The data model object.
 * @param   array         $validData  The validated data.
 *
 * @return    void
 * @since    1.6
 */
protected function postSaveHook(JModelLegacy $model, $validData = array())
{
    $task = $this->getTask();
    $item = $model->getItem();
    $id = $item->get('id');
    $tags = $validData['tags'];

    // Store the tag data if the weblink data was saved.
    if ($tags)
    {
        $tagsHelper = new JTagsHelper;
        $tagsHelper->tagItem($id, 'com_weblinks.weblink', $tags);
    }

    if ($task == 'save')
    {
        $this->setRedirect(JRoute::_('index.php?option=com_weblinks&view=weblinks', false));
    }
}

3. Добавьте поддержку тегов в метод getItem() модели

Добавьте следующие строки в метод getItem() модели:

$item->tags = new JTagsHelper;
$item->tags->getTagIds($item->id, 'com_weblinks.weblink');

Соответственно замените имя первичного ключа, имя компонента, а также алиас, который находится в поле alias таблицы типов.

4. Добавьте поле "тег" в экраны редактирования

Везде, где вы хотите добавить возможность указывать теги, добавьте поле в xml-файл или в соответствующие шаблоны (если необходимо):

<field name="tags" type="tag"
    label="JTAG"
    description="JTAG_DESC"
    class="inputbox"
    multiple="true" >
</field>

Поле все еще в разработке, но в шаблон (который будет его использовать) не забудьте добавить:

JHtml::_('formbehavior.chosen', 'select');

5. Подготовьте представление

Добавьте следующие строки в ваше представление (предварительно внеся соответствующие изменения):

$item->tags = new JTagsHelper;
$item->tags->getItemTags('com_newsfeeds.newsfeed.' . $this->item->id);

6. Настройте отображение

В шаблоне, в котором вы хотите отобразить теги, связанные с элментом, добавьте:

<?php if ($this->params->get('show_tags')) : ?>
    <?php $this->item->tagLayout = new JLayoutFile('joomla.content.tags'); ?>
    <?php echo $this->item->tagLayout->render($this->item->tags); ?>
<?php endif; ?>

Как вы можете внести свой вклад в развитие компонента

На данный момент компонент находится в активной разработке, поэтому приветствуются идеи и помощь в тестировании. Возможно, благодаря вам мы увидим com_tags уже в Joomla! 3.1. Вот некоторые полезные ссылки:

Dmitry Rekun
Работаю в банковской сфере, а с веб-разработкой (непосредственно с Joomla) столкнулся в 2007 году. Теперь это моё хобби, а в редких случаях и вторая работа. Какое-то время вёл свой блог, но решил попробовать работать в команде. И вот c 2012 года я здесь :)

Подпишитесь на рассылку новостей CMScafe