Back to TagsHelper class

Method searchTags

public static array
searchTags
(mixed $filters = array())
Function to search tags
Parameters
  • array $filters Filter to apply to the search
Returns
  • array
Since
  • 3.1
Class: TagsHelper
Project: Joomla

Method searchTags - Source code

/**
 * 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);
}