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']}"; }
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'])); }