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