Search.php 13 KB
<?php
namespace Product;

use Api\Yohobuy;
use Configs\WebCacheConfig;
use WebPlugin\Helpers;
use WebPlugin\HelperSearch;
use WebPlugin\Cache;
use LibModels\Web\Product\SearchData;
use Index\HomeModel;

/**
 * sale首页模板数据模型
 *
 * @name SaleModel
 * @package models
 * @copyright yoho.inc
 * @version 1.0 (2015-12-17 13:54:56)
 * @author sefon
 */
class SearchModel
{

    /**
     * 搜索相关页面公共条件处理
     * 
     * @param $param    array(
     *      'brand' => int (品牌页必传)
     *      'promotion' => int (sale页必传)
     *      'new' => string (new页必传)
     *      'folder_id' => string (搜索品牌系列参数,品牌页选传)
     *      ...(用户输入的参数,如没有可不传)
     * )
     * @param $option   array(
     *      'reviewNum'  => int (底部浏览记录显示个数)
     *      'controller' => string (说明当前控制器名)
     *      'action' => string (说明当前方法名)
     *      ...(其他一些排序参数,如没有可不传)
     * )
     * @return array
     */
    public static function  searchCondition($param = array(), $option = array())
    {
        $data = array();
        /* 过滤请求参数 */
        $condition = filter_input_array(INPUT_GET, array(
            'query' => FILTER_FLAG_NO_ENCODE_QUOTES ,
            'keyword' => FILTER_FLAG_NO_ENCODE_QUOTES ,
            'brand' => FILTER_SANITIZE_STRING,
            'sort' => FILTER_VALIDATE_INT,
            'category' => FILTER_VALIDATE_INT,
            'channel' => FILTER_VALIDATE_INT,
            'msort' => FILTER_SANITIZE_STRING,
            'misort' => FILTER_SANITIZE_STRING,
            'color' => FILTER_VALIDATE_INT,
            'size' => FILTER_DEFAULT,
            'style' => FILTER_DEFAULT,
            'price' => FILTER_DEFAULT,
            'gender' => FILTER_SANITIZE_STRING,
            'p_d' => FILTER_DEFAULT,
            'shelve_time' => FILTER_DEFAULT,
            'new' => FILTER_DEFAULT,
            'specialoffer' => FILTER_DEFAULT,
            'limited' => FILTER_DEFAULT,
            'order' => FILTER_DEFAULT,
            'viewNum' => FILTER_VALIDATE_INT,
            'rowNum' => FILTER_VALIDATE_INT,
            'specialsale_id' => FILTER_VALIDATE_INT,
            'new' => FILTER_SANITIZE_STRING,
            'page' => FILTER_VALIDATE_INT), false);
        //接收高级选项
        foreach ($_GET as $key =>$val) {
            if (strpos($key, 'parameter_') !== false) {
                $condition[$key] = (int) $val;
            }
        }
        //keyword=>query关键字
        if (isset($condition['keyword']) && !empty($condition['keyword'])) {
            $condition['query'] = rawurldecode($condition['keyword']);
        }
        //关键字
        if (isset($condition['query']) && !empty($condition['query'])) {
            $condition['query'] = rawurldecode($condition['query']);
            $condition['query'] = HelperSearch::stripTags($condition['query']);
        }
        $data['userInput'] = $condition;
        //品牌
        if (isset($condition['brand']) && !empty($condition['brand'])) {
            $condition['brand'] = rawurldecode($condition['brand']);
        }

        //性别
        if (isset($condition['gender']) && !empty($condition['gender'])) {
            $condition['gender'] = rawurldecode($condition['gender']);
        } else {
            $condition['gender'] = '';
        }
        //每页显示商品数
        $viewNumArray = array(60, 100, 200);
        if(!isset($condition['viewNum']) || empty($condition['viewNum'])){
            $condition['viewNum'] =60;
        }
        if (!in_array($condition['viewNum'], $viewNumArray)) {
            $condition['viewNum'] = 60;
        }
        //每行显示的商品数量
        if(!isset($condition['rowNum']) || empty($condition['rowNum'])){
            $condition['rowNum'] =5;
        }
        if ($condition['rowNum'] == 6) {
            $imgSize = array(195, 260);
            $minImgSize = array(50, 67);
        }
        else {
            $condition['rowNum'] = 5;
            $imgSize = array(235, 314);
            $minImgSize = array(60, 80);
        }
        //自定义搜索价格
        if (isset($condition['price']) && !empty($condition['price'])) {
            $price = explode(',', $condition['price']);
            if (!$price[0]) {
                $price[0] = 0;
            }
            if (!isset($price[1]) || empty($price[1])) {
                $price[1] = 99999;
            }
            $condition['price'] = implode(',', $price);
        }
        //返回搜索条件
        $condition['needFilter'] = 1;
        //过滤赠品
        $condition['attribute_not'] = 2;
        //默认排序
        if (!isset($condition['order']) || empty($condition['order'])) {
            //如果新品到着没传排序方式,默认按s_t_desc(新品)顺序排序
            if ($option['controller'] == 'List' && $option['action'] == 'new') {
                $condition['order'] = 's_t_desc';
            }else{
                $condition['order'] = 's_n_desc';
            }
        }
        $options = array(
            'imgSize' => $imgSize,
            'minImgSize' => $minImgSize,
            'rowNum' =>$condition['rowNum'],
            'viewNum' =>$condition['viewNum'],
        );

        //每页记录数减1,下一页占位
        $condition['viewNum'] = $condition['viewNum'] - 1;
        $condition = array_merge($condition, $param);
        
        $data['condition'] = $condition;
        $data['options'] = array_merge($options, $option);
        //调用商品分类的参数
        if (isset($condition['msort'])) {
            unset($condition['msort']);
        }
        if (isset($condition['misort'])) {
            unset($condition['misort']);
        }
        $data['sortCondition'] = $condition;

        // 清空不再使用的变更
        $condition = array();
        
        return $data;
    }

    /**
     * 搜索list-sale页数据
     * @param $customCondition array(
     *      'p_d' => string (如果没有传入折扣,则默认展示0.01~0.99折商品)
     * )
     * @param $customOptions array(
     *      'reviewNum'  => int (底部浏览记录显示个数)
     *      'controller' => string (说明当前控制器名)
     *      'action' => string (说明当前方法名)
     * )   排序条件
     * @return array()  (处理后的list首页数据)
     */
    public static function getListData($customCondition = array(), $customOptions = array())
    {
        $searchCondition = self::searchCondition($customCondition, $customOptions);
        // 组合搜索商品url
        $urlList['product'] = SearchData::getProductUrl($searchCondition['condition']);
        // 组合搜索分类url
        $sortCondition = array();
        if (isset($searchCondition['condition']['misort']) && !empty($searchCondition['condition']['misort'])) {
            $sortCondition['needSmallSort'] = 1;
        }
        $urlList['sort'] = SearchData::getClassesUrl($sortCondition);
        // 组合搜索折扣区间url
        $urlList['discount'] = SearchData::getDiscountUrl();
        $data = Yohobuy::getMulti($urlList);
        // 组织模板数据
        $result = HelperSearch::getList($data, $searchCondition['options'], $searchCondition['userInput']);
        
        // 清空不使用的变量
        $searchCondition = array();
        $data = array();
        
        return $result;
    }

    /**
     * 搜索页面获取搜索数据
     * 
     * @param $customCondition array()  搜索条件
     * @param $customOptions array(
     *      'reviewNum'  => int (底部浏览记录显示个数)
     *      'controller' => string (说明当前控制器名)
     *      'action' => string (说明当前方法名)
     * )   排序条件
     * @return array
     */
    public static function searchData($customCondition, $customOptions)
    {
        $searchCondition = self::searchCondition($customCondition, $customOptions);
        $urlList = array();
        // 组合搜索商品url
        $urlList['product'] = SearchData::getProductUrl($searchCondition['condition']);
        // 组合搜索分类url
        $urlList['sort'] = SearchData::getClassesUrl(array_merge($searchCondition['sortCondition'],array('needSmallSort'=>1)));
        // 组合搜索店铺url
        if (isset($searchCondition['condition']['query'])) {
            $param['keyword'] = $searchCondition['condition']['query'];
            $urlList['shop'] = SearchData::getShopUrl($param);
        }
        $data = Yohobuy::getMulti($urlList);
        //获取品牌商品分类
        if (isset($data['shop']) && !empty($data['shop'])) {
            $shopSortParam['brand'] = $data['shop']['id'];
            $shopSort = SearchData::getClassesData($shopSortParam);
            if (isset($shopSort['code']) && $shopSort['code'] == 200) {
                $data['shopSort'] = $shopSort['data']['sort'];
            }
        }
        // 组织模板数据
        $result = HelperSearch::getList($data, $searchCondition['options'], $searchCondition['userInput']);
        
        // 清空不使用的变量
        $searchCondition = array();
        $data = array();
        
        return $result;
    }
    /**
     * 根据product_sn查询产品图片信息
     * 
     * @param $productSkn
     * @param $options array()
     * @author sefon 2015-12-28 18:09:28
     * @return array
     */
    public static function getProductPic($productSkn, $options)
    {
        $condition = array();
        $condition['query'] = $productSkn;
        //返回搜索条件
        $condition['needFilter'] = 0;
        //获取产品数据
        $data = SearchData::searchElasticByCondition($condition);
        if (isset($data['code']) && $data['code'] === 200 && !empty($data['data']['product_list'])) {
            //组织数据结构
            $data = HelperSearch::getProductPic($data['data']['product_list'], $options);
        }
        else {
            $data = array();
        }
        $res = array('pics' => $data);
        
        return $res;
    }

    /**
     * 查询搜索提示
     * 
     * @param $query
     * @return array
     */
    public static function getSuggest($query)
    {
        $data = '';
        $result = SearchData::getSuggest($query);
        if (isset($result['code']) && $result['code'] == 200 && !empty($result['suggest']['items'])) {
            $data = array();
            $link = '';
            foreach ($result['suggest']['items'] as $v) {
                $link = Helpers::url('', array('query' => $v['item']), 'search');
                $data[] = '<li><a style="display: block;" href="' . $link . '" class="clearfix clear search-item" title="'.$v['item'].'" act="' . $link . '"><span class="searchvalue" >'.$v['item'].'</span><span class="valuenum">约'.$v['frequency'].'个商品</span></a></li>';
            }
        }
        return $data;
    }

    /**
     * 获取分类的尺码
     */
    public static function getSortSize($condition)
    {
        //当前页面的搜索条件
        $old = array();
        $url = explode('?', $_SERVER['HTTP_REFERER']);
        if (isset($url[1])) {
            $old = explode('&', $url[1]);
        }
        if (!empty($old)) {
            foreach ($old as $val) {
                $con = explode('=', $val);
                if ($con[0] == 'channel' && in_array($con[1], array(1,2))) {
                    $condition['gender'] = urldecode($con[1]);
                } else {
                    $condition[$con[0]] = urldecode($con[1]);
                }
            }
        }
        //分类,把销售分类转为物理分类
        if (isset($condition['msort']) && !empty($condition['msort'])) {
            $category = self::getRelateSort();
            $condition['sort'] = $category[$condition['msort']]['sort'];
        }
        //返回搜索条件
        $condition['needFilter'] = 1;
        $condition['viewNum'] = 1;
        unset($condition['msort']);
        $result = SearchData::searchElasticByCondition($condition);
        if (isset($result['code']) && $result['code'] == 200 && isset($result['data']['filter']) && !empty($result['data']['filter'])) {
            return HelperSearch::size($result['data']['filter'], true);
        }
    }

    /**
     * @param $keyword
     * @return array
     */
    public static function searchError($keyword)
    {
        $keyword = HelperSearch::stripTags($keyword);
        $keyword = HelperSearch::mbSubstr($keyword, 300);
        $data = array(
            //初始化js
            'searchListPage' => true,
            'search' => array(
                'keyWord' => $keyword,
                'searchActionUrl' => 'http://search.yohobuy.com',
                'latestWalk' => 7,
                'pathNav' => Array(
                    '0'=>array(
                        'href' => '/',
                        'name' => '首页'
                    ),
                    '1'=>array(
                        'name' => '搜索“<span id="nav_keyword">'.$keyword.'</span>”共<span id="nav_keyword_count">0</span>个结果'
                    )
                )
            )
        );
        return $data;
    }
}