* @since 1.0
*/
class Index
{
// 当前产品
protected $_product;
// 产品页面的title
protected $_title;
// 产品的主键对应的值
protected $_primaryVal;
// 产品的spu属性数组。
protected $_productSpuAttrArr;
// 以图片方式显示的spu属性
protected $_spuAttrShowAsImg;
// 在产品详细页面,在橱窗图部分,以放大镜的方式显示的产品图片列表
protected $_image_thumbnails;
// 在产品详细页面,在产品描述部分显示的产品图片列表
protected $_image_detail;
public function getLastData()
{
$productImgSize = Yii::$app->controller->module->params['productImgSize'];
$productImgMagnifier = Yii::$app->controller->module->params['productImgMagnifier'];
if(!$this->initProduct()){
Yii::$service->url->redirect404();
return;
}
ReviewHelper::initReviewConfig();
$ReviewAndStarCount = ReviewHelper::getReviewAndStarCount($this->_product);
list($review_count, $reviw_rate_star_average) = $ReviewAndStarCount;
$this->filterProductImg($this->_product['image']);
$groupAttr = Yii::$service->product->getGroupAttr($this->_product['attr_group']);
$groupAttrArr = $this->getGroupAttrArr($groupAttr);
return [
'groupAttrArr' => $groupAttrArr,
'name' => Yii::$service->store->getStoreAttrVal($this->_product['name'], 'name'),
'image_thumbnails' => $this->_image_thumbnails,
'image_detail' => $this->_image_detail,
'sku' => $this->_product['sku'],
'spu' => $this->_product['spu'],
'attr_group' => $this->_product['attr_group'],
'review_count' => $review_count,
'reviw_rate_star_average' => $reviw_rate_star_average,
'price_info' => $this->getProductPriceInfo(),
'tier_price' => $this->_product['tier_price'],
'media_size' => [
'small_img_width' => $productImgSize['small_img_width'],
'small_img_height' => $productImgSize['small_img_height'],
'middle_img_width' => $productImgSize['middle_img_width'],
],
'productImgMagnifier' => $productImgMagnifier,
'options' => $this->getSameSpuInfo(),
'custom_option' => $this->_product['custom_option'],
'description' => Yii::$service->store->getStoreAttrVal($this->_product['description'], 'description'),
'_id' => $this->_product['_id'],
'buy_also_buy' => $this->getProductBySkus($skus),
];
}
public function getGroupAttrArr($groupAttr){
$gArr = [];
if(is_array($groupAttr)){
foreach($groupAttr as $attr){
if(isset($this->_product[$attr]) && $this->_product[$attr]){
$gArr[$attr] = $this->_product[$attr];
}
}
}
//var_dump($gArr);
return $gArr;
}
/**
* @property $product_images | Array ,产品的图片属性
* 根据图片数组,得到橱窗图,和描述图
* 橱窗图:在产品详细页面顶部,放大镜显示部分的产品列表
* 描述图,在产品description文字描述后面显示的产品图片。
*/
public function filterProductImg($product_images){
$this->_image_thumbnails = $product_images;
//$this->_image_detail['gallery'] = $product_images['gallery'];
if(isset($product_images['gallery']) && is_array($product_images['gallery'])){
$thumbnails_arr = [];
$detail_arr = [];
foreach($product_images['gallery'] as $one){
$is_thumbnails = $one['is_thumbnails'];
$is_detail = $one['is_detail'];
if($is_thumbnails == 1){
$thumbnails_arr[] = $one;
}
if($is_detail == 1){
$detail_arr[] = $one;
}
}
$this->_image_thumbnails['gallery'] = $thumbnails_arr;
$this->_image_detail = $detail_arr;
}
if(isset($product_images['main']['is_detail']) && $product_images['main']['is_detail'] == 1 ){
$this->_image_detail[] = $product_images['main'];
}
}
/**废弃
* @property $data | Array 和当前产品的spu相同,但sku不同的产品 数组。
* @property $current_size | String 当前产品的size值
* @property $current_color | String 当前产品的颜色值
* @return array 分别为
* $all_attr1 所有的颜色数组
* $all_attr2 所有的尺码数组
* $attr1_2_attr2 当前尺码下的所有颜色数组。
* $attr2_2_attr1 当前颜色下的所有尺码数组。
*/
protected function getAttr1AndAttr2Info($data, $current_attr1, $current_attr2, $attr1, $attr2)
{
$all_attr1 = [];
$all_attr2 = [];
$attr1_2_attr2 = [];
$attr2_2_attr1 = [];
//var_dump($data);
foreach ($data as $one) {
$attr1_val = isset($one[$attr1]) ? $one[$attr1] : '';
$attr2_val = isset($one[$attr2]) ? $one[$attr2] : '';
//echo $attr1_val;
//echo $size;
//echo '##';
$image = $one['image'];
$name = $one['name'];
$url_key = $one['url_key'];
if ($attr1_val || $attr2_val) {
if ($attr1_val) {
$all_attr1[$attr1_val] = [
'name' => $name,
'image' => $image,
'url_key' => $url_key,
];
}
if ($attr2_val) {
$all_attr2[$attr2_val] = [
'name' => $name,
'image' => $image,
'url_key' => $url_key,
];
}
//echo $attr2_val.'#'.$current_attr2;
//echo '
';
if ($attr2_val && $current_attr2 == $attr2_val) {
$attr1_2_attr2[$attr1_val] = [
'name' => $name,
'image' => $image,
'url_key' => $url_key,
];
}
if ($attr1_val && $current_attr1 == $attr1_val) {
$attr2_2_attr1[$attr2_val] = [
'name' => $name,
'image' => $image,
'url_key' => $url_key,
];
}
}
}
return [$all_attr1, $all_attr2, $attr1_2_attr2, $attr2_2_attr1];
}
/**
* @property $select | Array , 需要查询的字段。
* 得到当前spu下面的所有的sku的数组、
* 这个是为了产品详细页面的spu下面的产品切换,譬如同一spu下的不同的颜色尺码切换。
*/
protected function getSpuData($select)
{
$spu = $this->_product['spu'];
$select = array_merge($select, $this->_productSpuAttrArr);
$filter = [
'select' => $select,
'where' => [
['spu' => $spu],
],
'asArray' => true,
];
$coll = Yii::$service->product->coll($filter);
return $coll['coll'];
}
/**
* @return Array得到spu下面的sku的spu属性的数据。用于在产品
* 得到spu下面的sku的spu属性的数据。用于在产品详细页面显示其他的sku
* 譬如页面:https://fecshop.appfront.fancyecommerce.com/raglan-sleeves-letter-printed-crew-neck-sweatshirt-53386451-77774122
* 该spu的其他sku的颜色尺码也在这里显示出来。
*/
protected function getSameSpuInfo()
{
$groupAttr = Yii::$service->product->getGroupAttr($this->_product['attr_group']);
// 当前的产品对应的spu属性组的属性,譬如 ['color','size','myyy']
$this->_productSpuAttrArr = Yii::$service->product->getSpuAttr($this->_product['attr_group']);
//var_dump($this->_productSpuAttrArr);exit;
$this->_spuAttrShowAsImg = Yii::$service->product->getSpuImgAttr($this->_product['attr_group']);
if (!is_array($this->_productSpuAttrArr) || empty($this->_productSpuAttrArr)) {
return;
}
// 当前的spu属性对应值数组 $['color'] = 'red'
$this->_currentSpuAttrValArr = [];
foreach ($this->_productSpuAttrArr as $spuAttr) {
$spuAttrVal = $this->_product[$spuAttr];
if ($spuAttrVal) {
$this->_currentSpuAttrValArr[$spuAttr] = $spuAttrVal;
} else {
// 如果某个spuAttr的值为空,则退出,这个说明产品数据有问题。
return;
}
}
// 得到当前的spu下面的所有的值
$select = ['name', 'image', 'url_key'];
$data = $this->getSpuData($select);
$spuValColl = [];
// 通过值,找到spu。
$reverse_val_spu = [];
if (is_array($data) && !empty($data)) {
foreach ($data as $one) {
$reverse_key = '';
foreach ($this->_productSpuAttrArr as $spuAttr) {
$spuValColl[$spuAttr][$one[$spuAttr]] = $one[$spuAttr];
$reverse_key .= $one[$spuAttr];
}
//$active = 'class="active"';
$one['main_img'] = isset($one['image']['main']['image']) ? $one['image']['main']['image'] : '';
$one['url'] = Yii::$service->url->getUrl($one['url_key']);
$reverse_val_spu[$reverse_key] = $one;
$showAsImgVal = $one[$this->_spuAttrShowAsImg];
if ($showAsImgVal) {
if (!isset($this->_spuAttrShowAsImgArr[$this->_spuAttrShowAsImg])) {
$this->_spuAttrShowAsImgArr[$showAsImgVal] = $one;
}
}
}
}
// 得到各个spu属性对应的值的集合。
foreach ($spuValColl as $spuAttr => $attrValArr) {
$spuValColl[$spuAttr] = array_unique($attrValArr);
$spuValColl[$spuAttr] = $this->sortSpuAttr($spuAttr, $spuValColl[$spuAttr]);
}
$spuShowArr = [];
foreach ($spuValColl as $spuAttr => $attrValArr) {
$attr_coll = [];
foreach ($attrValArr as $attrVal) {
$attr_info = $this->getSpuAttrInfo($spuAttr, $attrVal, $reverse_val_spu);
$attr_coll[] = $attr_info;
//[
// 'attr_val' => $attr,
//];
}
$spuShowArr[] = [
'label' => $spuAttr,
'value' => $attr_coll,
];
}
return $spuShowArr;
}
// spu属性部分
protected function getSpuAttrInfo($spuAttr, $attrVal, $reverse_val_spu)
{
$current = $this->_currentSpuAttrValArr;
$active = false;
if (isset($this->_currentSpuAttrValArr[$spuAttr])) {
if ($attrVal != $this->_currentSpuAttrValArr[$spuAttr]) {
$current[$spuAttr] = $attrVal;
} else {
$active = true;
}
}
$reverse_key = $this->generateSpuReverseKey($current);
$return = [];
$return['attr_val'] = $attrVal;
$return['active'] = 'noactive';
//echo $reverse_key."
";
if (isset($reverse_val_spu[$reverse_key]) && is_array($reverse_val_spu[$reverse_key])) {
$return['active'] = 'active';
$arr = $reverse_val_spu[$reverse_key];
foreach ($arr as $k=>$v) {
$return[$k] = $v;
}
if ($spuAttr == $this->_spuAttrShowAsImg) {
$return['show_as_img'] = $arr['main_img'];
}
} else {
// 如果是图片,不存在,则使用备用的。
if ($spuAttr == $this->_spuAttrShowAsImg) {
$return['active'] = 'active';
$arr = $this->_spuAttrShowAsImgArr[$attrVal];
if (is_array($arr) && !empty($arr)) {
foreach ($arr as $k=>$v) {
$return[$k] = $v;
}
}
$return['show_as_img'] = $arr['main_img'];
}
}
if ($active) {
$return['active'] = 'current';
}
return $return;
}
protected function generateSpuReverseKey($one)
{
$reverse_key = '';
foreach ($this->_productSpuAttrArr as $spuAttr) {
$spuValColl[$spuAttr][] = $one[$spuAttr];
$reverse_key .= $one[$spuAttr];
}
return $reverse_key;
}
/**
* @property $data | Array 各个尺码对应的产品数组
* @return array 排序后的数组
* 该函数,按照在配置中的size的顺序,将$data中的数据进行排序,让其按照尺码的由小到大的顺序
* 排列,譬如 :s,m,l,xl,xxl,xxxl等
*/
protected function sortSpuAttr($spuAttr, $data)
{
// 对size排序一下
$size = [];
$attr_group = $this->_product['attr_group'];
$attrInfo = Yii::$service->product->getGroupAttrInfo($attr_group);
$size_arr = isset($attrInfo[$spuAttr]['display']['data']) ? $attrInfo[$spuAttr]['display']['data'] : '';
$d_arr = [];
if (is_array($size_arr) && !empty($size_arr)) {
foreach ($size_arr as $size) {
if (isset($data[$size])) {
$d_arr[$size] = $data[$size];
}
}
if (!empty($d_arr)) {
return $d_arr;
}
}
return $data;
}
/**
* @return array
* 得到当前货币状态下的产品的价格和特价信息。
*/
protected function getProductPriceInfo()
{
$price = $this->_product['price'];
$special_price = $this->_product['special_price'];
$special_from = $this->_product['special_from'];
$special_to = $this->_product['special_to'];
return Yii::$service->product->price->getCurrentCurrencyProductPriceInfo($price, $special_price, $special_from, $special_to);
}
/**
* 初始化数据包括
* 主键值:$this->_primaryVal
* 当前产品对象:$this->_product
* Meta keywords , Meta Description等信息的设置。
* Title的设置。
* 根据当前产品的attr_group(属性组信息)重新给Product Model增加相应的属性组信息
* 然后,重新获取当前产品对象:$this->_product,此时加入了配置中属性组对应的属性。
*/
protected function initProduct()
{
$primaryKey = Yii::$service->product->getPrimaryKey();
$primaryVal = Yii::$app->request->get($primaryKey);
$this->_primaryVal = $primaryVal;
$product = Yii::$service->product->getByPrimaryKey($primaryVal);
if ($product) {
$enableStatus = Yii::$service->product->getEnableStatus();
if ($product['status'] != $enableStatus){
return false;
}
} else {
return false;
}
$this->_product = $product;
Yii::$app->view->registerMetaTag([
'name' => 'keywords',
'content' => Yii::$service->store->getStoreAttrVal($product['meta_keywords'], 'meta_keywords'),
]);
Yii::$app->view->registerMetaTag([
'name' => 'description',
'content' => Yii::$service->store->getStoreAttrVal($product['meta_description'], 'meta_description'),
]);
$this->_title = Yii::$service->store->getStoreAttrVal($product['meta_title'], 'meta_title');
$name = Yii::$service->store->getStoreAttrVal($product['name'], 'name');
//$this->breadcrumbs($name);
$this->_title = $this->_title ? $this->_title : $name;
Yii::$app->view->title = $this->_title;
//$this->_where = $this->initWhere();
// 通过上面查询的属性组,得到属性组对应的属性列表
// 然后重新查询产品
$attr_group = $this->_product['attr_group'];
Yii::$service->product->addGroupAttrs($attr_group);
// 重新查询产品信息。
$product = Yii::$service->product->getByPrimaryKey($primaryVal);
$this->_product = $product;
return true;
}
// 面包屑导航
protected function breadcrumbs($name)
{
if (Yii::$app->controller->module->params['category_breadcrumbs']) {
$parent_info = Yii::$service->category->getAllParentInfo($this->_category['parent_id']);
if (is_array($parent_info) && !empty($parent_info)) {
foreach ($parent_info as $info) {
$parent_name = Yii::$service->store->getStoreAttrVal($info['name'], 'name');
$parent_url = Yii::$service->url->getUrl($info['url_key']);
Yii::$service->page->breadcrumbs->addItems(['name' => $parent_name, 'url' => $parent_url]);
}
}
Yii::$service->page->breadcrumbs->addItems(['name' => $name]);
} else {
Yii::$service->page->breadcrumbs->active = false;
}
}
// 买了的人还买了什么,通过产品字段取出来sku,然后查询得到。
protected function getProductBySkus($skus)
{
$buy_also_buy_sku = $this->_product['buy_also_buy_sku'];
if ($buy_also_buy_sku) {
$skus = explode(',', $buy_also_buy_sku);
if (is_array($skus) && !empty($skus)) {
$filter['select'] = [
'sku', 'spu', 'name', 'image',
'price', 'special_price',
'special_from', 'special_to',
'url_key', 'score',
];
$filter['where'] = ['in', 'sku', $skus];
$products = Yii::$service->product->getProducts($filter);
//var_dump($products);
$products = Yii::$service->category->product->convertToCategoryInfo($products);
return $products;
}
}
}
}