<?php namespace Product; use LibModels\Wap\Guang\OptData; use Product\SearchModel; use LibModels\Web\Product\SearchData; use LibModels\Web\Product\ShopData; use Api\Yohobuy; use WebPlugin\HelperSearch; use LibModels\Web\Guang\ListData as GuangListData; use WebPlugin\Helpers; /** * 品牌店铺的模型 * * @copyright yoho.inc * @author xiaoxiao.hao <xiaoxiao.hao@yoho.cn> */ class ShopModel { private static $shopListUrl = '/shoplist'; public static function getData($shopId, $parameters) { $data = array('shopTopBanner' => array(), 'hotSingle' => array()); $parameters['shopId'] = $shopId; $shopList = ShopData::shopsDecoratorList($shopId); if (!empty($shopList['data']['list'])) { foreach ($shopList['data']['list'] as $list) { $fun = $list['resource_name']; if (is_callable("self::$fun")) { $list = self::$fun(self::getResourceData($list, $shopId), $parameters); switch ($fun) { case 'signboard': //过滤不合法的数据 break; case 'newProducts': $data['newArrivel']['name'] = '新品上架 NEW'; $data['newArrivel']['list'] = $list; break; case 'hotProducts': $data['hotSingle']['name'] = '人气单品 HOT'; $data['hotSingle']['list'] = $list; break; case 'goodsTabBar': if (isset($list['hot'])) { $data['hotSingle']['navs'] = $list['hot']; } if ($list['new']) { $data['newArrivel']['navs'] = $list['new']; } break; default : $data[$fun] = $list; } } } } else { headers_sent() || header('Location: /error.html'); exit(); } //店铺介绍 $data['brandIntro'] = self::getIntro($shopId, $parameters['uid']); //搜索店铺全部商品 $searchCondition = SearchModel::searchCondition($parameters['condition'], $parameters['options']); // 组合搜索商品url $urlList['product'] = SearchData::getProductUrl($searchCondition['condition']); // 组合搜索分类url $sortCondition = array(); $sortCondition['brand'] = self::getShopsBrandIds($shopId); if (isset($searchCondition['condition']['misort']) && !empty($searchCondition['condition']['misort'])) { $sortCondition['needSmallSort'] = 1; } $urlList['sort'] = SearchData::getClassesUrl($sortCondition); //批量调接口获取数据 $res = Yohobuy::getMulti($urlList); //新品上架 if (isset($parameters['navBar']) && $parameters['navBar'] * 1 === 3) { $searchCondition['options']['isNew'] = true; } // 组织模板数据 $result = HelperSearch::getList($res, $searchCondition['options'], $searchCondition['userInput']); $data['pathNav'] = array_merge( HelperSearch::$listNav, array( array('href' => '', 'name' => $data['brandIntro']['brandName'], 'title' => $data['brandIntro']['brandName']) ) ); $sort = self::getSort($res['sort'], $parameters['options']['misort'], $shopId); $searchCondition['userInput'] = empty($searchCondition['userInput']) ? array() : $searchCondition['userInput']; $param = array_merge($searchCondition['userInput'], array('navBar' => 1, 'shopId' => $shopId)); $data['allGoods']['list'] = $result['goods']; $data['allGoods']['name'] = '全部商品 ALL'; $data['allGoods']['opts'] = $result['opts']; $data['leftContent'] = isset($result['leftContent']) ? $result['leftContent'] : ''; $data['allGoods']['goodsMenu']['menuList'] = $sort; $data['allGoods']['goodsMenu']['url'] = self::$shopListUrl . '?' . http_build_query($param); $data['allGoods']['href'] = self::$shopListUrl . '?' . http_build_query($param); return $data; } /** * 店铺列表页 */ public static function getShopListData($shopId, $parameters) { $data = array('shopTopBanner' => array(), 'hotSingle' => array()); $parameters['shopId'] = $shopId; $shopList = ShopData::shopsDecoratorList($shopId); if (isset($shopList['data']['list']) && $shopList['code'] === 200) { foreach ($shopList['data']['list'] as $list) { $fun = $list['resource_name']; if (is_callable("self::$fun")) { $list = self::$fun(self::getResourceData($list, $shopId), $parameters); switch ($fun) { case 'newProducts': case 'hotProducts': case 'signboard': break; case 'goodsTabBar': if (isset($list['hot'])) { $data['hotSingle']['navs'] = $list['hot']; } else if ($list['new']) { $data['newArrivel']['navs'] = $list['new']; } break; default : $data[$fun] = $list; } } } } //店铺介绍 $data['brandIntro'] = self::getIntro($shopId, $parameters['uid']); //搜索店铺全部商品 $searchCondition = SearchModel::searchCondition($parameters['condition'], $parameters['options']); // 组合搜索商品url $urlList['product'] = SearchData::getProductUrl($searchCondition['condition']); // 组合搜索分类url $sortCondition = array(); $sortCondition['brand'] = self::getShopsBrandIds($shopId); if (isset($searchCondition['condition']['misort']) && !empty($searchCondition['condition']['misort'])) { $sortCondition['needSmallSort'] = 1; } $urlList['sort'] = SearchData::getClassesUrl($sortCondition); //批量调接口获取数据 $res = Yohobuy::getMulti($urlList); //新品上架 if (isset($parameters['navBar']) && $parameters['navBar'] * 1 === 3) { $searchCondition['options']['isNew'] = true; } // 组织模板数据 $result = HelperSearch::getList($res, $searchCondition['options'], $searchCondition['userInput']); $data['goods'] = $result['goods']; $data['opts'] = $result['opts']; $data['totalCount'] = $result['totalCount'];//商品总数 $data['leftContent'] = isset($result['leftContent']) ? $result['leftContent'] : ''; $data['filters'] = $result['filters']; $data['pathNav'] = array_merge( $result['pathNav'], array( array('href' => '', 'name' => $data['brandIntro']['brandName'], 'title' => $data['brandIntro']['brandName']) ) ); // $data['name'] = '全部商品 ALL'; // $sort = self::getSort($res['sort']); // $data['goodsMenu']['menuList'] = $sort; return $data; } //异步获取全部商品goods数据 public static function getGoods($condition, $options) { //搜索店铺全部商品 $searchCondition = SearchModel::searchCondition($condition, $options); // 组合搜索商品url $urlList['product'] = SearchData::getProductUrl($searchCondition['condition']); // 组合搜索分类url $sortCondition = array(); $sortCondition['brand'] = self::getShopsBrandIds($condition['shop']); if (isset($searchCondition['condition']['misort']) && !empty($searchCondition['condition']['misort'])) { $sortCondition['needSmallSort'] = 1; } $urlList['sort'] = SearchData::getClassesUrl($sortCondition); //批量调接口获取数据 $res = Yohobuy::getMulti($urlList); // 组织模板数据 $result = HelperSearch::getList($res, $searchCondition['options'], $searchCondition['userInput']); $sort = self::getSort($res['sort'], $options['misort'], $condition['shop']); $data['goodsMenu']['menuList'] = $sort; $data['list'] = $result['goods']; $data['opts'] = $result['opts']; return $data; } /** * 店铺-经典Banner 资源位 * @param type $data [] */ public static function shopTopBanner($data) { $result = array( 'banner' => '', 'isShowShopName' => false, 'bannerHeight' => 150 ); if (!empty($data['resource_data'][0]['shopSrc'])) { $result['banner'] = self::imageView2($data['resource_data'][0]['shopSrc'], 1150, 150); } if (!empty($data['resource_data'][0]['detailSrc'])) { $result['detailSrc'] = self::imageView2($data['resource_data'][0]['detailSrc'], 1150, 150); } if (!empty($data['resource_data'][0]['isShowShopName'])) { $result['isShowShopName'] = $data['resource_data'][0]['isShowShopName'] === 'Y'; } return $result; } /** * 店铺-基础Banner 资源位 * @param type $data * @return type [] */ public static function shopTopBanner_base($data) { $result = array( 'banner' => '', 'isShowShopName' => false, 'bannerHeight' => 150 ); if (!empty($data['resource_data'][0]['shopSrc'])) { $result['banner'] = $data['resource_data'][0]['shopSrc']; } if (!empty($data['resource_data'][0]['detailSrc'])) { $result['detailSrc'] = $data['resource_data'][0]['detailSrc']; } if (!empty($data['resource_data'][0]['isShowShopName'])) { $result['isShowShopName'] = $data['resource_data'][0]['isShowShopName'] === 'Y'; } return $result; } /** * 导航栏 资源位 * @param type $data * @return type [] */ public static function navigationBar($data, $parameters = array()) { $shopNav = array( array( 'name' => '店铺首页', 'url' => '/?navBar=0&shopId=' . $parameters['shopId'], ), array( 'name' => '全部商品', 'url' => self::$shopListUrl . '?navBar=1&shopId=' . $parameters['shopId'], 'arrow' => true, ), array( 'name' => '人气单品', 'url' => self::$shopListUrl . '?navBar=2&order=s_n_desc&shopId=' . $parameters['shopId'], ), array( 'name' => '新品上架', 'url' => self::$shopListUrl . '?navBar=3&order=s_t_desc&shopId=' . $parameters['shopId'], ), ); if (isset($data['resource_data']) && is_array($data['resource_data'])) { $shopNav = array_merge($shopNav, array_filter($data['resource_data'], function ($v) { if (empty($v['url'])) { return false; } return $v; })); } //选中状态 if (isset($parameters['navBar']) && count($shopNav) >= $parameters['navBar'] && $parameters['navBar'] >= 0) { $shopNav[$parameters['navBar']]['current'] = true; } else { $shopNav[0]['current'] = true; } return $shopNav; } /** * 资源位小图 * @param type $data */ public static function oneRowTwoColImages($data) { $oneData = array(); $twoData = array(); foreach ($data['resource_data'] as $resource) { if (empty($resource['data'])) { continue; } foreach ($resource['data'] as $key => $val) { $temp = array( 'img' => self::imageView2($val['src'], 300, 175), 'url' => Helpers::getUrlSafe($val['url']), ); if ($key === 0) { $oneData[] = $temp; } else { $twoData[] = $temp; } } } return array_slice(array_merge($oneData, $twoData), 0, 2); } /** * 资源位大图 * @param type $data * @return type [] */ public static function largeSlideImg($data) { $result = array(); foreach ($data['resource_data'] as $resource) { if (empty($resource['data'])) { continue; } foreach ($resource['data'] as $val) { $result[] = array( 'img' => self::imageView2($val['src'], 660, 360), 'url' => Helpers::getUrlSafe($val['url']), ); } } return $result; } /** * 经典推荐 * @param type $data * @return type [] */ public static function recommend($data) { $result = array(); foreach ($data['resource_data'] as $resource) { $result[] = array( 'enName' => Helpers::isChinese($resource['enName']) ? Helpers::substrEllipsis($resource['enName'], 5) : Helpers::substrEllipsis($resource['enName'], 10), 'name' => Helpers::isChinese($resource['name']) ? Helpers::substrEllipsis($resource['name'], 5) : Helpers::substrEllipsis($resource['name'], 6), 'img' => self::imageView2($resource['src'], 50, 50), 'title' => $resource['title'], 'url' => Helpers::getUrlSafe($resource['url']), ); } if (empty($result)) { return $result; } return array( 'title' => isset($result[0]['title']) ? $result[0]['title'] : '经典推荐', 'list' => $result ); } /** * 热门推荐 * @param type $data * @return type [] */ public static function hotRecommend($data) { $result = array(); foreach ($data['resource_data'] as $resource) { $result[] = array( 'img' => self::imageView2($resource['src'], 160, 240), 'title' => $resource['title'], 'url' => Helpers::getUrlSafe($resource['url']), ); } if (empty($result)) { return $result; } return array( 'title' => isset($result[0]['title']) ? $result[0]['title'] : '热销推荐', 'list' => $result ); } /** * 水牌 * @param type $data * @return type [] */ public static function signboard($data) { $result = array(); foreach ($data['resource_data'] as $resource) { if (empty($resource['data'])) { continue; } foreach ($resource['data'] as $val) { $result[] = array( 'img' => self::imageView2($val['src'], 160, 240), 'url' => Helpers::getUrlSafe($val['url']), ); } } return array( 'title' => empty($result[0]['title']) ? '' : $result[0]['title'], 'list' => $result ); } /** * 品牌一览 * @param type $data * @return type [] */ public static function brandBrowse($data, $parameters = array()) { $result = array(); $brand = isset($parameters['brand']) ? $parameters['brand'] : ''; if (count($data['resource_data']) <= 1) { return $result; } foreach ($data['resource_data'] as $resource) { $result[] = array( 'url' => Helpers::url( self::$shopListUrl, array( 'shopId' => $parameters['shopId'], 'brand' => $resource['id'], 'navBar' => 1 ), '' ), 'brandName' => $resource['brandName'], 'cur' => ($brand === strval($resource['id'])) ); } return array('title' => '品牌集合', 'list' => $result); } /** * 商品标签栏 * @param type $data * @return type [] */ public static function goodsTabBar($data, $parameters) { $more = array( 'name' => 'MORE', 'href' => self::$shopListUrl . '?shopId=' . $parameters['shopId'] ); $result = array( 'hot' => array(), 'new' => array() ); if (empty($data['resource_data'])) { return $result; } if (isset($data['resource_data']['hot'])) { foreach ($data['resource_data']['hot'] as $val) { if (empty($val['url'])) { continue; } $result['hot'][] = array( 'name' => $val['name'], 'href' => Helpers::getUrlSafe($val['url']), ); } } if (isset($data['resource_data']['new'])) { foreach ($data['resource_data']['new'] as $val) { if (empty($val['url'])) { continue; } $result['new'][] = array( 'name' => $val['name'], 'href' => Helpers::getUrlSafe($val['url']), ); } } $result['hot'][] = $more; $result['new'][] = $more; return $result; } /** * 新品上架 * @param type $data * @return type [] */ public static function newProducts($data, $opts) { $result = array(); foreach ($data['resource_data'] as $resource) { $result[] = array( 'productId' => $resource['productId'], 'title' => $resource['productName'], 'productSkn' => $resource['productSkn'], 'price' => '¥' . number_format(trim($resource['salesPrice'], '¥'), 2, '.', ''), 'img' => self::imageView2($resource['src'], 250, 340), 'url' => Helpers::getProductUrl($resource['productId'], $resource['productSkn'], $resource['productName']), ); } return $result; } /** * 人气单品 * @param type $data * @return type [] */ public static function hotProducts($data, $opts) { $result = array(); foreach ($data['resource_data'] as $key => $resource) { $result[] = array( 'productId' => $resource['productId'], 'title' => $resource['productName'], 'productSkn' => $resource['productSkn'], 'price' => '¥' . number_format(trim($resource['salesPrice'], '¥'), 2, '.', ''), 'img' => self::imageView2($resource['src'], 250, 340), 'url' => Helpers::getProductUrl($resource['productId'], $resource['productSkn'], $resource['productName']), 'index' => $key + 1 ); } return $result; } /** * 基础模板 * @param type int $shopId 店铺id * @return type [] */ public static function basisTemplate($shopId) { $data = array('signboard' => array()); $parameters['shopId'] = $shopId; $shopList = ShopData::shopsDecoratorList($shopId); if (!empty($shopList['data']['list'])) { foreach ($shopList['data']['list'] as $list) { $fun = $list['resource_name']; if (is_callable("self::$fun")) { $list = self::$fun(self::getResourceData($list, $shopId), $parameters); switch ($fun) { case 'shopTopBanner_base': case 'signboard': $data[$fun] = $list; break; } } } } return $data; } /** * 潮流资讯 * @param type string $tag 搜索内容 * @return array [] */ public static function getArticle($shopId) { $result = array(); $articleData = array(); $brands = self::getShopsBrands($shopId); if (empty($brands)) { return $result; } foreach ($brands as $val) { $article = GuangListData::getArticleByBrand($val['brand_id'], 3); if (!empty($article['data'])) { $articleData = array_merge($articleData, $article['data']); } if (count($articleData) > 3) { break; } } if (empty($articleData)) { return $result; } foreach ($articleData as $key => $artList) { if ($key >= 3) { break; } $result['trendList'][] = array( 'href' => $artList['url'], 'src' => self::imageView2(substr($artList['src'], 0, strpos($artList['src'], '?')), 264, 173), 'mainTitle' => $artList['title'], 'Subtitle' => $artList['intro'] ); } //等于3个才显示 if (count($result['trendList']) < 3) { return array(); } $result['name'] = '潮流资讯 HOT ITEMS'; return $result; } /** * 缩略图 * @param type $src 图片路径 * @param type $width 宽 * @param type $heigh 高 * @return type string src */ public static function imageView2($src, $width, $heigh) { $src .= strstr($src, '?') ? '&' : '?'; return Helpers::getUrlSafe("{$src}imageView2/1/w/{$width}/h/{$heigh}"); } private static function modifyUrl($val, $shopId) { if (isset($val['linkType']) && $val['linkType'] == 1) { return Helpers::url('/product/index/shoplist', array('filter_poolId' => $val['categoryId'], 'shopId' => $shopId), ''); } else { return $val['url']; } } /** * 解析resource_data 参数 * @param type $data * @return type [] */ public static function getResourceData($data, $shopId) { $result = isset($data['resource_data']) ? json_decode($data['resource_data'], true) : array(); foreach ($result as $key => &$val) { $val['url'] = self::modifyUrl($val, $shopId); if (isset($val['data']) && is_array($val['data'])) { foreach ($val['data'] as $k => &$v) { $url = self::modifyUrl($v, $shopId); if (!empty($url)) { $v['url'] = $url; } } } if (!iseet($val['data']) && is_array($val)) { foreach ($val as $k1 => &$v1) { $url = self::modifyUrl($v1, $shopId); if (!empty($url)) { $v1['url'] = $url; } } } } $data['resource_data'] = $result; return $data; } public static function shopsDecoratorList($shopId) { return ShopData::shopsDecoratorList($shopId); } public static function getIntro($shopId, $uid) { $data = array( 'brandName' => '', 'brandCont' => '', 'domain' => '', 'logo' => '', 'isFavorite' => false, 'multBrandShopType' => 0, 'shopTemplateType' => 0, 'showShopName' => false ); $intro = ShopData::getIntro($shopId, $uid); if (!empty($intro['data'])) { $data = array( 'brandName' => $intro['data']['shop_name'], 'brandCont' => $intro['data']['shop_intro'], 'domain' => $intro['data']['shop_domain'], 'logo' => $intro['data']['shop_logo'], 'isFavorite' => ($intro['data']['is_favorite'] === 'Y'), 'shopTemplateType' => intval($intro['data']['shop_template_type']), 'multBrandShopType' => intval($intro['data']['mult_brand_shop_type']), 'showShopName' => ($intro['data']['is_show_shop_name'] === 'Y') ); } $data['shopId'] = $shopId; return $data; } //获取二级品类(按库存排名取前15个二级品类) public static function getSort($sort, $misort, $shopId) { $result = array(); $i = 0; if (empty($sort['sort'])) { return $result; } foreach ($sort['sort'] as $key => $value) { foreach ($value['sub'] as $k => $v) { $result[$i]['href'] = '/?msort=' . $value['sort_id'] . '&misort=' . $v['sort_id'] . '&shopId=' . $shopId; $result[$i]['name'] = $v['sort_name']; $result[$i]['count'] = $v['count']; $result[$i]['orderBy'] = $v['order_by']; $result[$i]['misort'] = $v['sort_id']; $i++; } } foreach ($result as $key => $value) { $count[$key] = $value['count']; $sortName[$key] = $value['name']; } $arr = array(); array_multisort($count, SORT_DESC, $sortName, $result); $result = array_slice($result, 0, 15); foreach ($result as &$value) { if ($value['misort'] == $misort) { $value['curMenu'] = true; } } return $result; } /** * 获取店铺下的品牌 * @param type $shopId 店铺id * @return type [] */ public static function getShopsBrands($shopId) { $result = ShopData::getShopsBrands($shopId); return empty($result['data']) ? array() : $result['data']; } /** * 获取店铺下的品牌id * @param type $shopId 店铺id * @return array [] */ public static function getShopsBrandIds($shopId) { $brands = array(); $result = self::getShopsBrands($shopId); if (!empty($result)) { foreach ($result as $val) { $brands[] = $val['brand_id']; } } return implode(',', $brands); } public static function getSearch($shopId) { return ShopData::getSearch($shopId); } public static function getSortInfo($shopId, $yhChannel = '', $gender = '') { return ShopData::getSortInfo($shopId, $yhChannel, $gender); } public static function setFavorite($shopId, $isfavorite, $uid, $type = 'shop') { return ShopData::setFavorite($shopId, $isfavorite, $uid, $type); } public static function byDomain($domain) { $data = array('shop_id' => '', 'type' => ''); $result = ShopData::byDomain($domain); if (!empty($result['data'])) { $data = $result['data']; } return ShopData::byDomain($domain); } }