primo commit
This commit is contained in:
9
administrator/components/com_search/access.xml
Normal file
9
administrator/components/com_search/access.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<access component="com_search">
|
||||
<section name="component">
|
||||
<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
|
||||
<action name="core.options" title="JACTION_OPTIONS" description="JACTION_OPTIONS_COMPONENT_DESC" />
|
||||
<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
|
||||
<action name="core.edit.state" title="JACTION_EDITSTATE" description="JACTION_EDITSTATE_COMPONENT_DESC" />
|
||||
</section>
|
||||
</access>
|
||||
91
administrator/components/com_search/config.xml
Normal file
91
administrator/components/com_search/config.xml
Normal file
@ -0,0 +1,91 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<config>
|
||||
<fieldset
|
||||
name="component"
|
||||
label="COM_SEARCH_FIELDSET_SEARCH_OPTIONS_LABEL">
|
||||
<field
|
||||
name="enabled"
|
||||
type="radio"
|
||||
label="COM_SEARCH_CONFIG_GATHER_SEARCH_STATISTICS_LABEL"
|
||||
description="COM_SEARCH_CONFIG_GATHER_SEARCH_STATISTICS_DESC"
|
||||
class="btn-group btn-group-yesno"
|
||||
default="0"
|
||||
>
|
||||
<option value="1">JYES</option>
|
||||
<option value="0">JNO</option>
|
||||
</field>
|
||||
|
||||
<field
|
||||
name="search_phrases"
|
||||
type="radio"
|
||||
label="COM_SEARCH_FIELD_SEARCH_PHRASES_LABEL"
|
||||
description="COM_SEARCH_FIELD_SEARCH_PHRASES_DESC"
|
||||
class="btn-group btn-group-yesno"
|
||||
default="1"
|
||||
>
|
||||
<option value="1">JYES</option>
|
||||
<option value="0">JNO</option>
|
||||
</field>
|
||||
|
||||
<field
|
||||
name="search_areas"
|
||||
type="radio"
|
||||
label="COM_SEARCH_FIELD_SEARCH_AREAS_LABEL"
|
||||
description="COM_SEARCH_FIELD_SEARCH_AREAS_DESC"
|
||||
class="btn-group btn-group-yesno"
|
||||
default="1"
|
||||
>
|
||||
<option value="1">JYES</option>
|
||||
<option value="0">JNO</option>
|
||||
</field>
|
||||
|
||||
<field
|
||||
name="show_date"
|
||||
type="radio"
|
||||
label="COM_SEARCH_CONFIG_FIELD_CREATED_DATE_LABEL"
|
||||
description="COM_SEARCH_CONFIG_FIELD_CREATED_DATE_DESC"
|
||||
class="btn-group btn-group-yesno"
|
||||
default="1"
|
||||
>
|
||||
<option value="1">JSHOW</option>
|
||||
<option value="0">JHIDE</option>
|
||||
</field>
|
||||
|
||||
<field
|
||||
name="opensearch_name"
|
||||
type="text"
|
||||
label="COM_SEARCH_CONFIG_FIELD_OPENSEARCH_NAME_LABEL"
|
||||
description="COM_SEARCH_CONFIG_FIELD_OPENSEARCH_NAME_DESC"
|
||||
default=""
|
||||
/>
|
||||
|
||||
<field
|
||||
name="opensearch_description"
|
||||
type="textarea"
|
||||
label="COM_SEARCH_CONFIG_FIELD_OPENSEARCH_DESCRIPTON_LABEL"
|
||||
description="COM_SEARCH_CONFIG_FIELD_OPENSEARCH_DESCRIPTON_DESC"
|
||||
default=""
|
||||
cols="30"
|
||||
rows="2"
|
||||
/>
|
||||
|
||||
</fieldset>
|
||||
|
||||
<fieldset
|
||||
name="permissions"
|
||||
label="JCONFIG_PERMISSIONS_LABEL"
|
||||
description="JCONFIG_PERMISSIONS_DESC"
|
||||
>
|
||||
|
||||
<field
|
||||
name="rules"
|
||||
type="rules"
|
||||
label="JCONFIG_PERMISSIONS_LABEL"
|
||||
filter="rules"
|
||||
validate="rules"
|
||||
component="com_search"
|
||||
section="component"
|
||||
/>
|
||||
|
||||
</fieldset>
|
||||
</config>
|
||||
44
administrator/components/com_search/controller.php
Normal file
44
administrator/components/com_search/controller.php
Normal file
@ -0,0 +1,44 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_search
|
||||
*
|
||||
* @copyright (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
/**
|
||||
* Search master display controller.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
class SearchController extends JControllerLegacy
|
||||
{
|
||||
/**
|
||||
* @var string The default view.
|
||||
* @since 1.6
|
||||
*/
|
||||
protected $default_view = 'searches';
|
||||
|
||||
/**
|
||||
* Method to display a view.
|
||||
*
|
||||
* @param boolean $cachable If true, the view output will be cached
|
||||
* @param array $urlparams An array of safe URL parameters and their variable types, for valid values see {@link JFilterInput::clean()}.
|
||||
*
|
||||
* @return SearchController This object to support chaining.
|
||||
*
|
||||
* @since 1.5
|
||||
*/
|
||||
public function display($cachable = false, $urlparams = false)
|
||||
{
|
||||
JLoader::register('SearchHelper', JPATH_ADMINISTRATOR . '/components/com_search/helpers/search.php');
|
||||
|
||||
// Load the submenu.
|
||||
SearchHelper::addSubmenu($this->input->get('view', 'searches'));
|
||||
|
||||
return parent::display();
|
||||
}
|
||||
}
|
||||
58
administrator/components/com_search/controllers/searches.php
Normal file
58
administrator/components/com_search/controllers/searches.php
Normal file
@ -0,0 +1,58 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_search
|
||||
*
|
||||
* @copyright (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
/**
|
||||
* Methods supporting a list of search terms.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
class SearchControllerSearches extends JControllerLegacy
|
||||
{
|
||||
/**
|
||||
* Method to reset the search log table.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function reset()
|
||||
{
|
||||
// Check for request forgeries.
|
||||
$this->checkToken();
|
||||
|
||||
$model = $this->getModel('Searches');
|
||||
|
||||
if (!$model->reset())
|
||||
{
|
||||
JError::raiseWarning(500, $model->getError());
|
||||
}
|
||||
|
||||
$this->setRedirect('index.php?option=com_search&view=searches');
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to toggle the view of results.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function toggleResults()
|
||||
{
|
||||
// Check for request forgeries.
|
||||
$this->checkToken();
|
||||
|
||||
if ($this->getModel('Searches')->getState('show_results', 1, 'int') === 0)
|
||||
{
|
||||
$this->setRedirect('index.php?option=com_search&view=searches&show_results=1');
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->setRedirect('index.php?option=com_search&view=searches&show_results=0');
|
||||
}
|
||||
}
|
||||
}
|
||||
365
administrator/components/com_search/helpers/search.php
Normal file
365
administrator/components/com_search/helpers/search.php
Normal file
@ -0,0 +1,365 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_search
|
||||
*
|
||||
* @copyright (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\String\StringHelper;
|
||||
|
||||
/**
|
||||
* Search component helper.
|
||||
*
|
||||
* @since 1.5
|
||||
*/
|
||||
class SearchHelper
|
||||
{
|
||||
/**
|
||||
* Configure the Linkbar.
|
||||
*
|
||||
* @param string $vName The name of the active view.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
public static function addSubmenu($vName)
|
||||
{
|
||||
// Not required.
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a list of the actions that can be performed.
|
||||
*
|
||||
* @return JObject
|
||||
*
|
||||
* @deprecated 3.2 Use JHelperContent::getActions() instead.
|
||||
*/
|
||||
public static function getActions()
|
||||
{
|
||||
// Log usage of deprecated function.
|
||||
try
|
||||
{
|
||||
JLog::add(
|
||||
sprintf('%s() is deprecated. Use JHelperContent::getActions() with new arguments order instead.', __METHOD__),
|
||||
JLog::WARNING,
|
||||
'deprecated'
|
||||
);
|
||||
}
|
||||
catch (RuntimeException $exception)
|
||||
{
|
||||
// Informational log only
|
||||
}
|
||||
|
||||
// Get list of actions.
|
||||
return JHelperContent::getActions('com_search');
|
||||
}
|
||||
|
||||
/**
|
||||
* Sanitise search word.
|
||||
*
|
||||
* @param string &$searchword Search word to be sanitised.
|
||||
* @param string $searchphrase Either 'all', 'any' or 'exact'.
|
||||
*
|
||||
* @return boolean True if search word needs to be sanitised.
|
||||
*/
|
||||
public static function santiseSearchWord(&$searchword, $searchphrase)
|
||||
{
|
||||
$ignored = false;
|
||||
|
||||
$lang = JFactory::getLanguage();
|
||||
$tag = $lang->getTag();
|
||||
$search_ignore = $lang->getIgnoredSearchWords();
|
||||
|
||||
// Deprecated in 1.6 use $lang->getIgnoredSearchWords instead.
|
||||
$ignoreFile = JLanguageHelper::getLanguagePath() . '/' . $tag . '/' . $tag . '.ignore.php';
|
||||
|
||||
if (file_exists($ignoreFile))
|
||||
{
|
||||
include $ignoreFile;
|
||||
}
|
||||
|
||||
// Check for words to ignore.
|
||||
$aterms = explode(' ', StringHelper::strtolower($searchword));
|
||||
|
||||
// First case is single ignored word.
|
||||
if (count($aterms) == 1 && in_array(StringHelper::strtolower($searchword), $search_ignore))
|
||||
{
|
||||
$ignored = true;
|
||||
}
|
||||
|
||||
// Filter out search terms that are too small.
|
||||
$lower_limit = $lang->getLowerLimitSearchWord();
|
||||
|
||||
foreach ($aterms as $aterm)
|
||||
{
|
||||
if (StringHelper::strlen($aterm) < $lower_limit)
|
||||
{
|
||||
$search_ignore[] = $aterm;
|
||||
}
|
||||
}
|
||||
|
||||
// Next is to remove ignored words from type 'all' or 'any' (not exact) searches with multiple words.
|
||||
if (count($aterms) > 1 && $searchphrase != 'exact')
|
||||
{
|
||||
$pruned = array_diff($aterms, $search_ignore);
|
||||
$searchword = implode(' ', $pruned);
|
||||
}
|
||||
|
||||
return $ignored;
|
||||
}
|
||||
|
||||
/**
|
||||
* Does search word need to be limited?
|
||||
*
|
||||
* @param string &$searchword Search word to be checked.
|
||||
*
|
||||
* @return boolean True if search word should be limited; false otherwise.
|
||||
*
|
||||
* @since 1.5
|
||||
*/
|
||||
public static function limitSearchWord(&$searchword)
|
||||
{
|
||||
$restriction = false;
|
||||
|
||||
$lang = JFactory::getLanguage();
|
||||
|
||||
// Limit searchword to a maximum of characters.
|
||||
$upper_limit = $lang->getUpperLimitSearchWord();
|
||||
|
||||
if (StringHelper::strlen($searchword) > $upper_limit)
|
||||
{
|
||||
$searchword = StringHelper::substr($searchword, 0, $upper_limit - 1);
|
||||
$restriction = true;
|
||||
}
|
||||
|
||||
// Searchword must contain a minimum of characters.
|
||||
if ($searchword && StringHelper::strlen($searchword) < $lang->getLowerLimitSearchWord())
|
||||
{
|
||||
$searchword = '';
|
||||
$restriction = true;
|
||||
}
|
||||
|
||||
return $restriction;
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs a search term.
|
||||
*
|
||||
* @param string $searchTerm The term being searched.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 1.5
|
||||
* @deprecated 4.0 Use \Joomla\CMS\Helper\SearchHelper::logSearch() instead.
|
||||
*/
|
||||
public static function logSearch($searchTerm)
|
||||
{
|
||||
try
|
||||
{
|
||||
JLog::add(
|
||||
sprintf('%s() is deprecated. Use \Joomla\CMS\Helper\SearchHelper::logSearch() instead.', __METHOD__),
|
||||
JLog::WARNING,
|
||||
'deprecated'
|
||||
);
|
||||
}
|
||||
catch (RuntimeException $exception)
|
||||
{
|
||||
// Informational log only
|
||||
}
|
||||
|
||||
\Joomla\CMS\Helper\SearchHelper::logSearch($searchTerm, 'com_search');
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepares results from search for display.
|
||||
*
|
||||
* @param string $text The source string.
|
||||
* @param string $searchword The searchword to select around.
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
* @since 1.5
|
||||
*/
|
||||
public static function prepareSearchContent($text, $searchword)
|
||||
{
|
||||
// Strips tags won't remove the actual jscript.
|
||||
$text = preg_replace("'<script[^>]*>.*?</script>'si", '', $text);
|
||||
$text = preg_replace('/{.+?}/', '', $text);
|
||||
|
||||
// $text = preg_replace('/<a\s+.*?href="([^"]+)"[^>]*>([^<]+)<\/a>/is','\2', $text);
|
||||
|
||||
// Replace line breaking tags with whitespace.
|
||||
$text = preg_replace("'<(br[^/>]*?/|hr[^/>]*?/|/(div|h[1-6]|li|p|td))>'si", ' ', $text);
|
||||
|
||||
return self::_smartSubstr(strip_tags($text), $searchword);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks an object for search terms (after stripping fields of HTML).
|
||||
*
|
||||
* @param object $object The object to check.
|
||||
* @param string $searchTerm Search words to check for.
|
||||
* @param array $fields List of object variables to check against.
|
||||
*
|
||||
* @return boolean True if searchTerm is in object, false otherwise.
|
||||
*/
|
||||
public static function checkNoHtml($object, $searchTerm, $fields)
|
||||
{
|
||||
$searchRegex = array(
|
||||
'#<script[^>]*>.*?</script>#si',
|
||||
'#<style[^>]*>.*?</style>#si',
|
||||
'#<!.*?(--|]])>#si',
|
||||
'#<[^>]*>#i'
|
||||
);
|
||||
$terms = explode(' ', $searchTerm);
|
||||
|
||||
if (empty($fields))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach ($fields as $field)
|
||||
{
|
||||
if (!isset($object->$field))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
$text = self::remove_accents($object->$field);
|
||||
|
||||
foreach ($searchRegex as $regex)
|
||||
{
|
||||
$text = preg_replace($regex, '', $text);
|
||||
}
|
||||
|
||||
foreach ($terms as $term)
|
||||
{
|
||||
$term = self::remove_accents($term);
|
||||
|
||||
if (StringHelper::stristr($text, $term) !== false)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Transliterates given text to ASCII.
|
||||
*
|
||||
* @param string $str String to remove accents from.
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
* @since 3.2
|
||||
*/
|
||||
public static function remove_accents($str)
|
||||
{
|
||||
$str = JLanguageTransliterate::utf8_latin_to_ascii($str);
|
||||
|
||||
// @TODO: remove other prefixes as well?
|
||||
return preg_replace("/[\"'^]([a-z])/ui", '\1', $str);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns substring of characters around a searchword.
|
||||
*
|
||||
* @param string $text The source string.
|
||||
* @param integer $searchword Number of chars to return.
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
* @since 1.5
|
||||
*/
|
||||
public static function _smartSubstr($text, $searchword)
|
||||
{
|
||||
$lang = JFactory::getLanguage();
|
||||
$length = $lang->getSearchDisplayedCharactersNumber();
|
||||
$ltext = self::remove_accents($text);
|
||||
$textlen = StringHelper::strlen($ltext);
|
||||
$lsearchword = StringHelper::strtolower(self::remove_accents($searchword));
|
||||
$wordfound = false;
|
||||
$pos = 0;
|
||||
$length = $length > $textlen ? $textlen : $length;
|
||||
|
||||
while ($wordfound === false && $pos + $length < $textlen)
|
||||
{
|
||||
if (($wordpos = @StringHelper::strpos($ltext, ' ', $pos + $length)) !== false)
|
||||
{
|
||||
$chunk_size = $wordpos - $pos;
|
||||
}
|
||||
else
|
||||
{
|
||||
$chunk_size = $length;
|
||||
}
|
||||
|
||||
$chunk = StringHelper::substr($ltext, $pos, $chunk_size);
|
||||
$wordfound = StringHelper::strpos(StringHelper::strtolower($chunk), $lsearchword);
|
||||
|
||||
if ($wordfound === false)
|
||||
{
|
||||
$pos += $chunk_size + 1;
|
||||
}
|
||||
}
|
||||
|
||||
if ($wordfound !== false)
|
||||
{
|
||||
// Check if original text is different length than searched text (changed by function self::remove_accents)
|
||||
// Displayed text only, adjust $chunk_size
|
||||
if ($pos === 0)
|
||||
{
|
||||
$iOriLen = StringHelper::strlen(StringHelper::substr($text, 0, $pos + $chunk_size));
|
||||
$iModLen = StringHelper::strlen(self::remove_accents(StringHelper::substr($text, 0, $pos + $chunk_size)));
|
||||
|
||||
$chunk_size += $iOriLen - $iModLen;
|
||||
}
|
||||
else
|
||||
{
|
||||
$iOriSkippedLen = StringHelper::strlen(StringHelper::substr($text, 0, $pos));
|
||||
$iModSkippedLen = StringHelper::strlen(self::remove_accents(StringHelper::substr($text, 0, $pos)));
|
||||
|
||||
// Adjust starting position $pos
|
||||
if ($iOriSkippedLen !== $iModSkippedLen)
|
||||
{
|
||||
$pos += $iOriSkippedLen - $iModSkippedLen;
|
||||
}
|
||||
|
||||
$iOriReturnLen = StringHelper::strlen(StringHelper::substr($text, $pos, $chunk_size));
|
||||
$iModReturnLen = StringHelper::strlen(self::remove_accents(StringHelper::substr($text, $pos, $chunk_size)));
|
||||
|
||||
if ($iOriReturnLen !== $iModReturnLen)
|
||||
{
|
||||
$chunk_size += $iOriReturnLen - $iModReturnLen;
|
||||
}
|
||||
}
|
||||
|
||||
$sPre = $pos > 0 ? '... ' : '';
|
||||
$sPost = ($pos + $chunk_size) >= StringHelper::strlen($text) ? '' : ' ...';
|
||||
|
||||
return $sPre . StringHelper::substr($text, $pos, $chunk_size) . $sPost;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (($mbtextlen = StringHelper::strlen($text)) < $length)
|
||||
{
|
||||
$length = $mbtextlen;
|
||||
}
|
||||
|
||||
if (($wordpos = StringHelper::strpos($text, ' ', $length)) !== false)
|
||||
{
|
||||
return StringHelper::substr($text, 0, $wordpos) . ' ...';
|
||||
}
|
||||
else
|
||||
{
|
||||
return StringHelper::substr($text, 0, $length);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
44
administrator/components/com_search/helpers/site.php
Normal file
44
administrator/components/com_search/helpers/site.php
Normal file
@ -0,0 +1,44 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_search
|
||||
*
|
||||
* @copyright (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
/**
|
||||
* Mock JSite class used to fool the frontend search plugins because they route the results.
|
||||
*
|
||||
* @since 1.5
|
||||
*/
|
||||
class JSite extends JObject
|
||||
{
|
||||
/**
|
||||
* False method to fool the frontend search plugins.
|
||||
*
|
||||
* @return JSite
|
||||
*
|
||||
* @since 1.5
|
||||
*/
|
||||
public function getMenu()
|
||||
{
|
||||
$result = new JSite;
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* False method to fool the frontend search plugins.
|
||||
*
|
||||
* @return array
|
||||
*
|
||||
* @since 1.5
|
||||
*/
|
||||
public function getItems()
|
||||
{
|
||||
return array();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<form>
|
||||
<fields name="filter">
|
||||
<field
|
||||
name="search"
|
||||
type="text"
|
||||
inputmode="search"
|
||||
label="COM_SEARCH_SEARCH_IN_PHRASE"
|
||||
description="COM_SEARCH_SEARCH_IN_PHRASE"
|
||||
hint="JSEARCH_FILTER"
|
||||
/>
|
||||
</fields>
|
||||
<fields name="list">
|
||||
<field
|
||||
name="fullordering"
|
||||
type="list"
|
||||
onchange="this.form.submit();"
|
||||
default="a.hits ASC"
|
||||
validate="options"
|
||||
>
|
||||
<option value="">JGLOBAL_SORT_BY</option>
|
||||
<option value="a.search_term ASC">COM_SEARCH_HEADING_SEARCH_TERM_ASC</option>
|
||||
<option value="a.search_term DESC">COM_SEARCH_HEADING_SEARCH_TERM_DESC</option>
|
||||
<option value="a.hits ASC">JGLOBAL_HITS_ASC</option>
|
||||
<option value="a.hits DESC">JGLOBAL_HITS_DESC</option>
|
||||
</field>
|
||||
<field
|
||||
name="limit"
|
||||
type="limitbox"
|
||||
class="input-mini"
|
||||
default="25"
|
||||
onchange="this.form.submit();"
|
||||
/>
|
||||
</fields>
|
||||
</form>
|
||||
191
administrator/components/com_search/models/searches.php
Normal file
191
administrator/components/com_search/models/searches.php
Normal file
@ -0,0 +1,191 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_search
|
||||
*
|
||||
* @copyright (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
/**
|
||||
* Methods supporting a list of search terms.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
class SearchModelSearches extends JModelList
|
||||
{
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param array $config An optional associative array of configuration settings.
|
||||
*
|
||||
* @see JController
|
||||
* @since 1.6
|
||||
*/
|
||||
public function __construct($config = array())
|
||||
{
|
||||
if (empty($config['filter_fields']))
|
||||
{
|
||||
$config['filter_fields'] = array(
|
||||
'search_term', 'a.search_term',
|
||||
'hits', 'a.hits',
|
||||
);
|
||||
}
|
||||
|
||||
parent::__construct($config);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to auto-populate the model state.
|
||||
*
|
||||
* Note. Calling getState in this method will result in recursion.
|
||||
*
|
||||
* @param string $ordering An optional ordering field.
|
||||
* @param string $direction An optional direction (asc|desc).
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
protected function populateState($ordering = 'a.hits', $direction = 'asc')
|
||||
{
|
||||
// Load the filter state.
|
||||
$this->setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search', '', 'string'));
|
||||
|
||||
// Special state for toggle results button.
|
||||
$this->setState('show_results', $this->getUserStateFromRequest($this->context . '.show_results', 'show_results', 1, 'int'));
|
||||
|
||||
// Load the parameters.
|
||||
$params = JComponentHelper::getParams('com_search');
|
||||
$this->setState('params', $params);
|
||||
|
||||
// List state information.
|
||||
parent::populateState($ordering, $direction);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get a store id based on model configuration state.
|
||||
*
|
||||
* This is necessary because the model is used by the component and
|
||||
* different modules that might need different sets of data or different
|
||||
* ordering requirements.
|
||||
*
|
||||
* @param string $id A prefix for the store id.
|
||||
*
|
||||
* @return string A store id.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
protected function getStoreId($id = '')
|
||||
{
|
||||
// Compile the store id.
|
||||
$id .= ':' . $this->getState('show_results');
|
||||
$id .= ':' . $this->getState('filter.search');
|
||||
|
||||
return parent::getStoreId($id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Build an SQL query to load the list data.
|
||||
*
|
||||
* @return JDatabaseQuery
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
protected function getListQuery()
|
||||
{
|
||||
// Create a new query object.
|
||||
$db = $this->getDbo();
|
||||
$query = $db->getQuery(true);
|
||||
|
||||
// Select the required fields from the table.
|
||||
$query->select(
|
||||
$this->getState(
|
||||
'list.select',
|
||||
'a.*'
|
||||
)
|
||||
);
|
||||
$query->from($db->quoteName('#__core_log_searches', 'a'));
|
||||
|
||||
// Filter by search in title
|
||||
if ($search = $this->getState('filter.search'))
|
||||
{
|
||||
$search = $db->quote('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%'));
|
||||
$query->where($db->quoteName('a.search_term') . ' LIKE ' . $search);
|
||||
}
|
||||
|
||||
// Add the list ordering clause.
|
||||
$query->order($db->escape($this->getState('list.ordering', 'a.hits')) . ' ' . $db->escape($this->getState('list.direction', 'ASC')));
|
||||
|
||||
return $query;
|
||||
}
|
||||
|
||||
/**
|
||||
* Override the parent getItems to inject optional data.
|
||||
*
|
||||
* @return mixed An array of objects on success, false on failure.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
public function getItems()
|
||||
{
|
||||
$items = parent::getItems();
|
||||
|
||||
// Determine if number of results for search item should be calculated
|
||||
// by default it is `off` as it is highly query intensive
|
||||
if ($this->getState('show_results'))
|
||||
{
|
||||
JPluginHelper::importPlugin('search');
|
||||
$app = JFactory::getApplication();
|
||||
|
||||
if (!class_exists('JSite'))
|
||||
{
|
||||
// This fools the routers in the search plugins into thinking it's in the frontend
|
||||
JLoader::register('JSite', JPATH_ADMINISTRATOR . '/components/com_search/helpers/site.php');
|
||||
}
|
||||
|
||||
foreach ($items as &$item)
|
||||
{
|
||||
$results = $app->triggerEvent('onContentSearch', array($item->search_term));
|
||||
$item->returns = 0;
|
||||
|
||||
foreach ($results as $result)
|
||||
{
|
||||
$item->returns += count($result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $items;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to reset the search log table.
|
||||
*
|
||||
* @return boolean
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
public function reset()
|
||||
{
|
||||
$db = $this->getDbo();
|
||||
$query = $db->getQuery(true)
|
||||
->delete($db->quoteName('#__core_log_searches'));
|
||||
$db->setQuery($query);
|
||||
|
||||
try
|
||||
{
|
||||
$db->execute();
|
||||
}
|
||||
catch (RuntimeException $e)
|
||||
{
|
||||
$this->setError($e->getMessage());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
19
administrator/components/com_search/search.php
Normal file
19
administrator/components/com_search/search.php
Normal file
@ -0,0 +1,19 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_search
|
||||
*
|
||||
* @copyright (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
if (!JFactory::getUser()->authorise('core.manage', 'com_search'))
|
||||
{
|
||||
throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
|
||||
}
|
||||
|
||||
$controller = JControllerLegacy::getInstance('Search');
|
||||
$controller->execute(JFactory::getApplication()->input->get('task'));
|
||||
$controller->redirect();
|
||||
38
administrator/components/com_search/search.xml
Normal file
38
administrator/components/com_search/search.xml
Normal file
@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<extension type="component" version="3.1" method="upgrade">
|
||||
<name>com_search</name>
|
||||
<author>Joomla! Project</author>
|
||||
<creationDate>April 2006</creationDate>
|
||||
<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
|
||||
<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
|
||||
<authorEmail>admin@joomla.org</authorEmail>
|
||||
<authorUrl>www.joomla.org</authorUrl>
|
||||
<version>3.0.0</version>
|
||||
<description>COM_SEARCH_XML_DESCRIPTION</description>
|
||||
<files folder="site">
|
||||
<filename>controller.php</filename>
|
||||
<filename>router.php</filename>
|
||||
<filename>search.php</filename>
|
||||
<folder>models</folder>
|
||||
<folder>views</folder>
|
||||
</files>
|
||||
<languages folder="site">
|
||||
<language tag="en-GB">language/en-GB.com_search.ini</language>
|
||||
</languages>
|
||||
<administration>
|
||||
<menu link="option=com_search" img="class:search">Search</menu>
|
||||
<files folder="admin">
|
||||
<filename>config.xml</filename>
|
||||
<filename>controller.php</filename>
|
||||
<filename>search.php</filename>
|
||||
<folder>controllers</folder>
|
||||
<folder>helpers</folder>
|
||||
<folder>models</folder>
|
||||
<folder>views</folder>
|
||||
</files>
|
||||
<languages folder="admin">
|
||||
<language tag="en-GB">language/en-GB.com_search.ini</language>
|
||||
<language tag="en-GB">language/en-GB.com_search.sys.ini</language>
|
||||
</languages>
|
||||
</administration>
|
||||
</extension>
|
||||
@ -0,0 +1,88 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_search
|
||||
*
|
||||
* @copyright (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
// Include the component HTML helpers.
|
||||
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');
|
||||
|
||||
JHtml::_('bootstrap.tooltip');
|
||||
JHtml::_('behavior.multiselect');
|
||||
JHtml::_('formbehavior.chosen', 'select');
|
||||
|
||||
$listOrder = $this->escape($this->state->get('list.ordering'));
|
||||
$listDirn = $this->escape($this->state->get('list.direction'));
|
||||
?>
|
||||
<form action="<?php echo JRoute::_('index.php?option=com_search&view=searches'); ?>" method="post" name="adminForm" id="adminForm">
|
||||
<?php if (!empty( $this->sidebar)) : ?>
|
||||
<div id="j-sidebar-container" class="span2">
|
||||
<?php echo $this->sidebar; ?>
|
||||
</div>
|
||||
<div id="j-main-container" class="span10">
|
||||
<?php else : ?>
|
||||
<div id="j-main-container">
|
||||
<?php endif; ?>
|
||||
<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this, 'options' => array('filterButton' => false))); ?>
|
||||
<div class="clearfix"> </div>
|
||||
<?php if (empty($this->items)) : ?>
|
||||
<div class="alert alert-no-items">
|
||||
<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
|
||||
</div>
|
||||
<?php else : ?>
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="nowrap">
|
||||
<?php echo JHtml::_('searchtools.sort', 'COM_SEARCH_HEADING_PHRASE', 'a.search_term', $listDirn, $listOrder); ?>
|
||||
</th>
|
||||
<th width="15%" class="nowrap">
|
||||
<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_HITS', 'a.hits', $listDirn, $listOrder); ?>
|
||||
</th>
|
||||
<th width="1%" class="nowrap center">
|
||||
<?php echo JText::_('COM_SEARCH_HEADING_RESULTS'); ?>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
<?php echo $this->pagination->getListFooter(); ?>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
<tbody>
|
||||
<?php foreach ($this->items as $i => $item) : ?>
|
||||
<tr class="row<?php echo $i % 2; ?>">
|
||||
<td class="break-word">
|
||||
<?php echo $this->escape($item->search_term); ?>
|
||||
</td>
|
||||
<td>
|
||||
<?php echo (int) $item->hits; ?>
|
||||
</td>
|
||||
<?php if ($this->state->get('show_results')) : ?>
|
||||
|
||||
<td class="center btns">
|
||||
<a class="badge <?php if ($item->returns > 0) echo 'badge-success'; ?>" target="_blank" href="<?php echo JUri::root(); ?>index.php?option=com_search&view=search&searchword=<?php echo JFilterOutput::stringURLSafe($item->search_term); ?>">
|
||||
<?php echo $item->returns; ?><span class="icon-out-2" aria-hidden="true"></span><span class="element-invisible"><?php echo JText::_('JBROWSERTARGET_NEW'); ?></span></a>
|
||||
</td>
|
||||
<?php else : ?>
|
||||
<td class="center">
|
||||
<?php echo JText::_('COM_SEARCH_NO_RESULTS'); ?>
|
||||
</td>
|
||||
<?php endif; ?>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php endif; ?>
|
||||
<input type="hidden" name="task" value="" />
|
||||
<input type="hidden" name="boxchecked" value="0" />
|
||||
<?php echo JHtml::_('form.token'); ?>
|
||||
</div>
|
||||
</form>
|
||||
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<metadata>
|
||||
<layout title="COM_SEARCH_SEARCH_VIEW_DEFAULT_TITLE">
|
||||
<message>
|
||||
<![CDATA[COM_SEARCH_SEARCH_VIEW_DEFAULT_DESC]]>
|
||||
</message>
|
||||
</layout>
|
||||
</metadata>
|
||||
104
administrator/components/com_search/views/searches/view.html.php
Normal file
104
administrator/components/com_search/views/searches/view.html.php
Normal file
@ -0,0 +1,104 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_search
|
||||
*
|
||||
* @copyright (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
/**
|
||||
* View class for a list of search terms.
|
||||
*
|
||||
* @since 1.5
|
||||
*/
|
||||
class SearchViewSearches extends JViewLegacy
|
||||
{
|
||||
protected $enabled;
|
||||
|
||||
protected $items;
|
||||
|
||||
protected $pagination;
|
||||
|
||||
protected $state;
|
||||
|
||||
/**
|
||||
* Display the view.
|
||||
*
|
||||
* @param string $tpl The name of the template file to parse; automatically searches through the template paths.
|
||||
*
|
||||
* @return mixed A string if successful, otherwise an Error object.
|
||||
*/
|
||||
public function display($tpl = null)
|
||||
{
|
||||
$app = JFactory::getApplication();
|
||||
$this->items = $this->get('Items');
|
||||
$this->pagination = $this->get('Pagination');
|
||||
$this->state = $this->get('State');
|
||||
$this->filterForm = $this->get('FilterForm');
|
||||
$this->activeFilters = $this->get('ActiveFilters');
|
||||
$this->enabled = $this->state->params->get('enabled');
|
||||
$this->canDo = JHelperContent::getActions('com_search');
|
||||
|
||||
// Check for errors.
|
||||
if (count($errors = $this->get('Errors')))
|
||||
{
|
||||
throw new Exception(implode("\n", $errors), 500);
|
||||
}
|
||||
|
||||
// Check if plugin is enabled
|
||||
if ($this->enabled)
|
||||
{
|
||||
$app->enqueueMessage(JText::_('COM_SEARCH_LOGGING_ENABLED'), 'notice');
|
||||
}
|
||||
else
|
||||
{
|
||||
$app->enqueueMessage(JText::_('COM_SEARCH_LOGGING_DISABLED'), 'warning');
|
||||
}
|
||||
|
||||
$this->addToolbar();
|
||||
parent::display($tpl);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the page title and toolbar.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
protected function addToolbar()
|
||||
{
|
||||
$canDo = $this->canDo;
|
||||
|
||||
JToolbarHelper::title(JText::_('COM_SEARCH_MANAGER_SEARCHES'), 'search');
|
||||
|
||||
$showResults = $this->state->get('show_results', 1, 'int');
|
||||
|
||||
if ($showResults === 0)
|
||||
{
|
||||
JToolbarHelper::custom('searches.toggleresults', 'zoom-in.png', null, 'COM_SEARCH_SHOW_SEARCH_RESULTS', false);
|
||||
}
|
||||
else
|
||||
{
|
||||
JToolbarHelper::custom('searches.toggleresults', 'zoom-out.png', null, 'COM_SEARCH_HIDE_SEARCH_RESULTS', false);
|
||||
}
|
||||
|
||||
if ($canDo->get('core.edit.state'))
|
||||
{
|
||||
JToolbarHelper::custom('searches.reset', 'refresh.png', 'refresh_f2.png', 'JSEARCH_RESET', false);
|
||||
}
|
||||
|
||||
JToolbarHelper::divider();
|
||||
|
||||
if ($canDo->get('core.admin') || $canDo->get('core.options'))
|
||||
{
|
||||
JToolbarHelper::preferences('com_search');
|
||||
}
|
||||
|
||||
JToolbarHelper::divider();
|
||||
JToolbarHelper::help('JHELP_COMPONENTS_SEARCH');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user