getShortVersion(), '3.99.99', '>' ) ); } /** * Instantiate the application. */ if (!FLEXI_J40GE) { $app = \Joomla\CMS\Factory::getApplication($client_name); $app->initialise(); } else { // Alternative is (untested) //$app = CMSApplication::getInstance($client_name); //$app->initialise(); // Boot the DI container $container = \Joomla\CMS\Factory::getContainer(); $container->alias('session.web', 'session.web.' . $client_name) ->alias('session', 'session.web.' . $client_name) ->alias('\Joomla\CMS\Session\Session', 'session.web.' . $client_name) ->alias(\Joomla\CMS\Session\Session::class, 'session.web.' . $client_name) ->alias(\Joomla\Session\Session::class, 'session.web.' . $client_name) ->alias(\Joomla\Session\SessionInterface::class, 'session.web.' . $client_name); // Instantiate the application. $app = $is_admin ? $container->get(\Joomla\CMS\Application\AdministratorApplication::class) : $container->get(\Joomla\CMS\Application\SiteApplication::class); // Set the application as global app \Joomla\CMS\Factory::$application = $app; } // Call the task $jinput = $app->input; $task = $jinput->get('task', '', 'cmd'); $this->$task(); //$diff = round(1000000 * 10 * (microtime(true) - $start_time)) / 10; echo sprintf('
Time: %.3f s
', $diff/1000000); echo sprintf('
Time: %.3f s
', memory_get_usage() - $start_mem); } /** * Logic to get text search autocomplete strings * * @access public * @return void * @since 3.1.2 */ public function txtautocomplete() { // Call plugin, (e.g. to load category data) $this->_callPlugins(); global $globalcats; $app = \Joomla\CMS\Factory::getApplication(); $jinput = $app->input; $cparams = \Joomla\CMS\Component\ComponentHelper::getParams($this->option); $use_tmp = true; // Get request variables $type = $jinput->get('type', '', 'cmd'); $text = $jinput->get('text', '', 'string'); $lang = $jinput->get('lang', '', 'cmd'); $lang = substr($lang, 0,2); $pageSize = $jinput->get('pageSize', 20, 'int'); $pageNum = $jinput->get('pageNum', 1, 'int'); // Make sure the pageNum start with 1 to avoid SQL errors if ($pageNum < 1) { $pageNum = 1; } $usesubs = $jinput->get('usesubs', 1, 'int'); $min_word_len = $app->getUserState( $this->option.'.min_word_len', 0 ); $filtercat = $cparams->get('filtercat', 0); // Filter items using currently selected language $show_noauth = $cparams->get('show_noauth', 0); // Show unauthorized items // Get category ID(s) $cid = $jinput->get('cid', 0, 'int'); $cids = $jinput->get('cids', '', 'string'); // CASE 1: Single category view, zero or string means ignore and use 'cids' if ($cid) { $_cids = array($cid); } // CASE 2: Multi category view elseif (!empty($cids)) { if (!is_array($cids)) { $_cids = preg_replace( '/[^0-9,]/i', '', (string) $cids ); $_cids = explode(',', $_cids); } else { $_cids = $cids; } } // No category id was given else { $_cids = array(); } // Make sure given data are integers ... $cids = array(); foreach ($_cids as $i => $_id) { if ((int) $_id) { $cids[] = (int) $_id; } } // Sub - cats if ($usesubs) { // Find descendants of the categories $subcats = array(); foreach ($cids as $_id) { if ( !isset($globalcats[$_id]) ) continue; $subcats = array_merge($subcats, $globalcats[$_id]->descendantsarray); } $cids = array_unique($subcats); } $cid_list = implode(',', $cids); // Nothing to do if ( $type!='basic_index' && $type!='adv_index' ) jexit(); if ( !strlen($text) ) jexit(); // All starting words are exact words but last word is a ... word prefix $search_prefix = $cparams->get('add_search_prefix') ? 'vvv' : ''; // SEARCH WORD Prefix $words = preg_split('/\s\s*/u', $text); $_words = array(); foreach ($words as & $_w) { $_words[] = !$search_prefix ? trim($_w) : preg_replace('/(\b[^\s,\.]+\b)/u', $search_prefix.'$0', trim($_w)); } $newtext = '+' . implode( ' +', $_words ) .'*'; //print_r($_words); exit; // Query CLAUSE for match the given text $db = \Joomla\CMS\Factory::getDbo(); $quoted_text = $db->escape($newtext, true); $quoted_text = $db->Quote( $quoted_text, false ); $_text_match = ' MATCH (si.search_index) AGAINST ('.$quoted_text.' IN BOOLEAN MODE) '; // Query retieval limits $limitstart = $pageSize * ($pageNum - 1); $limit = $pageSize; $lang_where = ''; if ($filtercat) { $lta = 'i'; $lang_where .= ' AND (' . $lta . '.language LIKE ' . $db->Quote( $lang .'%' ) . ' OR ' . $lta . '.language="*" ) '; //$lang_where .= ' AND (' . $lta . '.language = ' . $db->Quote(\Joomla\CMS\Factory::getLanguage()->getTag()) . ' OR ' . $lta . '.language = ' . $db->Quote('*') . ')'; } $access_where = ''; $joinaccess = ''; /*if (!$show_noauth) { $user = \Joomla\CMS\Factory::getUser(); $aid_arr = \Joomla\CMS\Access\Access::getAuthorisedViewLevels($user->id); $aid_list = implode(",", $aid_arr); $access_where .= ' AND ty.access IN (0,'.$aid_list.')'; $access_where .= ' AND mc.access IN (0,'.$aid_list.')'; $access_where .= ' AND i.access IN (0,'.$aid_list.')'; }*/ // Dates for publish up / down $_nowDate = 'UTC_TIMESTAMP()'; //$db->Quote($now); $nullDate = $db->getNullDate(); // Do query ... $tbl = $type=='basic_index' ? 'flexicontent_items_ext' : 'flexicontent_advsearch_index'; $query = 'SELECT si.item_id, si.search_index' //.', '. $_text_match. ' AS score' // THIS MAYBE SLOW .' FROM #__' . $tbl . ' AS si' .' JOIN '. ($use_tmp ? '#__flexicontent_items_tmp' : '#__content') .' AS i ON i.id = si.item_id' .(($access_where && !$use_tmp) || ($filtercat && !$use_tmp) || $type !== 'basic_index' ? ' JOIN #__flexicontent_items_ext AS ie ON i.id = ie.item_id ' : '') .($access_where ? ' JOIN #__flexicontent_types AS ty ON ie.type_id = ty.id' : '') .($access_where ? ' JOIN #__categories AS mc ON mc.id = i.catid' : '') .($cid_list ? ' JOIN #__flexicontent_cats_item_relations AS rel ON i.id = rel.itemid AND rel.catid IN ('.$cid_list.')' : '') .$joinaccess .' WHERE '. $_text_match .' AND i.state IN (1,-5) ' //(FLEXI_J16GE ? 2:-1) // TODO search archived .' AND ( i.publish_up is NULL OR i.publish_up = '.$db->Quote($nullDate).' OR i.publish_up <= '.$_nowDate.' ) ' .' AND ( i.publish_down is NULL OR i.publish_down = '.$db->Quote($nullDate).' OR i.publish_down >= '.$_nowDate.' ) ' . $lang_where . $access_where //.' ORDER BY score DESC' // THIS MAYBE SLOW .' LIMIT '.$limitstart.', '.$limit ; $data = $db->setQuery($query)->loadAssocList(); //print_r($data); exit; // Get last word (this is a word prefix) and remove it from words array $word_prefix = array_pop($words); // Reconstruct search text with complete words (not including last) $complete_words = implode(' ', $words); // Find out the words that matched $words_found = array(); $regex = '/(\b)('.$search_prefix.$word_prefix.'\w*)(\b)/iu'; foreach ($data as $_d) { //echo $_d['item_id'] . ' '; if (preg_match_all($regex, $_d['search_index'], $matches) ) { //print_r($matches[2]); exit; foreach ($matches[2] as $_m) { if ($search_prefix) { $_m = preg_replace('/\b'.$search_prefix.'/u', '', $_m); } $_m_low = StringHelper::strtolower($_m, 'UTF-8'); $words_found[$_m_low] = 1; } } } //print_r($words_found); exit; // Pagination not appropriate when using autocomplete ... $options = array(); $options['Total'] = count($words_found); // Create responce and JSON encode it $options['Matches'] = array(); $n = 0; foreach ($words_found as $_w => $i) { if (!$search_prefix) { // Word too short if (StringHelper::strlen($_w) < $min_word_len ) { continue; } // Stopword or too common if ($this->_isStopWord($_w, $tbl)) { continue; } } $options['Matches'][] = array( 'text' => $complete_words.($complete_words ? ' ' : '').$_w, 'id' => $complete_words.($complete_words ? ' ' : '').$_w ); ++$n; if ($n >= $pageSize) { break; } } jexit(json_encode($options)); } /** * Method to fetch the tags for selecting in item form * * @since 1.5 */ public function viewtags() { // Check for request forgeries \Joomla\CMS\Session\Session::checkToken('request') or jexit(\Joomla\CMS\Language\Text::_('JINVALID_TOKEN')); require_once \Joomla\CMS\Filesystem\Path::clean(JPATH_SITE . '/components/com_flexicontent/helpers/permission.php'); $app = \Joomla\CMS\Factory::getApplication(); $perms = FlexicontentHelperPerm::getPerm(); @ob_end_clean(); //header('Content-type: application/json; charset=utf-8'); header('Content-type: application/json'); header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Cache-Control: no-cache"); header("Pragma: no-cache"); $array = array(); if (!$perms->CanUseTags) { $this->_loadLanguage(); $array[] = (object) array( 'id' => '0', 'name' => \Joomla\CMS\Language\Text::_('FLEXI_FIELD_NO_ACCESS') ); } else { // If (search) text is just whitespace then set limit to a much higher value $q = $app->input->getString('q', ''); $q = $q !== parse_url(@$_SERVER["REQUEST_URI"], PHP_URL_PATH) ? $q : ''; $limit = $q && !trim($q) ? 10000 : 500; $tagobjs = $this->_gettags($q, $limit); if ($tagobjs) { foreach ($tagobjs as $tag) { $array[] = (object) array( 'id' => $tag->id, 'name' => $tag->name, 'translated_text' => $tag->fa_text, ); } } if (empty($array)) { $this->_loadLanguage(); $array[] = (object) array( 'id' => '0', 'name' => \Joomla\CMS\Language\Text::_($perms->CanCreateTags ? 'FLEXI_NEW_TAG_ENTER_TO_CREATE' : 'FLEXI_NO_TAGS_FOUND'), 'translated_text' => '', ); } } jexit(json_encode($array/*, JSON_UNESCAPED_UNICODE*/)); } // *** // *** Helper methods // *** private function _isStopWord($word, $tbl='flexicontent_items_ext', $col='search_index') { $app = \Joomla\CMS\Factory::getApplication(); $jinput = $app->input; if ($jinput->get('task', '', 'cmd') == __FUNCTION__) die(__FUNCTION__ . ' : direct call not allowed'); $db = \Joomla\CMS\Factory::getDbo(); $quoted_word = $db->escape($word, true); $query = 'SELECT '.$col .' FROM #__'.$tbl .' WHERE MATCH ('.$col.') AGAINST ("+'.$quoted_word.'")' .' LIMIT 1'; $result = $db->setQuery($query)->loadAssocList(); return !empty($return) ? true : false; } private function _callPlugins() { $app = \Joomla\CMS\Factory::getApplication(); $jinput = $app->input; if ($jinput->get('task', '', 'cmd') == __FUNCTION__) die(__FUNCTION__ . ' : direct call not allowed'); // Call system plugin $extfolder = 'system'; $extname = 'flexisystem'; $className = 'plg'. ucfirst($extfolder).$extname; require_once JPATH_SITE . '/plugins/'.$extfolder.'/'.$extname.'/'.$extname.'.php'; $dispatcher = JEventDispatcher::getInstance(); $plg_db_data = \Joomla\CMS\Plugin\PluginHelper::getPlugin($extfolder, $extname); $plg = new $className($dispatcher, array('type'=>$extfolder, 'name'=>$extname, 'params'=>$plg_db_data->params)); // Load cached category data global $globalcats; if (FLEXI_CACHE) { // Add the category tree to categories cache $catscache = \Joomla\CMS\Factory::getCache('com_flexicontent_cats'); $catscache->setCaching(1); // Force cache ON $catscache->setLifeTime(FLEXI_CACHE_TIME); // Set expire time (default is 1 hour) $globalcats = $catscache->get( array($plg, 'getCategoriesTree'), array() ); } else { $globalcats = $plg->getCategoriesTree(); } } /** * Method to fetch tags according to a given text * * @return object * @since 1.0 */ private function _getTags($text = '', $limit = 500) { if (!defined('FLEXI_FISH')) define('FLEXI_FISH' , ($params->get('flexi_fish', 0) && (\Joomla\CMS\Plugin\PluginHelper::isEnabled('system', 'falangdriver' ))) ? 1 : 0); $app = \Joomla\CMS\Factory::getApplication(); $jinput = $app->input; if ($jinput->get('task', '', 'cmd') == __FUNCTION__) die(__FUNCTION__ . ' : direct call not allowed'); $db = \Joomla\CMS\Factory::getDbo(); $lang_code = $jinput->getString('item_lang'); $lang_code = $lang_code && $lang_code !== '*' ? $lang_code : $jinput->getString('lang', \Joomla\CMS\Factory::getLanguage()->getTag()); $query = $db->getQuery(true) ->select('la.*') ->from('#__languages AS la') ->where('la.lang_code = ' . $db->quote($lang_code)) ; $lang = $db->setQuery($query)->loadObject(); $query = $db->getQuery(true) ->select('ft.*') ->from('#__flexicontent_tags AS ft') ->where('ft.published = 1') ->order('ft.name') ; !FLEXI_FALANG ? $query->select('"" AS fa_text') : $query ->select('fa.value AS fa_text') ->leftjoin('#__falang_content AS fa ON fa.reference_table = "tags" AND fa.reference_field = "title" AND fa.reference_id = ft.jtag_id' . ' AND fa.language_id = ' . (int) $lang->lang_id); if (trim($text)) { $escaped_text = $db->escape($text, true); $quoted_text = $db->Quote('%' . $escaped_text . '%', false); !FLEXI_FALANG ? $query->where('name LIKE ' . $quoted_text) : $query->where('ft.name LIKE ' . $quoted_text . ' OR fa.value LIKE ' . $quoted_text); } $tags = $db->setQuery($query, 0, (int) $limit)->loadObjectlist(); return $tags; } /** * Method to load language files * * @return object * @since 3.2.1.4 */ private function _loadLanguage() { $app = \Joomla\CMS\Factory::getApplication(); $jinput = $app->input; if ($jinput->get('task', '', 'cmd') == __FUNCTION__) die(__FUNCTION__ . ' : direct call not allowed'); // Load english language file for 'com_flexicontent' component then override with current language file \Joomla\CMS\Factory::getLanguage()->load('com_flexicontent', JPATH_ADMINISTRATOR, 'en-GB', true); \Joomla\CMS\Factory::getLanguage()->load('com_flexicontent', JPATH_ADMINISTRATOR, null, true); } }