/** * Generates output for use with autocomplete and suggest methods * * @static * * @param array $params * @param int $subTreeLimit * @param bool $hideRootTag * @param string $locale * * @return array */ private static function generateOutput(array $params, $subTreeLimit, $hideRootTag, $locale) { $subTreeLimit = (int) $subTreeLimit; $hideRootTag = (bool) $hideRootTag; $locale = (string) $locale; if (empty($locale)) { return array('status' => 'success', 'message' => '', 'tags' => array()); } // @TODO Fix synonyms not showing up in autocomplete // when subtree limit is defined in class attribute if ($subTreeLimit > 0) { if ($hideRootTag) { $params['id'] = array('<>', $subTreeLimit); } $params['path_string'] = array('like', '%/' . $subTreeLimit . '/%'); } // first fetch tags that exist in selected locale /** @var eZTagsObject[] $tags */ $tags = eZTagsObject::fetchList($params, null, null, false, $locale); if (!is_array($tags)) { $tags = array(); } $tagsIDsToExclude = array_map(function ($tag) { /** @var eZTagsObject $tag */ return (int) $tag->attribute('id'); }, $tags); // then fetch the rest of tags, but exclude already fetched ones // fetch with main translation to be consistent with eztags attribute content $customConds = eZTagsObject::fetchCustomCondsSQL($params, true); if (!empty($tagsIDsToExclude)) { $customConds .= " AND " . eZDB::instance()->generateSQLINStatement($tagsIDsToExclude, 'eztags.id', true, true, 'int') . " "; } $tagsRest = eZPersistentObject::fetchObjectList(eZTagsObject::definition(), array(), $params, null, null, true, false, array('DISTINCT eztags.*', array('operation' => 'eztags_keyword.keyword', 'name' => 'keyword'), array('operation' => 'eztags_keyword.locale', 'name' => 'locale')), array('eztags_keyword'), $customConds); if (!is_array($tagsRest)) { $tagsRest = array(); } // finally, return both set of tags as one list $tags = array_merge($tags, $tagsRest); $returnArray = array('status' => 'success', 'message' => '', 'tags' => array()); foreach ($tags as $tag) { $returnArrayChild = array(); $returnArrayChild['tag_parent_id'] = $tag->attribute('parent_id'); $returnArrayChild['tag_parent_name'] = $tag->hasParent(true) ? $tag->getParent(true)->attribute('keyword') : ''; $returnArrayChild['tag_name'] = $tag->attribute('keyword'); $returnArrayChild['tag_id'] = $tag->attribute('id'); $returnArrayChild['tag_locale'] = $tag->attribute('current_language'); $returnArray['tags'][] = $returnArrayChild; } return $returnArray; }
$http = eZHTTPTool::instance(); $tagsSearchResults = array(); $tagsSearchCount = 0; $offset = isset($Params['Offset']) && (int) $Params['Offset'] > 0 ? (int) $Params['Offset'] : 0; $limit = (int) eZINI::instance('eztags.ini')->variable('SearchSettings', 'SearchLimit'); $viewParameters = array('offset' => $offset); $tagsSearchText = trim(urldecode($http->variable('TagsSearchText', ''))); $tagsSearchSubTree = (int) $http->variable('TagsSearchSubTree', 0); $tagsSearchSubTree = $tagsSearchSubTree > 0 ? $tagsSearchSubTree : 0; $tagsIncludeSynonyms = $http->hasVariable('TagsIncludeSynonyms'); if (!empty($tagsSearchText)) { $sorts = array('eztags_keyword.keyword' => 'asc'); $limits = array('offset' => $offset, 'limit' => $limit); $params = array('eztags_keyword.keyword' => array('like', '%' . $tagsSearchText . '%')); $customConds = eZTagsObject::fetchCustomCondsSQL($params); if ($tagsSearchSubTree > 0) { if ($tagsIncludeSynonyms) { $customConds .= ' AND ( path_string LIKE "%/' . $tagsSearchSubTree . '/%" OR main_tag_id = ' . $tagsSearchSubTree . ' ) '; } else { $params['path_string'] = array('like', '%/' . $tagsSearchSubTree . '/%'); } } else { if (!$tagsIncludeSynonyms) { $params['main_tag_id'] = 0; } } $tagsSearchResults = eZPersistentObject::fetchObjectList(eZTagsObject::definition(), array(), $params, $sorts, $limits, true, false, array('DISTINCT eztags.*', array('operation' => 'eztags_keyword.keyword', 'name' => 'keyword'), array('operation' => 'eztags_keyword.locale', 'name' => 'locale')), array('eztags_keyword'), $customConds); $tagsSearchCount = eZPersistentObject::fetchObjectList(eZTagsObject::definition(), array(), $params, array(), null, false, false, array(array('operation' => 'COUNT( * )', 'name' => 'row_count')), array('eztags_keyword'), $customConds); $tagsSearchCount = $tagsSearchCount[0]['row_count']; }