Authored by Rock Zhang

Merge branch 'test' of git.dev.yoho.cn:web/yohobuy into test

Conflicts:
	library/LibModels/Wap/Product/SearchData.php
... ... @@ -164,6 +164,19 @@ class AbstractAction extends Controller_Abstract
}
/**
* 跳转到指定的URL
*
* @param string $url 链接地址
* @return void
*/
protected function go($url)
{
headers_sent() || header('Location: ' . $url);
exit();
}
/**
* 设置Cookie
*
* @param string $name cookie的名字
... ... @@ -259,26 +272,6 @@ class AbstractAction extends Controller_Abstract
return $udid;
}
/**
* 获取当前登录的用户名字
*
* @return int
* @todo
*/
protected function getUname()
{
if (!$this->_uname) {
$cookie = $this->getCookie('_UID');
if (!empty($cookie)) {
$cookieList = explode('::', $cookie);
if (isset($cookieList[0])) {
$this->_uname = $cookieList[0];
}
}
}
return $this->_uname;
}
/*
* 设置网站SEO的标题
*
... ...
... ... @@ -71,7 +71,7 @@ class Yohobuy
'os_version' => 'yohobuy:h5',
'private_key' => self::$privateKeyList[$clientType],
'screen_size' => '720x1280',
'v' => '6',
'v' => '7',
);
return $param;
}
... ...
... ... @@ -9,8 +9,8 @@ class CacheConfig
{
/* 公共的数据缓存 */
const KEY_COMMON_SIDE_NAV = 'key_common_side_nav'; // 公共的侧边栏
const KEY_CATEGORY_CLASSES_DATA = 'key_category_classes_data'; // 品类数据
const KEY_COMMON_CATEGORY_CLASSES = 'key_common_category_classes'; // 公共的品类数据
const KEY_COMMON_CATEGORY_CLASSES_NAMES = 'key_common_category_classes_names'; // 公共的品类名称列表
/* 控制器方法中的数据缓存 */
const KEY_ACTION_INDEX_INDEX = 'key_action_index_index'; // 频道选择
... ... @@ -33,6 +33,7 @@ class CacheConfig
const KEY_ACTION_PRODUCT_INDEX = 'key_action_product_index'; // 品类商品列表
const KEY_ACTION_PRODUCT_BRAND = 'key_action_product_brand'; // 品类商品列表
const KEY_ACTION_PRODUCT_BRAND_DOMAINS = 'key_action_product_brand_DOMAINS'; // 所有品牌域名列表
const KEY_ACTION_PRODUCT_BRAND_DOMAINS = 'key_action_product_brand_domains'; // 所有品牌域名列表
const KEY_ACTION_PRODUCT_BRAND_NAMES = 'key_action_product_brand_names'; // 所有品牌名称列表
}
... ...
<?php
namespace LibModels\Wap\Product;
use Api\Yohobuy;
use Api\Sign;
/**
* 商品品牌相关的数据模型
*
* @name BrandData
* @package
* @copyright yoho.inc
* @version 1.0 (2015-10-28 11:12:35)
* @author fei.hong <fei.hong@yoho.cn>
*/
class BrandData
{
/**
* 收藏
*
* @param int $id 品牌ID
* @param int $uid 用户ID
* @return array
*/
public static function favorite($id, $uid)
{
$param = Yohobuy::param();
$param['method'] = 'app.favorite.add';
$param['id'] = $id;
$param['uid'] = $uid;
$param['type'] = 'brand';
$param['client_secret'] = Sign::getSign($param);
return Yohobuy::post(Yohobuy::API_URL, $param, true);
}
/**
* 取消收藏
*
* @param int $id 品牌ID
* @param int $uid 用户ID
* @return array
*/
public static function favoriteCancel($id, $uid)
{
$param = Yohobuy::param();
$param['method'] = 'app.favorite.cancel';
$param['fav_id'] = $id;
$param['uid'] = $uid;
$param['type'] = 'brand';
$param['client_secret'] = Sign::getSign($param);
return Yohobuy::post(Yohobuy::API_URL, $param, true);
}
}
... ...
<?php
namespace LibModels\Wap\Product;
use Api\Yohobuy;
... ... @@ -17,83 +18,102 @@ class SearchData
{
protected static $_searchurl = 'http://101.200.31.165/yohosearch/search.json';
/**
* 模糊搜索提供的关键词
*
* @param string $keyword 关键词
* @return array 根据跟定关键词搜索到的结果,包括数据数目count和提供的关键词keyword
*/
public static function searchFuzzyDatas($keyword)
{
// 构建必传参数
$param = Yohobuy::param();
/**
* 模糊搜索提供的关键词
*
* @param string $keyword 关键词
* @return array 根据给定关键词搜索到的结果,包括数据数目count和提供的关键词keyword
*/
public static function searchFuzzyDatas($keyword)
{
// 构建必传参数
$param = Yohobuy::param();
$param['keyword'] = $keyword;
$param['method'] = 'app.search.fuzzy';
$param['keyword'] = $keyword;
$param['method'] = 'app.search.fuzzy';
$param['client_secret'] = Sign::getSign($param);
return Yohobuy::get(Yohobuy::API_URL, $param);
}
}
/**
* 根据跟定查询数据搜索数据列表
*
* @param string $query 查询条件, 默认为null
* @param string $brand 品牌,默认为null
* @param string $gender 性别,默认为null,"1,3"表示男, "2,3"表示女, "1,2,3"表示全部
* @param integer $color 颜色id
* @param integer $size 尺码id
* @param integer $price 价格
* @param string $p_d 折扣,默认为null
* @param string $sort 商品所属品类,默认为null
* @param string $order 排序方式,默认为按照时间倒序排列s_t_desc,
* s_t_asc表示按时间正序排列,
* s_p_asc表示按价格正序排列,
* s_p_desc表示按价格倒序排列,
* p_d_asc表示按折扣正序排列,
* p_d_desc表示按折扣倒序排列
* @param integer $page 指定查询是多少页,默认为第一页
* @param integer $limit 指定查询多少个,默认是60个
* @param integer $channel表示哪个频道,1表示男生,2表示女生,3表示潮童,4表示创意生活
* @return array 搜索到的数据
*/
public static function searchLiDatas($query = null, $brand = null, $gender = null, $color = null, $size = null, $price = null, $p_d = null, $sort = null, $order = 's_t_desc', $page = 1, $limit = 60, $channel = null)
{
// 排序数据映射表
$order_map = array(
's_t_desc' => 'shelve_time:desc',
's_t_asc' => 'shelve_time:asc',
's_p_asc' => 'sales_price:asc',
's_p_desc' => 'sales_price:desc',
's_d_desc' => 'discount:desc',
's_d_asc' => 'discount:asc',
'skn_desc' => 'product_skn:desc',
'skn_asc' => 'product_skn:asc',
'activities_desc' => 'activities.order_by:desc',
'activities_asc' => 'activities.order_by:asc',
's_n_asc'=>'sales_num:asc',
's_n_desc'=>'sales_num:desc',
'activities_id_desc' => 'activities.activity_id:desc',
'activities_id_asc' => 'activities.activity_id:asc',
);
/**
* 根据给定查询数据搜索数据列表
*
* @param string $query 查询条件, 默认为null
* @param string $brand 品牌,默认为null
* @param string $gender 性别,默认为null,"1,3"表示男, "2,3"表示女, "1,2,3"表示全部
* @param integer $color 颜色id
* @param integer $size 尺码id
* @param integer $price 价格
* @param string $p_d 折扣,默认为null
* @param string $sort 商品所属品类,默认为null
* @param string $order 排序方式,默认为按照时间倒序排列s_t_desc,
* s_t_asc表示按时间正序排列,
* s_p_asc表示按价格正序排列,
* s_p_desc表示按价格倒序排列,
* p_d_asc表示按折扣正序排列,
* p_d_desc表示按折扣倒序排列
* @param integer $page 指定查询是多少页,默认为第一页
* @param integer $limit 指定查询多少个,默认是60个
* @param integer $channel表示哪个频道,1表示男生,2表示女生,3表示潮童,4表示创意生活
* @return array 搜索到的数据
*/
public static function searchLiDatas($query = null, $brand = null, $gender = null, $color = null, $size = null, $price = null, $p_d = null, $sort = null, $order = 's_t_desc', $page = 1, $limit = 60, $channel = null)
{
// 构建必传参数
$param = Yohobuy::param();
$param = array();
is_null($query) || $param['query'] = $query;
is_null($brand) || $param['brand'] = $brand;
is_null($gender) || $param['gender'] = $gender;
is_null($color) || $param['color'] = $color;
is_null($size) || $param['size'] = $size;
is_null($price) || $param['price'] = $price;
is_null($p_d) || $param['p_d'] = $p_d;
is_null($sort) || $param['sort'] = $sort;
is_null($channel) || $param['channel'] = $channel;
$param['method'] = 'app.search.li';
$param['order'] = $order;
$param['page'] = $page;
$param['limit'] = $limit;
$param['client_secret'] = Sign::getSign($param);
is_null($query) || $param['query'] = $query;
is_null($brand) || $param['brand'] = $brand;
is_null($gender) || $param['gender'] = $gender;
is_null($color) || $param['color'] = $color;
is_null($size) || $param['size'] = $size;
is_null($price) || $param['price'] = $price;
is_null($p_d) || $param['p_d'] = $p_d;
is_null($sort) || $param['sort'] = $sort;
// is_null($channel) || $param['channel'] = $channel;
$param['order'] = $order_map[$order];
$param['page'] = $page;
$param['viewNum'] = $limit; // 每页记录数
$param['status'] = 1; // 是否上架,1表示在架,2表示不在
return Yohobuy::get(self::$_searchurl, $param);
}
return Yohobuy::get(Yohobuy::API_URL, $param);
}
/**
* 根据给定查询数据搜索数据列表
*
* @param string $query 查询条件, 默认为null
* @param string $brand 品牌,默认为null
* @param string $gender 性别,默认为null,"1,3"表示男, "2,3"表示女, "1,2,3"表示全部
* @param integer $color 颜色id
* @param integer $size 尺码id
* @param integer $price 价格
* @param string $p_d 折扣,默认为null
* @param string $sort 商品所属品类,默认为null
* @param string $order 排序方式,默认为按照时间倒序排列s_t_desc,
* s_t_asc表示按时间正序排列,
* s_p_asc表示按价格正序排列,
* s_p_desc表示按价格倒序排列,
* p_d_asc表示按折扣正序排列,
* p_d_desc表示按折扣倒序排列
* @param integer $page 指定查询是多少页,默认为第一页
* @param integer $limit 指定查询多少个,默认是60个
* @param integer $channel表示哪个频道,1表示男生,2表示女生,3表示潮童,4表示创意生活
* @return array 搜索到的数据
*/
public static function searchByCondition($condition, $order = 's_t_desc', $page = 1, $limit = 60)
{
$param = Yohobuy::param();
$param['method'] = 'app.search.li';
$param['order'] = $order;
$param['page'] = $page;
$param['limit'] = $limit;
$param += $condition;
$param['client_secret'] = Sign::getSign($param);
return Yohobuy::get(Yohobuy::API_URL, $param, 600); // 有缓存10分钟
}
}
... ...
... ... @@ -32,8 +32,15 @@ class Helpers
case 'search': // 搜索
$url = 'http://search' . SUB_DOMAIN;
break;
case 'index': // 默认
$url = '';
break;
default:
$url = 'http://' . $module . SUB_DOMAIN;
}
if (!empty($param)) {
$url .= $uri . '?' . http_build_query($param, null, '&');
}
$url .= $uri . '?' . http_build_query($param, null, '&');
return $url;
}
... ...
... ... @@ -33,45 +33,6 @@ http {
autoindex_exact_size on;
autoindex_localtime on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /cygdrive/E/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
... ... @@ -108,7 +69,7 @@ http {
# }
#}
# Զļ
# �����Զ���������ļ�
#include /nginx/conf/vhosts/yohoboys.conf;
#include /nginx/conf/vhosts/yohogirls.conf;
#include /nginx/conf/vhosts/yohostore.conf;
... ...
... ... @@ -4,6 +4,7 @@
CustomLog "/Data/logs/apache/access.buy.test.yoho.cn.log" combined
ErrorLog "/Data/logs/apache/error.buy.test.yoho.cn.log"
ServerName buy.test.yoho.cn
ServerAlias *.test.yoho.cn
DocumentRoot "/Data/code/git/yohobuy/yohobuy/m.yohobuy.com/public"
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
... ...
server
{
listen 80;
server_name buy.test.yoho.cn;
server_name buy.test.yoho.cn *.test.yoho.cn;
#access_log /Data/logs/access.buy.test.yoho.cn.log combined;
error_log /Data/logs/error.buy.test.yoho.cn.log warn;
... ...
... ... @@ -159,7 +159,7 @@ function search(opt) {
$.ajax({
type: 'GET',
url: '/product/list/search',
url: '/index/search/search',
data: setting,
success: function(data) {
var noResult = '<p class="no-result">未找到相关搜索结果</p>',
... ...
... ... @@ -3,7 +3,7 @@
{{# goodList}}
{{# search}}
<div id="search-input" class="search-input">
<form action="/product/list/index" method="get">
<form action={{url}} method="get">
<i class="search-icon iconfont">&#xe60f;</i>
<input type="text" value={{default}} name="query">
<i class="clear-input iconfont hide">&#xe61a;</i>
... ...
... ... @@ -3,7 +3,7 @@
{{# goodList}}
{{# search}}
<div id="search-input" class="search-input">
<form action="/product/list/index" method="get">
<form action={{url}} method="get">
<i class="search-icon iconfont">&#xe60f;</i>
<input type="text" value={{default}} name="query">
<i class="clear-input iconfont hide">&#xe61a;</i>
... ...
... ... @@ -2,11 +2,15 @@
use Action\AbstractAction;
use LibModels\Wap\Product\SearchData;
use Plugin\DataProcess\ListProcess;
use Plugin\Helpers;
/**
* 搜索页
*/
class SearchController extends AbstractAction
{
/**
* 搜索首页
*/
... ... @@ -45,107 +49,173 @@ class SearchController extends AbstractAction
)
);
$this->_view->display('index', array(
'search' => $data,
'searchPage' => true,
'search' => $data,
'searchPage' => true,
'pageFooter' => true
));
}
/**
* 搜索列表页
*/
public function listAction()
{
$query = $this->get('query', null);
$brand = $this->get('brand', null);
$gender = $this->getCookie('_Channel', 'boys');
$p_d = $this->get('p_d', null);
$misort = $this->get('misort', null);
$msort = $this->get('msort', null);
$data = array(
'pageHeader' => array(
'navBack' => true,
'navTitle' => '搜索',
'navHome' => '/'
),
'goodListPage' => true,
'goodList' => array(
'brand' => 0,
'msort' => 0,
'gender' => $gender,
'price' => 0,
'size' => 0,
'discount' => ''
)
);
// 首先查询是否属于内置品类
$classes = ClassModel::getClassesArr();
$classFlag = array_search($query, $classes);
if($classFlag !== false)// 属于内部品类
{
$data['pageHeader']['navTitle'] = '所有'.$query;
// 过滤请求参数
$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_VALIDATE_INT,
'gender' => FILTER_DEFAULT,
'p_d' => FILTER_DEFAULT,), false);
$query = isset($condition['query']) ? strtolower(trim($condition['query'])) : null;
// 标识用户是否有输入搜索内容
$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();
// 如果存在搜索字符串就显示搜索栏
if(!is_null($query) && $classFlag === false)
{
$data['search'] = array(
'default' => $query
);
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();
}
// 转换性别
$this->genderTrans($gender);
$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;
// 查询数据
$listData = SearchData::searchLiDatas($query, $brand, $gender, $p_d, $misort, $msort);
$listData = SearchData::searchByCondition($condition);
// 处理返回的数据
if (isset($listData['code']) && $listData['code'] === 200) {
$tmpData = $listData['data'];
// 如果存在品牌信息就显示品牌字段
if(isset($tmpData['brand']) && !empty($tmpData['brand']))
{
$brandData = $tmpData['brand'];
$data['brandWay'] = array(
'url' => '/product/list/brand?brand='.$brandData['id'],
'thumb' => Helpers::getImageUrl($brandData['brand_ico'], 75, 40),
'name' => $brandData['brand_name']
);
// 设置品牌默认值
$data['goodList']['brand'] = $brandData['id'];
}
$data['goodList'] += ListProcess::getListData($tmpData);
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())
{
$query = $this->get('query', null);
$brand = $this->get('brand', null);
$gender = $this->get('gender', null);
$color = $this->get('color', null);
$size = $this->get('size', null);
$price = $this->get('price', null);
$p_d = $this->get('discount', null);
$sort = $this->get('msort', null);
// 转换性别
$this->genderTrans($gender);
if ($this->isAjax()) {
// 过滤请求参数
$condition = filter_input_array(INPUT_GET, array(
'query' => FILTER_DEFAULT,
'brand' => FILTER_VALIDATE_INT,
'sort' => FILTER_VALIDATE_INT,
'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);
// 转换排序方式
$order = $this->get('order', null);
$page = $this->get('page', 1);
$order = $this->get('order', 0);
$type = $this->get('type', '');
switch ($type) {
case 'price':
... ... @@ -162,21 +232,19 @@ class SearchController extends AbstractAction
$data = array();
// 查询数据
$listData = SearchData::searchLiDatas($query, $brand, $gender, $color, $size, $price, $p_d, $sort, $order);
$listData = SearchData::searchByCondition($condition, $order, $page);
// 处理返回的数据
if (isset($listData['code']) && $listData['code'] === 200) {
$tmpData = $listData['data'];
unset($tmpData['filter']);// 不要筛选条件的数据
$data = ListProcess::getListData($tmpData);
if (isset($listData['data'])) {
if (isset($listData['data']['filter'])) {
unset($listData['data']['filter']);
}
$data = ListProcess::getListData($listData['data']);
}
$listData = array();
if(empty($data))
{
if (empty($data)) {
echo ' ';
}
else
{
} else {
$this->_view->display('page', $data);
}
}
... ... @@ -189,8 +257,7 @@ class SearchController extends AbstractAction
*/
public function fuzzysearch()
{
if($this->isAjax())
{
if ($this->isAjax()) {
$keyword = $this->post('keyword', '');
$result = SearchData::searchFuzzyDatas($keyword);
... ... @@ -198,4 +265,5 @@ class SearchController extends AbstractAction
$this->echoJson($result);
}
}
}
\ No newline at end of file
}
... ...
... ... @@ -20,18 +20,18 @@ class ClassModel
{
/**
* 根据频道获取品牌一览数据
* 根据频道获取品数据
*
* @param int $channel 1表示男生频道, 2表示女生频道, 3表示潮童频道, 4表示创意生活频道
* @return array
*/
public static function getClassData()
{
$classes = array();
$result = array();
if (USE_CACHE) {
$key = CacheConfig::KEY_COMMON_CATEGORY_CLASSES;
// 先尝试获取一级缓存(master), 有数据则直接返回.
$result = Cache::get(CacheConfig::KEY_CATEGORY_CLASSES_DATA, 'master');
$result = Cache::get($key, 'master');
if (!empty($result)) {
return $result;
}
... ... @@ -49,6 +49,8 @@ class ClassModel
break;
}
$oneClass = array();
$item = array();
foreach ($data['data'] as $k => $v) {
$oneClass = array('name' => $k, 'ca' => array());
if ($num === 1) {
... ... @@ -64,9 +66,9 @@ class ClassModel
$subitem['name'] = $value['category_name'];
$subitem['id'] = $value['relation_parameter']['sort'];
$subitem['url'] = Helpers::url('/', array(
'sort' => $value['relation_parameter']['sort'],
'sort_name' => $value['category_name']
), 'list');
'sort' => $value['relation_parameter']['sort'],
'sort_name' => $value['category_name']
), 'list');
$item['sub'][] = $subitem;
}
... ... @@ -75,80 +77,73 @@ class ClassModel
}
$num++;
$classes[] = $oneClass;
$result[] = $oneClass;
}
if (USE_CACHE) {
// 接口调用异常时, 不害怕,从我们的二级缓存(slave)里再取数据.
if (empty($classes)) {
$classes = Cache::get(CacheConfig::KEY_CATEGORY_CLASSES_DATA, 'slave');
if (empty($result)) {
$result = Cache::get($key, 'slave');
}
// 接口调用正常,数据封装完成, 则设置一级(master)和二级(slave)数据缓存
else {
Cache::set(CacheConfig::KEY_CATEGORY_CLASSES_DATA, $classes);
Cache::set($key, $result);
}
}
} while (false);
return $classes;
return $result;
}
/**
* 返回品类构成的数组
* 根据频道获取所有品类名称
*
* @return array 键为品类查询sort参数,值为品类名称构成的数组
* @return array(
* "first" => '一级品类',
* "second" => '二级品类',
* )
*/
public static function getClassesArr()
public static function getClassNames()
{
$classes = array();
$classesData = self::getClassData();
$result = array('first' => array(), 'second' => array());
foreach ($classesData as $val) {
foreach ($val['ca'] as $single) {
$classes[$single['id']] = $single['name'];
$classes += self::array_column($single['sub'], 'name', 'id');
if (USE_CACHE) {
$key = CacheConfig::KEY_COMMON_CATEGORY_CLASSES_NAMES;
// 先尝试获取一级缓存(master), 有数据则直接返回.
$result = Cache::get($key, 'master');
if (!empty($result)) {
return $result;
}
}
$classes= ClassData::getClassesData();
if (!empty($classes['data'])) {
$id = 0;
foreach ($classes['data'] as $data) {
foreach ($data as $item) {
$id = $item['category_id'];
$result['first'][$id] = $item['category_name'];
foreach ($item['sub'] as $sub) {
$id = $sub['category_id'];
$result['second'][$id] = $sub['category_name'];
}
}
}
}
$classes = array();
return $classes;
}
/**
* 自定义array_column函数
*
* @return array 返回数组中指定的一列组成的数组
*/
/**
* 自定义array_column函数
* @param array $input 需要取出数组咧的多维数组
* @param string $columnKey 需要返回的列
* @param mixed $indexKey 作为返回数组的索引值
* @return array 从多维数组中返回单列数组
*/
private static function array_column(array $input, $columnKey, $indexKey = null)
{
$array = array();
foreach ($input as $value) {
if (!isset($value[$columnKey])) {
trigger_error("Key \"$columnKey\" does not exist in array");
return false;
if (USE_CACHE) {
// 接口调用异常时, 不害怕,从我们的二级缓存(slave)里再取数据.
if (empty($result)) {
$result = Cache::get($key, 'slave');
}
if (is_null($indexKey)) {
$array[] = $value[$columnKey];
} else {
if (!isset($value[$indexKey])) {
trigger_error("Key \"$indexKey\" does not exist in array");
return false;
}
if (!is_scalar($value[$indexKey])) {
trigger_error("Key \"$indexKey\" does not contain scalar value");
return false;
}
$array[$value[$indexKey]] = $value[$columnKey];
// 接口调用正常,数据封装完成, 则设置一级(master)和二级(slave)数据缓存
else {
Cache::set($key, $result);
}
}
return $array;
return $result;
}
}
... ...
... ... @@ -44,7 +44,7 @@ class ListModel
}
// 调用接口查询数据
$listData = ClassData::filterClassData($condition);
$listData = ClassData::filterClassData($condition);
// 处理返回的数据
if (isset($listData['code']) && $listData['code'] === 200) {
$result = ListProcess::getListData($listData['data']);
... ... @@ -63,16 +63,19 @@ class ListModel
return $result;
}
/**
* 获取品牌商品列表数据
* 获取品牌信息
*
* @param int $id 唯一的ID
* @param int $uid 用户ID
* @param string $title 网站标题
* @return array
*/
public static function getBrandData($condition, $id, $uid, &$title)
public static function getBrandIntro($id, $uid, &$title)
{
$result = array();
// 获取品牌介绍信息, 有缓存1小时
$introData = BrandData::getBrandIntro($id, $uid);
if (isset($introData['data']['brand_intro'])) {
... ... @@ -88,14 +91,28 @@ class ListModel
$result['brandHome']['banner'] = Helpers::getImageUrl($bannerData['data']['banner'], 640, 75);
}
return $result;
}
/**
* 获取品牌商品列表数据
*
* @param array $condition 条件参数
* @param string $title 网站标题
* @return array
*/
public static function getBrandData($condition, &$title)
{
$result = array();
if (USE_CACHE) {
$key = CacheConfig::KEY_ACTION_PRODUCT_BRAND;
if (!empty($condition)) {
$key .= http_build_query($condition, null, '&');
}
// 先尝试获取一级缓存(master), 有数据则直接返回.
$result['goodList'] = Cache::get($key, 'master');
if (!empty($result['goodList'])) {
$result = Cache::get($key, 'master');
if (!empty($result)) {
return $result;
}
}
... ... @@ -104,20 +121,28 @@ class ListModel
$listData = BrandData::filterBrandData($condition);
// 处理返回的数据
if (isset($listData['code']) && $listData['code'] === 200) {
$result['goodList'] = ListProcess::getListData($listData['data']);
$result = ListProcess::getListData($listData['data']);
if (!empty($listData['data']['brand'])) {
$result['brandWay'] = array(
'url' => 'http://'. $listData['data']['brand_domain'] . SUB_DOMAIN,
'thumb' => Helpers::getImageUrl($listData['data']['brand_ico'], 75, 40),
'name' => $listData['data']['brand_name']
);
$title = $listData['data']['brand_name'];
}
}
if (USE_CACHE) {
// 接口调用异常时, 不害怕,从我们的二级缓存(slave)里再取数据.
if (empty($result['goodList'])) {
$result['goodList'] = Cache::get($key, 'slave');
if (empty($result)) {
$result = Cache::get($key, 'slave');
}
// 接口调用正常,数据封装完成, 则设置一级(master)和二级(slave)数据缓存
else {
Cache::set($key, $result['goodList'], 600); // 缓存10分钟
Cache::set($key, $result, 600); // 缓存10分钟
}
}
return $result;
}
... ... @@ -125,7 +150,7 @@ class ListModel
* 获取所有的品牌名称列表
*
* @return array(
* 品牌ID => 品牌名(domain)
* 品牌ID => 品牌名(domain)
* )
*/
public static function getAllBrandDomains()
... ... @@ -133,7 +158,7 @@ class ListModel
$result = array();
if (USE_CACHE) {
$key = CacheConfig::KEY_ACTION_PRODUCT_BRAND_ALLNAMES;
$key = CacheConfig::KEY_ACTION_PRODUCT_BRAND_DOMAINS;
// 先尝试获取一级缓存(master), 有数据则直接返回.
$result = Cache::get($key, 'master');
if (!empty($result)) {
... ... @@ -146,14 +171,14 @@ class ListModel
if (!empty($brand['data']['brands'])) {
foreach ($brand['data']['brands'] as $value) {
foreach ($value as $row) {
$result[ $row['id'] ] = $row['brand_domain'] ;
$result[$row['id']] = $row['brand_domain'];
}
}
}
// 更多关联的品牌
if (!empty($brand['data']['morebrands'])) {
foreach ($brand['data']['morebrands'] as $row) {
$result[ $row['id'] ] = $row['brand_domain'];
$result[$row['id']] = $row['brand_domain'];
}
}
$brand = array();
... ... @@ -165,7 +190,58 @@ class ListModel
}
// 接口调用正常,数据封装完成, 则设置一级(master)和二级(slave)数据缓存
else {
Cache::set($key, $result, 600); // 缓存10分钟
Cache::set($key, $result);
}
}
return $result;
}
/**
* 获取所有的品牌名称列表
*
* @return array(
* 品牌域名(domain) => 品牌名称(name)
* )
*/
public static function getAllBrandNames()
{
$result = array();
if (USE_CACHE) {
$key = CacheConfig::KEY_ACTION_PRODUCT_BRAND_NAMES;
// 先尝试获取一级缓存(master), 有数据则直接返回.
$result = Cache::get($key, 'master');
if (!empty($result)) {
return $result;
}
}
$brand = BrandData::getBrandsData(null);
/* 按字母'A-Z'分组的品牌列表 */
if (!empty($brand['data']['brands'])) {
foreach ($brand['data']['brands'] as $value) {
foreach ($value as $row) {
$result[$row['brand_domain']] = strtolower($row['brand_name']);
}
}
}
// 更多关联的品牌
if (!empty($brand['data']['morebrands'])) {
foreach ($brand['data']['morebrands'] as $row) {
$result[$row['brand_domain']] = strtolower($row['brand_name']);
}
}
$brand = array();
if (USE_CACHE) {
// 接口调用异常时, 不害怕,从我们的二级缓存(slave)里再取数据.
if (empty($result)) {
$result = Cache::get($key, 'slave');
}
// 接口调用正常,数据封装完成, 则设置一级(master)和二级(slave)数据缓存
else {
Cache::set($key, $result);
}
}
... ...
... ... @@ -11,26 +11,39 @@ class PlusstarController extends AbstractAction
{
/**
* 国际精选-品牌列表页
* 国际优选-品牌列表页
* 明星原创-品牌列表页
*
* @param int gender "1,3"表示男, "2,3"表示女
* @param int type 1表示国际优选, 2表示明星原创
*/
public function indexAction()
{
$this->setTitle('国际优选');
$this->setNavHeader('国际优选', true, SITE_MAIN);
$gender = $this->get('gender', '1,3');
$data = Guang\PlusstarModel::getFirstBrands($gender);
$data['psList'] = true; // 控制模板中的JS使用
$this->_view->display('index', $data);
$type = $this->get('type', 1);
if ($type == '2') {
$this->setTitle('明星原创');
$this->setNavHeader('明星原创', true, SITE_MAIN);
$data = Guang\PlusstarModel::getBrands($gender);
$data['psList'] = true; // 控制模板中的JS使用
$this->_view->display('list', $data);
} else {
$this->setTitle('国际优选');
$this->setNavHeader('国际优选', true, SITE_MAIN);
$data = Guang\PlusstarModel::getFirstBrands($gender);
$data['psList'] = true; // 控制模板中的JS使用
$this->_view->display('index', $data);
}
}
/**
* 明星原创-品牌列表页
*
* 备注:已不使用暂留着,可去掉
* @param int gender "1,3"表示男, "2,3"表示女
*/
public function listAction()
... ... @@ -79,7 +92,7 @@ class PlusstarController extends AbstractAction
$data['ps']['likeUrl'] = false; //"http://guang.m.yohobuy.com/plustar/brandinfo?id=285&amp;openby:yohobuy={&quot;action&quot;:&quot;go.weblogin&quot;,&quot;params&quot;:{&quot;jumpurl&quot;:{&quot;url&quot;:&quot;http:\/\/guang.m.yohobuy.com\/plustar\/brandinfo&quot;,&quot;param&quot;:{&quot;id&quot;:285}},&quot;requesturl&quot;:{&quot;url&quot;:&quot;\/guang\/api\/v1\/favorite\/togglebrand&quot;,&quot;param&quot;:{&quot;brand_id&quot;:&quot;701&quot;}},&quot;priority&quot;:&quot;Y&quot;}}";
$data['ps']['intro'] = empty($brandInfo['getBrandInfo']['data']['brand_intro']) ? '' : strtr(strip_tags($brandInfo['getBrandInfo']['data']['brand_intro']), array('&nbsp;' => ' '));
$data['ps']['newArrival'] = array();
$data['ps']['newArrival']['moreUrl'] = '/product/list/brand?brand='.$id; // @todo 品牌列表页面
$data['ps']['newArrival']['moreUrl'] = '/product/list/brand?brand=' . $id; // @todo 品牌列表页面
$data['ps']['newArrival']['naList'] = $brandInfo['getNewProduct'];
$data['ps']['infos'] = array();
... ...
<?php
use Action\AbstractAction;
use LibModels\Wap\Category\BrandData;
use LibModels\Wap\Category\ClassData;
use Plugin\DataProcess\ListProcess;
use Plugin\Helpers;
/**
... ... @@ -29,7 +26,7 @@ class IndexController extends AbstractAction
// 过滤请求参数
$condition = filter_input_array(INPUT_GET, array(
'brand' => FILTER_VALIDATE_INT,
'sort' => FILTER_VALIDATE_INT,
'sort' => FILTER_DEFAULT,
'msort' => FILTER_VALIDATE_INT,
'misort' => FILTER_VALIDATE_INT,
'color' => FILTER_VALIDATE_INT,
... ... @@ -74,7 +71,7 @@ class IndexController extends AbstractAction
*/
public function brandAction()
{
/* 品牌域名参数 @see Bootstrap.php */
/* 品牌域名参数 @see Bootstrap.php */
$domain = $this->param('named');
if (empty($domain)) {
$this->error();
... ... @@ -86,12 +83,19 @@ class IndexController extends AbstractAction
if (!isset($brandIds[0])) {
$this->error();
}
// 当前的登录用户UID
$uid = $this->getUid();
// 存标题信息
$title = '';
/* 搜索框相关 */
$from = $this->get('from');
$query = $this->get('query');
/* 过滤请求参数 */
$condition = filter_input_array(INPUT_GET, array(
'sort' => FILTER_VALIDATE_INT,
'sort' => FILTER_DEFAULT,
'msort' => FILTER_VALIDATE_INT,
'misort' => FILTER_VALIDATE_INT,
'color' => FILTER_VALIDATE_INT,
... ... @@ -101,16 +105,25 @@ class IndexController extends AbstractAction
'gender' => FILTER_DEFAULT,
'p_d' => FILTER_DEFAULT,), false);
$condition['brand'] = $brandIds[0];
// 存标题信息
$title = '';
$data = Product\ListModel::getBrandData($condition, $brandIds[0], $uid, $title);
if (!empty($condition)) {
$data = array_merge($data, $condition);
}
$data['goodListPage'] = true;
// 从搜索页过来的,显示搜索框, 和进入品牌引导信息
if ($from === 'search') {
$data['goodList'] = Product\ListModel::getBrandData($condition, $title);
$data['goodList']['brandWay'] = false;
$data['goodList']['search']['default'] = $query;
$data['goodList']['search']['url'] = Helpers::url('', null, 'search');
}
// 品牌一览过来的展示品牌介绍和LOGO
else {
$data['brandHome'] = Product\ListModel::getBrandIntro($brandIds[0], $uid, $title);
$data['goodList'] = Product\ListModel::getBrandData($condition, $title);
}
$data['goodList'] += $condition;
if ($title === '') {
$title = $domain;
}
$this->setTitle($title);
$this->setNavHeader($title, true, SITE_MAIN);
... ...
<?php
use Action\AbstractAction;
use LibModels\Wap\Product\BrandData;
/**
* 商品操作相关的控制器
*
* @name Opt
* @package
* @name OptController
* @package product
* @copyright yoho.inc
* @version 1.0 (2015-10-27 19:13:28)
* @author fei.hong <fei.hong@yoho.cn>
*/
class Opt
class OptController extends AbstractAction
{
/**
* 品牌[店铺]收藏/取消收藏
*
* @param int id 品牌ID
* @param string opt 操作标识("ok":表示收藏,"cancel":表示取消收藏)
* @return json
*/
public function favoriteBrandAction()
{
$result = array('code' => 400, 'message' => '未登录', 'data' => false);
do {
/* 判断是否是AJAX请求 */
if (!$this->isAjax()) {
break;
}
/* 判断品牌ID是否有效 */
$id = $this->post('id');
if (!is_numeric($id)) {
break;
}
/* 判断用户是否登录 */
$uid = $this->getUdid();
if (!$uid) {
break;
}
/* 取消收藏 */
$opt = $this->post('opt', 'ok');
if ($opt !== 'ok') {
$result = BrandData::favoriteCancel($id, $uid);
break;
}
/* 收藏 */
$result = BrandData::favorite($id, $uid);
}
while (false);
$this->echoJson($result);
}
}
... ...
... ... @@ -12,3 +12,17 @@ routes.author.route.module = Guang
routes.author.route.controller = Index
routes.author.route.action = Editor
; 国际优选
routes.author.type = "rewrite"
routes.author.match = "/plustar"
routes.author.route.module = Guang
routes.author.route.controller = Plusstar
routes.author.route.action = Index
; 明星原创
routes.author.type = "rewrite"
routes.author.match = "/(plustar|plustar/index)"
routes.author.route.module = Guang
routes.author.route.controller = Plusstar
routes.author.route.action = Index
... ...