Your IP : 216.73.216.54


Current Path : /var/www/html/components/com_jvld/models/
Upload File :
Current File : /var/www/html/components/com_jvld/models/search.php

<?php
/**
 * @version		$Id$
 * @package		JV-LinkDirectory
 * @subpackage	com_jvld
 * @copyright	Copyright 2008-2013 JV-Extensions. All rights reserved
 * @license		GNU General Public License version 3 or later
 * @author		JV-Extensions
 * @link		http://www.jv-extensions.com
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.modellist');

class JvldModelSearch extends JModelList
{
	public $input;
	public $cfg;
	protected $srch_fields = array();

	public function __construct($config = array())
	{
		parent::__construct($config);

		$this->input = JFactory::getApplication()->input;
		$this->cfg = JvldCfg::getInstance();
	}

	protected function getListQuery()
	{
		$u_lalevels = implode(',', JFactory::getUser()->getAuthorisedViewLevels());
		$langcheckq = (_JVLD_JOOMLA_MLANG) ?  " and (L.language = '".JFactory::getLanguage()->getTag()."' or L.language = '*')" : "";

		// get searchable extra fields
		$this->srch_fields = JvldDb::getRows("select id from #__jvld_extrafields where searchable = 1 order by fieldtype desc");

		$statusq = $this->input->getInt('search_status_sel', _JVLD_LINKSTATUS_ESTABLISHED);
		$dsql_s = ($statusq == _JVLD_LINKSTATUS_ESTABLISHED) ? "L.link_status = "._JVLD_LINKSTATUS_ESTABLISHED." and " : "";

		$dsql = "	select distinct L.id 
					from #__jvld_links as L, #__jvld_catlinks as CL, #__categories as JC, #__jvld_linkprof as PROF  
					where 
						PROF.lid = L.id and 
						CL.cid = JC.id and 						 
						".$dsql_s."
						L.access in (".$u_lalevels.") and 
						JC.access in (".$u_lalevels.") and  
						L.id = CL.lid ".$langcheckq." ";

		// get query values from request
		$qvals = $this->getQueryValues();

		// get search query
		$searchq = $qvals['searchq'];

		// get condition query
		$sq_sql = ($this->cfg->get('srchpage_sortmethod')) ? $this->getFullTextConditionSubQuery($searchq, $qvals) : $this->getLikeSearchConditionSubQuery($searchq, $qvals);
		$dsql .= $sq_sql;

		$osql = "";
		switch ($this->cfg->get('srchpage_sortoptions'))
		{
			case 2: $osql .= "L.link_published_on asc"; break;
			case 3: $osql .= "L.partner_title desc"; break;
			case 4: $osql .= "L.partner_title asc"; break;
			default:
			case 1:
				$osql .= "L.link_published_on desc"; break;
		}

		$dsql .= " order by " . $osql;
		return $dsql;
	}

	public function getStart()
	{
		return $this->getState('list.start');
	}

	public function getLimit()
	{
		return $this->getState('list.limit');
	}

	public function getAllItems()
	{
		$sql = $this->getListQuery();
		return JvldDb::getRows($sql." limit 0, 9999");
	}

	protected function getStoreId($id = '')
	{
		return parent::getStoreId($id);
	}

	protected function populateState($ordering = null, $direction = null)
	{
		$app = JFactory::getApplication();

		$value = ($app->input->get('rstart', 0) == 1) ? 0 : $app->input->get('limitstart', 0, 'int');
		$this->setState('list.start', $value);

		$value = ($value == -1) ? 0 : $app->input->get('limit', intval($app->get('list_limit', 0)), 'uint');
		$this->setState('list.limit', $value);
	}

	public function getQueryValues()
	{
		$qvals = array();

		$resetall = $this->input->getInt('resetall', 0);
		$from_mod = $this->input->getInt('from_mod', 0);

		if ($resetall)
		{
			$qvals['searchq'] = '';
			$qvals['cid'] = 0;
			$qvals['wordsel'] = 0;
			$qvals['statusel'] = _JVLD_LINKSTATUS_ESTABLISHED;

			for ($i = 0; $i < count($this->srch_fields); $i++)
			{
				$sfield = new JvldField($this->srch_fields[$i]->id);

				if (($sfield->getTypeSearchMode() == _JVLD_FIELD_SEARCHTYPE_EXACT) && ($sfield->isTypeOptionBased()))
				{
					$fname = 'filter_ef_'.$sfield->getID();
					$qvals[$fname] = '';
				}
			}
		}
		else
		{
			if ($from_mod)
			{
				// submit from module
				$qvals['searchq'] = \Joomla\String\StringHelper::trim($this->input->getString('mod-srch-search-query', ''));
				$qvals['cid'] = $this->input->getInt('mod_filter_cid', 0);
				$qvals['wordsel'] = 0;
				$qvals['statusel'] = _JVLD_LINKSTATUS_ESTABLISHED;

				for ($i = 0; $i < count($this->srch_fields); $i++)
				{
					$sfield = new JvldField($this->srch_fields[$i]->id);

					if (($sfield->getTypeSearchMode() == _JVLD_FIELD_SEARCHTYPE_EXACT) && ($sfield->isTypeOptionBased()))
					{
						$fname = 'filter_ef_'.$sfield->getID();
						$qvals[$fname] = \Joomla\String\StringHelper::trim($this->input->getString("mod_filter_ef_" . $sfield->getID(), ""));
					}
				}
			}
			else
			{
				// submit from self search page
				$qvals['searchq'] = \Joomla\String\StringHelper::trim($this->input->getString('srch-search-query', ''));
				$qvals['cid'] = $this->input->getInt('filter_cid', 0);
				$qvals['wordsel'] = $this->input->getInt('search_words_sel', 0);
				$qvals['statusel'] = $this->input->getInt('search_status_sel', _JVLD_LINKSTATUS_ESTABLISHED);

				for ($i = 0; $i < count($this->srch_fields); $i++)
				{
					$sfield = new JvldField($this->srch_fields[$i]->id);

					if (($sfield->getTypeSearchMode() == _JVLD_FIELD_SEARCHTYPE_EXACT) && ($sfield->isTypeOptionBased()))
					{
						$fname = 'filter_ef_'.$sfield->getID();
						$qvals[$fname] = \Joomla\String\StringHelper::trim($this->input->getString("filter_ef_" . $sfield->getID(), ""));
					}
				}
			}
		}

		return $qvals;
	}

	private function getFullTextConditionSubQuery($searchq, $qvals)
	{
		$psql = "";

		if ($searchq != '')
		{
			// Get the column names of extra fields that can be searched into
			$field_names = array();
			$srch_fields_cnt = count($this->srch_fields);
			for ($i = 0; $i < $srch_fields_cnt; $i++)
			{
				$sfield = new JvldField($this->srch_fields[$i]->id);

				if (($sfield->getTypeSearchMode() == _JVLD_FIELD_SEARCHTYPE_CONTAINED) && (!$sfield->isTypeOptionBased()) && (!$sfield->isTypeMultiValued()))
				{
					$field_names[] = "L.field".$sfield->getID();
				}
			}

			if (count($field_names))
			{
				// full text search
				$search_match = "match(L.partner_url, L.partner_title, L.metadesc, L.metakeys, PROF.title, PROF.description, ";
				$search_match .= implode(", ", $field_names);
				$search_match .= ")";
			}
			else
			{
				// full text search
				$search_match = "match(L.partner_url, L.partner_title, L.metadesc, L.metakeys, PROF.title, PROF.description)";
			}

			$words = array();
			$words_sel = $this->input->getInt('search_words_sel', 0);
			$words = $words_sel ? explode(" ", $searchq) : array($searchq);

			$esql = "";
			switch ($words_sel)
			{
				case 0: // exact
				{
					$esql = "   and ".$search_match." against ('\"".JvldSecure::defendSQL($searchq, 1)."\"' in boolean mode) ";

					$psql .= $esql;
					break;
				}
				case 1: // all
				{
					$kwords = '';
					for ($i=0;$i<count($words);$i++)
					{
						$kwords .= '+"'.JvldSecure::defendSQL(\Joomla\String\StringHelper::trim($words[$i]), 1).'" ';
					}

					$esql = "   and ".$search_match." against ('".$kwords."' in boolean mode) ";

					$psql .= $esql;
					break;
				}
				case 2: // any
				{
					$kwords = '';
					for ($i=0;$i<count($words);$i++)
					{
						$kwords .= '"'.JvldSecure::defendSQL(\Joomla\String\StringHelper::trim($words[$i]), 1).'" ';
					}

					$esql = "   and ".$search_match." against ('".$kwords."' in boolean mode) ";

					$psql .= $esql;
					break;
				}
				default:
					break;
			}
		}

		$cid = $qvals['cid'];
		if ($cid)
		{
			$psql .= "  and CL.cid = ".(int)$cid;
		}

		// Get only those extra fields which have EXACT SEARCH and OPTBASED and that have value in links
		for ($i = 0; $i < count($this->srch_fields); $i++)
		{
			$sfield = new JvldField($this->srch_fields[$i]->id);

			if (($sfield->getTypeSearchMode() == _JVLD_FIELD_SEARCHTYPE_EXACT) && ($sfield->isTypeOptionBased()))
			{
				$fname = "filter_ef_" . $sfield->getID();
				$v = $qvals[$fname];
				if (($v != "") && ($v != "~"))
				{
					if ($sfield->isTypeMultiValued())
					{
						$v  = \Joomla\String\StringHelper::trim($v, "~");
						$vs = explode("~", $v);

						for ($p = 0; $p < count($vs); $p++)
						{
							$psql .= " and L.field" . $sfield->getID() . " like '%|" . JvldSecure::defendSQL($vs[$p]) . "|%' ";
						}
					}
					else
					{
						$psql .= " and L.field" . $sfield->getID() . " = '" . JvldSecure::defendSQL($v) . "' ";
					}
				}
			}
		}

		return $psql;
	}

	private function getLikeSearchConditionSubQuery($searchq, $qvals)
	{
		$psql = "";

		if ($searchq != '')
		{
			// Get the column names of extra fields that can be searched into
			$field_names = array();
			$srch_fields_cnt = count($this->srch_fields);
			for ($i = 0; $i < $srch_fields_cnt; $i++)
			{
				$sfield = new JvldField($this->srch_fields[$i]->id);

				if (($sfield->getTypeSearchMode() == _JVLD_FIELD_SEARCHTYPE_CONTAINED) && (!$sfield->isTypeOptionBased()) && (!$sfield->isTypeMultiValued()))
				{
					$field_names[] = "L.field".$sfield->getID();
				}
			}

			$words = array();
			$words_sel = $this->input->getInt('search_words_sel', 0);
			$words = $words_sel ? explode(" ", $searchq) : array($searchq);

			$esql = "";
			switch ($words_sel)
			{
				case 0: // exact
				{
					$esql .= "L.partner_url like '%".JvldSecure::defendSQL($searchq, 1)."%' or L.partner_title like '%".JvldSecure::defendSQL($searchq, 1)."%' or L.metadesc like '%".JvldSecure::defendSQL($searchq, 1)."%' or L.metakeys like '%".JvldSecure::defendSQL($searchq, 1)."%' or PROF.title like '%".JvldSecure::defendSQL($searchq, 1)."%' or PROF.description like '%".JvldSecure::defendSQL($searchq, 1)."%' or ";

					if (count($field_names))
					{
						for ($ls=0;$ls<count($field_names);$ls++)
						{
							$esql .= $field_names[$ls] . " like '%".JvldSecure::defendSQL($searchq, 1)."%' or ";
						}
					}

					$esql = "(".\Joomla\String\StringHelper::substr($esql, 0, \Joomla\String\StringHelper::strlen($esql)-4).")";
					break;
				}
				case 1: // all
				{
					for ($kw=0;$kw<count($words);$kw++)
					{
						$esql_1 = "(L.partner_url like '%".JvldSecure::defendSQL($words[$kw], 1)."%' or L.partner_title like '%".JvldSecure::defendSQL($words[$kw], 1)."%' or L.metadesc like '%".JvldSecure::defendSQL($words[$kw], 1)."%' or L.metakeys like '%".JvldSecure::defendSQL($words[$kw], 1)."%' or PROF.title like '%".JvldSecure::defendSQL($words[$kw], 1)."%' or PROF.description like '%".JvldSecure::defendSQL($words[$kw], 1)."%' or ";

						if (count($field_names))
						{
							for ($ls=0;$ls<count($field_names);$ls++)
							{
								$esql_1 .= $field_names[$ls] . " like '%".JvldSecure::defendSQL($words[$kw], 1)."%' or ";
							}
						}

						$esql_1 = \Joomla\String\StringHelper::substr($esql_1, 0, \Joomla\String\StringHelper::strlen($esql_1)-4).") and ";
						$esql .= $esql_1;
					}

					$esql = \Joomla\String\StringHelper::substr($esql, 0, \Joomla\String\StringHelper::strlen($esql)-5);
					break;
				}
				case 2: // any
				{
					for ($kw=0;$kw<count($words);$kw++)
					{
						$esql .= "L.partner_url like '%".JvldSecure::defendSQL($words[$kw], 1)."%' or L.partner_title like '%".JvldSecure::defendSQL($words[$kw], 1)."%' or L.metadesc like '%".JvldSecure::defendSQL($words[$kw], 1)."%' or L.metakeys like '%".JvldSecure::defendSQL($words[$kw], 1)."%' or PROF.title like '%".JvldSecure::defendSQL($words[$kw], 1)."%' or PROF.description like '%".JvldSecure::defendSQL($words[$kw], 1)."%' or ";

						if (count($field_names))
						{
							for ($ls=0;$ls<count($field_names);$ls++)
							{
								$esql .= $field_names[$ls] . " like '%".JvldSecure::defendSQL($words[$kw], 1)."%' or ";
							}
						}
					}

					$esql = "(".\Joomla\String\StringHelper::substr($esql, 0, \Joomla\String\StringHelper::strlen($esql)-4).")";
					break;
				}
				default:
					break;
			}

			$psql .= " and ".$esql;
		}

		$cid = $qvals['cid'];
		if ($cid)
		{
			$psql .= "  and CL.cid = ".(int)$cid;
		}

		// Get only those extra fields which have EXACT SEARCH and OPTBASED and that have value in links
		for ($i = 0; $i < count($this->srch_fields); $i++)
		{
			$sfield = new JvldField($this->srch_fields[$i]->id);

			if (($sfield->getTypeSearchMode() == _JVLD_FIELD_SEARCHTYPE_EXACT) && ($sfield->isTypeOptionBased()))
			{
				$fname = "filter_ef_" . $sfield->getID();
				$v = $qvals[$fname];
				if (($v != "") && ($v != "~"))
				{
					if ($sfield->isTypeMultiValued())
					{
						$v  = \Joomla\String\StringHelper::trim($v, "~");
						$vs = explode("~", $v);

						for ($p = 0; $p < count($vs); $p++)
						{
							$psql .= " and L.field" . $sfield->getID() . " like '%|" . JvldSecure::defendSQL($vs[$p]) . "|%' ";
						}
					}
					else
					{
						$psql .= " and L.field" . $sfield->getID() . " = '" . JvldSecure::defendSQL($v) . "' ";
					}
				}
			}
		}

		return $psql;
	}
}