Seditio Source
Root |
./othercms/elxis_5.3_atlas_rev2452/includes/libraries/elxis/search.class.php
<?php
/**
* @version        $Id: search.class.php 2349 2020-08-19 19:04:10Z IOS $
* @package        Elxis
* @subpackage    Search
* @copyright    Copyright (c) 2006-2020 Elxis CMS (https://www.elxis.org). All rights reserved.
* @license        Elxis Public License ( https://www.elxis.org/elxis-public-license.html )
* @author        Elxis Team ( https://www.elxis.org )
* @description     Elxis CMS is free software. Read the license for copyright notices and details
*/

defined('_ELXIS_') or die ('Direct access to this location is not allowed');


elxisLoader::loadFile('components/com_search/engines/engine.interface.php');


class
elxisSearch {

    private
$engines = array();
    private
$engine_default = '';
    private
$engine_current = '';
    private
$engine = null; //loaded engine class
   
private $errormsg = ''; //error message
   
private $apc = 0;


   
/*********************/
    /* MAGIC CONSTRUCTOR */
    /*********************/
   
public function __construct() {
       
$this->loadEngines();
        if (
$this->errormsg == '') {
           
$cookie = false;
            if (isset(
$_COOKIE['elxisengine'])) {
               
$cookie_engine = trim(filter_input(INPUT_COOKIE, 'elxisengine', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
                if ((
$cookie_engine != '') && isset($this->engines[$cookie_engine])) {
                   
$this->setEngine($cookie_engine);
                   
$cookie = true;
                }
            }
            if (!
$cookie) {
               
$this->setEngine( $this->engine_default );
            }
        }
    }


   
/**********************/
    /* SET CURRENT ENGINE */
    /**********************/
   
public function setEngine($engine) {
       
$eLang = eFactory::getLang();

        if ((
trim($engine) != '') && isset($this->engines[$engine])) {
            if (
$engine == $this->engine_current) { $this->rememberEngine(); return true; } //already loaded
           
$this->engine_current = $engine;
           
$this->loadEngineLang($engine);
           
elxisLoader::loadFile('includes/libraries/elxis/parameters.class.php');
           
$params = new elxisParameters($this->engines[$engine]['params'], '', 'engine');

           
elxisLoader::loadFile('components/com_search/engines/'.$this->engine_current.'/'.$this->engine_current.'.engine.php');
           
$class = $this->engine_current.'Engine';
           
$this->engine = new $class($params);
           
$this->rememberEngine();
            return
true;
        }

       
$this->errormsg = $eLang->exist('ENGINE_NOT_AVAIL') ? $eLang->get('ENGINE_NOT_AVAIL') : 'The requested search engine is not available!';
        return
false;
    }


   
/********************/
    /* SET ENGINE TITLE */
    /********************/
   
public function setEngineTitle($engine, $title) {
        if ((
trim($engine) != '') && (trim($title) != '') && isset($this->engines[$engine])) { $this->engines[$engine]['title'] = $title; }
    }


   
/********************************/
    /* LOAD CURRENT ENGINE LANGUAGE */
    /********************************/
   
public function loadEngineLang($engine) {
       
$eLang = eFactory::getLang();

       
$clang = $eLang->currentLang();
        if (
file_exists(ELXIS_PATH.'/language/'.$clang.'/'.$clang.'.engine_'.$engine.'.php')) {
           
$langfile = ELXIS_PATH.'/language/'.$clang.'/'.$clang.'.engine_'.$engine.'.php';
        } else if (
file_exists(ELXIS_PATH.'/language/en/en.engine_'.$engine.'.php')) {
           
$langfile = ELXIS_PATH.'/language/en/en.engine_'.$engine.'.php';
        } else if (
file_exists(ELXIS_PATH.'/components/com_search/engines/'.$engine.'/language/'.$clang.'.engine_'.$engine.'.php')) {
           
$langfile = ELXIS_PATH.'/components/com_search/engines/'.$engine.'/language/'.$clang.'.engine_'.$engine.'.php';
        } else if (
file_exists(ELXIS_PATH.'/components/com_search/engines/'.$engine.'/language/en.engine_'.$engine.'.php')) {
           
$langfile = ELXIS_PATH.'/components/com_search/engines/'.$engine.'/language/en.engine_'.$engine.'.php';
        } else {
           
$langfile = '';
        }

        if (
$langfile != '') { $eLang->loadFile($langfile); }
    }


   
/**********************************/
    /* STORE CURRENT ENGINE IN COOKIE */
    /**********************************/
   
private function rememberEngine() {
       
$cookie_engine = '';
        if (isset(
$_COOKIE['elxisengine'])) {
           
$cookie_engine = trim(filter_input(INPUT_COOKIE, 'elxisengine', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
            if ((
$cookie_engine == '') || !isset($this->engines[$cookie_engine])) { $cookie_engine = ''; }
        }
        if (
$cookie_engine != '') {
            if (
$cookie_engine == $this->engine_current) { return; }
        } else {
            if (
$this->engine_current == $this->engine_default) { return; }
        }

       
$eSession = eFactory::getSession();
       
$domain = $eSession->getCookieDomain();
       
$path = $eSession->getCookiePath();
       
$t = time() + 2592000;
       
$secure = $eSession->getCookieSecure();
       
$httponly = $eSession->getCookieHTTP();
       
$samesite = $eSession->getCookieSameSite();

        if (
version_compare(PHP_VERSION, '7.3.0') >= 0) {
           
$cookoptions = array (
               
'expires' => $t,
               
'path' => $path,
               
'domain' => $domain,
               
'secure' => $secure,
               
'httponly' => $httponly,
               
'samesite' => $samesite
           
);
           
setcookie('elxisengine', $this->engine_current, $cookoptions);
        } else {
           
//setcookie('elxisengine', $this->engine_current, $t, $path, $domain, $secure, $httponly);
           
setcookie('elxisengine', $this->engine_current, $t, $path.'; samesite='.$samesite, $domain, $secure, $httponly);
        }
    }


   
/*********************************/
    /* LOAD AVAILABLE SEARCH ENGINES */
    /*********************************/
   
private function loadEngines() {
       
$elxis = eFactory::getElxis();
       
$eLang = eFactory::getLang();
       
$db = eFactory::getDB();

       
$this->apc = $elxis->getConfig('APC');
       
$lowlev = $elxis->acl()->getLowLevel();
       
$exactlev = $elxis->acl()->getExactLevel();
       
$lng = $eLang->currentLang();

        if ((
$this->apc == 1) && ($exactlev == 7)) {
           
$engines = elxisAPC::fetch('engines'.$lng, 'search');
           
$defengine = elxisAPC::fetch('defengine', 'search');
            if (
$engines !== false) {
               
$this->engines = $engines;
                if ((
$defengine !== false) && (trim($defengine) != '')) {
                   
$this->engines[$defengine]['default'] = true;
                   
$this->engine_default = $defengine;
                } else {
                    foreach (
$this->engines as $engine => $eng) {
                       
$this->engines[$engine]['default'] = true;
                       
$this->engine_default = $engine;
                        break;
                    }
                }
                return;
            }
        }

       
$sql = "SELECT * FROM ".$db->quoteId('#__engines')." WHERE ".$db->quoteId('published')."=1"
       
."\n AND ((".$db->quoteId('alevel')." <= :lowlevel) OR (".$db->quoteId('alevel')." = :exactlevel))"
       
."\n ORDER BY ".$db->quoteId('ordering')." ASC";
       
$stmt = $db->prepare($sql);
       
$stmt->bindParam(':lowlevel', $lowlev, PDO::PARAM_INT);
       
$stmt->bindParam(':exactlevel', $exactlev, PDO::PARAM_INT);
       
$stmt->execute();
       
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
        if (!
$rows) {
           
$this->errormsg = $eLang->exist('NO_AVAIL_ENGINES') ? $eLang->get('NO_AVAIL_ENGINES') : 'There are no available search engines!';
            return
false;
        }

       
$first = '';
        foreach (
$rows as $row) {
           
$engine = $row['engine'];
            if (!
file_exists(ELXIS_PATH.'/components/com_search/engines/'.$engine.'/'.$engine.'.engine.php')) { continue; }
            if (
$first == '') { $first = $engine; }
           
$uppereng = strtoupper($engine);
           
$title = $row['title'];
            if (
$eLang->exist($uppereng)) { $title = $eLang->get($uppereng); }
            if (
intval($row['defengine']) == 1) { $this->engine_default = $engine; }
           
$this->engines[$engine] = array(
               
'title' => $title,
               
'params' => $row['params'],
               
'default' => false
           
);
        }

        if (
$first == '') {
           
$this->errormsg = $eLang->exist('NO_AVAIL_ENGINES') ? $eLang->get('NO_AVAIL_ENGINES') : 'There are no available search engines!';
            return
false;
        }

        if (
$this->engine_default == '') { $this->engine_default = $first; }
       
$this->engines[ $this->engine_default ]['default'] = true;

        if ((
$this->apc) && ($exactlev == 7)) {
           
elxisAPC::store('engines'.$lng, 'search', $this->engines, 1800);
           
elxisAPC::store('defengine', 'search', $this->engine_default, 1800);
        }
    }


   
/********************************/
    /* GET AVAILABLE SEARCH ENGINES */
    /********************************/
   
public function getEngines() {
        return
$this->engines;
    }


   
/*****************************/
    /* GET CURRENT SEARCH ENGINE */
    /*****************************/
   
public function getCurrentEngine() {
        return (
$this->engine_current != '') ? $this->engine_current : $this->engine_default;
    }


   
/*****************************/
    /* GET CURRENT SEARCH ENGINE */
    /*****************************/
   
public function getDefaultEngine() {
        return
$this->engine_default;
    }


   
/*********************/
    /* GET ERROR MESSAGE */
    /*********************/
   
public function getError() {
        return
$this->errormsg;
    }


   
/*****************************/
    /* RETURN ENGINE'S META INFO */
    /*****************************/
   
public function engineInfo() {
        if (!
$this->engine) { return false; }
        return
$this->engine->engineInfo();
    }


   
/************************************/
    /* PERFORM SEARCH ON CURRENT ENGINE */
    /************************************/
   
public function search($page=1) {
        if (!
$this->engine) { return false; }
       
$this->engine->search($page);
    }


   
/*******************************/
    /* GET NUMBER OF TOTAL RESULTS */
    /*******************************/
   
public function getTotal() {
        return
$this->engine->getTotal();
    }


   
/********************/
    /* GET SEARCH LIMIT */
    /********************/
   
public function getLimit() {
        return
$this->engine->getLimit();
    }


   
/**************************/
    /* GET SEARCH LIMIT START */
    /**************************/
   
public function getLimitStart() {
        return
$this->engine->getLimitstart();
    }


   
/***************************/
    /* GET CURRENT PAGE NUMBER */
    /***************************/
   
public function getPage() {
        return
$this->engine->getPage();
    }


   
/***************************/
    /* GET MAXIMUM PAGE NUMBER */
    /***************************/
   
public function getMaxPage() {
        return
$this->engine->getMaxPage();
    }


   
/****************************/
    /* GET SEARCH OPTIONS ARRAY */
    /****************************/
   
public function getOptions() {
        return
$this->engine->getOptions();
    }


   
/******************************************/
    /* GET SEARCH SEARCH FOR THE CURRENT PAGE */
    /******************************************/
   
public function getResults() {
        return
$this->engine->getResults();
    }


   
/****************************************/
    /* DISPLAY CURRENT ENGINE'S SEARCH FORM */
    /****************************************/
   
public function searchForm() {
       
$this->engine->searchForm();
    }


   
/**************************/
    /* DISPLAY SEARCH RESULTS */
    /**************************/
   
public function showResults() {
        if ((
$this->engine_current == $this->engine_default) && ($this->getTotal() > 0)) {
           
$eDoc = eFactory::getDocument();
           
$eDoc->setMetaTag('totalResults', $this->getTotal());
           
$eDoc->setMetaTag('startIndex', $this->getLimitStart() + 1);
           
$eDoc->setMetaTag('itemsPerPage', $this->getLimit());
        }
       
$this->engine->showResults();
    }

}

?>