J1.5 talk

Creating a search plugin

From Joomla! Documentation

Revision as of 14:51, 26 August 2013 by Wilsonge (talk | contribs) (Wilsonge moved page Talk:Creating a search plugin to J1.5 talk:Creating a search plugin: Move to 1.5 namespace)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

the php file presented here is written in a procedural way.

For joomla 1.5, it's better to write it using a class, as explained here: http://docs.joomla.org/Creating_a_Plugin_for_Joomla_1.5

<?php
//First start with information about the Plugin and yourself. For example:
/**
 * @version		$Id: nameofplugin.php versionnumber date author
 * @copyright	        Copyright
 * @license		License, for example GNU/GPL
 * All other information you would like to add
 */

//To prevent accessing the document directly, enter this code:
// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );

// Import library dependencies
jimport('joomla.plugin.plugin');

//Load the language file. Replace 'nameofplugin' with the name of your plugin.
JPlugin::loadLanguage( 'plg_search_nameofplugin' );

class plgSearchnameofplugin extends JPlugin {

	/**
	 * plugin 'areas', i.e. it's differents search sections
	 * for this example, we us only one section, but you could have several (e.g: articles, categories, author...)
	 * @var array
	 */
	var $_areas  = array(
		'mypluginsearcha' => 'PLG_MYSEARCHPLUGIN_AREA_A'
	); 

	/**
	 * Handles onSearchAreas Event
	 *
	 * @return array
	 */
	function onSearchAreas()
	{
		return $this->_areas;
	}

	/** 
	 * Handles onSearchAreas event
	 * 
	 * @param string $text the text to search
	 * @param string $phrase the type of search (exact/all/any)
	 * @param string $ordering ordering of the results (alpha/newest/...)
	 * @param array $areas areas to be search
	 * @return array matches
	 */
	function onSearch( $text, $phrase='', $ordering='', $areas=null )
	{
		$db		=& JFactory::getDBO();
		$user	=& JFactory::getUser(); 

		//If the array is not correct, return it:
		if (is_array( $areas )) {
			if (!array_intersect( $areas, array_keys( $this->_areas ) )) {
				return array();
			}
		}

		//Define the parameters. First get the right plugin; 'search' (the group), 'nameofplugin'. 
		$plugin =& JPluginHelper::getPlugin('search', 'nameofplugin');

		//Then load the parameters of the plugin.
		$pluginParams = new JParameter( $plugin->params );

		//Now define the parameters like this:
		$limit = $pluginParams->def( 'nameofparameter', defaultsetting );

		//Use the function trim to delete spaces in front of or at the back of the searching terms
		$text = trim( $text );

		//Return Array when nothing was filled in.
		if ($text == '') {
			return array();
		}

		// After this, you have to add the database part. This will be the most difficult part, because this changes per situation.
		// In the coding examples later on you will find some of the examples used by Joomla! 1.5 core Search Plugins.
		// in case of multiple sectionS, just repeat and adapt for each, merging each section results, 
		// and filtering with an if statement: if (!$areas || in_array('mypluginsearcha', $areas))) {...}
		// It will look something like this, if you have only one section 
		$wheres = array();
		switch ($phrase) {

			//search exact
			case 'exact':
				$text		= $db->Quote( '%'.$db->getEscaped( $text, true ).'%', false );
				$wheres2 	= array();
				$wheres2[] 	= 'LOWER(a.name) LIKE '.$text;
				$where 		= '(' . implode( ') OR (', $wheres2 ) . ')';
				break;

			//search all or any
			case 'all':
			case 'any':

			//set default
			default:
				$words 	= explode( ' ', $text );
				$wheres = array();
				foreach ($words as $word)
				{
					$word		= $db->Quote( '%'.$db->getEscaped( $word, true ).'%', false );
					$wheres2 	= array();
					$wheres2[] 	= 'LOWER(a.name) LIKE '.$word;
					$wheres[] 	= implode( ' OR ', $wheres2 );
				}
				$where = '(' . implode( ($phrase == 'all' ? ') AND (' : ') OR ('), $wheres ) . ')';
				break;
		}

		//ordering of the results
		switch ( $ordering ) {

			//alphabetic, ascending
			case 'alpha':
				$order = 'a.name ASC';
				break;

			//oldest first
			case 'oldest':

			//popular first
			case 'popular':

			//newest first
			case 'newest':

			//default setting: alphabetic, ascending
			default:
				$order = 'a.name ASC';
		}

		//replace nameofplugin
		$searchNameofplugin = JText::_( 'Nameofplugin' );

		//the database query; differs per situation! It will look something like this:
		$query = 'SELECT a.name AS title,'
		. ' CONCAT_WS( " / ", '. $db->Quote($searchNameofplugin) .', b.title )AS section,'
		. ' "1" AS browsernav'
		. ' FROM #__nameofplugin AS a'
		. ' INNER JOIN #__categories AS b ON b.id = a.catid'
		. ' WHERE ( '. $where .' )'
		. ' AND a.published = 1'
		. ' AND b.access <= '. (int) $user->get( 'aid' )
		. ' ORDER BY '. $order
		;

		//Set query
		$db->setQuery( $query, 0, $limit );
		$rows = $db->loadObjectList();

		//The 'output' of the displayed link
		foreach($rows as $key => $row) {
			$rows[$key]->href = 'index.php?option=com_newsfeeds&view=newsfeed&catid='.$row->catslug.'&id='.$row->slug;
		}

		//Return the search results in an array
		return $rows;
	}
}

JulienV 05:09, 2 June 2011 (CDT)