Search.php 8.98 KB
<?php

use Action\AbstractAction;
use LibModels\Wap\Product\SearchData;
use Plugin\DataProcess\ListProcess;
use Plugin\Helpers;

/**
 * 搜索页
 */
class SearchController extends AbstractAction
{

    /**
     * 搜索首页
     */
    public function indexAction()
    {
        $this->_view->html('search');
        $this->_view->display('index', array(
            'search' => array('url' => Helpers::url('', null, 'search')),
            'showDownloadApp' => true,
            'searchPage' => true,
            'pageFooter' => true
        ));
    }

    /**
     * 搜索列表页
     */
    public function listAction()
    {
        // 过滤请求参数
        $condition = filter_input_array(INPUT_GET, array(
            'query' => FILTER_DEFAULT,
            'brand' => FILTER_VALIDATE_INT,
            'sort' => FILTER_DEFAULT,
            'msort' => FILTER_VALIDATE_INT,
            'misort' => FILTER_VALIDATE_INT,
            'color' => FILTER_VALIDATE_INT,
            'size' => FILTER_VALIDATE_INT,
            'price' => FILTER_VALIDATE_INT,
            'discount' => FILTER_DEFAULT,
            'gender' => FILTER_DEFAULT,
            'p_d' => FILTER_DEFAULT,), false);

        $query = isset($condition['query']) ? strtolower(trim($condition['query'])) : null;
        if (isset($condition['discount'])) {
            $condition['p_d'] = rawurldecode($condition['discount']);
            unset($condition['discount']);
        }

        // 标识用户是否有输入搜索内容
        $haveQuery = $query !== null;
        // 标识用户搜的是不是一级品类
        $isQueryFirstClass = false;
        // 标识用户搜的是不是二级品类
        $isQuerySecondClass = false;

        /* 判断是不是品牌, 是品牌跳到品牌列表页(显示搜索框) */
        if ($haveQuery) {
            $domain = null;
            $brandNames = Product\ListModel::getAllBrandNames();

            do {
                /* 精确查品牌域名 */
                if (isset($brandNames[$query])) {
                    $domain = $query;
                    break;
                }

                /* 精确查品牌名称 */
                $domains = array_keys($brandNames, $query, true);
                if (isset($domains[0])) {
                    $domain = $domains[0];
                    break;
                }

                /* 模糊查品牌域名 */
                foreach ($brandNames as $key => $domains) {
                    if (strpos($key, $query) !== false) {
                        $domain = $key;
                        break;
                    }
                }
            } while (false);

            // 清空变量做释放
            $brandNames = array();

            // 跳转到品牌商品列表页
            if ($domain !== null) {
                $url = Helpers::url('', array(
                            'from' => 'search',
                            'query' => $query,
                            'gender' => $condition['gender']
                                ), $domain);
                $this->go($url);
            }
        }


        /* 判断是不是品类, 是品类加导航标题(不显示搜索框) */
        if ($haveQuery) {
            $classNames = Category\ClassModel::getClassNames();

            do {
                /* 精确查一级品类 */
                $sorts = array_keys($classNames['first'], $query, true);
                if (isset($sorts[0])) {
                    $isQueryFirstClass = true;
                    break;
                }

                /* 精确查二级品类 */
                $sorts = array_keys($classNames['second'], $query, true);
                if (isset($sorts[0])) {
                    $isQuerySecondClass = true;
                    break;
                }
            } while (false);

            $classNames = array();
        }

        $data = array();
        // 搜索是一级品类
        if ($isQueryFirstClass) {
            $this->setTitle('全部' . $query);
            $this->setNavHeader('全部' . $query, true, SITE_MAIN);
        }
        // 搜索是二级品类
        elseif ($isQuerySecondClass) {
            $this->setTitle($query);
            $this->setNavHeader($query, true, SITE_MAIN);
        }
        // 搜索其它内容
        else {
            if ($haveQuery) {
                $data['goodList']['search']['default'] = $query;
                $data['goodList']['search']['default'] = $query;
            }
            $this->setTitle('搜索');
            $this->setNavHeader('搜索', true, SITE_MAIN);
        }

        $data['goodListPage'] = true;
        $data['goodList'] = $condition;
        $data['query'] = $query;

        // 查询数据
        if (!isset($condition['query'])) {
            $data['goodList'] += Product\ListModel::getClassData($condition);
        } else {
            $listData = SearchData::searchByCondition($condition);
            // 处理返回的数据
            if (!empty($listData['data']['brand'])) {
                $brandData = $listData['data']['brand'];
                $data['brandWay'] = array(
                    'url' => 'http://' . $brandData['brand_domain'] . SUB_DOMAIN,
                    'thumb' => Helpers::getImageUrl($brandData['brand_ico'], 75, 40),
                    'name' => $brandData['brand_name']
                );
                // 设置品牌默认值
                $data['goodList']['brand'] = $brandData['id'];
                $data['goodList'] += ListProcess::getListData($listData['data']);
            }
            $listData = array();
        }

        $this->_view->display('list', $data);
    }

    /**
     * Ajax异步筛选请求
     */
    public function searchAction()
    {
        if ($this->isAjax()) {
            // 过滤请求参数
            $condition = filter_input_array(INPUT_GET, array(
                'query' => FILTER_DEFAULT,
                'brand' => FILTER_VALIDATE_INT,
                'sort' => FILTER_DEFAULT,
                'msort' => FILTER_VALIDATE_INT,
                'misort' => FILTER_VALIDATE_INT,
                'color' => FILTER_VALIDATE_INT,
                'size' => FILTER_VALIDATE_INT,
                'price' => FILTER_VALIDATE_INT,
                'discount' => FILTER_DEFAULT,
                'gender' => FILTER_DEFAULT,
                'p_d' => FILTER_DEFAULT,), false);

            if (isset($condition['sort'])) {
                $condition['sort'] = rawurldecode($condition['sort']);
            }
            if (isset($condition['discount'])) {
                $condition['p_d'] = rawurldecode($condition['discount']);
                unset($condition['discount']);
            }
            if (isset($condition['gender'])) {
                $condition['gender'] = rawurldecode($condition['gender']);
            }

            // 转换排序方式
            $page = $this->get('page', 1);
            $order = $this->get('order', 0);
            $type = $this->get('type', '');
            switch ($type) {
                case 'price':
                    $order = ($order == 0) ? 's_p_desc' : 's_p_asc';
                    break;
                case 'discount':
                    $order = ($order == 0) ? 'p_d_desc' : 'p_d_asc';
                    break;
                case 'newest':
                default:
                    $order = ($order == 0) ? 's_t_desc' : 's_t_asc';
                    break;
            }

            $data = array();
            // 查询品类或品牌数据
            if (!isset($condition['query'])) {
                $condition['order'] = $order;
                $condition['page'] = $page;
                // 搜索品类
                if (!isset($condition['brand'])) {
                    $data += Product\ListModel::getClassData($condition);
                }
                // 搜索品牌
                else {
                    $title = '';
                    $data += Product\ListModel::getBrandData($condition, $title);
                }
                if (isset($data['filter'])) {
                    unset($data['filter']);
                }
            }
            // 查询数据
            else {
                $listData = SearchData::searchByCondition($condition, $order, $page);
                // 处理返回的数据
                if (isset($listData['data'])) {
                    if (isset($listData['data']['filter'])) {
                        unset($listData['data']['filter']);
                    }
                    $data = ListProcess::getListData($listData['data']);
                }
                $listData = array();
            }

            if (empty($data)) {
                echo ' ';
            } else {
                $this->_view->display('page', $data);
            }
        }
    }

    /**
     * 模糊搜索指定字符
     * 
     * @return array 模糊搜索的结果
     */
    public function fuzzysearch()
    {
        if ($this->isAjax()) {
            $keyword = $this->post('keyword', '');

            $result = SearchData::searchFuzzyDatas($keyword);

            $this->echoJson($result);
        }
    }

}