/**
* Function to search tags
*
* @param array $filters Filter to apply to the search
*
* @return array
*
* @since 3.1
*/
public static function searchTags($filters = array())
{
$db = Factory::getDbo();
$query = $db->getQuery(true)->select([$db->quoteName('a.id', 'value'), $db->quoteName('a.path', 'text'), $db->quoteName('a.path')])->from($db->quoteName('#__tags', 'a'))->join('LEFT', $db->quoteName('#__tags', 'b'), $db->quoteName('a.lft') . ' > ' . $db->quoteName('b.lft') . ' AND ' . $db->quoteName('a.rgt') . ' < ' . $db->quoteName('b.rgt'));
// Do not return root
$query->where($db->quoteName('a.alias') . ' <> ' . $db->quote('root'));
// Filter language
if (!empty($filters['flanguage'])) {
$query->whereIn($db->quoteName('a.language'), [$filters['flanguage'], '*'], ParameterType::STRING);
}
// Search in title or path
if (!empty($filters['like'])) {
$search = '%' . $filters['like'] . '%';
$query->extendWhere('AND', [$db->quoteName('a.title') . ' LIKE :search1', $db->quoteName('a.path') . ' LIKE :search2'], 'OR')->bind([':search1', ':search2'], $search);
}
// Filter title
if (!empty($filters['title'])) {
$query->where($db->quoteName('a.title') . ' = :title')->bind(':title', $filters['title']);
}
// Filter on the published state
if (isset($filters['published']) && is_numeric($filters['published'])) {
$published = (int) $filters['published'];
$query->where($db->quoteName('a.published') . ' = :published')->bind(':published', $published, ParameterType::INTEGER);
}
// Filter on the access level
if (isset($filters['access']) && \is_array($filters['access']) && \count($filters['access'])) {
$groups = ArrayHelper::toInteger($filters['access']);
$query->whereIn($db->quoteName('a.access'), $groups);
}
// Filter by parent_id
if (isset($filters['parent_id']) && is_numeric($filters['parent_id'])) {
$tagTable = Factory::getApplication()->bootComponent('com_tags')->getMVCFactory()->createTable('Tag', 'Administrator');
if ($children = $tagTable->getTree($filters['parent_id'])) {
$childrenIds = \array_column($children, 'id');
$query->whereIn($db->quoteName('a.id'), $childrenIds);
}
}
$query->group([$db->quoteName('a.id'), $db->quoteName('a.title'), $db->quoteName('a.level'), $db->quoteName('a.lft'), $db->quoteName('a.rgt'), $db->quoteName('a.parent_id'), $db->quoteName('a.published'), $db->quoteName('a.path')])->order($db->quoteName('a.lft') . ' ASC');
// Get the options.
$db->setQuery($query);
try {
$results = $db->loadObjectList();
} catch (\RuntimeException $e) {
return array();
}
// We will replace path aliases with tag names
return self::convertPathsToNames($results);
}