Authored by 郝肖肖

pc 店铺装修 代码移入

<?php
namespace LibModels\Web\Product;
use Api\Yohobuy;
use Api\Sign;
/**
* 品牌店铺的接口
* @info http://git.dev.yoho.cn/yoho-documents/api-interfaces/blob/master/%E5%95%86%E5%93%81%E5%88%97%E8%A1%A8/brandShops.md
* @copyright yoho.inc
* @author xiaoxiao.hao <xiaoxiao.hao@yoho.cn>
*/
class ShopData
{
/**
* 获取店铺装修的所有资源接口
* @param type int $shopId 店铺id
* @return type []
*/
public static function shopsDecoratorList($shopId)
{
$param = Yohobuy::param();
$param['method'] = 'app.shopsdecorator.getList';
$param['shop_id'] = intval($shopId);
$param['client_secret'] = Sign::getSign($param);
return Yohobuy::get(Yohobuy::API_URL, $param);
}
/**
* 查询店铺介绍接口
* @param type int $shopId 店铺id
* @return type []
*/
public static function getIntro($shopId, $uid = '')
{
$param = Yohobuy::param();
$param['method'] = 'app.shops.getIntro';
$param['shop_id'] = intval($shopId);
$param['uid'] = $uid;
$param['client_secret'] = Sign::getSign($param);
return Yohobuy::get(Yohobuy::API_URL, $param);
}
/**
* 查询店铺下面的所有品牌
* @param type int $shopId 店铺id
* @return type []
*/
public static function getShopsBrands($shopId)
{
$param = Yohobuy::param();
$param['method'] = 'app.shops.getShopsBrands';
$param['shop_id'] = intval($shopId);
$param['client_secret'] = Sign::getSign($param);
return Yohobuy::get(Yohobuy::API_URL, $param);
}
/**
* 搜索店铺内商品 || 查询该店铺下全部商品
* @param type int $shopId 店铺id
* @return type []
*/
public static function getSearch($shopId)
{
$param = Yohobuy::param();
$param['method'] = 'app.search.li';
$param['shop'] = intval($shopId);
$param['client_secret'] = Sign::getSign($param);
return Yohobuy::get(Yohobuy::API_URL, $param);
}
/**
* 查询该店铺下所有二级品类
* @param type int $shopId 店铺id
* @param type string $yhChannel 频道
* @param type string $gender 性别
* @return type []
*/
public static function getSortInfo($shopId, $yhChannel = '', $gender = '')
{
$param = Yohobuy::param();
$param['method'] = 'app.shop.getSortInfo';
$param['shop_id'] = intval($shopId);
$param['yh_channel'] = $yhChannel;
$param['gender'] = $gender;
$param['client_secret'] = Sign::getSign($param);
return Yohobuy::get(Yohobuy::API_URL, $param);
}
/**
* 收藏|取消 店铺接口
* @param type int $shopId 店铺id
* @param type Boolean $isfavorite true:收藏,false:取消
* @param type string $type 收藏的类型,brand、product、shop
* @return type []
*/
public static function setFavorite($shopId, $isfavorite, $uid, $type = 'shop')
{
$param = Yohobuy::param();
$param['method'] = $isfavorite ? 'app.favorite.add' : 'app.favorite.cancel';
$param['id'] = intval($shopId);
$param['fav_id'] = intval($shopId);
$param['uid'] = $uid;
$param['type'] = $type;
$param['client_secret'] = Sign::getSign($param);
return Yohobuy::get(Yohobuy::API_URL, $param);
}
/**
* 根据domain查找shop_id
* @param type string $domain 品牌域名
* @return type []
*/
public static function byDomain($domain)
{
$param = Yohobuy::param();
$param['method'] = 'web.brand.byDomain';
$param['domain'] = $domain;
$param['client_secret'] = Sign::getSign($param);
return Yohobuy::get(Yohobuy::API_URL, $param);
}
}
... ...
... ... @@ -1050,4 +1050,23 @@ class Helpers
return true;
}
/**
* 格式化产品url
* @param type int $productId 产品id
* @param type $productSkn 产品编号
* @param type $productName 产品名称
* @param type $cnAlphaBet
* @return type url
*/
public static function getProductUrl($productId, $productSkn, $productName = '', $cnAlphaBet = '')
{
$cnAlphaBet = empty($cnAlphaBet) ? $cnAlphaBet : md5($productName);
return self::url(
'/product/pro_' . $productId . '_' .
$productSkn . '/' . $cnAlphaBet . '.html',
null,
'item'
);
}
}
... ...
{{> product/goods-list}}
\ No newline at end of file
... ...
{{> layout/header}}
<div class="shop-index-page product-list-page product-page yoho-page center-content home-page">
<div class="center-content clearfix">
{{> layout/path-nav}}
{{> product/shop-header}}
<div class="list-left pull-left">
{{> product/left-content}}
{{> product/shop-sidebar}}
</div>
<div class="list-right pull-right">
{{#if coupon}}
<div class="coupon clearfix">
<div class="coupon-title">
</div>
</div>
{{/if}}
{{#if largeSlideImg}}
<div class="slider-wrap clearfix">
<div class="slider-left pull-left">
<div class="slide-wrapper">
<ul>
{{#largeSlideImg}}
<li>
<a href="{{url}}"><img src="{{img}}"></a>
</li>
{{/largeSlideImg}}
</ul>
</div>
</div>
<div class="slider-right pull-right">
{{#oneRowTwoColImages}}
<a class="slider-item" href="{{url}}"><img src="{{img}}"></a>
{{/oneRowTwoColImages}}
</div>
</div>
{{/if}}
{{#newArrivel}}
<div class="new-arrivel clearfix">
{{> index/floor-header}}
{{> product/shop-single-list}}
</div>
{{/newArrivel}}
{{#hotSingle}}
<div class="hot-single clearfix">
{{> index/floor-header}}
{{> product/shop-single-list}}
</div>
{{/hotSingle}}
{{#allGoods}}
<div class="all-goods clearfix">
{{> index/floor-header}}
<div class="goods-wrap">
{{> product/goods-list}}
</div>
<div class="loading">
<a href="{{href}}" target= "_blank">查看更多</a>
</div>
</div>
{{/allGoods}}
{{#trendInfo}}
<div class="trend-info clearfix">
{{> index/floor-header}}
<ul class="trend-list">
{{#each trendList}}
<li>
<a href="{{href}}">
<img src="{{src}}" />
<div class="main-title">{{mainTitle}}</div>
<div class="sub-title">{{Subtitle}}</div>
</a>
</li>
{{/each}}
</ul>
</div>
{{/trendInfo}}
</div>
</div>
</div>
{{> layout/footer}}
... ...
{{> layout/header}}
<div class="shop-index-page product-list-page product-page yoho-page center-content">
<div class="center-content clearfix">
{{> layout/path-nav}}
{{> product/shop-header}}
<div class="list-left pull-left">
{{> product/left-content}}
{{> product/shop-sidebar}}
</div>
<div class="list-right pull-right">
{{> product/shop-entry}}
{{> product/standard-content}}
{{> product/latest-walk}}
</div>
</div>
</div>
{{> layout/footer}}
... ...
... ... @@ -304,5 +304,10 @@
seajs.use('js/coupon/coupon');
</script>
{{/if}}
{{!-- 店铺首页 --}}
{{#if shopIndexPage}}
<script>
seajs.use('js/product/shop-index');
</script>
{{/if}}
... ...
<div class="fixed-area">
{{# goodsMenu}}
<div class="all-goods-menu">
<span class="menu-tag">所有商品</span>
<ul class="menu-list">
{{#each menuList}}
<li class="{{#if curMenu}} on {{/if}}"><a class="pjax" href="{{href}}">{{name}}</a></li>
{{/each}}
</ul>
<a href="{{url}}" class="more">MORE</a>
</div>
{{/goodsMenu}}
{{# opts}}
<div class="sort-pager">
{{# sortType}}
<a class="sort-type{{#if active}} active{{/if}} pjax" href="{{href}}">
{{name}}
{{#if hasSortOrient}}
{{#if active}}
{{#if desc}}
<span class="active-icon iconfont">&#xe603;</span>
{{^}}
<span class="active-icon iconfont">&#xe604;</span>
{{/if}}
{{^}}
<span class="iconfont">&#xe614;</span>
{{/if}}
{{^}}
<span class="iconfont">&#xe604;</span>
{{/if}}
</a>
{{/ sortType}}
{{#if list}}
{{#if oldPage}}
<div class="pager-wrap">
<p class="page-orient">
{{#if preHref}}
<a class="pjax" href="{{preHref}}">
<span class="iconfont">&#xe615;</span>
</a>
{{^}}
<span class="dis-icon iconfont">&#xe615;</span>
{{/if}}
<span>
<i>{{curPage}}</i>/{{pageCount}}
</span>
{{#if nextHref}}
<a class="pjax" href="{{nextHref}}">
<span class="iconfont">&#xe601;</span>
</a>
{{^}}
<span class="dis-icon iconfont">&#xe601;</span>
{{/if}}
</p>
</div>
{{^}}
<div class="page-nav">
{{#if preHref}}
<a class="pjax" href="{{preHref}}">
<span class="page-prev"><i class="arrow-left"></i></span>
</a>
{{^}}
<span class="page-prev"><i class="arrow-left"></i></span>
{{/if}}
{{#if nextHref}}
<a class="pjax" href="{{nextHref}}">
<span class="page-next">
下一页
<i class="arrow-right"></i>
<i class="pages">{{curPage}}</i>/{{pageCount}}
</span>
</a>
{{^}}
<span class="page-next">
下一页
<i class="arrow-right"></i>
<i class="pages">{{curPage}}</i>/{{pageCount}}
</span>
{{/if}}
</div>
{{/if}}
{{/if}}
</div>
{{/ opts}}
</div>
<div class="goods-container clearfix">
{{# list}}
{{> product/good}}
{{/list}}
<div class="good-item-wrapper">
<div class="good-info-main"></div>
<div class="good-select-color"></div>
</div>
</div>
... ...
{{# shopTopBanner}}
<div class="shop-banner">
<div class="banner-img" style="height: {{bannerHeight}}px;background: url({{banner}})"></div>
{{#if shopsType}}
<div class="shop-name">
{{brandName}}
</div>
{{/if}}
<div class="opt-wrap">
<div class="shop-intro">
<i class="shop-intro-ico"></i>
店铺介绍
</div>
<div class="shop-collect" data-id="{{brandIntro.shopId}}">
<i class="shop-collect-ico {{#if brandIntro.isFavorite}}on{{/if}}"></i>
<span class="shop-collect-text">
{{#if brandIntro.isFavorite}}
已收藏
{{else}}
收藏
{{/if}}
</span>
</div>
</div>
</div>
{{#brandIntro}}
<div class="pop-shop-intro">
<div class="shop-intro-bg"></div>
<div class="shop-intro-area">
<i class="close-btn"></i>
<div class="brand-cont">
<div class="intro-title">
<h2>{{brandName}}</h2>
<p>品牌介绍</p>
</div>
<div class="intro-cont">
{{{brandCont}}}
</div>
</div>
</div>
</div>
{{/brandIntro}}
<div class="mask"></div>
{{/ shopTopBanner}}
{{#if navigationBar}}
<ul class="shop-nav clearfix">
{{#navigationBar}}
<li class="nav-item {{#if @first}}first{{/if}} {{#if current}}current{{/if}}">
<a href="{{url}}">
{{name}}
{{#if arrow}}
<span class="iconfont">&#xe63a;</span>
{{/if}}
</a>
</li>
{{/navigationBar}}
</ul>
{{/if}}
... ...
{{#brandBrowse}}
<div class="brand-collect left-modular">
<h2 class="title">{{title}}</h2>
<ul class="left-list">
{{#each list}}
<li class="{{#if cur}} on {{/if}}"><a href="{{url}}">{{brandName}}</a></li>
{{/each}}
</ul>
</div>
{{/brandBrowse}}
{{#recommend}}
<div class="classic-recommend left-modular">
<h2 class="title">{{title}}</h2>
<ul class="left-list">
{{#each list}}
<li>
<a href="{{url}}">
<div class="classic-name">
{{#name}}
<p class="name">{{.}}</p>
{{/name}}
{{#enName}}
<p class="en-name">{{.}}</p>
{{/enName}}
</div>
<img src="{{img}}" />
</a>
</li>
{{/each}}
</ul>
</div>
{{/recommend}}
{{#hotRecommend}}
<div class="sell-recommend left-modular">
<h2 class="title">{{title}}</h2>
<ul class="left-list">
{{#each list}}
<li>
<a target="_blank" href="{{url}}"><img src="{{img}}" alt="{{title}}" /></a>
</li>
{{/each}}
</ul>
</div>
{{/hotRecommend}}
... ...
<ul>
{{#each list}}
<li>
<a class="item item-{{@index}}" href="{{url}}" target= "_blank">
<img class="lazy" data-original="{{img}}"/>
<p class="title">
{{title}}
</p>
<p class="price">
{{price}}
</p>
{{#if index}}
<span class="hat">{{index}}</span>
{{/if}}
</a>
</li>
{{/each}}
</ul>
... ...

21.3 KB | W: 0px | H: 0px

23.7 KB | W: 0px | H: 0px

  • 2-up
  • Swipe
  • Onion skin
... ... @@ -11,3 +11,5 @@ require('./brand');
require('./hotrank');
require('./item');
require('./shop-index');
... ...
/**
* 首页
* @author: bikai<kai.bi@yoho.cn>
* @date: 2016/4/26
*/
var $ = require('yoho.jquery'),
lazyLoad = require('yoho.lazyload'),
product = require('../product/product');
var $shopIntro = $('.shop-intro'),
$shopCollect = $('.shop-collect'),
$sliderLeft = $('.slider-left'),
$allGoods = $('.all-goods'),
$fixedArea = $allGoods.find('.fixed-area'),
fixedAreaTop = $fixedArea.offset() ? $fixedArea.offset().top : 0;
// Pjax
require('yoho.pjax');
require('../common/slider');
require('../product/list');
product.init(4);
lazyLoad($('img.lazy'));
if ($sliderLeft.length) {
$sliderLeft.slider();
}
$shopIntro.on('click', function() {
$('.pop-shop-intro').show();
$('.mask').show();
});
$('.close-btn, .mask').on('click', function() {
$('.pop-shop-intro').hide();
$('.mask').hide();
});
// 收藏店铺
function colloectAction() {
var $colloectIcon = $shopCollect.find('.shop-collect-ico'),
$colloectText = $shopCollect.find('.shop-collect-text'),
isFavorite = $colloectIcon.hasClass('on'),
needColloect = window.cookie('needColloect');
$.ajax({
type: 'post',
url: '/shoplist/setFavorite',
data: {
isFavorite: isFavorite ? 0 : 1,
needColloect: needColloect,
shopId: $shopCollect.data('id')
},
success: function(res) {
if (res.code === 200) {
if (isFavorite) {
$colloectIcon.removeClass('on');
$colloectText.html('收藏');
} else {
$colloectIcon.addClass('on');
$colloectText.html('已收藏');
}
if (needColloect) {
$colloectIcon.addClass('on');
$colloectText.html('已收藏');
}
} else if (res.code === 401) {
window.setCookie('needColloect', '1', {
path: '/',
domain: '.yohobuy.com',
expires: 90
});
location.href = res.url;
}
}
});
}
$shopCollect.on('click', function() {
colloectAction();
});
if (window.cookie('needColloect') * 1 === 1) {
colloectAction();
window.setCookie('needColloect', '', {
path: '/',
domain: '.yohobuy.com',
expires: 1
});
}
// 全部商品使用 pjax 翻页
$allGoods.pjax('a.pjax', '.goods-wrap', {
timeout: 5000,
scrollTo: false // 默认滚动没有动画,禁止掉
}).on('pjax:end', function() {
product.init(4);
lazyLoad($('img.lazy'));
$fixedArea = $allGoods.find('.fixed-area'); // 翻页后 fixed-area 区域有变化,需要更新选择器
// 分页后移动到全部商品
$('html, body').animate({
scrollTop: $allGoods.offset().top - 30
});
}).on('click', '.menu-list li', function() {
var $this = $(this);
$this.siblings().removeClass('on');
$this.addClass('on');
});
$(window).on('scroll', function() {
var scrollTop = $(this).scrollTop();
if (scrollTop > fixedAreaTop) {
$fixedArea.css({
position: 'fixed',
top: 0
});
} else {
$fixedArea.css({
position: 'static',
top: 0
});
}
});
... ...
... ... @@ -10,6 +10,7 @@
@import "hot-rank";
@import "shop-entry";
@import "detail";
@import "shop-index";
.product-page {
/*分页*/
... ...
.shop-index-page {
margin: 10px auto 30px;
width: 1150px;
.shop-banner {
position: relative;
.shop-name {
position: absolute;
left: 260px;
bottom: 20px;
font-size: 36px;
color: #fff;
}
.banner-img {
width: 100%;
height: 150px;
}
.opt-wrap {
position: absolute;
top: 65%;
right: 0;
padding: 0 10px;
}
.shop-intro,
.shop-collect {
display: inline-block;
width: 110px;
height: 30px;
margin-right: 10px;
font-size: 16px;
line-height: 30px;
text-align: center;
color: #fff;
border: 1px solid #fff;
cursor: pointer;
i {
background-repeat: no-repeat;
float: left;
position: relative;
left: 11px;
top: 5px;
}
.shop-intro-ico {
width: 16px;
height: 20px;
background-image: resolve(/product/shop-instro.png);
margin-right: 12px;
}
.shop-collect-ico {
width: 20px;
height: 19px;
background-image: resolve(/product/shop-collection.png);
top: 6px;
margin-right: 12px;
&.on {
background-image: resolve(/product/shop-collection-on.png);
}
}
}
}
.shop-nav {
box-sizing: border-box;
margin-bottom: 30px;
padding: 0 20px;
width: 100%;
height: 40px;
color: #fff;
background: #000;
font-size: 16px;
a {
position: relative;
top: 8px;
display: inline-block;
line-height: 26px;
color: #fff;
}
.nav-item {
position: relative;
float: left;
width: 160px;
text-align: center;
&.first {
width: 100px;
text-align: left;
}
}
.current {
a {
border-bottom: 2px solid #fff;
}
}
}
.coupon {
margin-top: 20px;
width: 100%;
height: 80px;
.coupon-title {
width: 162px;
height: 100%;
background: url(/product/coupon-title.png);
}
}
.slider-wrap {
height: 360px;
}
.slider-left {
float: left;
margin-right: 10px;
width: 660px;
height: 100%;
overflow: hidden;
img {
width: 100%;
height: 100%;
}
.slide-pagination,
.slide-switch {
display: none;
}
}
.slider-right {
float: left;
width: 300px;
height: 100%;
.slider-item {
display: block;
margin-bottom: 10px;
width: 100%;
height: 175px;
}
}
.floor-header {
margin-top: 50px;
}
.new-arrivel,
.hot-single {
width: 980px;
.item {
float: left;
position: relative;
margin-right: 10px;
margin-bottom: 20px;
width: 235px;
height: 315px;
font-size: 14px;
text-align: center;
line-height: 1.5;
background: #f5f5f5;
img {
width: 235px;
height: 250px;
}
.title {
width: 220px;
padding: 0 5px;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
}
.hat {
position: absolute;
top: 0;
right: 0;
width: 50px;
height: 50px;
color: #ffc513;
text-align: center;
line-height: 57px;
background: url(/product/hat.png);
}
}
.mask {
background-color: #000;
opacity: .5;
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 1001;
display: none;
cursor: pointer;
}
.pop-shop-intro {
display: none;
}
.shop-intro-bg {
width: 908px;
height: 604px;
background-color: #000;
opacity: .5;
position: fixed;
left: 50%;
top: 50%;
z-index: 1002;
margin: -302px 0 0 -454px;
}
.shop-intro-area {
width: 898px;
height: 594px;
padding: 60px 10px 35px 40px;
background-color: #fff;
position: fixed;
left: 50%;
top: 50%;
margin: -297px 0 0 -449px;
z-index: 1003;
box-sizing: border-box;
.close-btn {
width: 18px;
height: 18px;
background-image: resolve(/product/shop-instro-close.png);
position: absolute;
right: 20px;
top: 20px;
cursor: pointer;
}
.brand-cont {
overflow: auto;
width: 100%;
height: 499px;
padding-right: 30px;
box-sizing: border-box;
}
.intro-title {
float: left;
h2 {
width: 100%;
float: left;
text-align: left;
font-size: 26px;
font-weight: bold;
color: #000;
font-style: italic;
}
p {
font-family: "黑体";
font-size: 20px;
text-align: left;
padding: 10px 0;
float: left;
}
}
.intro-cont {
width: 100%;
float: left;
margin-top: 55px;
font-size: 14px;
line-height: 20px;
p {
text-indent: 2em;
}
img {
width: 100%;
margin-top: 10px;
}
}
}
.fixed-area {
background: #fff;
z-index: 1;
width: 970px;
}
.all-goods-menu {
width: 100%;
height: 40px;
line-height: 40px;
.menu-tag {
color: #d0021b;
font-size: 18px;
font-weight: bold;
text-align: left;
padding: 0 20px 0 10px;
border-right: 1px solid #000;
float: left;
}
.menu-list {
width: 810px;
height: 40px;
overflow: hidden;
float: left;
font-size: 14px;
li {
display: inline-block;
padding: 0 15px;
}
.on {
background: #000;
height: 28px;
line-height: 28px;
a {
color: #fff;
}
}
}
.more {
font-size: 14px;
float: right;
}
}
.sort-pager .sort-type:first-child .iconfont {
display: inline-block;
}
.loading {
position: relative;
width: 100%;
text-align: center;
a {
display: block;
height: 35px;
width: 120px;
margin: 0 auto 0;
background-color: #000;
color: #fff;
font-size: 14px;
line-height: 35px;
text-align: center;
}
}
.trend-info {
width: 100%;
.trend-list {
width: 100%;
li {
float: left;
width: 316px;
margin-left: 10px;
text-align: center;
&:first-child {
margin-left: 0;
}
}
img {
width: 100%;
height: 181px;
}
.main-title,
.sub-title {
box-sizing: border-box;
font-size: 16px;
margin-top: 15px;
padding: 0 10px;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
line-height: 24px;
}
.sub-title {
margin-top: 0;
font-size: 14px;
}
}
}
.goods-container {
.good-info {
width: 235px;
height: auto;
margin-bottom: 35px;
}
.good-detail-text {
text-align: left;
}
}
.left-modular {
width: 160px;
font-size: 14px;
margin-top: 20px;
float: left;
.title {
width: 100%;
height: 25px;
line-height: 25px;
background: #000;
color: #fff;
font-family: "黑体";
padding-left: 14px;
box-sizing: border-box;
}
.left-list {
width: 100%;
margin-top: 5px;
li {
width: 100%;
height: 42px;
line-height: 42px;
background: #f5f5f5;
float: left;
box-sizing: border-box;
margin-top: 5px;
padding-left: 14px;
a {
color: #000;
}
&.on {
border: 1px solid #000;
}
}
}
}
.classic-recommend {
.left-list li {
height: 50px;
line-height: 50px;
}
.classic-name {
width: 96px;
display: inline-block;
line-height: 14px;
vertical-align: middle;
.name {
font-size: 14px;
}
.en-name {
font-size: 12px;
}
}
img {
width: 40px;
max-height: 40px;
margin-right: 5px;
vertical-align: middle;
}
}
.sell-recommend {
.left-list li {
padding-left: 0;
height: auto;
margin-bottom: 25px;
line-height: inherit;
img {
width: 100%;
}
}
}
::-webkit-scrollbar {
width: 16px;
height: 16px;
}
::-webkit-scrollbar-track,
::-webkit-scrollbar-thumb {
border-radius: 999px;
border: 5px solid transparent;
}
::-webkit-scrollbar-track {
box-shadow: 0 0 6px rgba(0, 0, 0, 0) inset;
}
::-webkit-scrollbar-thumb {
min-height: 20px;
background-clip: content-box;
box-shadow: 0 0 0 6px rgba(0, 0, 0, .3) inset;
}
::-webkit-scrollbar-corner {
background: transparent;
}
.page-nav {
padding: 7px 0;
float: right;
font-size: 14px;
.page-prev {
width: 33px;
height: 33px;
background: #ccc;
text-align: center;
float: left;
}
.arrow-left {
width: 10px;
height: 10px;
display: inline-block;
position: relative;
top: -7px;
background: resolve(/product/arrow-left.png) no-repeat;
}
a .page-prev,
a .page-next {
background: #000;
color: #fff;
}
.page-next {
min-width: 110px;
height: 33px;
background: #a9a9a9;
float: left;
margin-left: 1px;
line-height: 33px;
padding-left: 10px;
box-sizing: border-box;
padding-right: 10px;
}
.arrow-right {
width: 10px;
height: 10px;
display: inline-block;
vertical-align: middle;
background: resolve(/product/arrow-right.png) no-repeat;
}
.pages {
margin-left: 10px;
}
}
}
... ...
... ... @@ -152,23 +152,12 @@ class BrandsModel
/**
* 根据品牌域名处理相关品牌参数
* @param $domain (品牌域名)
* @param $type (根据type调取同一接口不同的数据)
* @return array|bool
*/
public static function getBrandByDomain($domain, $type)
public static function getBrandByDomain($domain)
{
//根据传来的type值,选择请求需要的数据
switch ($type) {
case 1:
$fields = 'id,brand_name,brand_name_cn,brand_name_en,brand_domain,brand_alif,brand_banner,brand_ico,static_content_code';
break;
case 2:
$fields = 'id,brand_name,brand_name_cn,brand_name_en,brand_banner,brand_ico,brand_intro';
default:
break;
}
//调用接口获得数据
$brandInfo = BrandData::getBrandLogoByDomain($domain, $fields);
$brandInfo = BrandData::getBrandLogoByDomain($domain);
$result = array();
//组装品牌页顶部banner条需要的数据
if (!empty($brandInfo['data']) && $brandInfo['code'] == 200) {
... ... @@ -178,6 +167,10 @@ class BrandsModel
$result['brandNameEn'] = isset($brandInfo['data']['brand_name_en']) ? $brandInfo['data']['brand_name_en'] : '';
$result['brandNameCn'] = isset($brandInfo['data']['brand_name_cn']) ? $brandInfo['data']['brand_name_cn'] : '';
$result['brandAbout'] = isset($brandInfo['data']['brand_intro']) ? $brandInfo['data']['brand_intro'] : '';
$result['shopTemplateType'] = isset($brandInfo['data']['shop_template_type']) ?
intval($brandInfo['data']['shop_template_type']) : '';
$result['type'] = isset($brandInfo['data']['type']) ? $brandInfo['data']['type'] : 0;
$result['shopId'] = isset($brandInfo['data']['shop_id']) ? $brandInfo['data']['shop_id'] : '';
}
else {
return false;
... ...
<?php
namespace Product;
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 (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), $parameters);
switch ($fun) {
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;
case 'brandBrowse':
$data['brandBrowse'] = array('title' => '品牌集合', 'list'=> $list);
break;
case 'recommend':
$data['recommend'] = array(
'title' => isset($list[0]['title']) ? $list[0]['title'] : '经典推荐',
'list'=> $list
);
break;
case 'hotRecommend':
$data['hotRecommend'] = array(
'title' => isset($list[0]['title']) ? $list[0]['title'] : '热销推荐',
'list'=> $list
);
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();
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));
$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']['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), $parameters);
switch ($fun) {
case 'newProducts':
case 'hotProducts':
break;
case 'goodsTabBar':
if (isset($list['hot'])) {
$data['hotSingle']['navs'] = $list['hot'];
} else if ($list['new']) {
$data['newArrivel']['navs'] = $list['new'];
}
break;
case 'brandBrowse':
$data['brandBrowse'] = array('title' => '品牌集合', 'list'=> $list);
break;
case 'recommend':
$data['recommend'] = array(
'title' => isset($list[0]['title']) ? $list[0]['title'] : '经典推荐',
'list'=> $list
);
break;
case 'hotRecommend':
$data['hotRecommend'] = array(
'title' => isset($list[0]['title']) ? $list[0]['title'] : '热销推荐',
'list'=> $list
);
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();
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'] = $result['pathNav'];
$data['goods'] = $result['goods'];
$data['opts'] = $result['opts'];
$data['leftContent'] = isset($result['leftContent']) ? $result['leftContent'] : '';
$data['filters'] = $result['filters'];
$data['pathNav'] = $result['pathNav'];
// $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();
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' => '',
'bannerHeight' => 150
);
if (isset($data['resource_data'][0]['shopSrc'])) {
$result['banner'] = self::imageView2($data['resource_data'][0]['shopSrc'], 1150, 150);
}
return $result;
}
/**
* 导航栏 资源位
* @param type $data
* @return type []
*/
public static function navigationBar($data, $parameters = array())
{
$shopNav = array(
array(
'name' => '店铺首页',
'url' => '/?navBar=0',
),
array(
'name' => '全部商品',
'url' => self::$shopListUrl . '?navBar=1',
'arrow' => true,
),
array(
'name' => '人气单品',
'url' => self::$shopListUrl . '?navBar=2&order=s_n_desc',
),
array(
'name' => '新品上架',
'url' => self::$shopListUrl . '?navBar=3&order=s_t_desc',
),
);
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' => $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' => $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'=> $resource['enName'],
'name'=> $resource['name'],
'img'=> self::imageView2($resource['src'], 50, 50),
'title'=> $resource['title'],
'url'=> $resource['url'],
);
}
return $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'=> $resource['url'],
);
}
return $result;
}
/**
* 品牌一览
* @param type $data
* @return type []
*/
public static function brandBrowse($data, $parameters = array())
{
$result = array();
$brand = isset($parameters['brand']) ? $parameters['brand'] : '';
foreach ($data['resource_data'] as $resource) {
$result[] = array(
'url' => Helpers::url(
self::$shopListUrl,
array(
'brand' => $resource['id'],
'navBar' => 1
),
''
),
'brandName' => $resource['brandName'],
'cur' => ($brand === strval($resource['id']))
);
}
return $result;
}
/**
* 商品标签栏
* @param type $data
* @return type []
*/
public static function goodsTabBar($data)
{
$result = array();
if (isset($data['resource_data'])) {
$result = $data['resource_data'];
}
return $result;
}
/**
* 新品上架
* @param type $data
* @return type []
*/
public static function newProducts($data)
{
$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)
{
$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 string $tag 搜索内容
* @return array []
*/
public static function getArticle($tag = '')
{
$result = array();
$article = GuangListData::article('1,2,3', 0, 0, '', 0, $tag, '', 3);
if (!isset($article['data']['list']['artList'])) {
return $result;
}
foreach ($article['data']['list']['artList'] as $artList) {
$result['trendList'][] = array(
'href' => $artList['url'],
'src' => self::imageView2(substr($artList['src'], 0, strpos($artList['src'], '?')), 264, 173),
'mainTitle' => $artList['title'],
'Subtitle' => $artList['intro']
);
}
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 "{$src}imageView2/1/w/{$width}/h/{$heigh}";
}
/**
* 解析resource_data 参数
* @param type $data
* @return type []
*/
public static function getResourceData($data)
{
$data['resource_data'] = isset($data['resource_data']) ? json_decode($data['resource_data'], true) : array();
return $data;
}
public static function shopsDecoratorList($shopId)
{
return ShopData::shopsDecoratorList($shopId);
}
public static function getIntro($shopId, $uid)
{
$data = array('brandName' => '', 'brandCont' => '', 'domain'=> '', 'logo'=> '', 'is_favorite'=> false);
$intro = ShopData::getIntro($shopId, $uid);
if ($intro['code'] === 200 && isset($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'),
'multBrandShopType'=> $intro['data']['mult_brand_shop_type']
);
}
$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;
}
public static function getShopsBrands($shopId)
{
return ShopData::getShopsBrands($shopId);
}
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 (isset($result['code']) && $result['code'] === 200 && !empty($result['data'])) {
$data = $result['data'];
}
return ShopData::byDomain($domain);
}
}
\ No newline at end of file
... ...
... ... @@ -7,10 +7,11 @@ use Product\HotrankModel;
use Index\HomeModel;
use WebPlugin\Helpers;
use LibModels\Web\Product\BrandData;
use Product\ShopModel;
class IndexController extends WebAction
{
private $_information = array('code' => 400, 'message' => '操作失败,请稍后再试!');
/**
* 品牌首页
*/
... ... @@ -22,11 +23,27 @@ class IndexController extends WebAction
$this->go(SITE_MAIN);
}
//根据品牌域名获取品牌id(同时判断品牌域名是否有效),无效跳转首页
$type = 1;
$result = BrandsModel::getBrandByDomain($domain, $type);
$result = BrandsModel::getBrandByDomain($domain);
if (!$result) {
$this->go(SITE_MAIN);
}
$type = intval(isset($result['type']) ? $result['type'] : '');
switch ($type) {
case 1:
//无单品店有多品店:1--->搜索页
$this->go('http://search.yohobuy.com/?query=' . $domain);
exit(0);
break;
case 2:
//店铺页面
//$shopTemplateType 1基础模板,2经典模板,
if ($result['shopTemplateType'] === 2 && !empty($result['shopId'])) {
$this->shopHome($result['shopId']);
exit(0);
}
break;
}
//获取uid
$uid = $this->getUid();
... ... @@ -125,8 +142,7 @@ class IndexController extends WebAction
//根据品牌域名获取品牌id(同时判断品牌域名是否有效),无效跳转首页
$type = 2;
$result = BrandsModel::getBrandByDomain($domain, $type);
$result = BrandsModel::getBrandByDomain($domain);
if (!$result) {
$this->go(SITE_MAIN);
}
... ... @@ -260,4 +276,148 @@ class IndexController extends WebAction
}
/**
* 品牌店铺首页
*/
public function shopHome($shopId)
{
$domain = $this->param('named');
// 设置头部数据
$this->setWebNavHeader();
$misort = $this->get('misort');
$pjax = $this->get('_pjax');
if ($pjax) {
$data = ShopModel::getGoods(
array(
'shop' => $shopId
),
array(
'controller' => 'Index',
'action' => 'index',
'misort' => $misort
)
);
$data['shopIndexPage'] = true;
// 渲染模板
$this->_view->display('goods-list', $data);
exit();
}
//获取uid
$uid = $this->getUid();
$parameters = array(
'condition' => array(
'shop' => $shopId
),
'options' => array(
'controller' => 'Index',
'action' => 'index',
'misort' => $misort
),
'uid' => $uid,
'navBar' => $this->get('navBar', 0),
'brand' => $this->get('brand', 0)
);
$data = array_merge(
array(
'shopIndexPage' => true,
'pathNav' => false, // pathNav数据结构同其他页面
'coupon' => false, // 先不做
'trendInfo' => ShopModel::getArticle($domain),
),
ShopModel::getData($shopId, $parameters)
);
$this->_view->display('shop-index', $data);
}
//店铺列表页
public function shopListAction()
{
//品牌域名,没有获取到品牌域名的跳转首页
$domain = $this->param('named');
//根据品牌域名获取品牌id(同时判断品牌域名是否有效),无效跳转首页
$result = BrandsModel::getBrandByDomain($domain);
if (isset($result['code']) && $result['code'] !== 200 || empty($result['shopId'])) {
$this->go(SITE_MAIN);
}
$shopId = $result['shopId'];
//获取uid
$uid = $this->getUid();
// 设置头部数据
$this->setWebNavHeader();
$parameters = array(
'condition' => array(
'shop' => $shopId
),
'options' => array(
'controller' => 'Index',
'action' => 'index',
),
'uid' => $uid,
'navBar' => $this->get('navBar', 1),
'brand' => $this->get('brand', 0)
);
$data = array_merge(
array(
'shopIndexPage' => true,
'pathNav' => false, // pathNav数据结构同其他页面
'coupon' => false, // 先不做
),
ShopModel::getShopListData($shopId, $parameters)
);
$this->_view->display('shop-list', $data);
}
/**
* 店铺收藏与取消
* @return type json
*/
public function setFavoriteAction()
{
$result = $this->_information;
if (!$this->isAjax()) {
return;
}
//获取uid
$uid = $this->getUid();
do{
if (empty($uid)) {
$result = array(
'code' => 401,
'message' => '请先登录!',
'url' => Helpers::url('/signin.html', array(), 'default')
);
break;
}
$shopId = $this->post('shopId');
$isFavorite = $this->post('isFavorite');
$needColloect = $this->post('needColloect', 0);
if (empty($shopId)) {
break;
}
//$needColloect 说明刚登录状态 是cookie传的值
$isFavorite = $needColloect * 1 === 1 ? true : $isFavorite;
$result = ShopModel::setFavorite($shopId, $isFavorite, $uid);
} while (false);
$this->echoJson($result);
}
}
... ...
... ... @@ -49,6 +49,20 @@ routes.item.route.action = Index
routes.item.map.1 = productId
routes.item.map.2 = goodsId
;店铺装修
routes.brandshopList.type = "rewrite"
routes.brandshopList.match = "/shoplist"
routes.brandshopList.route.module = Product
routes.brandshopList.route.controller = Index
routes.brandshopList.route.action = shopList
;店铺装修-收藏与取消
routes.brandFavorite.type = "rewrite"
routes.brandFavorite.match = "/shoplist/setFavorite"
routes.brandFavorite.route.module = Product
routes.brandFavorite.route.controller = Index
routes.brandFavorite.route.action = setFavorite
routes.itemshow.type = "regex"
routes.itemshow.match = "#/product/show_([0-9]+)_([0-9]+).html#"
routes.itemshow.route.module = Product
... ...