Теги

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

Для корректной работы компонента тегов нам понадобятся таблицы определенной структуры, рассмотрим их подробно.

Таблицы тегов

Таблица, в которой хранятся теги будет называться bff_test_tags, структура таблицы выглядит следующим образом:

CREATE TABLE `bff_test_tags` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT, -- ID тега
  `tag` varchar(255) NOT NULL DEFAULT '',        -- тег (название)
  `moderated` tinyint(1) unsigned NOT NULL DEFAULT '0', -- состояние тега (прошел модерацию / не прошел)
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Таблица связи тегов с объектом, в нашем примере это публикации posts, называется bff_test_posts_tags, структура таблицы:

CREATE TABLE `bff_test_posts_tags` (
  `post_id` int(11) unsigned NOT NULL, -- ID объекта
  `tag_id` int(11) unsigned NOT NULL,  -- ID тега
  PRIMARY KEY (`post_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Инициализация компонента тегов

Для работы с компонентом тегов Tags необходимо:

  • создать класс обработчик тегов,
  • задать настройки,
  • инициализировать компонент. Создаем класс обработчик тегов TestTags, родительским классом которого должен быть компонент ядра \bff\db\Tags, реализующий необходимые функции. Задаем настройки компонента и подключаем TestTags к модулю или дополнению в котором ведется разработка:
class TestTags extends \bff\db\Tags
{
    protected function initSettings()
    {
        # указываем таблицу с тегами
        $this->tblTags = `bff_test_tags`;
        
        # использовать модерацию тегов
        $this->postModeration = true;
        
        # указываем таблицу связи тегов с объектом
        $this->tblTagsIn = `bff_test_posts_tags`;
        # указываем название поля объекта в таблице связи в котором хранится ID объекта
        $this->tblTagsIn_ItemID = 'post_id';
        
        # задаем ссылку для админ панели на пункт меню списка тегов
        # в модуле myblog в админ контроллере должен быть объявлен метод listing,
        # отвечающий за отображения списка тегов 
        $this->urlItemsListing = $this->adminLink('listing&tag=', 'myblog');
    }
}

Создаем метод для доступа к компоненту тегов в базовом контроллере модуля или расширения:

/**
 * Инициализация компонента работы с тегами
 * @return TestTags
 */
public function postTags()
{
    static $tagsComponent;
    if (!isset($tagsComponent)) {
        $tagsComponent = new TestTags();
    }
    return $tagsComponent;
}

Использование объекта в админ-панели

Развернуто о порядке применения данного компонента в списках и формах вы найдете в данной статье

Использование объекта на фронтенде

Получение списка тегов объекта выполняется при помощи метода компонента Tags tagsGet(object_id), параметром является id объекта, к которому теги привязываются.

$tagsComponent = $this->postTags();
$tags = $tagsComponent->tagsGet($postID);

Полученные таким образом теги можно выводить на страницу объекта или в форму добавления / редактирования пользователем. В форме, кроме получения ранее сохраненных тегов необходимо обеспечить выбор тегов, удаление и сохранение выбранных. Выбор тегов выполняется автозаполнением:

  • подключаем tpl::includeJS(['autocomplete'], true); уже имеющуюся js библиотеку bff.autocomplete.js;
  • в backend endpoint, методе обрабатчике ajax-запросов по полю ввода первыех буквы тегов, получаем теги методом компонента Tags tagsAutocomplete()
$query = $this->input->post('q', TYPE_NOTAGS);
$tagsComponent->tagsAutocomplete($query);

Сохранение тегов в базе данных выполняется методом компонента тегов tagsSave(object_id).

$tagsComponent->tagsSave($postID); # параметром является id объекта, к которому привязываются теги