public function prepareParams() { if (!isset($this->_params['Tinhte_XenTag_tagsList']) && !empty($this->_params['page'])) { $this->_params['Tinhte_XenTag_tagsList'] = $this->_params['page'][Tinhte_XenTag_Constants::FIELD_PAGE_TAGS] ? Tinhte_XenTag_Helper::unserialize($this->_params['page'][Tinhte_XenTag_Constants::FIELD_PAGE_TAGS]) : array(); } parent::prepareParams(); }
protected function _Tinhte_XenTag_updateTagsInDatabase() { $force = $this->getExtraData(self::DATA_FORCE_UPDATE_TAGS_IN_DATABASE); $skip = $this->getExtraData(self::DATA_SKIP_UPDATE_TAGS_IN_DATABASE); if ($force or $this->isChanged(Tinhte_XenTag_Constants::FIELD_RESOURCE_TAGS) and empty($skip)) { $tagsOrTexts = Tinhte_XenTag_Helper::unserialize($this->get(Tinhte_XenTag_Constants::FIELD_RESOURCE_TAGS)); $tagTexts = Tinhte_XenTag_Helper::getTextsFromTagsOrTexts($tagsOrTexts); $updated = Tinhte_XenTag_Integration::updateTags(Tinhte_XenTag_Constants::CONTENT_TYPE_RESOURCE, $this->get('resource_id'), XenForo_Visitor::getUserId(), $tagTexts, $this); if (is_array($updated)) { $tagsCount = count($updated); $this->set(Tinhte_XenTag_Constants::FIELD_RESOURCE_TAGS, $updated, '', array('setAfterPreSave' => true)); $this->_db->update('xf_resource', array(Tinhte_XenTag_Constants::FIELD_RESOURCE_TAGS => serialize($updated)), array('resource_id = ?' => $this->get('resource_id'))); } else { $tagsCount = intval($updated); } $requiresTag = Tinhte_XenTag_Option::get('resourceRequiresTag'); $maximumTags = intval($this->getModelFromCache('XenResource_Model_Resource')->Tinhte_XenTag_getMaximumTags()); if ($requiresTag and $maximumTags !== 0 and $tagsCount == 0) { throw new XenForo_Exception(new XenForo_Phrase('tinhte_xentag_resource_requires_tag'), true); } if ($maximumTags !== -1 and $tagsCount > $maximumTags) { throw new XenForo_Exception(new XenForo_Phrase('tinhte_xentag_too_many_tags_x_of_y', array('maximum' => $maximumTags, 'count' => $tagsCount)), true); } } }
protected function _render(array $widget, $positionCode, array $params, XenForo_Template_Abstract $template) { $threads = array(); if (isset($params['thread']) and !empty($params['thread']['thread_id'])) { // $thread is found in the template params, try to fetch the tags $tagsOrTexts = Tinhte_XenTag_Helper::unserialize($params['thread'][Tinhte_XenTag_Constants::FIELD_THREAD_TAGS]); } if (empty($tagsOrTexts) and isset($params['page']) and !empty($params['page']['node_id'])) { // fetch page's tags $tagsOrTexts = Tinhte_XenTag_Helper::unserialize($params['page'][Tinhte_XenTag_Constants::FIELD_PAGE_TAGS]); } if (empty($tagsOrTexts) and isset($params['forum']) and !empty($params['forum']['node_id'])) { // fetch forum's tags $tagsOrTexts = Tinhte_XenTag_Helper::unserialize($params['forum'][Tinhte_XenTag_Constants::FIELD_FORUM_TAGS]); } if (empty($tagsOrTexts) and isset($params['resource']) and !empty($params['resource']['resource_id'])) { // fetch resource's tags $tagsOrTexts = Tinhte_XenTag_Helper::unserialize($params['resource'][Tinhte_XenTag_Constants::FIELD_RESOURCE_TAGS]); } if (!empty($tagsOrTexts)) { $core = WidgetFramework_Core::getInstance(); /* @var $threadModel XenForo_Model_Thread */ $threadModel = $core->getModelFromCache('XenForo_Model_Thread'); /* @var $tagModel Tinhte_XenTag_Model_Tag */ $tagModel = $core->getModelFromCache('Tinhte_XenTag_Model_Tag'); $tagTexts = Tinhte_XenTag_Helper::getTextsFromTagsOrTexts($tagsOrTexts); $tags = $tagModel->getTagsByText($tagTexts); $threadIds = array(); foreach ($tags as $tag) { $latest = Tinhte_XenTag_Helper::unserialize($tag['latest_tagged_contents']); if (empty($latest)) { // for some reason, the latest_tagged_contents field is empty // this is illogical because at least there is 1 tagged content (current thread) // so we will rebuild the tag... $latest = $tagModel->updateTag($tag['tag_id']); } if (!empty($latest)) { foreach ($latest as $taggedContent) { if ($taggedContent['content_type'] == 'thread') { // ignore current thread id, obviously!!! if (!empty($params['thread']['thread_id']) and $taggedContent['content_id'] == $params['thread']['thread_id']) { continue; } $threadIds[] = $taggedContent['content_id']; } } } } if (!empty($threadIds)) { $threadIds = array_unique($threadIds); $forumIds = $this->_helperGetForumIdsFromOption(array(), $params, empty($widget['options']['as_guest']) ? false : true); // quick way to get all viewable forum ids $conditions = array('node_id' => $forumIds, Tinhte_XenTag_XenForo_Model_Thread::CONDITIONS_THREAD_ID => $threadIds, 'deleted' => false, 'moderated' => false); $fetchOptions = array('limit' => $widget['options']['limit'], 'join' => XenForo_Model_Thread::FETCH_AVATAR, 'order' => 'post_date', 'orderDirection' => 'desc'); $threads = $threadModel->getThreads($conditions, $fetchOptions); } } $template->setParam('threads', $threads); return $template->render(); }
public function prepareApiDataForThread(array $thread, array $forum, array $firstPosts) { $data = parent::prepareApiDataForThread($thread, $forum, $firstPosts); $tagsOrTexts = Tinhte_XenTag_Helper::unserialize($thread[Tinhte_XenTag_Constants::FIELD_THREAD_TAGS]); $tagTexts = Tinhte_XenTag_Helper::getTextsFromTagsOrTexts($tagsOrTexts); $data['thread_tags'] = Tinhte_XenTag_Helper::getSafeTagsTextArrayForSearchMapping($tagTexts); return $data; }
protected function _insertIntoIndex(XenForo_Search_Indexer $indexer, array $data, array $parentData = null) { $title = $data['title']; $metadata = array(); if (isset($data[Tinhte_XenTag_Constants::FIELD_FORUM_TAGS])) { Tinhte_XenTag_Helper::prepareSearchIndex($title, $metadata, $data[Tinhte_XenTag_Constants::FIELD_FORUM_TAGS]); } $indexer->insertIntoIndex(Tinhte_XenTag_Constants::CONTENT_TYPE_FORUM, $data['node_id'], $title, $data['description'], XenForo_Application::$time, 0, 0, $metadata); }
public function renderTagHashtag(array $tag, array $rendererStates) { $tagText = $this->stringifyTree($tag['children']); if (substr($tagText, 0, 1) === '#') { $tagText = substr($tagText, 1); } $this->_Tinhte_XenTag_tagTexts[Tinhte_XenTag_Helper::getSafeTagTextForSearch($tagText)] = $tagText; return $this->renderTagUnparsed($tag, $rendererStates); }
public function processConstraints(array $constraints, XenForo_Search_DataHandler_Abstract $typeHandler = null) { $processed = parent::processConstraints($constraints, $typeHandler); foreach ($constraints as $constraint => $constraintInfo) { if ($constraint == Tinhte_XenTag_Constants::SEARCH_CONSTRAINT_TAGS) { $processed[$constraint] = array('metadata' => array(Tinhte_XenTag_Constants::SEARCH_METADATA_TAGS, Tinhte_XenTag_Helper::getSafeTagsTextArrayForSearch($constraintInfo))); } } return $processed; }
protected function _insertIntoIndex(XenForo_Search_Indexer $indexer, array $data, array $parentData = null) { $metadata = array(); if (isset($data[Tinhte_XenTag_Constants::FIELD_POST_TAGS])) { $title = ''; Tinhte_XenTag_Helper::prepareSearchIndex($title, $metadata, $data[Tinhte_XenTag_Constants::FIELD_POST_TAGS]); $indexer = new Tinhte_XenTag_XenForo_Search_Indexer($indexer, $metadata); } parent::_insertIntoIndex($indexer, $data, $parentData); }
protected function _insertIntoIndex(XenForo_Search_Indexer $indexer, array $data, array $parentData = null) { $message = $data['message']; $message = trim(XenForo_Helper_String::stripQuotes($message, 0)); $tagTexts = Tinhte_XenTag_Integration::parseHashtags($message); if (!empty($tagTexts)) { $extraMetadata = array(); $extraMetadata[Tinhte_XenTag_Constants::SEARCH_METADATA_TAGS] = Tinhte_XenTag_Helper::getSafeTagsTextArrayForSearch($tagTexts); $indexer = new Tinhte_XenTag_XenForo_Search_Indexer($indexer, $extraMetadata); } $result = parent::_insertIntoIndex($indexer, $data, $parentData); }
public function renderJson() { $results = array(); foreach ($this->_params['tags'] as $tag) { $normalized = Tinhte_XenTag_Helper::getNormalizedTagText($tag['tag_text']); if (isset($results[$normalized])) { continue; } $results[$normalized] = $this->_getPresentationForResult($tag); } return array('results' => $results); }
protected function _Tinhte_XenTag_updateTagsInDatabase() { $force = $this->getExtraData(self::DATA_FORCE_UPDATE_TAGS_IN_DATABASE); $skip = $this->getExtraData(self::DATA_SKIP_UPDATE_TAGS_IN_DATABASE); if ($force or $this->isChanged(Tinhte_XenTag_Constants::FIELD_PAGE_TAGS) and empty($skip)) { $tagsOrTexts = Tinhte_XenTag_Helper::unserialize($this->get(Tinhte_XenTag_Constants::FIELD_PAGE_TAGS)); $tagTexts = Tinhte_XenTag_Helper::getTextsFromTagsOrTexts($tagsOrTexts); $updated = Tinhte_XenTag_Integration::updateTags(Tinhte_XenTag_Constants::CONTENT_TYPE_PAGE, $this->get('node_id'), XenForo_Visitor::getUserId(), $tagTexts, $this); if (is_array($updated)) { $this->set(Tinhte_XenTag_Constants::FIELD_PAGE_TAGS, $updated, '', array('setAfterPreSave' => true)); $this->_db->update('xf_page', array(Tinhte_XenTag_Constants::FIELD_PAGE_TAGS => serialize($updated)), array('node_id = ?' => $this->get('node_id'))); } } }
protected function _render(array $widget, $positionCode, array $params, XenForo_Template_Abstract $template) { $threads = array(); if (isset($params['thread']) and !empty($params['thread']['thread_id'])) { // $thread is found in the template params, try to fetch the tags $tags = Tinhte_XenTag_Helper::unserialize($params['thread'][Tinhte_XenTag_Constants::FIELD_THREAD_TAGS]); } if (empty($tags) and isset($params['page']) and !empty($params['page']['node_id'])) { // fetch page's tags $tags = Tinhte_XenTag_Helper::unserialize($params['page'][Tinhte_XenTag_Constants::FIELD_PAGE_TAGS]); } if (empty($tags) and isset($params['forum']) and !empty($params['forum']['node_id'])) { // fetch forum's tags $tags = Tinhte_XenTag_Helper::unserialize($params['forum'][Tinhte_XenTag_Constants::FIELD_FORUM_TAGS]); } if (empty($tags) and isset($params['resource']) and !empty($params['resource']['resource_id'])) { // fetch resource's tags $tags = Tinhte_XenTag_Helper::unserialize($params['resource'][Tinhte_XenTag_Constants::FIELD_RESOURCE_TAGS]); } if (!empty($tags)) { $core = WidgetFramework_Core::getInstance(); /* @var $searchModel XenForo_Model_Search */ $searchModel = $core->getModelFromCache('XenForo_Model_Search'); $tagConstraint = implode(' ', array_keys($tags)); $constraints = array(Tinhte_XenTag_Constants::SEARCH_CONSTRAINT_TAGS => $tagConstraint); $searcher = new XenForo_Search_Searcher($searchModel); $searchQuery = ''; $order = 'date'; $typeHandler = $searchModel->getSearchDataHandler('thread'); $results = $searcher->searchType($typeHandler, $searchQuery, $constraints, $order, false, $widget['options']['limit'] * 10); if (!empty($results)) { $threadIds = array(); foreach ($results as $result) { if ($result[0] === 'thread') { $threadIds[] = $result[1]; } } $threadIds = array_unique($threadIds); $forumIds = $this->_helperGetForumIdsFromOption(array(), $params, empty($widget['options']['as_guest']) ? false : true); $conditions = array('node_id' => $forumIds, Tinhte_XenTag_XenForo_Model_Thread::CONDITIONS_THREAD_ID => $threadIds, 'deleted' => false, 'moderated' => false); $fetchOptions = array('limit' => $widget['options']['limit'], 'join' => XenForo_Model_Thread::FETCH_AVATAR, 'order' => 'post_date', 'orderDirection' => 'desc'); /* @var $threadModel XenForo_Model_Thread */ $threadModel = $core->getModelFromCache('XenForo_Model_Thread'); $threads = $threadModel->getThreads($conditions, $fetchOptions); } } $template->setParam('threads', $threads); return $template->render(); }
public function actionEdit() { $response = parent::actionEdit(); if ($response instanceof XenForo_ControllerResponse_View) { if (isset($response->params['forum'])) { $forum =& $response->params['forum']; if (isset($forum[Tinhte_XenTag_Constants::FIELD_FORUM_OPTIONS])) { $forum[Tinhte_XenTag_Constants::FIELD_FORUM_OPTIONS] = Tinhte_XenTag_Helper::unserialize($forum[Tinhte_XenTag_Constants::FIELD_FORUM_OPTIONS]); } else { $forum[Tinhte_XenTag_Constants::FIELD_FORUM_OPTIONS] = array(); } } } return $response; }
protected function _render(array $widget, $positionCode, array $params, XenForo_Template_Abstract $template) { $threads = array(); $tags = Tinhte_XenTag_Helper::explodeTags($widget['options']['tags']); $tagsText = array(); foreach ($tags as $tag) { $tag = trim($tag); if (!empty($tag)) { $tagsText[] = $tag; } } if (!empty($tagsText)) { $core = WidgetFramework_Core::getInstance(); /* @var $threadModel XenForo_Model_Thread */ $threadModel = $core->getModelFromCache('XenForo_Model_Thread'); /* @var $tagModel Tinhte_XenTag_Model_Tag */ $tagModel = $core->getModelFromCache('Tinhte_XenTag_Model_Tag'); $tags = $tagModel->getTagsByText($tagsText); $threadIds = array(); foreach ($tags as $tag) { $latest = Tinhte_XenTag_Helper::unserialize($tag['latest_tagged_contents']); if (empty($latest)) { // for some reason, the latest_tagged_contents field is empty // this is illogical because at least there is 1 tagged content (current thread) // so we will rebuild the tag... $latest = $tagModel->updateTag($tag['tag_id']); } if (!empty($latest)) { foreach ($latest as $taggedContent) { if ($taggedContent['content_type'] == 'thread') { $threadIds[] = $taggedContent['content_id']; } } } } if (!empty($threadIds)) { $threadIds = array_unique($threadIds); $forumIds = $this->_helperGetForumIdsFromOption(array(), $params, empty($widget['options']['as_guest']) ? false : true); // quick way to get all viewable forum ids $conditions = array('node_id' => $forumIds, Tinhte_XenTag_XenForo_Model_Thread::CONDITIONS_THREAD_ID => $threadIds, 'deleted' => false, 'moderated' => false); $fetchOptions = array('limit' => $widget['options']['limit'], 'join' => XenForo_Model_Thread::FETCH_AVATAR, 'order' => 'post_date', 'orderDirection' => 'desc'); $threads = $threadModel->getThreads($conditions, $fetchOptions); } } $template->setParam('threads', $threads); return $template->render(); }
protected function _insertIntoIndex(XenForo_Search_Indexer $indexer, array $data, array $parentData = null) { $metadata = array(); if (isset($data[Tinhte_XenTag_Constants::FIELD_FORUM_TAGS])) { // sondh@2012-11-05 // added isset check before trying to unserialize the tags // or this may raise an exception (it happens because // XenForo_DataWriter::getMergedData doesn't return an array with all the fields // the array only includes new or existing data... // similar to Tinhte_XenTag_Search_DataHandler_Page $tagsOrTexts = Tinhte_XenTag_Helper::unserialize($data[Tinhte_XenTag_Constants::FIELD_FORUM_TAGS]); } else { $tagsOrTexts = array(); } $tagTexts = Tinhte_XenTag_Helper::getTextsFromTagsOrTexts($tagsOrTexts); $metadata[Tinhte_XenTag_Constants::SEARCH_METADATA_TAGS] = Tinhte_XenTag_Helper::getSafeTagsTextArrayForSearch($tagTexts); $indexer->insertIntoIndex(Tinhte_XenTag_Constants::CONTENT_TYPE_FORUM, $data['node_id'], $data['title'], $data['description'], XenForo_Application::$time, XenForo_Visitor::getUserId(), 0, $metadata); }
protected function __construct($html, array &$update, array &$resource) { $this->_html = $html; $mode = Tinhte_XenTag_Option::get('autoTagResource'); switch ($mode) { case Tinhte_XenTag_Option::AUTO_TAG_RESOURCE_TAGS: if (!empty($resource[Tinhte_XenTag_Constants::FIELD_RESOURCE_TAGS])) { $this->_tags = Tinhte_XenTag_Helper::unserialize($resource[Tinhte_XenTag_Constants::FIELD_RESOURCE_TAGS]); } break; case Tinhte_XenTag_Option::AUTO_TAG_MODE_ALL_TAGS: if (!empty($resource[Tinhte_XenTag_Constants::FIELD_RESOURCE_TAGS])) { $this->_tags = Tinhte_XenTag_Helper::unserialize($resource[Tinhte_XenTag_Constants::FIELD_RESOURCE_TAGS]); } $this->_useGlobalTags = true; break; } }
protected function _insertIntoIndex(XenForo_Search_Indexer $indexer, array $data, array $parentData = null) { if (isset($data[Tinhte_XenTag_Constants::FIELD_THREAD_TAGS])) { // sondh@2012-11-05 // added isset check before trying to unserialize the tags // read more about this in // Tinhte_XenTag_Search_DataHandler_Page::_insertIntoIndex $tagsOrTexts = Tinhte_XenTag_Helper::unserialize($data[Tinhte_XenTag_Constants::FIELD_THREAD_TAGS]); } else { $tagsOrTexts = array(); } if (!empty($tagsOrTexts)) { $extraMetadata = array(); $tagTexts = Tinhte_XenTag_Helper::getTextsFromTagsOrTexts($tagsOrTexts); $extraMetadata[Tinhte_XenTag_Constants::SEARCH_METADATA_TAGS] = Tinhte_XenTag_Helper::getSafeTagsTextArrayForSearch($tagTexts); $indexer = new Tinhte_XenTag_XenForo_Search_Indexer($indexer, $extraMetadata); } $result = parent::_insertIntoIndex($indexer, $data, $parentData); }
public function getGeneralConstraintsFromInput(array $input, &$errors = null) { if (isset($GLOBALS[Tinhte_XenTag_Constants::GLOBALS_CONTROLLERPUBLIC_SEARCH_SEARCH])) { $GLOBALS[Tinhte_XenTag_Constants::GLOBALS_CONTROLLERPUBLIC_SEARCH_SEARCH]->Tinhte_XenTag_actionSearch($this, $input); } $constraints = parent::getGeneralConstraintsFromInput($input, $errors); if (!empty($input[Tinhte_XenTag_Constants::SEARCH_INPUT_TAGS])) { $tagTexts = $input[Tinhte_XenTag_Constants::SEARCH_INPUT_TAGS]; if (!is_array($tagTexts)) { $tagTexts = array($tagTexts); } /* @var $tagModel Tinhte_XenTag_Model_Tag */ $tagModel = $this->getModelFromCache('Tinhte_XenTag_Model_Tag'); // runs through basic validation first foreach ($tagTexts as &$tagText) { $tagText = Tinhte_XenTag_Helper::getNormalizedTagText($tagText); } $constraints[Tinhte_XenTag_Constants::SEARCH_CONSTRAINT_TAGS] = $tagTexts; } return $constraints; }
public function render() { if ($this->_useGlobalTags) { $globalTagsOrTexts = $this->_getTagModel()->getTagsOrTextsFromCache(); $tagsOrTexts = array(); foreach ($this->_tagsOrTexts as $tagOrText) { $tagText = Tinhte_XenTag_Helper::getTextFromTagOrText($tagOrText); $tagsOrTexts[Tinhte_XenTag_Helper::getNormalizedTagText($tagText)] = $tagOrText; } foreach ($globalTagsOrTexts as $globalTagOrText) { $globalTagText = Tinhte_XenTag_Helper::getTextFromTagOrText($globalTagOrText); $tagsOrTexts[Tinhte_XenTag_Helper::getNormalizedTagText($globalTagText)] = $globalTagOrText; } $this->_tagsOrTexts = $tagsOrTexts; } if (!empty($this->_tagsOrTexts)) { $autoTagOptions = array('onceOnly' => Tinhte_XenTag_Option::get('autoTagOnceOnly')); return Tinhte_XenTag_Integration::autoTag($this->_html, $this->_tagsOrTexts, $autoTagOptions); } else { return $this->_html; } }
protected function _verifyText(&$text) { $text = Tinhte_XenTag_Helper::getNormalizedTagText($text); $censored = XenForo_Helper_String::censorString($text); if ($censored !== $text) { $this->error(new XenForo_Phrase('tinhte_xentag_tag_no_contain_censored'), 'tag_text'); return false; } if (Tinhte_XenTag_Helper::isTagContainingSeparator($text)) { $this->error(new XenForo_Phrase('tinhte_xentag_tag_can_not_contain_comma'), 'tag_text'); return false; } $textLength = utf8_strlen($text); if ($textLength < Tinhte_XenTag_Option::get('tagMinLength')) { $this->error(new XenForo_Phrase('tinhte_xentag_tag_must_be_at_least_x_length', array('minLength' => Tinhte_XenTag_Option::get('tagMinLength'))), 'tag_text'); return false; } if ($textLength > Tinhte_XenTag_Option::get('tagMaxLength')) { $this->error(new XenForo_Phrase('tinhte_xentag_tag_can_not_longer_than_x', array('maxLength' => Tinhte_XenTag_Option::get('tagMaxLength'))), 'tag_text'); return false; } return true; }
protected function __construct($html, array &$post, array &$thread) { $this->_html = $html; $mode = Tinhte_XenTag_Option::get('autoTagMode'); switch ($mode) { case Tinhte_XenTag_Option::AUTO_TAG_MODE_THREAD_TAGS: if (!empty($thread[Tinhte_XenTag_Constants::FIELD_THREAD_TAGS])) { $this->_tags = Tinhte_XenTag_Helper::unserialize($thread[Tinhte_XenTag_Constants::FIELD_THREAD_TAGS]); } break; case Tinhte_XenTag_Option::AUTO_TAG_MODE_THREAD_TAGS_FIRST_POST_ONLY: if ($post['position'] == 0 && !empty($thread[Tinhte_XenTag_Constants::FIELD_THREAD_TAGS])) { $this->_tags = Tinhte_XenTag_Helper::unserialize($thread[Tinhte_XenTag_Constants::FIELD_THREAD_TAGS]); } break; case Tinhte_XenTag_Option::AUTO_TAG_MODE_ALL_TAGS: if (!empty($thread[Tinhte_XenTag_Constants::FIELD_THREAD_TAGS])) { $this->_tags = Tinhte_XenTag_Helper::unserialize($thread[Tinhte_XenTag_Constants::FIELD_THREAD_TAGS]); } $this->_useGlobalTags = true; break; } }
public function prepareForum(array $forum) { $prepared = parent::prepareForum($forum); $prepared['Tinhte_XenTag_tagsList'] = $forum[Tinhte_XenTag_Constants::FIELD_FORUM_TAGS] ? Tinhte_XenTag_Helper::unserialize($forum[Tinhte_XenTag_Constants::FIELD_FORUM_TAGS]) : array(); return $prepared; }
public static function updateThreadDwFromPostDw(XenForo_DataWriter_Discussion_Thread $threadDw, XenForo_DataWriter_DiscussionMessage_Post $postDw) { if (!Tinhte_XenTag_Option::get('tagThreadWithHashtags')) { return false; } $message = $postDw->get('message'); $tagTexts = Tinhte_XenTag_Integration::parseHashtags($message); $threadTags = $threadDw->Tinhte_XenTag_getTags(); $threadTagTexts = Tinhte_XenTag_Helper::getTextsFromTagsOrTexts($threadTags); $threadSafes = Tinhte_XenTag_Helper::getSafeTagsTextArrayForSearch($threadTagTexts); $isChanged = false; foreach ($tagTexts as $tagText) { $safe = Tinhte_XenTag_Helper::getSafeTagTextForSearch($tagText); if (!in_array($safe, $threadSafes)) { $threadTags[] = $tagText; $threadSafes[] = $safe; $isChanged = true; } } if ($isChanged) { $threadDw->Tinhte_XenTag_setTags($threadTags); return true; } return false; }
protected static function _autoTag_isBetweenHtmlTags($html, $position) { $htmlLength = utf8_strlen($html); // look for <a> and </a> $aBefore = Tinhte_XenTag_Helper::utf8_strripos($html, '<a', $position - $htmlLength); if ($aBefore !== false) { $aAfter = Tinhte_XenTag_Helper::utf8_stripos($html, '</a>', $aBefore); if ($aAfter > $position) { // too bad, this position is between <a> and </a> return true; } } // now that we are not inside <a /> // we have to make sure we are not in the middle of any tag $symbolBefore = Tinhte_XenTag_Helper::utf8_strrpos($html, '<', $position - $htmlLength); if ($symbolBefore !== false) { $symbolAfter = utf8_strpos($html, '>', $symbolBefore); if ($symbolAfter > $position) { // now this is extremly bad, get out of here now! return true; } } return false; }
protected function _deleteTaggedContentsResources(array $tag, array $taggeds) { if (!Tinhte_XenTag_Option::xfrmFound()) { // XFRM is not installed/enabled return false; } $tagModel = $this->getModelFromCache('Tinhte_XenTag_Model_Tag'); $resourceModel = $this->getModelFromCache('XenResource_Model_Resource'); $resourceIds = array(); foreach ($taggeds as $tagged) { if ($tagged['content_type'] == Tinhte_XenTag_Constants::CONTENT_TYPE_RESOURCE) { $resourceIds[] = $tagged['content_id']; } } $resources = $resourceModel->getResourcesByIds($resourceIds); foreach ($resources as $resource) { $tagsOrTexts = Tinhte_XenTag_Helper::unserialize($resource[Tinhte_XenTag_Constants::FIELD_RESOURCE_TAGS]); $tagTexts = Tinhte_XenTag_Helper::getTextsFromTagsOrTexts($tagsOrTexts); $filteredTagTexts = array(); foreach ($tagTexts as $tagText) { if ($tagModel->isTagIdenticalWithText($tag, $tagText)) { // drop this tag } else { $filteredTagTexts[] = $tagText; } } if (count($tagTexts) != count($filteredTagTexts)) { /* @var $dw XenResource_DataWriter_Resource */ $dw = XenForo_DataWriter::create('XenResource_DataWriter_Resource'); $dw->setExistingData($resource, true); // save queries $dw->Tinhte_XenTag_setTags($filteredTagTexts); $dw->setExtraData(Tinhte_XenTag_XenResource_DataWriter_Resource::DATA_SKIP_UPDATE_TAGS_IN_DATABASE, true); $dw->save(); } } }
public function filterString($string, array $rendererStates) { $isString = true; if (is_array($string)) { // array is our way of marking tag originals prepend/append text $isString = false; $string = reset($string); } if ($isString) { // checks if the string is an URI of some kind $isString = !Zend_Uri::check($string); } if ($isString) { // checks if the parent tag has some strange requirements $tagDataStack = $rendererStates['tagDataStack']; $lastTagDataStack = array_pop($tagDataStack); if ($lastTagDataStack['tag'] === 'hashtag') { // well, this is a hashtag already... $isString = false; } else { $parentTagInfo = $this->_parent__getTagRule($lastTagDataStack['tag']); if (!empty($parentTagInfo['plainChildren'])) { // parent tag asks for plain children, we should do nothing $isString = false; } elseif (!empty($parentTagInfo['stopSmilies']) or !empty($parentTagInfo['stopLineBreakConversion'])) { // parent tag asks for some functionalities disabled, we should disable ourself // too $isString = false; } } } if ($isString) { $offset = 0; while (true) { $pos = utf8_strpos($string, '#', $offset); if ($pos === false) { break; } $offset = $pos + 1; if ($pos > 0) { $beforeTagText = utf8_substr($string, $pos - 1, 1); if (!preg_match(Tinhte_XenTag_Integration::REGEX_VALID_CHARACTER_AROUND, $beforeTagText)) { // the before character of tag text is not a valid character, dismiss the found // tag text continue; } } $stringForPregMatch = utf8_substr($string, $pos + 1); if (preg_match('/[^a-zA-Z0-9]/', $stringForPregMatch, $matches, PREG_OFFSET_CAPTURE)) { $nonTagTextPos = $matches[0][1]; } else { // get all of the remaining characters $nonTagTextPos = utf8_strlen($stringForPregMatch); } $nonTagTextPos += $pos + 1; $tagText = utf8_trim(utf8_substr($string, $pos + 1, $nonTagTextPos - 1 - $pos)); if (utf8_strlen($tagText) < Tinhte_XenTag_Option::get('tagMinLength')) { // too short continue; } $afterTagText = utf8_substr($string, $nonTagTextPos, 1); if (!empty($afterTagText)) { if (!preg_match(Tinhte_XenTag_Integration::REGEX_VALID_CHARACTER_AROUND, $afterTagText)) { // the after character of tag text is not a valid character, dismiss the found // tag text $tagText = ''; } } if (!empty($tagText)) { $this->_Tinhte_XenTag_autoHashtagTexts[Tinhte_XenTag_Helper::getSafeTagTextForSearch($tagText)] = $tagText; // add bb code wrapping $replacement = sprintf('[HASHTAG]#%s[/HASHTAG]', $tagText); $string = utf8_substr_replace($string, $replacement, $pos, $nonTagTextPos - $pos); $pos += utf8_strlen($replacement) - 1; } $offset = $pos + 1; } } return parent::filterString($string, $rendererStates); }
public function getAllTag(array $conditions = array(), array $fetchOptions = array()) { $whereConditions = $this->prepareTagConditions($conditions, $fetchOptions); $orderClause = $this->prepareTagOrderOptions($fetchOptions); $joinOptions = $this->prepareTagFetchOptions($fetchOptions); $limitOptions = $this->prepareLimitFetchOptions($fetchOptions); $all = $this->fetchAllKeyed($this->limitQueryResults("\n\t\t\t\tSELECT tag.*\n\t\t\t\t{$joinOptions['selectFields']}\n\t\t\t\tFROM `xf_tinhte_xentag_tag` AS tag\n\t\t\t\t{$joinOptions['joinTables']}\n\t\t\t\tWHERE {$whereConditions}\n\t\t\t\t{$orderClause}\n\t\t\t\t", $limitOptions['limit'], $limitOptions['offset']), 'tag_id'); foreach ($all as &$tag) { if (!empty($tag['target_data'])) { $tag['target_data'] = Tinhte_XenTag_Helper::unserialize($tag['target_data']); } } return $all; }