Пример #1
0
 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();
 }
Пример #2
0
 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);
         }
     }
 }
Пример #3
0
 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();
 }
Пример #4
0
 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;
 }
Пример #5
0
 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);
 }
Пример #6
0
 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);
 }
Пример #7
0
 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;
 }
Пример #8
0
 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);
 }
Пример #9
0
 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);
 }
Пример #10
0
 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);
 }
Пример #11
0
 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')));
         }
     }
 }
Пример #12
0
 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();
 }
Пример #13
0
 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;
 }
Пример #14
0
 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();
 }
Пример #15
0
 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);
 }
Пример #16
0
 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;
     }
 }
Пример #17
0
 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);
 }
Пример #18
0
 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;
 }
Пример #19
0
 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;
     }
 }
Пример #20
0
 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;
 }
Пример #21
0
 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;
     }
 }
Пример #22
0
 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;
 }
Пример #23
0
 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;
 }
Пример #24
0
 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;
 }
Пример #25
0
 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();
         }
     }
 }
Пример #26
0
 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);
 }
Пример #27
0
 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;
 }