/** * Provides auto complete results when adding tags to object * * @static * @param mixed $args * @return array */ public static function autocomplete($args) { $http = eZHTTPTool::instance(); $searchString = $http->postVariable('search_string'); $subTreeLimit = $http->postVariable('subtree_limit'); $hideRootTag = $http->postVariable('hide_root_tag') == '1' ? true : false; $params = array('keyword' => array('like', $searchString . '%')); if ($subTreeLimit > 0) { if ($hideRootTag) { $params['id'] = array('<>', $subTreeLimit); } $params['path_string'] = array('like', '%/' . $subTreeLimit . '/%'); } $tags = eZTagsObject::fetchList($params); $returnArray = array(); $returnArray['status'] = 'success'; $returnArray['message'] = ''; $returnArray['tags'] = array(); foreach ($tags as $tag) { $returnArrayChild = array(); $returnArrayChild['tag_parent_id'] = (int) $tag->attribute('parent_id'); $returnArrayChild['tag_parent_name'] = $tag->hasParent() ? $tag->getParent()->attribute('keyword') : ''; $returnArrayChild['tag_name'] = $tag->attribute('keyword'); $returnArrayChild['tag_id'] = (int) $tag->attribute('id'); $returnArray['tags'][] = $returnArrayChild; } return $returnArray; }
/** * Creates and returns SQL parts used in fetch functions * * @return array */ function createSqlParts($params) { $returnArray = array('tables' => '', 'joins' => '', 'columns' => ''); if (isset($params['tag_id'])) { if (is_array($params['tag_id'])) { $tagIDsArray = $params['tag_id']; } else { if ((int) $params['tag_id'] > 0) { $tagIDsArray = array((int) $params['tag_id']); } else { return $returnArray; } } if (!isset($params['include_synonyms']) || isset($params['include_synonyms']) && (bool) $params['include_synonyms'] == true) { $result = eZTagsObject::fetchList(array('main_tag_id' => array($tagIDsArray)), null, false); if (is_array($result) && !empty($result)) { foreach ($result as $r) { array_push($tagIDsArray, (int) $r['id']); } } } $returnArray['tables'] = " INNER JOIN eztags_attribute_link i1 ON (i1.object_id = ezcontentobject.id AND i1.objectattribute_version = ezcontentobject.current_version)"; $db = eZDB::instance(); $dbString = $db->generateSQLINStatement($tagIDsArray, 'i1.keyword_id', false, true, 'int'); $returnArray['joins'] = " {$dbString} AND "; } return $returnArray; }
/** * Returns the JSON encoded string of children tags for supplied GET params * Used in YUI version of children tags list in admin interface * * @static * * @param array $args * * @return string */ public static function tagsChildren($args) { $http = eZHTTPTool::instance(); $filter = urldecode(trim($http->getVariable('filter', ''))); if (!isset($args[0]) || !is_numeric($args[0])) { return array('count' => 0, 'offset' => false, 'filter' => $filter, 'data' => array()); } $offset = false; $limits = null; if ($http->hasGetVariable('offset')) { $offset = (int) $http->getVariable('offset'); if ($http->hasGetVariable('limit')) { $limit = (int) $http->getVariable('limit'); } else { $limit = 10; } $limits = array('offset' => $offset, 'limit' => $limit); } $sorts = null; if ($http->hasGetVariable('sortby')) { $sortBy = trim($http->getVariable('sortby')); $sortDirection = 'asc'; if ($http->hasGetVariable('sortdirection') && trim($http->getVariable('sortdirection')) == 'desc') { $sortDirection = 'desc'; } $sorts = array($sortBy => $sortDirection); } $fetchParams = array('parent_id' => (int) $args[0], 'main_tag_id' => 0); if (!empty($filter)) { $fetchParams['keyword'] = array('like', '%' . $filter . '%'); } /** @var eZTagsObject[] $children */ $children = eZTagsObject::fetchList($fetchParams, $limits, $sorts); $childrenCount = eZTagsObject::fetchListCount($fetchParams); if (!is_array($children) || empty($children)) { return array('count' => 0, 'offset' => false, 'filter' => $filter, 'data' => array()); } $dataArray = array(); foreach ($children as $child) { $tagArray = array(); $tagArray['id'] = $child->attribute('id'); $tagArray['keyword'] = htmlspecialchars($child->attribute('keyword'), ENT_QUOTES); $tagArray['modified'] = $child->attribute('modified'); $tagArray['translations'] = array(); foreach ($child->getTranslations() as $translation) { $tagArray['translations'][] = htmlspecialchars($translation->attribute('locale'), ENT_QUOTES); } $dataArray[] = $tagArray; } return array('count' => $childrenCount, 'offset' => $offset, 'filter' => $filter, 'data' => $dataArray); }
/** * 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; }
/** * Returns tags within this instance * * @return array */ function tags() { if (!is_array($this->IDArray) || empty($this->IDArray)) { return array(); } return eZTagsObject::fetchList(array('id' => array($this->IDArray))); }
<?php /** @var eZModule $Module */ /** @var array $Params */ $http = eZHTTPTool::instance(); $tagIDs = $http->sessionVariable('eZTagsDeleteIDArray', $http->postVariable('SelectedIDArray'), array()); if (!is_array($tagIDs) || empty($tagIDs)) { return $Module->handleError(eZError::KERNEL_NOT_FOUND, 'kernel'); } /** @var eZTagsObject[] $tagsList */ $tagsList = eZTagsObject::fetchList(array('id' => array($tagIDs)), null, null, true); if (!is_array($tagsList) || empty($tagsList)) { return $Module->handleError(eZError::KERNEL_NOT_FOUND, 'kernel'); } $http->setSessionVariable('eZTagsDeleteIDArray', $tagIDs); $parentTagID = (int) $tagsList[0]->attribute('parent_id'); if ($http->hasPostVariable('NoButton')) { $http->removeSessionVariable('eZTagsDeleteIDArray'); if ($parentTagID > 0) { return $Module->redirectToView('id', array($parentTagID)); } return $Module->redirectToView('dashboard', array()); } else { if ($http->hasPostVariable('YesButton')) { $db = eZDB::instance(); foreach ($tagsList as $tag) { if ($tag->getSubTreeLimitationsCount() > 0 || $tag->attribute('main_tag_id') != 0) { continue; } $db->begin(); $parentTag = $tag->getParent(true);
public static function create($remoteID, $keyword, eZTagsObject $parentTag=null) { // Vérification de l'existance if ($remoteID) { $tag = eZTagsObject::fetchByRemoteID($remoteID); if ($tag) { if ($parentTag && $tag->attribute( 'parent_id' ) != $parentTag->attribute('id')) { $tag->setAttribute('parent_id', $parentTag->attribute('id')); $tag->updatePathString($parentTag); $tag->updateDepth($parentTag); } return $tag; } } else { $tags = eZTagsObject::fetchList(array( 'keyword' => array( 'like', trim( $keyword ) ), 'parent_id' => $parentTag ? $parentTag->attribute('id') : 0, )); if (count($tags)) return $tags[0]; } $db = eZDB::instance(); $db->begin(); // Création du tag $tag = new eZTagsObject(array( 'remote_id' => $remoteID, 'parent_id' => $parentTag ? $parentTag->attribute( 'id' ) : null, 'main_tag_id' => null, 'keyword' => $keyword, 'depth' => $parentTag ? $parentTag->attribute( 'depth' ) + 1 : 1 )); $tag->store(); // Mise a jour du path string $tag->setAttribute( 'path_string', ($parentTag ? $parentTag->attribute( 'path_string' ) : '/') . $tag->attribute( 'id' ) . '/' ); $tag->store(); $tag->updateModified(); $db->commit(); /* Extended Hook */ if ( class_exists( 'ezpEvent', false ) ) ezpEvent::getInstance()->filter( 'tag/add', array( 'tag' => $tag, 'parentTag' => $parentTag ) ); return $tag; }
/** * Returns the tag cloud for specified parameters using eZ Find * * @param array $params * * @return array */ private function solrTagCloud($params) { $offset = 0; if (isset($params['offset']) && is_numeric($params['offset'])) { $offset = (int) $params['offset']; } // It seems that Solr doesn't like PHP_INT_MAX constant on 64bit operating systems $limit = 1000000; if (isset($params['limit']) && is_numeric($params['limit'])) { $limit = (int) $params['limit']; } $searchFilter = array(); if (isset($params['class_identifier'])) { if (!is_array($params['class_identifier'])) { $params['class_identifier'] = array($params['class_identifier']); } if (!empty($params['class_identifier'])) { $searchFilter['meta_class_identifier_ms'] = '(' . implode(' OR ', $params['class_identifier']) . ')'; } } if (isset($params['parent_node_id'])) { $searchFilter['meta_path_si'] = (int) $params['parent_node_id']; } $solrSearch = new eZSolr(); $solrParams = array('SearchOffset' => 0, 'SearchLimit' => 1000000, 'Facet' => array(array('field' => 'ezf_df_tag_ids', 'limit' => 1000000)), 'Filter' => $searchFilter, 'QueryHandler' => 'ezpublish', 'AsObjects' => false); $searchResult = $solrSearch->search('*:*', $solrParams); if (!isset($searchResult['SearchExtras']) || !$searchResult['SearchExtras'] instanceof ezfSearchResultInfo) { return array(); } $facetResult = $searchResult['SearchExtras']->attribute('facet_fields'); if (!is_array($facetResult) || empty($facetResult[0]['countList'])) { return array(); } $tagsCountList = $facetResult[0]['countList']; /** @var eZTagsObject[] $tags */ $tags = eZTagsObject::fetchList(array('id' => array(array_keys($tagsCountList)))); if (!is_array($tags) || empty($tags)) { return array(); } $tagSortArray = array(); $tagKeywords = array(); $tagCounts = array(); foreach ($tags as $tag) { $tagKeyword = $tag->attribute('keyword'); $tagCount = $tagsCountList[(int) $tag->attribute('id')]; $tagSortArray[] = array('keyword' => $tagKeyword, 'count' => $tagCount, 'tag' => $tag); $tagKeywords[] = $tagKeyword; $tagCounts[] = $tagCount; } // calling call_user_func_array requires all arguments to be references // this is the reason for $sortFlags array and $sortArgs[] = &.... $sortArgs = array(); $sortFlags = array(SORT_ASC, SORT_DESC, SORT_LOCALE_STRING, SORT_NUMERIC); if (isset($params['sort_by']) && is_array($params['sort_by']) && !empty($params['sort_by'])) { $params['sort_by'] = is_string($params['sort_by'][0]) ? array($params['sort_by']) : $params['sort_by']; foreach ($params['sort_by'] as $sortItem) { if (is_array($sortItem) && !empty($sortItem)) { switch ($sortItem[0]) { case 'keyword': $sortArgs[] =& $tagKeywords; if (isset($sortItem[1]) && $sortItem[1]) { $sortArgs[] =& $sortFlags[0]; } else { $sortArgs[] =& $sortFlags[1]; } $sortArgs[] =& $sortFlags[2]; break; case 'count': $sortArgs[] =& $tagCounts; if (isset($sortItem[1]) && $sortItem[1]) { $sortArgs[] =& $sortFlags[0]; } else { $sortArgs[] =& $sortFlags[1]; } $sortArgs[] =& $sortFlags[3]; break; } } } } if (empty($sortArgs)) { $sortArgs[] =& $tagKeywords; $sortArgs[] =& $sortFlags[0]; } $sortArgs[] =& $tagSortArray; call_user_func_array('array_multisort', $sortArgs); $tagSortArray = array_slice($tagSortArray, $offset, $limit); if (empty($tagSortArray)) { return array(); } $tagKeywords = array_slice($tagKeywords, $offset, $limit); $tagCounts = array_slice($tagCounts, $offset, $limit); if (isset($params['post_sort_by'])) { if ($params['post_sort_by'] === 'keyword') { array_multisort($tagKeywords, SORT_ASC, SORT_LOCALE_STRING, $tagSortArray); } else { if ($params['post_sort_by'] === 'keyword_reverse') { array_multisort($tagKeywords, SORT_DESC, SORT_LOCALE_STRING, $tagSortArray); } else { if ($params['post_sort_by'] === 'count') { array_multisort($tagCounts, SORT_ASC, SORT_NUMERIC, $tagSortArray); } else { if ($params['post_sort_by'] === 'count_reverse') { array_multisort($tagCounts, SORT_DESC, SORT_NUMERIC, $tagSortArray); } } } } } $this->normalizeTagCounts($tagSortArray, $tagCounts); return $tagSortArray; }
/** * Fetches latest modified tags by specified parameters * * @static * * @param int|bool $parentTagID * @param int $limit * @param mixed $language * * @return array */ public static function fetchLatestTags($parentTagID = false, $limit = 0, $language = false) { $parentTagID = (int) $parentTagID; $filterArray = array(); $filterArray['main_tag_id'] = 0; $filterArray['id'] = array('!=', $parentTagID); if ($parentTagID > 0) { $filterArray['path_string'] = array('like', '%/' . $parentTagID . '/%'); } if ($language) { if (!is_array($language)) { $language = array($language); } eZContentLanguage::setPrioritizedLanguages($language); } $result = eZTagsObject::fetchList($filterArray, array('offset' => 0, 'limit' => $limit), array('modified' => 'desc')); if ($language) { eZContentLanguage::clearPrioritizedLanguages(); } if (is_array($result) && !empty($result)) { return array('result' => $result); } return array('result' => false); }
/** * Creates and returns SQL parts used in fetch functions * * @param array $params where 'tag_id' is an array of arrays; at least one tag ID from each array must match * * @return array */ public function createAndMultipleFilterSqlParts($params) { $returnArray = array('tables' => '', 'joins' => '', 'columns' => ''); if (!isset($params['tag_id'])) { return $returnArray; } if (is_array($params['tag_id'])) { $tagIDsArray = $params['tag_id']; } else { return $returnArray; } $returnArray['tables'] = " INNER JOIN eztags_attribute_link i1 ON (i1.object_id = ezcontentobject.id AND i1.objectattribute_version = ezcontentobject.current_version)\n INNER JOIN eztags i2 ON (i1.keyword_id = i2.id)\n INNER JOIN eztags_keyword i3 ON (i2.id = i3.keyword_id)"; $dbStrings = array(); $db = eZDB::instance(); foreach ($tagIDsArray as $tagIDGroup) { $tagIDGroup = (array) $tagIDGroup; if (!isset($params['include_synonyms']) || isset($params['include_synonyms']) && (bool) $params['include_synonyms'] == true) { /** @var eZTagsObject[] $tags */ $tags = eZTagsObject::fetchList(array('main_tag_id' => array($tagIDGroup))); if (is_array($tags)) { foreach ($tags as $tag) { $tagIDGroup[] = $tag->attribute('id'); } } } $dbStrings[] = "EXISTS (\n SELECT 1\n FROM\n eztags_attribute_link j1,\n ezcontentobject j2\n WHERE " . $db->generateSQLINStatement($tagIDGroup, 'j1.keyword_id', false, true, 'int') . " AND j1.object_id = j2.id\n AND j2.id = ezcontentobject.id\n AND j1.objectattribute_version = j2.current_version\n )"; } $dbString = implode(" AND ", $dbStrings); if (isset($params['language'])) { $language = $params['language']; if (!is_array($language)) { $language = array($language); } eZContentLanguage::setPrioritizedLanguages($language); } $returnArray['joins'] = " {$dbString}\n AND " . eZContentLanguage::languagesSQLFilter('i2') . " AND " . eZContentLanguage::sqlFilter('i3', 'i2') . " AND "; if (isset($params['language'])) { eZContentLanguage::clearPrioritizedLanguages(); } return $returnArray; }
if ($tagID > 0 && !$tag instanceof eZTagsObject) { header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found'); eZExecution::cleanExit(); } $maxTags = 100; if ($eztagsINI->hasVariable('TreeMenu', 'MaxTags')) { $iniMaxTags = $eztagsINI->variable('TreeMenu', 'MaxTags'); if (is_numeric($iniMaxTags)) { $maxTags = (int) $iniMaxTags; } } $limitArray = null; if ($maxTags > 0) { $limitArray = array('offset' => 0, 'length' => $maxTags); } $children = eZTagsObject::fetchList(array('parent_id' => $tagID, 'main_tag_id' => 0), $limitArray); $response = array(); $response['error_code'] = 0; $response['id'] = $tagID; $response['parent_id'] = $tag instanceof eZTagsObject ? (int) $tag->attribute('parent_id') : -1; $response['children_count'] = count($children); $response['children'] = array(); foreach ($children as $child) { $childResponse = array(); $childResponse['id'] = (int) $child->attribute('id'); $childResponse['parent_id'] = (int) $child->attribute('parent_id'); $childResponse['has_children'] = $child->getChildrenCount() > 0 ? 1 : 0; $childResponse['synonyms_count'] = $child->getSynonymsCount(); $childResponse['subtree_limitations_count'] = $child->getSubTreeLimitationsCount(); $childResponse['language_name_array'] = $child->languageNameArray(); $childResponse['keyword'] = $child->attribute('keyword');
#!/usr/bin/env php <?php require 'autoload.php'; $cli = eZCLI::instance(); $script = eZScript::instance(array('description' => '\\nUpdates path string of all the tags.\\n', 'use-session' => false, 'use-modules' => false, 'use-extensions' => true)); $script->startup(); $options = $script->getOptions('', '', array()); $script->initialize(); $limit = 20; $offset = 0; $db = eZDB::instance(); $script->setIterationData('.', '~'); while ($firstLevelTags = eZTagsObject::fetchList(array('parent_id' => 0, 'main_tag_id' => 0), array('offset' => $offset, 'limit' => $limit), null, true)) { foreach ($firstLevelTags as $tag) { $tagID = $tag->attribute('id'); $db->begin(); $tag->updatePathString(); $db->commit(); $script->iterate($cli, true, 'Updated path string of tag ID = $tagID and all its children.'); } $offset += $limit; } $script->shutdown();
/** * Returns tags within this instance * * @return eZTagsObject[] */ public function tags() { if (!is_array($this->IDArray) || empty($this->IDArray)) { return array(); } $tags = array(); foreach (eZTagsObject::fetchList(array('id' => array($this->IDArray))) as $item) { $tags[array_search($item->attribute('id'), $this->IDArray)] = $item; } ksort($tags); return $tags; }
$http = eZHTTPTool::instance(); $keywordArray = $Params['Parameters']; if (!(is_array($keywordArray) && !empty($keywordArray))) { return $Module->handleError(eZError::KERNEL_NOT_FOUND, 'kernel'); } $parentID = 0; for ($i = 0; $i < count($keywordArray) - 1; $i++) { $tags = eZTagsObject::fetchList(array('parent_id' => $parentID, 'main_tag_id' => 0, 'keyword' => urldecode(trim($keywordArray[$i])))); if (is_array($tags) && !empty($tags)) { $parentID = $tags[0]->attribute('id'); } else { return $Module->handleError(eZError::KERNEL_NOT_FOUND, 'kernel'); } } $tags = eZTagsObject::fetchList(array('parent_id' => $parentID, 'keyword' => urldecode(trim($keywordArray[count($keywordArray) - 1])))); if (!(is_array($tags) && !empty($tags))) { return $Module->handleError(eZError::KERNEL_NOT_FOUND, 'kernel'); } $viewParameters = array(); if (isset($Params['Offset'])) { $viewParameters['offset'] = (int) $Params['Offset']; } $tpl = eZTemplate::factory(); $tpl->setVariable('blocks', eZINI::instance('eztags.ini')->variable('View', 'ViewBlocks')); $tpl->setVariable('tag', $tags[0]); $tpl->setVariable('view_parameters', $viewParameters); $tpl->setVariable('persistent_variable', false); $tpl->setVariable('show_reindex_message', false); if ($http->hasSessionVariable('eZTagsShowReindexMessage')) { $http->removeSessionVariable('eZTagsShowReindexMessage');