Example #1
0
	function smart ($options=array()) {
		$this->slug = $this->uri = self::$_slug;
		$options['search'] = empty($options['search'])?"":stripslashes($options['search']);

		// Load search engine components
		require_once(ECART_MODEL_PATH."/Search.php");
		new SearchParser();
		new BooleanParser();

		// Sanitize the search string
		$search = $options['search'];

		// Price matching
		$prices = SearchParser::PriceMatching($search);
		if ($prices) {
			$pricematch = false;
			switch ($prices->op) {
				case ">": $pricematch = "((onsale=0 AND (minprice > $prices->target OR maxprice > $prices->target))
							OR (onsale=1 AND (minsaleprice > $prices->target OR maxsaleprice > $prices->target)))"; break;
				case "<": $pricematch = "((onsale=0 AND (minprice < $prices->target OR maxprice < $prices->target))
							OR (onsale=1 AND (minsaleprice < $prices->target OR maxsaleprice < $prices->target)))"; break;
				default: $pricematch = "((onsale=0 AND (minprice >= $prices->min AND maxprice <= $prices->max))
								OR (onsale=1 AND (minsaleprice >= $prices->min AND maxsaleprice <= $prices->max)))";
			}
		}

		// Boolean keyword search
		$boolean = apply_filters('ecart_boolean_search',$search);

		// Natural language search for relevance
		$search = apply_filters('ecart_search_query',$search);

		if (strlen($options['search']) > 0 && empty($boolean)) $boolean = $options['search'];

		$index = DatabaseObject::tablename(ContentIndex::$table);
		$this->loading = array(
			'joins'=>"INNER JOIN $index AS search ON search.product=p.id",
			'columns'=> "SUM(MATCH(terms) AGAINST ('$search')) AS score",
			'where'=>"MATCH(terms) AGAINST ('$boolean' IN BOOLEAN MODE)",
			'orderby'=>'score DESC');
		if (!empty($pricematch)) $this->loading['having'] = $pricematch;
		if (isset($options['show'])) $this->loading['limit'] = $options['show'];

		// No search
		if (empty($options['search'])) $options['search'] = __('(no search terms)','Ecart');
		$this->name = __("Search Results for","Ecart").": {$options['search']}";

	}
Example #2
0
 public function smart(array $options = array())
 {
     // $this->loading['debug'] = true;
     // Load search engine components
     new SearchParser();
     new BooleanParser();
     new ShortwordParser();
     $search = $this->search;
     if (ShoppStorefront()) {
         ShoppStorefront()->search = $search;
     }
     // Sanitize the search string
     // Price matching
     $prices = SearchParser::PriceMatching($search);
     if ($prices) {
         $pricematch = false;
         switch ($prices->op) {
             case '>':
                 $pricematch = "minprice > {$prices->target} OR maxprice > {$prices->target}";
                 break;
             case '<':
                 $pricematch = "minprice < {$prices->target} OR maxprice < {$prices->target}";
                 break;
             default:
                 $pricematch = "minprice >= {$prices->min} AND maxprice <= {$prices->max}";
                 break;
         }
     }
     // Boolean keyword search
     $boolean = apply_filters('shopp_boolean_search', $search);
     // Exact shortword search
     $shortwords = '';
     if (!(defined('SHOPP_DISABLE_SHORTWORD_SEARCH') && SHOPP_DISABLE_SHORTWORD_SEARCH)) {
         $shortwords = apply_filters('shopp_shortword_search', $search);
     }
     // Natural language search for relevance
     $search = apply_filters('shopp_search_query', $search);
     if (strlen($options['search']) > 0 && empty($boolean)) {
         $boolean = $options['search'];
     }
     $score = "SUM(MATCH(terms) AGAINST ('{$search}'))";
     $where = "MATCH(terms) AGAINST ('{$boolean}' IN BOOLEAN MODE)";
     if (!empty($shortwords)) {
         $score = "SUM(MATCH(terms) AGAINST ('{$search}'))+SUM(terms REGEXP '[[:<:]](" . str_replace(' ', '|', $shortwords) . ")[[:>:]]')";
         $where = "({$where} OR terms REGEXP '[[:<:]](" . str_replace(' ', '|', $shortwords) . ")[[:>:]]')";
     }
     $index = ShoppDatabaseObject::tablename(ContentIndex::$table);
     $this->loading['joins'] = array($index => "INNER JOIN {$index} AS search ON search.product=p.ID");
     $this->loading['columns'] = "{$score} AS score";
     $this->loading['where'] = array($where);
     $this->loading['groupby'] = 'p.ID';
     $this->loading['orderby'] = 'score DESC';
     if (!empty($pricematch)) {
         $this->loading[empty($search) ? 'where' : 'having'] = array($pricematch);
     }
     if (isset($options['show'])) {
         $this->loading['limit'] = $options['show'];
     }
     if (isset($options['published'])) {
         $this->loading['published'] = $options['published'];
     }
     if (isset($options['paged'])) {
         $this->loading['paged'] = $options['paged'];
     }
     // No search
     if (empty($options['search'])) {
         $options['search'] = __('(no search terms)', 'Shopp');
     }
     $this->name = sprintf(__('Search Results for: %s', 'Shopp'), esc_html($options['search']));
 }