353 lines
13 KiB
PHP
353 lines
13 KiB
PHP
<?php
|
|
/**
|
|
* @package JEM
|
|
* @subpackage JEM Search Plugin
|
|
* @copyright (C) 2013-2024 joomlaeventmanager.net
|
|
* @copyright (C) 2005-2009 Christoph Lukes
|
|
* @license https://www.gnu.org/licenses/gpl-3.0 GNU/GPL
|
|
*/
|
|
|
|
defined('_JEXEC') or die;
|
|
|
|
use Joomla\CMS\Factory;
|
|
use Joomla\CMS\Language\Text;
|
|
use Joomla\CMS\Plugin\PluginHelper;
|
|
use Joomla\CMS\Plugin\CMSPlugin;
|
|
use Joomla\Registry\Registry;
|
|
|
|
jimport('joomla.html.parameter');
|
|
|
|
|
|
class plgSearchJEM extends CMSPlugin
|
|
{
|
|
protected static $_areas = array(
|
|
'jemevents' => 'PLG_JEM_SEARCH_EVENTS',
|
|
'jemvenues' => 'PLG_JEM_SEARCH_VENUES',
|
|
'jemcategories' => 'PLG_JEM_SEARCH_JEM_CATEGORIES'
|
|
);
|
|
|
|
public function __construct(&$subject, $config)
|
|
{
|
|
parent::__construct($subject, $config);
|
|
CMSPlugin::loadLanguage('plg_search_jem', JPATH_ADMINISTRATOR);
|
|
}
|
|
|
|
|
|
/**
|
|
* @return array An array of search areas
|
|
*/
|
|
function onContentSearchAreas()
|
|
{
|
|
include_once(JPATH_SITE . '/components/com_jem/factory.php');
|
|
if (!class_exists('JemFactory')) {
|
|
return array(); // we need jem please
|
|
}
|
|
|
|
return self::$_areas;
|
|
}
|
|
|
|
/**
|
|
* Categories 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 restricted to areas, null if search all
|
|
*/
|
|
function onContentSearch($text, $phrase = '', $ordering = '', $areas = null)
|
|
{
|
|
include_once(JPATH_SITE . '/components/com_jem/factory.php');
|
|
if (!class_exists('JemFactory')) {
|
|
return array(); // we need jem please
|
|
}
|
|
|
|
$db = Factory::getContainer()->get('DatabaseDriver');
|
|
$app = Factory::getApplication();
|
|
$user = JemFactory::getUser();
|
|
$groups = implode(',', $user->getAuthorisedViewLevels());
|
|
$tag = Factory::getApplication()->getLanguage()->getTag();
|
|
|
|
require_once(JPATH_SITE . '/components/com_jem/helpers/route.php');
|
|
|
|
if (is_array($areas)) {
|
|
if (!array_intersect($areas, array_keys(self::$_areas))) {
|
|
return array();
|
|
}
|
|
} else {
|
|
$areas = array_keys(self::$_areas);
|
|
}
|
|
|
|
// load plugin params info
|
|
$plugin = PluginHelper::getPlugin('search', 'jem');
|
|
$pluginParams = new Registry($plugin->params);
|
|
|
|
$limit = $pluginParams->def('search_limit', 50);
|
|
|
|
$text = trim($text);
|
|
if ($text == '') {
|
|
return array();
|
|
}
|
|
|
|
$searchJEM = $db->Quote(Text::_('PLG_JEM_SEARCH_JEM'));
|
|
|
|
$rows = array();
|
|
$query = $db->getQuery(true);
|
|
|
|
if (in_array('jemevents', $areas) && $limit > 0) {
|
|
$areaName = Text::_(self::$_areas['jemevents']);
|
|
|
|
switch ($phrase) {
|
|
case 'exact':
|
|
$text_q = $db->Quote('%' . $db->escape($text, true) . '%', false);
|
|
$wheres2 = array();
|
|
$wheres2[] = 'LOWER(a.title) LIKE ' . $text_q;
|
|
$wheres2[] = 'LOWER(a.introtext) LIKE ' . $text_q;
|
|
$wheres2[] = 'LOWER(a.fulltext) LIKE ' . $text_q;
|
|
$wheres2[] = 'LOWER(a.meta_keywords) LIKE ' . $text_q;
|
|
$wheres2[] = 'LOWER(a.meta_description) LIKE ' . $text_q;
|
|
$where = '(' . implode(') OR (', $wheres2) . ')';
|
|
break;
|
|
|
|
case 'all':
|
|
case 'any':
|
|
default:
|
|
$words = explode(' ', $text);
|
|
$wheres = array();
|
|
foreach ($words as $word) {
|
|
$word = $db->Quote('%' . $db->escape($word, true) . '%', false);
|
|
$wheres2 = array();
|
|
$wheres2[] = 'LOWER(a.title) LIKE ' . $word;
|
|
$wheres2[] = 'LOWER(a.introtext) LIKE ' . $word;
|
|
$wheres2[] = 'LOWER(a.fulltext) LIKE ' . $word;
|
|
$wheres2[] = 'LOWER(a.meta_keywords) LIKE ' . $word;
|
|
$wheres2[] = 'LOWER(a.meta_description) LIKE ' . $word;
|
|
$wheres[] = implode(' OR ', $wheres2);
|
|
}
|
|
$where = '(' . implode(($phrase == 'all' ? ') AND (' : ') OR ('), $wheres) . ')';
|
|
break;
|
|
}
|
|
|
|
switch ($ordering) {
|
|
case 'oldest':
|
|
$order = 'a.dates ASC, a.times ASC';
|
|
break;
|
|
|
|
case 'alpha':
|
|
$order = 'a.title ASC';
|
|
break;
|
|
|
|
case 'category':
|
|
$order = 'c.catname ASC, a.title ASC';
|
|
break;
|
|
|
|
case 'newest':
|
|
default:
|
|
$order = 'a.dates DESC, a.times DESC';
|
|
}
|
|
|
|
$query->clear();
|
|
//sqlsrv changes
|
|
$case_when = ' CASE WHEN ';
|
|
$case_when .= $query->charLength('a.alias');
|
|
$case_when .= ' THEN ';
|
|
$a_id = $query->castAsChar('a.id');
|
|
$case_when .= $query->concatenate(array($a_id, 'a.alias'), ':');
|
|
$case_when .= ' ELSE ';
|
|
$case_when .= $a_id . ' END as slug';
|
|
|
|
$case_when1 = ' CASE WHEN ';
|
|
$case_when1 .= $query->charLength('c.alias');
|
|
$case_when1 .= ' THEN ';
|
|
$c_id = $query->castAsChar('c.id');
|
|
$case_when1 .= $query->concatenate(array($c_id, 'c.alias'), ':');
|
|
$case_when1 .= ' ELSE ';
|
|
$case_when1 .= $c_id . ' END as catslug';
|
|
|
|
$query->select('a.title AS title, a.meta_description, a.meta_keywords, a.created AS created');
|
|
$query->select($query->concatenate(array('a.introtext', 'a.fulltext')) . ' AS text');
|
|
$query->select($query->concatenate(array($db->quote($areaName), 'c.catname'), ' / ') . ' AS section');
|
|
$query->select($case_when . ',' . $case_when1 . ', ' . '\'2\' AS browsernav');
|
|
$query->select('rel.catid');
|
|
|
|
$query->from('#__jem_events AS a');
|
|
$query->join('LEFT', '#__jem_cats_event_relations AS rel ON rel.itemid = a.id');
|
|
$query->join('LEFT', '#__jem_categories AS c ON c.id = rel.catid');
|
|
$query->where(
|
|
'(' . $where . ')' . ' AND a.published=1 AND c.published = 1 AND a.access IN (' . $groups . ') '
|
|
. 'AND c.access IN (' . $groups . ') '
|
|
);
|
|
$query->group('a.id');
|
|
$query->order($order);
|
|
|
|
$db->setQuery($query, 0, $limit);
|
|
$list = $db->loadObjectList();
|
|
$limit -= count($list);
|
|
|
|
if (isset($list)) {
|
|
foreach ($list as $key => $row) {
|
|
$list[$key]->href = JEMHelperRoute::getEventRoute($row->slug);
|
|
|
|
// todo: list ALL accessable categories
|
|
// todo: show date/time somewhere because this is very useful information
|
|
}
|
|
}
|
|
|
|
$rows[] = $list;
|
|
}
|
|
|
|
if (in_array('jemvenues', $areas) && $limit > 0) {
|
|
$areaName = Text::_(self::$_areas['jemvenues']);
|
|
|
|
switch ($phrase) {
|
|
case 'exact':
|
|
$text_q = $db->Quote('%' . $db->escape($text, true) . '%', false);
|
|
$wheres2 = array();
|
|
$wheres2[] = 'LOWER(venue) LIKE ' . $text_q;
|
|
$wheres2[] = 'LOWER(locdescription) LIKE ' . $text_q;
|
|
$wheres2[] = 'LOWER(city) LIKE ' . $text_q;
|
|
$wheres2[] = 'LOWER(meta_keywords) LIKE ' . $text_q;
|
|
$wheres2[] = 'LOWER(meta_description) LIKE ' . $text_q;
|
|
$where = '(' . implode(') OR (', $wheres2) . ')';
|
|
break;
|
|
|
|
case 'all':
|
|
case 'any':
|
|
default:
|
|
$words = explode(' ', $text);
|
|
$wheres = array();
|
|
foreach ($words as $word) {
|
|
$word = $db->Quote('%' . $db->escape($word, true) . '%', false);
|
|
$wheres2 = array();
|
|
$wheres2[] = 'LOWER(venue) LIKE ' . $word;
|
|
$wheres2[] = 'LOWER(locdescription) LIKE ' . $word;
|
|
$wheres2[] = 'LOWER(city) LIKE ' . $word;
|
|
$wheres2[] = 'LOWER(meta_keywords) LIKE ' . $word;
|
|
$wheres2[] = 'LOWER(meta_description) LIKE ' . $word;
|
|
$wheres[] = implode(' OR ', $wheres2);
|
|
}
|
|
$where = '(' . implode(($phrase == 'all' ? ') AND (' : ') OR ('), $wheres) . ')';
|
|
break;
|
|
}
|
|
|
|
switch ($ordering) {
|
|
case 'oldest':
|
|
$order = 'created DESC';
|
|
break;
|
|
|
|
case 'alpha':
|
|
$order = 'venue ASC';
|
|
break;
|
|
|
|
case 'newest':
|
|
$order = 'created ASC';
|
|
break;
|
|
|
|
default:
|
|
$order = 'venue ASC';
|
|
}
|
|
|
|
$query = 'SELECT venue AS title,'
|
|
. ' locdescription AS text,'
|
|
. ' created,'
|
|
. ' "2" AS browsernav,'
|
|
. ' CASE WHEN CHAR_LENGTH(alias) THEN CONCAT_WS(\':\', id, alias) ELSE id END as slug, '
|
|
. ' ' . $db->quote($areaName) . ' AS section'
|
|
. ' FROM #__jem_venues'
|
|
. ' WHERE ( ' . $where . ')'
|
|
. ' AND published = 1'
|
|
. ' ORDER BY ' . $order;
|
|
$db->setQuery($query, 0, $limit);
|
|
$list2 = $db->loadObjectList();
|
|
|
|
foreach ((array)$list2 as $key => $row) {
|
|
$list2[$key]->href = JEMHelperRoute::getVenueRoute($row->slug);
|
|
}
|
|
|
|
$rows[] = $list2;
|
|
}
|
|
|
|
if (in_array('jemcategories', $areas) && $limit > 0) {
|
|
$areaName = Text::_(self::$_areas['jemcategories']);
|
|
|
|
switch ($phrase) {
|
|
case 'exact':
|
|
$text_q = $db->Quote('%' . $db->escape($text, true) . '%', false);
|
|
$wheres2 = array();
|
|
$wheres2[] = 'LOWER(catname) LIKE ' . $text_q;
|
|
$wheres2[] = 'LOWER(description) LIKE ' . $text_q;
|
|
$wheres2[] = 'LOWER(meta_keywords) LIKE ' . $text_q;
|
|
$wheres2[] = 'LOWER(meta_description) LIKE ' . $text_q;
|
|
$where = '(' . implode(') OR (', $wheres2) . ')';
|
|
break;
|
|
|
|
case 'all':
|
|
case 'any':
|
|
default:
|
|
$words = explode(' ', $text);
|
|
$wheres = array();
|
|
foreach ($words as $word) {
|
|
$word = $db->Quote('%' . $db->escape($word, true) . '%', false);
|
|
$wheres2 = array();
|
|
$wheres2[] = 'LOWER(catname) LIKE ' . $word;
|
|
$wheres2[] = 'LOWER(description) LIKE ' . $word;
|
|
$wheres2[] = 'LOWER(meta_keywords) LIKE ' . $word;
|
|
$wheres2[] = 'LOWER(meta_description) LIKE ' . $word;
|
|
$wheres[] = implode(' OR ', $wheres2);
|
|
}
|
|
$where = '(' . implode(($phrase == 'all' ? ') AND (' : ') OR ('), $wheres) . ')';
|
|
break;
|
|
}
|
|
|
|
$query = 'SELECT catname AS title,'
|
|
. ' description AS text,'
|
|
. ' "" AS created,'
|
|
. ' "2" AS browsernav,'
|
|
. ' CASE WHEN CHAR_LENGTH(alias) THEN CONCAT_WS(\':\', id, alias) ELSE id END as slug, '
|
|
. ' ' . $db->quote($areaName) . ' AS section'
|
|
. ' FROM #__jem_categories'
|
|
. ' WHERE ( ' . $where . ' )'
|
|
. ' AND published = 1'
|
|
. ' AND access IN (' . $groups . ') '
|
|
. ' ORDER BY catname';
|
|
$db->setQuery($query, 0, $limit);
|
|
$list3 = $db->loadObjectList();
|
|
|
|
foreach ((array)$list3 as $key => $row) {
|
|
$list3[$key]->href = JEMHelperRoute::getCategoryRoute($row->slug);
|
|
}
|
|
|
|
$rows[] = $list3;
|
|
}
|
|
|
|
$count = count($rows);
|
|
if ($count > 1) {
|
|
switch ($count) {
|
|
case 2:
|
|
$results = array_merge((array)$rows[0], (array)$rows[1]);
|
|
break;
|
|
|
|
case 3:
|
|
$results = array_merge((array)$rows[0], (array)$rows[1], (array)$rows[2]);
|
|
break;
|
|
|
|
case 4:
|
|
default:
|
|
$results = array_merge((array)$rows[0], (array)$rows[1], (array)$rows[2], (array)$rows[3]);
|
|
break;
|
|
}
|
|
|
|
return $results;
|
|
} else {
|
|
if ($count == 1) {
|
|
return $rows[0];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
?>
|