/** * Content Search method * The sql must return the following fields that are used in a common display * routine: href, title, section, created, text, browsernav * @param string Target search string * @param string mathcing option, exact|any|all * @param string ordering option, newest|oldest|popular|alpha|category * @param mixed An array if the search it to be restricted to areas, null if search all */ function plgSearchContent($text, $phrase = '', $ordering = '', $areas = null) { global $mainframe; $db =& JFactory::getDBO(); $user =& JFactory::getUser(); require_once JPATH_SITE . DS . 'components' . DS . 'com_content' . DS . 'helpers' . DS . 'route.php'; require_once JPATH_SITE . DS . 'administrator' . DS . 'components' . DS . 'com_search' . DS . 'helpers' . DS . 'search.php'; $searchText = $text; if (is_array($areas)) { if (!array_intersect($areas, array_keys(plgSearchContentAreas()))) { return array(); } } // load plugin params info $plugin =& JPluginHelper::getPlugin('search', 'content'); $pluginParams = new JParameter($plugin->params); $sContent = $pluginParams->get('search_content', 1); $sUncategorised = $pluginParams->get('search_uncategorised', 1); $sArchived = $pluginParams->get('search_archived', 1); $limit = $pluginParams->def('search_limit', 50); $nullDate = $db->getNullDate(); $date =& JFactory::getDate(); $now = $date->toMySQL(); $text = trim($text); if ($text == '') { return array(); } $wheres = array(); switch ($phrase) { case 'exact': $text = $db->Quote('%' . $db->getEscaped($text, true) . '%', false); $wheres2 = array(); $wheres2[] = 'a.title LIKE ' . $text; $wheres2[] = 'a.introtext LIKE ' . $text; $wheres2[] = 'a.`fulltext` LIKE ' . $text; $wheres2[] = 'a.metakey LIKE ' . $text; $wheres2[] = 'a.metadesc LIKE ' . $text; $where = '(' . implode(') OR (', $wheres2) . ')'; break; case 'all': case 'any': default: $words = explode(' ', $text); $wheres = array(); foreach ($words as $word) { $word = $db->Quote('%' . $db->getEscaped($word, true) . '%', false); $wheres2 = array(); $wheres2[] = 'a.title LIKE ' . $word; $wheres2[] = 'a.introtext LIKE ' . $word; $wheres2[] = 'a.`fulltext` LIKE ' . $word; $wheres2[] = 'a.metakey LIKE ' . $word; $wheres2[] = 'a.metadesc LIKE ' . $word; $wheres[] = implode(' OR ', $wheres2); } $where = '(' . implode($phrase == 'all' ? ') AND (' : ') OR (', $wheres) . ')'; break; } $morder = ''; switch ($ordering) { case 'oldest': $order = 'a.created ASC'; break; case 'popular': $order = 'a.hits DESC'; break; case 'alpha': $order = 'a.title ASC'; break; case 'category': $order = 'b.title ASC, a.title ASC'; $morder = 'a.title ASC'; break; case 'newest': default: $order = 'a.created DESC'; break; } $rows = array(); // search articles if ($sContent && $limit > 0) { $query = 'SELECT a.title AS title, a.metadesc, a.metakey,' . ' a.created AS created,' . ' CONCAT(a.introtext, a.`fulltext`) AS text,' . ' CONCAT_WS( "/", u.title, b.title ) AS section,' . ' CASE WHEN CHAR_LENGTH(a.alias) THEN CONCAT_WS(":", a.id, a.alias) ELSE a.id END as slug,' . ' CASE WHEN CHAR_LENGTH(b.alias) THEN CONCAT_WS(":", b.id, b.alias) ELSE b.id END as catslug,' . ' u.id AS sectionid,' . ' "2" AS browsernav' . ' FROM #__content AS a' . ' INNER JOIN #__categories AS b ON b.id=a.catid' . ' INNER JOIN #__sections AS u ON u.id = a.sectionid' . ' WHERE ( ' . $where . ' )' . ' AND a.state = 1' . ' AND u.published = 1' . ' AND b.published = 1' . ' AND a.access <= ' . (int) $user->get('aid') . ' AND b.access <= ' . (int) $user->get('aid') . ' AND u.access <= ' . (int) $user->get('aid') . ' AND ( a.publish_up = ' . $db->Quote($nullDate) . ' OR a.publish_up <= ' . $db->Quote($now) . ' )' . ' AND ( a.publish_down = ' . $db->Quote($nullDate) . ' OR a.publish_down >= ' . $db->Quote($now) . ' )' . ' GROUP BY a.id' . ' ORDER BY ' . $order; $db->setQuery($query, 0, $limit); $list = $db->loadObjectList(); $limit -= count($list); if (isset($list)) { foreach ($list as $key => $item) { $list[$key]->href = ContentHelperRoute::getArticleRoute($item->slug, $item->catslug, $item->sectionid); } } $rows[] = $list; } // search uncategorised content if ($sUncategorised && $limit > 0) { $query = 'SELECT id, a.title AS title, a.created AS created, a.metadesc, a.metakey, ' . ' a.introtext AS text,' . ' "2" as browsernav, "' . $db->Quote(JText::_('Uncategorised Content')) . '" AS section' . ' FROM #__content AS a' . ' WHERE (' . $where . ')' . ' AND a.state = 1' . ' AND a.access <= ' . (int) $user->get('aid') . ' AND a.sectionid = 0' . ' AND a.catid = 0' . ' AND ( a.publish_up = ' . $db->Quote($nullDate) . ' OR a.publish_up <= ' . $db->Quote($now) . ' )' . ' AND ( a.publish_down = ' . $db->Quote($nullDate) . ' OR a.publish_down >= ' . $db->Quote($now) . ' )' . ' ORDER BY ' . ($morder ? $morder : $order); $db->setQuery($query, 0, $limit); $list2 = $db->loadObjectList(); $limit -= count($list2); if (isset($list2)) { foreach ($list2 as $key => $item) { $list2[$key]->href = ContentHelperRoute::getArticleRoute($item->id); } } $rows[] = $list2; } // search archived content if ($sArchived && $limit > 0) { $searchArchived = JText::_('Archived'); $query = 'SELECT a.title AS title, a.metadesc, a.metakey,' . ' a.created AS created,' . ' a.introtext AS text,' . ' CASE WHEN CHAR_LENGTH(a.alias) THEN CONCAT_WS(":", a.id, a.alias) ELSE a.id END as slug,' . ' CASE WHEN CHAR_LENGTH(b.alias) THEN CONCAT_WS(":", b.id, b.alias) ELSE b.id END as catslug,' . ' u.id AS sectionid,' . ' "2" AS browsernav' . ' FROM #__content AS a' . ' INNER JOIN #__categories AS b ON b.id=a.catid AND b.access <= ' . $user->get('gid') . ' INNER JOIN #__sections AS u ON u.id = a.sectionid' . ' WHERE ( ' . $where . ' )' . ' AND a.state = -1' . ' AND u.published = 1' . ' AND b.published = 1' . ' AND a.access <= ' . (int) $user->get('aid') . ' AND b.access <= ' . (int) $user->get('aid') . ' AND u.access <= ' . (int) $user->get('aid') . ' AND ( a.publish_up = ' . $db->Quote($nullDate) . ' OR a.publish_up <= ' . $db->Quote($now) . ' )' . ' AND ( a.publish_down = ' . $db->Quote($nullDate) . ' OR a.publish_down >= ' . $db->Quote($now) . ' )' . ' ORDER BY ' . $order; $db->setQuery($query, 0, $limit); $list3 = $db->loadObjectList(); if (isset($list3)) { foreach ($list3 as $key => $item) { $list3[$key]->href = ContentHelperRoute::getArticleRoute($item->slug, $item->catslug, $item->sectionid); } } $rows[] = $list3; } $results = array(); if (count($rows)) { foreach ($rows as $row) { $new_row = array(); foreach ($row as $key => $article) { if (searchHelper::checkNoHTML($article, $searchText, array('text', 'title', 'metadesc', 'metakey'))) { $new_row[] = $article; } } $results = array_merge($results, (array) $new_row); } } return $results; }
/** * Search method * * The sql must return the following fields that are used in a common display * routine: href, title, section, created, text, browsernav * @param string Target search string * @param integer The state to search for -1=archived, 0=unpublished, 1=published [default] * @param string A prefix for the section label, eg, 'Archived ' */ function plgSearchJFContent($text, $phrase = '', $ordering = '', $areas = null) { global $mainframe; $registry = JFactory::getConfig(); $lang = $registry->getValue("config.jflang"); $db = JFactory::getDBO(); $user = JFactory::getUser(); require_once JPATH_SITE . DS . 'components' . DS . 'com_content' . DS . 'helpers' . DS . 'route.php'; if (is_array($areas)) { // Use main content search area if (!array_intersect($areas, array_keys(plgSearchContentAreas()))) { return array(); } } // load plugin params info $plugin = JPluginHelper::getPlugin('search', 'jfcontent'); $pluginParams = new JParameter($plugin->params); $sContent = $pluginParams->get('search_content', 1); $sUncategorised = $pluginParams->get('search_uncategorised', 1); $sArchived = $pluginParams->get('search_archived', 1); $limit = $pluginParams->def('search_limit', 50); $activeLang = $pluginParams->def('active_language_only', 0); $nullDate = $db->getNullDate(); $date = JFactory::getDate(); $now = $date->toMySQL(); $text = trim($text); if ($text == '') { return array(); } $wheres = array(); switch ($phrase) { case 'exact': $text = $db->Quote('%' . $db->getEscaped($text, true) . '%', false); $where = "LOWER(jfc.value) LIKE " . $text; break; case 'all': case 'any': default: $words = explode(' ', $text); $wheres = array(); foreach ($words as $word) { $word = $db->Quote('%' . $db->getEscaped($word, true) . '%', false); $wheres[] = "LOWER(jfc.value) LIKE " . $word; } $where = '(' . implode($phrase == 'all' ? ') AND (' : ') OR (', $wheres) . ')'; break; } $morder = ''; switch ($ordering) { case 'oldest': $order = 'a.created ASC'; break; case 'popular': $order = 'a.hits DESC'; break; case 'alpha': $order = 'a.title ASC'; break; case 'category': $order = 'b.title ASC, a.title ASC'; $morder = 'a.title ASC'; break; case 'newest': default: $order = 'a.created DESC'; break; } $rows = array(); // search articles if ($sContent && $limit > 0) { // NB can't use concat since Joomfish won't translate sub-values $query = 'SELECT a.id as contid, b.id as catid, u.id AS secid, a.title AS title, a.created AS created,' . ' a.introtext, a.fulltext, ' . ' u.title as sectitle, b.title as cattitle,' . ' CASE WHEN CHAR_LENGTH(a.alias) THEN CONCAT_WS(":", a.id, a.alias) ELSE a.id END as slug,' . ' CASE WHEN CHAR_LENGTH(b.alias) THEN CONCAT_WS(":", b.id, b.alias) ELSE b.id END as catslug,' . ' "2" AS browsernav, ' . ' jfl.code as jflang, jfl.title as jflname' . ' FROM #__content AS a' . ' INNER JOIN #__categories AS b ON b.id=a.catid' . ' INNER JOIN #__sections AS u ON u.id = a.sectionid' . "\n LEFT JOIN #__jf_content as jfc ON reference_id = a.id" . "\n LEFT JOIN #__languages as jfl ON jfc.language_id = jfl.lang_id" . ' WHERE ( ' . $where . ' )' . ' AND a.state = 1' . ' AND u.published = 1' . ' AND b.published = 1' . ' AND a.access <= ' . (int) $user->get('aid') . ' AND b.access <= ' . (int) $user->get('aid') . ' AND u.access <= ' . (int) $user->get('aid') . ' AND ( a.publish_up = ' . $db->Quote($nullDate) . ' OR a.publish_up <= ' . $db->Quote($now) . ' )' . ' AND ( a.publish_down = ' . $db->Quote($nullDate) . ' OR a.publish_down >= ' . $db->Quote($now) . ' )' . "\n AND jfc.reference_table = 'content'" . ($activeLang ? "\n AND jfl.code = '{$lang}'" : '') . ' GROUP BY a.id' . ' ORDER BY ' . $order; $db->setQuery($query, 0, $limit); $list = $db->loadObjectList(); $limit -= count($list); if (isset($list)) { foreach ($list as $key => $item) { $list[$key]->text = $item->introtext . $item->fulltext; $list[$key]->section = $item->sectitle . "/" . $item->cattitle . " - " . $item->jflname; $list[$key]->href = ContentHelperRoute::getArticleRoute($item->slug, $item->catslug, $item->secid); } } $rows[] = $list; } // search uncategorised content if ($sUncategorised && $limit > 0) { $query = 'SELECT a.id as contid, a.title AS title, a.created AS created,' . ' a.introtext AS text,' . ' "2" as browsernav, "' . $db->Quote(JText::_('Uncategorised Content')) . '" AS section,' . ' jfl.code as jflang, jfl.title as jflname' . ' FROM #__content AS a' . "\n LEFT JOIN #__jf_content as jfc ON reference_id = a.id" . "\n LEFT JOIN #__languages as jfl ON jfc.language_id = jfl.lang_id" . ' WHERE (' . $where . ')' . ' AND a.state = 1' . ' AND a.access <= ' . (int) $user->get('aid') . ' AND a.sectionid = 0' . ' AND a.catid = 0' . ' AND ( a.publish_up = ' . $db->Quote($nullDate) . ' OR a.publish_up <= ' . $db->Quote($now) . ' )' . ' AND ( a.publish_down = ' . $db->Quote($nullDate) . ' OR a.publish_down >= ' . $db->Quote($now) . ' )' . "\n AND jfc.reference_table = 'content'" . ($activeLang ? "\n AND jfl.code = '{$lang}'" : '') . ' ORDER BY ' . ($morder ? $morder : $order); $db->setQuery($query, 0, $limit); $list2 = $db->loadObjectList(); $limit -= count($list2); if (isset($list2)) { foreach ($list2 as $key => $item) { $list2[$key]->href = ContentHelperRoute::getArticleRoute($item->contid); } } $rows[] = $list2; } // search archived content if ($sArchived && $limit > 0) { $searchArchived = JText::_('Archived'); $query = 'SELECT a.title AS title, a.id as conti, b.id as catid, u.id AS secid,' . ' a.created AS created,' . ' a.introtext AS text,' . ' CASE WHEN CHAR_LENGTH(a.alias) THEN CONCAT_WS(":", a.id, a.alias) ELSE a.id END as slug,' . ' CASE WHEN CHAR_LENGTH(b.alias) THEN CONCAT_WS(":", b.id, b.alias) ELSE b.id END as catslug,' . ' u.title as sectitle, b.title as cattitle,' . ' u.id AS sectionid,' . ' "2" AS browsernav,' . ' jfl.code as jflang, jfl.title as jflname' . ' FROM #__content AS a' . ' INNER JOIN #__categories AS b ON b.id=a.catid AND b.access <= ' . $user->get('gid') . ' INNER JOIN #__sections AS u ON u.id = a.sectionid' . "\n LEFT JOIN #__jf_content as jfc ON reference_id = a.id" . "\n LEFT JOIN #__languages as jfl ON jfc.language_id = jfl.lang_id" . ' WHERE ( ' . $where . ' )' . ' AND a.state = -1' . ' AND u.published = 1' . ' AND b.published = 1' . ' AND a.access <= ' . (int) $user->get('aid') . ' AND b.access <= ' . (int) $user->get('aid') . ' AND u.access <= ' . (int) $user->get('aid') . ' AND ( a.publish_up = ' . $db->Quote($nullDate) . ' OR a.publish_up <= ' . $db->Quote($now) . ' )' . ' AND ( a.publish_down = ' . $db->Quote($nullDate) . ' OR a.publish_down >= ' . $db->Quote($now) . ' )' . "\n AND jfc.reference_table = 'content'" . ($activeLang ? "\n AND jfl.code = '{$lang}'" : '') . ' ORDER BY ' . $order; $db->setQuery($query, 0, $limit); $list3 = $db->loadObjectList(); if (isset($list3)) { foreach ($list3 as $key => $item) { $list3[$key]->section = $item->sectitle . "/" . $item->cattitle . " - " . $item->jflname; $list3[$key]->href = ContentHelperRoute::getArticleRoute($item->slug, $item->catslug, $item->sectionid); } } $rows[] = $list3; } $results = array(); if (count($rows)) { foreach ($rows as $row) { $results = array_merge($results, (array) $row); } } return $results; }