| Current Path : /var/www/html/components/com_jvld/models/ |
| 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;
}
}