自己定义好spu属性,第一个产品 添加没问题。第二产品 必定会被删

bug问题 · voima · 于 4年前 发布 · 1303 次阅读

1、定义好 2个 spu 属性 2、分组属性 3、添加产品,选择 spu属性,增加 sku 编码 。 问题出现在添加第二个产品的时候,选择和第一个产品同样的分组,第二个产品保存后被删,product_flat 没有了第二个产品的数据

共收到 5 条回复
Fecmall#14年前 0 个赞

1.通过QQ群得知,你这个是fecbbc多商户的问题

2.这个问题已经处理过了,你可以在fecmall后台进行升级

3.论坛可以发图,上传后是这样的字符串![](https://i.loli.net/2020/03/07/QujhoakpEmlvXYw.png),保存就可以看到图

Fecmall#24年前 0 个赞

如果你不想升级,贴一下代码你参看:

admin后台编辑产品

<?php
/**
 * FecShop file.
 *
 * @link http://www.fecshop.com/
 * @copyright Copyright (c) 2016 FecShop Software LLC
 * @license http://www.fecshop.com/license/
 */

namespace fecbbc\app\appadmin\modules\Catalog\block\productinfo;

use fec\helpers\CRequest;
use fec\helpers\CUrl;
use fecshop\app\appadmin\interfaces\base\AppadminbaseBlockEditInterface;
use fecshop\app\appadmin\modules\AppadminbaseBlockEdit;
//use fecshop\app\appadmin\modules\Catalog\block\productinfo\index\Attr;
use Yii;

/**
 * block catalog/productinfo.
 * @author Terry Zhao <2358269014@qq.com>
 * @since 1.0
 */
class Managerbatchedit extends AppadminbaseBlockEdit implements AppadminbaseBlockEditInterface
{
    public $_saveUrl;
    protected $_attr;
    protected $_custom_option_list_str;
    /**
     * 为了可以使用rewriteMap,use 引入的文件统一采用下面的方式,通过Yii::mapGet()得到className和Object
     */
    protected $_attrBlockName = '\fecbbc\app\appadmin\modules\Catalog\block\productinfo\index\BatchAttr';
    protected $_attrBlock;

    public function init()
    {
        /**
         * 通过Yii::mapGet() 得到重写后的class类名以及对象。Yii::mapGet是在文件@fecshop\yii\Yii.php中
         */
        $this->_attrBlockName = Yii::mapGetName($this->_attrBlockName);  
        
        $this->_saveUrl = CUrl::getUrl('catalog/productinfo/managerbatcheditsave');
        
        ////
        if (!($this instanceof AppadminbaseBlockEditInterface)) {
            echo  json_encode([
                    'statusCode'=>'300',
                    'message'=>'Manageredit must implements fecshop\app\appadmin\interfaces\base\AppadminbaseBlockEditInterface',
            ]);
            exit;
        }
        $this->_editFormData = 'editFormData';
        $this->setService();
        $this->_param = CRequest::param();
        $this->_primaryKey = $this->_service->getPrimaryKey();
        $editSpu = Yii::$app->request->get('edit_spu');
        $this->_one = $this->_service->getByEditSpu($editSpu);
        
        // 产品库存
        $product_id = $this->_one[$this->_primaryKey];
        if($product_id){
            // 从mysql中取出来qty。
            $qty = Yii::$service->product->stock->getProductFlatQty($product_id);
            $this->_one['qty'] = $qty ;
        }
        
        $this->_attr = new $this->_attrBlockName($this->_one);
        //$this->_param		= $request_param[$this->_editFormData];
    }

    public function setService()
    {
        $this->_service = Yii::$service->product;
    }

    public function getCurrentProductPrimay()
    {
        $primaryKey = Yii::$service->product->getPrimaryKey();
        $primaryVal = CRequest::param($primaryKey);
        if ($primaryVal) {
            return $primaryKey.'='.$primaryVal;
        }

        return '';
    }

    // 传递给前端的数据 显示编辑form
    public function getLastData()
    {
        $editSpu = Yii::$app->request->get('edit_spu');
        
        //public $showImgAttr;
    
        $spuImgAttr = $this->getSpuImageAttr();
        
        //var_dump($editSpu);
        //var_dump($spuImgAttr);
        // $editSpu, $spuImgAttr
        // exit;
        list ($spuAttrValArr, $attrKeyArr, $attrImgs) = $this->getGroupSpuAttrSelected($editSpu, $spuImgAttr);
        //var_dump($spuAttrValArr);exit;
        // var_dump($this->getGroupSpuAttr());
        return [
            'baseInfo'          => $this->getBaseInfo(),
            'priceInfo'         => $this->getPriceInfo(),
            'tier_price'        => $this->_one['tier_price'],
            'metaInfo'          => $this->getMetaInfo(),
            'groupGeneralAttr'         => $this->getGroupGeneralAttr(),
            'groupSpuAttr'         => $this->getGroupSpuAttrB($spuAttrValArr),
            'groupSpuAttrImgs'         => $attrImgs,
            'groupSpuAttrSelected'         => $spuAttrValArr,
            'groupSpuAttrSelectedJson'   => json_encode($attrKeyArr),
            'descriptionInfo'   => $this->getDescriptionInfo(),
            
            'attrGroup'         => $this->_attr->getProductAttrGroupSelect(),
            'primaryInfo'       => $this->getCurrentProductPrimay(),
            'img_html'          => $this->getImgHtml(),
            'custom_option'     => $this->_one['custom_option'],
            'sku'     => $this->_one['sku'],
            'price'     => $this->_one['price'],
            'qty'     => $this->_one['qty'],
            'product_id'        => $this->_one[Yii::$service->product->getPrimaryKey()],
            'edit_spu'   => $editSpu ,
            //'editBar' 	    => $this->getEditBar(),
            //'textareas'	    => $this->_textareas,
            //'lang_attr'	    => $this->_lang_attr,
            'saveUrl'           => $this->_saveUrl,
            'operate'           => Yii::$app->request->get('operate'),
            'custom_option_add' => $this->getCustomOptionAdd(),
            'custom_option_img' => $this->getCustomOpImgHtml(),
            'custom_option_list'=> $this->_custom_option_list_str,
            'relation'          => $this->getRelationInfo(),
        ];
    }

    public function getCustomOptionAdd()
    {
        $attr_group = $this->_one['attr_group'];
        $currentAttrGroup = CRequest::param('attr_group');
        if ($currentAttrGroup) {
            $attr_group = $currentAttrGroup;
        }
        
        $str = '';
        $this->_custom_option_list_str = '';
        if ($attr_group) {
            $custom_option_attr_info = Yii::$service->product->getCustomOptionAttrInfo($attr_group);
            if (is_array($custom_option_attr_info) && !empty($custom_option_attr_info)) {
                $this->_custom_option_list_str .= '<table style=""><thead><tr>';

                foreach ($custom_option_attr_info as $attr => $info) {
                    $label = $info['label'];
                    $this->_custom_option_list_str .= '<th>' . Yii::$service->page->translate->__($attr) . '</th>';

                    $str .= '<div class="nps"><span >' . Yii::$service->page->translate->__($attr) . ':</span>';
                    $type = isset($info['display']['type']) ? $info['display']['type'] : '';
                    $data = isset($info['display']['data']) ? $info['display']['data'] : '';
                    if ($type == 'select' && is_array($data) && !empty($data)) {
                        $str .= '<select atr="'.$attr.'" class="custom_option_attr">';
                        foreach ($info['display']['data'] as $v) {
                            $str .= '<option value="'.$v.'">' . Yii::$service->page->translate->__($v) . '</option>';
                        }
                        $str .= '</select>';
                    }
                    $str .= '</div>';
                }
                $str .= '<div class="nps"><span>Sku:</span><input style="width:40px;" type="text" class="custom_option_sku"  value="" /></div>
						<div class="nps"><span>Qty:</span><input style="width:40px;" type="text" class="custom_option_qty"  value="" /></div>
						<div class="nps"><span>Price:</span><input  style="width:40px;" type="text" class="custom_option_price"  value="" /></div>
						<div class="nps" style="width:220px;"><a class=" button chose_custom_op_img" style="display: block;float: left; margin: -2px 10px 0;" ><span style="margin:0">' . Yii::$service->page->translate->__('Select Image') . '</span></a><div class="chosened_img"></div></div>
						<div class="nps"><a style="display: block;float: right; margin: -2px 10px 0;" class="button add_custom_option"><span style="margin:0">+</span></a></div>
					';

                $this->_custom_option_list_str .= '<th>' . Yii::$service->page->translate->__('sku') . '</th><th>' . Yii::$service->page->translate->__('qty') . '</th><th>' . Yii::$service->page->translate->__('price') . '</th><th>' . Yii::$service->page->translate->__('image') . '</th><th>' . Yii::$service->page->translate->__('delete') . '</th>';
                $this->_custom_option_list_str .= '<tr><thead>';
                //$this->_custom_option_list_str .= '<tbody></tbody>';
                //$this->_custom_option_list_str .= '</table>';
                $this->_custom_option_list_str .= '<tbody>';
                //echo '<br><br>';
                
                $custom_option = $this->_one['custom_option'];
                if (is_array($custom_option) && !empty($custom_option)) {
                    foreach ($custom_option  as $one) {
                        $this->_custom_option_list_str .= '<tr>';
                        foreach ($custom_option_attr_info as $attr => $info) {
                            $val = $one[$attr];
                            $this->_custom_option_list_str .= '<td rel="'.$attr.'" val="'.$val.'">' . Yii::$service->page->translate->__($val) . '</td>';
                        }
                        $this->_custom_option_list_str .= '<td class="custom_option_sku" rel="sku" val="'.$one['sku'].'">'.$one['sku'].'</td>';
                        $this->_custom_option_list_str .= '<td rel="qty" val="'.$one['qty'].'">'.$one['qty'].'</td>';
                        $this->_custom_option_list_str .= '<td rel="price" val="'.$one['price'].'">'.$one['price'].'</td>';
                        $this->_custom_option_list_str .= '<td rel="image" ><img style="width:30px;" rel="'.$one['image'].'" src="'.Yii::$service->product->image->getUrl($one['image']).'"/></td>';
                        $this->_custom_option_list_str .= '<td><a title="' . Yii::$service->page->translate->__('delete') . '"  href="javascript:void(0)" class="btnDel deleteCustomList"><i class="fa fa-trash-o"></i></a></td>';
                        $this->_custom_option_list_str .= '</tr>';
                    }
                }
                $this->_custom_option_list_str .= '</tbody>';
                $this->_custom_option_list_str .= '</table>';
            }
        }

        return $str;
    }

    public function getRelationInfo()
    {
        $this->_lang_attr = '';
        $this->_textareas = '';
        $editArr = $this->_attr->getRelationInfo();
        $editBar = $this->getEditBar($editArr);

        return $this->_lang_attr.$editBar.$this->_textareas;
    }

    public function getBaseInfo()
    {
        $this->_lang_attr = '';
        $this->_textareas = '';
        $editArr = $this->_attr->getBaseInfo();
        $editBar = $this->getEditBar($editArr);

        return $this->_lang_attr.$editBar.$this->_textareas;
    }

    public function getPriceInfo()
    {
        $this->_lang_attr = '';
        $this->_textareas = '';
        $editArr = $this->_attr->getPriceInfo();
        $editBar = $this->getEditBar($editArr);

        return $this->_lang_attr.$editBar.$this->_textareas;
    }

    public function getMetaInfo()
    {
        $this->_lang_attr = '';
        $this->_textareas = '';
        $editArr = $this->_attr->getMetaInfo();
        $editBar = $this->getEditBar($editArr);

        return $this->_lang_attr.$editBar.$this->_textareas;
    }

    public function getDescriptionInfo()
    {
        $this->_lang_attr = '';
        $this->_textareas = '';
        $editArr = $this->_attr->getDescriptionInfo();
        $editBar = $this->getEditBar($editArr);

        return $this->_lang_attr.$editBar.$this->_textareas;
    }
    
    public function getGroupGeneralAttr()
    {
        $this->_lang_attr = '';
        $this->_textareas = '';
        $editArr = $this->_attr->getGroupGeneralAttr();
        $this->_primaryKey = $this->_service->getPrimaryKey();
        //$product_id = $this->_param[$this->_primaryKey];
        //$this->_one = $this->_service->getByPrimaryKey($product_id);
        // add translate
        if (!empty($editArr) && is_array($editArr)) {
            foreach ($editArr as $k => $v) {
                $editArr[$k]['label'] = Yii::$service->page->translate->__($k);
                if (isset($v['display']['type']) && in_array($v['display']['type'], ['select', 'editSelect'])) {
                    if (isset($v['display']['data']) && is_array($v['display']['data'])) {
                        $select_data = [];
                        foreach ($v['display']['data'] as $v2) {
                            if ($v['display']['type'] == 'select') {
                                $select_data[$v2] = Yii::$service->page->translate->__($v2);
                            } else {
                                $select_data[$v2] = $v2;
                            }
                        }
                        $editArr[$k]['display']['data'] = $select_data;
                    }
                }    
            }
            $editBar = $this->getEditBar($editArr);

            return $this->_lang_attr.$editBar.$this->_textareas;
        }

        return '';
    }
    
    //public $showImgAttr;
    
    public function getSpuImageAttr()
    {
        $arr = [];
        $editArr = $this->_attr->getGroupSpuAttr();
        //var_dump($editArr );exit;
        if (is_array($editArr) && !empty($editArr)) {
            foreach ($editArr as $spuOne) {
                $name = $spuOne['name'];
                $showAsImg = $spuOne['showAsImg'];
                if ($showAsImg) {
                    
                    return $name;
                }
            }
        }
        
        return '';
    }
        
    
    public function getGroupSpuAttrB($spuAttrValArr)
    {
        $arr = [];
        $editArr = $this->_attr->getGroupSpuAttr();
        //var_dump($editArr );exit;
        if (is_array($editArr) && !empty($editArr)) {
            foreach ($editArr as $spuOne) {
                $name = $spuOne['name'];
                //$showAsImg = $spuOne['showAsImg'];
                //if ($showAsImg) {
                //    $this->showImgAttr = $name;
                //}
                $displayData = isset($spuOne['display']['data']) ? $spuOne['display']['data'] : '';
                if ($name && is_array($displayData)) {
                    $diffArr = [];
                    if (is_array($spuAttrValArr[$name])) {
                        //var_dump($displayData);
                        $diffArr = array_diff($spuAttrValArr[$name], $displayData);
                        // var_dump($diffArr);
                    }
                    $arr[$name] = array_merge($displayData, $diffArr);
                }
                
            }
        }
        
        return $arr;
    }
    // 得到spu产品中,spu属性select的数组值
    // @param $spuImgAttr | 显示图片的属性
    public function getGroupSpuAttrSelected($spu, $spuImgAttr)
    {
        // 通过spu查询所有的sku
        
        // 得到sku对应的所有的值
        $editArr = $this->_attr->getGroupSpuAttr();
        if (!is_array($editArr)  || empty($editArr)) {
            
            return [];
        }
        foreach ($editArr as $spuOne) {
            $spuAttrs[] = $spuOne['name'];
        }    
        //var_dump($spuAttrs);exit;
        //$collArr, $attrKeyArr
        
        list($spuAttrValArr, $attrKeyArr, $attrImgs) = Yii::$service->product->getSpuSelectSpuAttrVal($spu, $spuAttrs, $spuImgAttr); // getBySpu($spu);
        //var_dump($spuAttrValArr, $attrKeyArr, $attrImgs);exit;
        // $spuAttrValArr 
        if (!is_array($spuAttrValArr)  || empty($spuAttrValArr)) {
            
            return [ [], [], $attrImgs];
        }
        return [$spuAttrValArr, $attrKeyArr, $attrImgs];
    }
    
    
    
    
    
    
    
    public function getVal($name, $column){
        if (isset ($this->_one[$name]) ) {
            
            return ($this->_one[$name] || $this->_one[$name] === 0) ? $this->_one[$name] : $column['default'];
        } else if(isset($this->_one['attr_group_info']) && $this->_one['attr_group_info']) {  //  mysql model类型
            $attr_group_info = $this->_one['attr_group_info'];
            if (isset($attr_group_info[$name])) {
                return $attr_group_info[$name];
            } else {
                return '';
            }
        }
    }  

    public function getImgHtml()
    {
        if (isset($this->_one['image']['main']) && !empty($this->_one['image']['main'])) {
            $main_image = $this->_one['image']['main'];
        }
        if (isset($this->_one['image']['gallery']) && !empty($this->_one['image']['gallery'])) {
            $gallery_image = $this->_one['image']['gallery'];
        }
        //var_dump($this->_one);exit;
        $str =
        '<div>
			<table class="list productimg" width="100%" >
				<thead>
					<tr>
						<td>' . Yii::$service->page->translate->__('Image') . '</td>
						<td>' . Yii::$service->page->translate->__('Label') . '</td>
						<td>' . Yii::$service->page->translate->__('Sort Order') . '</td>
                        <td>' . Yii::$service->page->translate->__('Main Image') . '</td>
                        <td>' . Yii::$service->page->translate->__('Window Img') . '</td>
						<td>' . Yii::$service->page->translate->__('Description Img') . '</td>
                        <td>' . Yii::$service->page->translate->__('Delete') . '</td>
					</tr>
				</thead>
				<tbody>';
        if (!empty($main_image) && is_array($main_image)) {
            $is_thumbnails = $main_image['is_thumbnails'] ? $main_image['is_thumbnails'] : 1;
            $is_detail = $main_image['is_detail'] ? $main_image['is_detail'] : 1;
            
            $str .= '<tr class="p_img" rel="1" style="border-bottom:1px solid #ccc;">
						<td style="width:120px;text-align:center;"><img  rel="'.$main_image['image'].'" style="width:100px;height:100px;" src="'.Yii::$service->product->image->getUrl($main_image['image']).'"></td>
						<td style="width:220px;text-align:center;"><input  type="text" class="image_label" name="image_label"  value="'.$main_image['label'].'" /></td>
						<td style="width:220px;text-align:center;"><input  type="text" class="sort_order"  name="sort_order" value="'.$main_image['sort_order'].'"  /></td>
						<td style="width:30px;text-align:center;"><input type="radio" name="image" checked  value="'.$main_image['image'].'" /></td>
						
                        <td style="width:220px;text-align:center;">
                            <select name="is_thumbnails" class="is_thumbnails">
                                '.$this->getYesNoOptions($is_thumbnails).'
                            </select>
                        </td>
                        <td style="width:220px;text-align:center;">
                            <select name="is_detail" class="is_detail">
                                '.$this->getYesNoOptions($is_detail).'
                            </select>
                        </td>
                        
                        <td style="padding:0 0 0 20px;"><a class="delete_img btnDel" href="javascript:void(0)"><i class="fa fa-trash-o"></i></a></td>
					</tr>';
        }
        if (!empty($gallery_image) && is_array($gallery_image)) {
            $i = 2;
            
            foreach ($gallery_image as $gallery) {
                $is_thumbnails = $gallery['is_thumbnails'] ? $gallery['is_thumbnails'] : 1;
                $is_detail = $gallery['is_detail'] ? $gallery['is_detail'] : 1;
            
                $str .= '<tr class="p_img" rel="'.$i.'" style="border-bottom:1px solid #ccc;">
									<td style="width:120px;text-align:center;"><img  rel="'.$gallery['image'].'" style="width:100px;height:100px;" src="'.Yii::$service->product->image->getUrl($gallery['image']).'"></td>
									<td style="width:220px;text-align:center;"><input  type="text" class="image_label" name="image_label"  value="'.$gallery['label'].'" /></td>
									<td style="width:220px;text-align:center;"><input  type="text" class="sort_order"  name="sort_order" value="'.$gallery['sort_order'].'"  /></td>
									<td style="width:30px;text-align:center;"><input type="radio" name="image"   value="'.$gallery['image'].'" /></td>
                                   <td style="width:220px;text-align:center;">
                                        <select name="is_thumbnails" class="is_thumbnails">
                                            '.$this->getYesNoOptions($is_thumbnails).'
                                        </select>
                                    </td>
                                    <td style="width:220px;text-align:center;">
                                        <select name="is_detail" class="is_detail">
                                            '.$this->getYesNoOptions($is_detail).'
                                        </select>
                                    </td>
									<td style="padding:0 0 0 20px;"><a class="delete_img btnDel" href="javascript:void(0)"><i class="fa fa-trash-o"></i></a></td>
								</tr>';
                $i++;
            }
        }

        $str .= '</tbody>
			</table>
		</div>';

        return $str;
    }
    
    public function getYesNoOptions($val){
        if($val == 1){
            return '
                <option  value="1" selected="selected" >' . Yii::$service->page->translate->__('Yes') . '</option>
                <option  value="2">' . Yii::$service->page->translate->__('No') . '</option>
            ';
        }else{
            return '
                <option  value="1">' . Yii::$service->page->translate->__('Yes') . '</option>
                <option  value="2" selected="selected">' . Yii::$service->page->translate->__('No') . '</option>
            ';
        }
    }

    public function getCustomOpImgHtml()
    {
        if (isset($this->_one['image']['main']) && !empty($this->_one['image']['main'])) {
            $main_image = $this->_one['image']['main'];
        }
        if (isset($this->_one['image']['gallery']) && !empty($this->_one['image']['gallery'])) {
            $gallery_image = $this->_one['image']['gallery'];
        }
        $str = '';
        if (!empty($main_image) && is_array($main_image)) {
            $str .= '<span><img  rel="'.$main_image['image'].'" style="width:80px;" src="'.Yii::$service->product->image->getUrl($main_image['image']).'"></span>';
        }
        if (!empty($gallery_image) && is_array($gallery_image)) {
            $i = 2;
            foreach ($gallery_image as $gallery) {
                $str .= '<span><img  rel="'.$gallery['image'].'" style="width:80px;" src="'.Yii::$service->product->image->getUrl($gallery['image']).'"></span>';
                $i++;
            }
        }
        $str .= '';

        return $str;
    }

    public function getEditArr()
    {
    }

    /**
     * save article data,  get rewrite url and save to article url key.
     */
    public function save()
    {
        $this->initParamType();
        /*
         * if attribute is date or date time , db storage format is int ,by frontend pass param is int ,
         * you must convert string datetime to time , use strtotime function.
         */
        // var_dump()

        if (Yii::$app->request->post('operate') == 'copy') {
            $productPrimaryKey = Yii::$service->product->getPrimaryKey();
            if (isset($this->_param[$productPrimaryKey])) {
                unset($this->_param[$productPrimaryKey]);
                //echo 111;
                //var_dump($this->_param);
                //exit;
            }
        }
        
        $spu_attrs = Yii::$app->request->post('spu_attrs');
        $spuImgAttr = Yii::$app->request->post('spuImgAttr');
        $spuArr = $this->getSpuArr($spu_attrs, $spuImgAttr);
        $editFormSku = $this->_param['sku'];
        if (!$editFormSku && (!$spuArr || empty($spuArr))) {
            echo  json_encode([
                'statusCode' => '300',
                'message'    => 'spu属性为空,如果您当前选择的产品没有spu属性,请使用单个产品添加',
            ]);
            exit;
        }
        $edit_spu = Yii::$app->request->post('edit_spu');
        $this->checkSaveData($this->_param);
        $this->_service->tbSave($edit_spu, $this->_param, $spuArr);
        
        
        /*
        
        foreach ($spuArr as $spuOne) {
            foreach ($spuOne as $k=>$v) {
                $this->_param[$k] = $v;
            }
            $this->_service->save($this->_param, 'catalog/product/index');
        
            $errors = Yii::$service->helper->errors->get();
            if ($errors) {
                echo  json_encode([
                    'statusCode' => '300',
                    'message'    => $errors,
                ]);
                exit;
            }
        }
        */
        
        echo  json_encode([
            'statusCode' => '200',
            'message'    => Yii::$service->page->translate->__('Save Success'),
        ]);
        exit;
                
    }
     /**
     * 如果是添加新产品,检查spu是否存在
     */
    public function checkSaveData($one)
    {
        $productId = Yii::$app->request->post('product_id');
        // 如果是添加产品,那么需要查询是否已经存在此spu
        if (!$productId) {
            $products = Yii::$service->product->getBySpu($one['spu']);  // $this->_productModel->findOne(['spu' => $one['spu']]);
            if (!empty($products)) {
                echo  json_encode([
                    'statusCode' => '300',
                    'message'    => '该spu已经存在,请勿添加相同spu的产品',
                ]);
                exit;
            }
        }
        
    }
    
    // 字符串解析出来数组。
    public function getSpuArr($spu_attrs, $spuImgAttr)
    {
        if (!$spu_attrs) {
            return [];
        }
        //echo $spuImgAttr;exit;
        $imgArr = [];
        $spuImgAttrArr = explode('|||', $spuImgAttr);
        if (is_array($spuImgAttrArr) && !empty($spuImgAttrArr)) {
            foreach ($spuImgAttrArr as $one) {
                list($attrName, $attrVal, $ImgKey) = explode('####', $one);
                if ($attrName && $attrVal && $ImgKey) {
                    $imgArr[$attrName.'###'.$attrVal] = $ImgKey;
                }
                
            }
        }
        
        $arr = [];
        $spu_arrs = explode('***', $spu_attrs);
        foreach ($spu_arrs as $spu_arr) {
            if ($spu_arr) {
                $spu_attr_arr = explode('|||', $spu_arr);
                $arr2 = [];
                foreach ($spu_attr_arr as $spu_attr_one) {
                    if ($spu_attr_one) {
                        list($attr, $val) = explode('###', $spu_attr_one);
                        $arr2[$attr] = $val;
                        $key = $attr.'###'.$val;
                        if (isset($imgArr[$key]) && $imgArr[$key]) {
                            $arr2['main_image'] = $imgArr[$key];
                        }
                    }
                }
                $arr[] = $arr2;
            }
            
        }
        //var_dump($arr);exit;
        
        return $arr;
    }

    protected function initParamType()
    {
        $request_param = CRequest::param();
        $this->_param = $request_param[$this->_editFormData];
        $this->_param['attr_group'] = CRequest::param('attr_group');
        $custom_option = CRequest::param('custom_option');
        //var_dump($custom_option);
        $custom_option = $custom_option ? json_decode($custom_option, true) : [];
        $custom_option_arr = [];
        if (is_array($custom_option) && !empty($custom_option)) {
            foreach ($custom_option as $option) {
                if(is_array($option) && !empty($option)){
                    foreach($option as $key => $val){
                        if($key == 'qty'){
                            $option[$key] = (int) $option[$key];
                        } else if ($key == 'price') {
                            $option[$key] = (float) $option[$key];
                        } else {
                            $option[$key] = html_entity_decode($val);
                        }
                    }
                }
                $custom_option_arr[$option['sku']] = $option;
            }
        }
        
        $this->_param['custom_option'] = $custom_option_arr;
        //var_dump($this->_param['custom_option']);
        $image_gallery = CRequest::param('image_gallery');
        $image_main = CRequest::param('image_main');
        $save_gallery = [];
        // Category
        $category = CRequest::param('category');
        if ($category) {
            $category = explode(',', $category);
            if (!empty($category)) {
                $cates = [];
                foreach ($category  as $cate) {
                    if ($cate) {
                        $cates[] = $cate;
                    }
                }
                $this->_param['category'] = $cates;
            } else {
                $this->_param['category'] = [];
            }
        } else {
            $this->_param['category'] = [];
        }
        // init image gallery
        if ($image_gallery) {
            $image_gallery_arr = explode('|||||', $image_gallery);
            if (!empty($image_gallery_arr)) {
                foreach ($image_gallery_arr as $one) {
                    if (!empty($one)) {
                        list($gallery_image, $gallery_label, $gallery_sort_order,$gallery_is_thumbnails,$gallery_is_detail) = explode('#####', $one);
                        $save_gallery[] = [
                            'image'            => $gallery_image,
                            'label'              => $gallery_label,
                            'sort_order'      => $gallery_sort_order,
                            'is_thumbnails' => $gallery_is_thumbnails,
                            'is_detail'         => $gallery_is_detail,
                        ];
                    }
                }
                $this->_param['image']['gallery'] = $save_gallery;
            }
        }
        // init image main
        if ($image_main) {
            list($main_image, $main_label, $main_sort_order,$main_is_thumbnails,$main_is_detail) = explode('#####', $image_main);
            $save_main = [
                'image'             => $main_image,
                'label'               => $main_label,
                'sort_order'       => $main_sort_order,
                'is_thumbnails'   => $main_is_thumbnails,
                'is_detail'          => $main_is_detail,
            ];
            $this->_param['image']['main'] = $save_main;
        }
        //qty
        $this->_param['qty'] = $this->_param['qty'] ? (float) ($this->_param['qty']) : 0;
        $this->_param['package_number'] = (int)abs($this->_param['package_number']);
        //is_in_stock
        $this->_param['is_in_stock'] = $this->_param['is_in_stock'] ? (int) ($this->_param['is_in_stock']) : 0;
        //price
        $this->_param['cost_price'] = $this->_param['cost_price'] ? (float) ($this->_param['cost_price']) : 0;
        $this->_param['price'] = $this->_param['price'] ? (float) ($this->_param['price']) : 0;
        $this->_param['special_price'] = $this->_param['special_price'] ? (float) ($this->_param['special_price']) : 0;
        //date
        $this->_param['new_product_from'] = $this->_param['new_product_from'] ? (float) (strtotime($this->_param['new_product_from'])) : 0;
        $this->_param['new_product_to'] = $this->_param['new_product_to'] ? (float) (strtotime($this->_param['new_product_to'])) : 0;
        $this->_param['special_from'] = $this->_param['special_from'] ? (float) (strtotime($this->_param['special_from'])) : 0;
        $this->_param['special_to'] = $this->_param['special_to'] ? (float) (strtotime($this->_param['special_to'])) : 0;
        //weight
        $this->_param['weight'] = $this->_param['weight'] ? (float) ($this->_param['weight']) : 0;
        //长
        $this->_param['long'] = $this->_param['long'] ? (float) ($this->_param['long']) : 0;
        //宽
        $this->_param['width'] = $this->_param['width'] ? (float) ($this->_param['width']) : 0;
        //高
        $this->_param['high'] = $this->_param['high'] ? (float) ($this->_param['high']) : 0;
        //体积重
        $this->_param['volume_weight'] = Yii::$service->shipping->getVolumeWeight($this->_param['long'], $this->_param['width'], $this->_param['high']) ;
        
        $this->_param['score'] = $this->_param['score'] ? (int) ($this->_param['score']) : 0;
        //status
        $this->_param['status'] = $this->_param['status'] ? (float) ($this->_param['status']) : 0;
        // 供应商
        $this->_param['bdmin_user_id'] = $this->_param['bdmin_user_id'] ? (int) ($this->_param['bdmin_user_id']) : 0;
        
        //image main sort order
        if (isset($this->_param['image']['main']['sort_order']) && !empty($this->_param['image']['main']['sort_order'])) {
            $this->_param['image']['main']['sort_order'] = (int) ($this->_param['image']['main']['sort_order']);
        }
        //image gallery
        if (isset($this->_param['image']['gallery']) && is_array($this->_param['image']['gallery']) && !empty($this->_param['image']['gallery'])) {
            $gallery_af = [];
            foreach ($this->_param['image']['gallery'] as $gallery) {
                if (isset($gallery['sort_order']) && !empty($gallery['sort_order'])) {
                    $gallery['sort_order'] = (int) $gallery['sort_order'];
                }
                $gallery_af[] = $gallery;
            }
            $this->_param['image']['gallery'] = $gallery_af;
        }
        // 自定义属性 也就是在 @common\config\fecshop_local_services\Product.php 产品服务的 customAttrGroup 配置的产品属性。
        $custom_attr = \Yii::$service->product->getGroupAttrInfo($this->_param['attr_group']);
        if (is_array($custom_attr) && !empty($custom_attr)) {
            foreach ($custom_attr as $attrInfo) {
                $attr = $attrInfo['name'];
                $dbtype = $attrInfo['dbtype'];
                if (isset($this->_param[$attr]) && !empty($this->_param[$attr])) {
                    if ($dbtype == 'Int') {
                        if (isset($attrInfo['display']['lang']) && $attrInfo['display']['lang']) {
                            $langs = Yii::$service->fecshoplang->getAllLangCode();
                            if (is_array($langs) && !empty($langs)) {
                                foreach ($langs as $langCode) {
                                    $langAttr = Yii::$service->fecshoplang->getLangAttrName($attr, $langCode);
                                    if (isset($this->_param[$attr][$langAttr]) && $this->_param[$attr][$langAttr]) {
                                        $this->_param[$attr][$langAttr] = (int) $this->_param[$attr][$langAttr];
                                    }
                                }
                            }
                        } else {
                            $this->_param[$attr] = (int) $this->_param[$attr];
                        }
                    }
                    if ($dbtype == 'Float') {
                        if (isset($attrInfo['display']['lang']) && $attrInfo['display']['lang']) {
                            $langs = Yii::$service->fecshoplang->getAllLangCode();
                            if (is_array($langs) && !empty($langs)) {
                                foreach ($langs as $langCode) {
                                    $langAttr = Yii::$service->fecshoplang->getLangAttrName($attr, $langCode);
                                    if (isset($this->_param[$attr][$langAttr]) && $this->_param[$attr][$langAttr]) {
                                        $this->_param[$attr][$langAttr] = (float) $this->_param[$attr][$langAttr];
                                    }
                                }
                            }
                        } else {
                            $this->_param[$attr] = (float) $this->_param[$attr];
                        }
                    }
                }
            }
        }

        //tier price
        $tier_price = $this->_param['tier_price'];
        $tier_price_arr = [];
        if ($tier_price) {
            $arr = explode('||', $tier_price);
            if (is_array($arr) && !empty($arr)) {
                foreach ($arr as $ar) {
                    list($tier_qty, $tier_price) = explode('##', $ar);
                    if ($tier_qty && $tier_price) {
                        $tier_qty = (int) $tier_qty;
                        $tier_price = (float) $tier_price;
                        $tier_price_arr[] = [
                            'qty'    => $tier_qty,
                            'price'    => $tier_price,
                        ];
                    }
                }
            }
        }
        $tier_price_arr = \fec\helpers\CFunc::array_sort($tier_price_arr, 'qty', 'asc');
        $this->_param['tier_price'] = $tier_price_arr;
    }

    // 批量删除
    public function delete()
    {
        $ids = '';
        if ($id = CRequest::param($this->_primaryKey)) {
            $ids = $id;
        } elseif ($ids = CRequest::param($this->_primaryKey.'s')) {
            $ids = explode(',', $ids);
        }
        $this->_service->remove($ids);
        $errors = Yii::$service->helper->errors->get();
        if (!$errors) {
            echo  json_encode([
                'statusCode' => '200',
                'message' => Yii::$service->page->translate->__('Remove Success'),
            ]);
            exit;
        } else {
            echo  json_encode([
                'statusCode' => '300',
                'message' => $errors,
            ]);
            exit;
        }
    }
}
Fecmall#34年前 0 个赞

bdmin后台编辑产品

<?php
/**
 * FecShop file.
 *
 * @link http://www.fecshop.com/
 * @copyright Copyright (c) 2016 FecShop Software LLC
 * @license http://www.fecshop.com/license/
 */

namespace fecbbc\app\appbdmin\modules\Catalog\block\productinfo;

use fec\helpers\CRequest;
use fec\helpers\CUrl;
use fecbbc\app\appbdmin\interfaces\base\AppbdminbaseBlockEditInterface;
use fecbbc\app\appbdmin\modules\AppbdminbaseBlockEdit;
//use fecshop\app\appadmin\modules\Catalog\block\productinfo\index\Attr;
use Yii;

/**
 * block catalog/productinfo.
 * @author Terry Zhao <2358269014@qq.com>
 * @since 1.0
 */
class Managerbatchedit extends AppbdminbaseBlockEdit implements AppbdminbaseBlockEditInterface
{
    public $_saveUrl;
    protected $_attr;
    protected $_custom_option_list_str;
    protected $_bdmin_user_id;

    /**
     * 为了可以使用rewriteMap,use 引入的文件统一采用下面的方式,通过Yii::mapGet()得到className和Object
     */
    protected $_attrBlockName = '\fecbbc\app\appbdmin\modules\Catalog\block\productinfo\index\BatchAttr';
    protected $_attrBlock;

    public function init()
    {
        /**
         * 通过Yii::mapGet() 得到重写后的class类名以及对象。Yii::mapGet是在文件@fecshop\yii\Yii.php中
         */
        $this->_attrBlockName = Yii::mapGetName($this->_attrBlockName);  
        
        $this->_saveUrl = CUrl::getUrl('catalog/productinfo/managerbatcheditsave');
        
        ////
        if (!($this instanceof AppbdminbaseBlockEditInterface)) {
            echo  json_encode([
                    'statusCode'=>'300',
                    'message'=>'Manageredit must implements fecbbc\app\appbdmin\interfaces\base\AppbdminbaseBlockEditInterface',
            ]);
            exit;
        }
        $this->_editFormData = 'editFormData';
        $this->setService();
        $this->_param = CRequest::param();
        $this->_primaryKey = $this->_service->getPrimaryKey();
        $editSpu = Yii::$app->request->get('edit_spu');
        $this->_one = $this->_service->getByEditSpu($editSpu);
        
        // 产品库存
        $product_id = $this->_one[$this->_primaryKey];
        if($product_id){
            // 从mysql中取出来qty。
            $qty = Yii::$service->product->stock->getProductFlatQty($product_id);
            $this->_one['qty'] = $qty ;
        }
        $this->_bdmin_user_id = Yii::$app->user->identity->id;
        $this->_attr = new $this->_attrBlockName($this->_one);
        //$this->_param		= $request_param[$this->_editFormData];
    }

    public function setService()
    {
        $this->_service = Yii::$service->product;
    }

    public function getCurrentProductPrimay()
    {
        $primaryKey = Yii::$service->product->getPrimaryKey();
        $primaryVal = CRequest::param($primaryKey);
        if ($primaryVal) {
            return $primaryKey.'='.$primaryVal;
        }

        return '';
    }
    
    /**
     * 当前用户是否有操作该产品的权限
     */
    public function productHasRole($product_spu){
        $products = Yii::$service->product->getBySpu($product_spu);
        $identity = Yii::$app->user->identity;
        $currentUserId = $identity->id;
        if (!is_array($products) || empty($products)) {
            exit;
        }
        foreach ($products as $product) {
            $product_bdmin_user_id = isset($product['bdmin_user_id']) ? $product['bdmin_user_id'] : '';
            if (!$product_bdmin_user_id || $currentUserId != $product_bdmin_user_id) {
                exit;
            }
        }
    }
    
    // 传递给前端的数据 显示编辑form
    public function getLastData()
    {
        $editSpu = Yii::$app->request->get('edit_spu');
        if ($editSpu) {
            $this->productHasRole($editSpu);
        }
        
        //public $showImgAttr;
    
        $spuImgAttr = $this->getSpuImageAttr();
        
        //var_dump($editSpu);
        //var_dump($spuImgAttr);
        // $editSpu, $spuImgAttr
        // exit;
        list ($spuAttrValArr, $attrKeyArr, $attrImgs) = $this->getGroupSpuAttrSelected($editSpu, $spuImgAttr);
        //var_dump($spuAttrValArr);exit;
        // var_dump($this->getGroupSpuAttr());
        return [
            'baseInfo'          => $this->getBaseInfo(),
            'priceInfo'         => $this->getPriceInfo(),
            'tier_price'        => $this->_one['tier_price'],
            'metaInfo'          => $this->getMetaInfo(),
            'groupGeneralAttr'         => $this->getGroupGeneralAttr(),
            'groupSpuAttr'         => $this->getGroupSpuAttrB($spuAttrValArr),
            'groupSpuAttrImgs'         => $attrImgs,
            'groupSpuAttrSelected'         => $spuAttrValArr,
            'groupSpuAttrSelectedJson'   => json_encode($attrKeyArr),
            'descriptionInfo'   => $this->getDescriptionInfo(),
            
            'attrGroup'         => $this->_attr->getProductAttrGroupSelect(),
            'primaryInfo'       => $this->getCurrentProductPrimay(),
            'img_html'          => $this->getImgHtml(),
            'custom_option'     => $this->_one['custom_option'],
            'sku'     => $this->_one['sku'],
            'price'     => $this->_one['price'],
            'qty'     => $this->_one['qty'],
            'product_id'        => $this->_one[Yii::$service->product->getPrimaryKey()],
            'edit_spu'   => $editSpu ,
            //'editBar' 	    => $this->getEditBar(),
            //'textareas'	    => $this->_textareas,
            //'lang_attr'	    => $this->_lang_attr,
            'saveUrl'           => $this->_saveUrl,
            'operate'           => Yii::$app->request->get('operate'),
            'custom_option_add' => $this->getCustomOptionAdd(),
            'custom_option_img' => $this->getCustomOpImgHtml(),
            'custom_option_list'=> $this->_custom_option_list_str,
            'relation'          => $this->getRelationInfo(),
        ];
    }

    public function getCustomOptionAdd()
    {
        $attr_group = $this->_one['attr_group'];
        $currentAttrGroup = CRequest::param('attr_group');
        if ($currentAttrGroup) {
            $attr_group = $currentAttrGroup;
        }
        
        $str = '';
        $this->_custom_option_list_str = '';
        if ($attr_group) {
            $custom_option_attr_info = Yii::$service->product->getCustomOptionAttrInfo($attr_group);
            if (is_array($custom_option_attr_info) && !empty($custom_option_attr_info)) {
                $this->_custom_option_list_str .= '<table style=""><thead><tr>';

                foreach ($custom_option_attr_info as $attr => $info) {
                    $label = $info['label'];
                    $this->_custom_option_list_str .= '<th>' . Yii::$service->page->translate->__($attr) . '</th>';

                    $str .= '<div class="nps"><span >' . Yii::$service->page->translate->__($attr) . ':</span>';
                    $type = isset($info['display']['type']) ? $info['display']['type'] : '';
                    $data = isset($info['display']['data']) ? $info['display']['data'] : '';
                    if ($type == 'select' && is_array($data) && !empty($data)) {
                        $str .= '<select atr="'.$attr.'" class="custom_option_attr">';
                        foreach ($info['display']['data'] as $v) {
                            $str .= '<option value="'.$v.'">' . Yii::$service->page->translate->__($v) . '</option>';
                        }
                        $str .= '</select>';
                    }
                    $str .= '</div>';
                }
                $str .= '<div class="nps"><span>Sku:</span><input style="width:40px;" type="text" class="custom_option_sku"  value="" /></div>
						<div class="nps"><span>Qty:</span><input style="width:40px;" type="text" class="custom_option_qty"  value="" /></div>
						<div class="nps"><span>Price:</span><input  style="width:40px;" type="text" class="custom_option_price"  value="" /></div>
						<div class="nps" style="width:220px;"><a class=" button chose_custom_op_img" style="display: block;float: left; margin: -2px 10px 0;" ><span style="margin:0">' . Yii::$service->page->translate->__('Select Image') . '</span></a><div class="chosened_img"></div></div>
						<div class="nps"><a style="display: block;float: right; margin: -2px 10px 0;" class="button add_custom_option"><span style="margin:0">+</span></a></div>
					';

                $this->_custom_option_list_str .= '<th>' . Yii::$service->page->translate->__('sku') . '</th><th>' . Yii::$service->page->translate->__('qty') . '</th><th>' . Yii::$service->page->translate->__('price') . '</th><th>' . Yii::$service->page->translate->__('image') . '</th><th>' . Yii::$service->page->translate->__('delete') . '</th>';
                $this->_custom_option_list_str .= '<tr><thead>';
                //$this->_custom_option_list_str .= '<tbody></tbody>';
                //$this->_custom_option_list_str .= '</table>';
                $this->_custom_option_list_str .= '<tbody>';
                //echo '<br><br>';
                
                $custom_option = $this->_one['custom_option'];
                if (is_array($custom_option) && !empty($custom_option)) {
                    foreach ($custom_option  as $one) {
                        $this->_custom_option_list_str .= '<tr>';
                        foreach ($custom_option_attr_info as $attr => $info) {
                            $val = $one[$attr];
                            $this->_custom_option_list_str .= '<td rel="'.$attr.'" val="'.$val.'">' . Yii::$service->page->translate->__($val) . '</td>';
                        }
                        $this->_custom_option_list_str .= '<td class="custom_option_sku" rel="sku" val="'.$one['sku'].'">'.$one['sku'].'</td>';
                        $this->_custom_option_list_str .= '<td rel="qty" val="'.$one['qty'].'">'.$one['qty'].'</td>';
                        $this->_custom_option_list_str .= '<td rel="price" val="'.$one['price'].'">'.$one['price'].'</td>';
                        $this->_custom_option_list_str .= '<td rel="image" ><img style="width:30px;" rel="'.$one['image'].'" src="'.Yii::$service->product->image->getUrl($one['image']).'"/></td>';
                        $this->_custom_option_list_str .= '<td><a title="' . Yii::$service->page->translate->__('delete') . '"  href="javascript:void(0)" class="btnDel deleteCustomList"><i class="fa fa-trash-o"></i></a></td>';
                        $this->_custom_option_list_str .= '</tr>';
                    }
                }
                $this->_custom_option_list_str .= '</tbody>';
                $this->_custom_option_list_str .= '</table>';
            }
        }

        return $str;
    }

    public function getRelationInfo()
    {
        $this->_lang_attr = '';
        $this->_textareas = '';
        $editArr = $this->_attr->getRelationInfo();
        $editBar = $this->getEditBar($editArr);

        return $this->_lang_attr.$editBar.$this->_textareas;
    }

    public function getBaseInfo()
    {
        $this->_lang_attr = '';
        $this->_textareas = '';
        $editArr = $this->_attr->getBaseInfo();
        $editBar = $this->getEditBar($editArr);

        return $this->_lang_attr.$editBar.$this->_textareas;
    }

    public function getPriceInfo()
    {
        $this->_lang_attr = '';
        $this->_textareas = '';
        $editArr = $this->_attr->getPriceInfo();
        $editBar = $this->getEditBar($editArr);

        return $this->_lang_attr.$editBar.$this->_textareas;
    }

    public function getMetaInfo()
    {
        $this->_lang_attr = '';
        $this->_textareas = '';
        $editArr = $this->_attr->getMetaInfo();
        $editBar = $this->getEditBar($editArr);

        return $this->_lang_attr.$editBar.$this->_textareas;
    }

    public function getDescriptionInfo()
    {
        $this->_lang_attr = '';
        $this->_textareas = '';
        $editArr = $this->_attr->getDescriptionInfo();
        $editBar = $this->getEditBar($editArr);

        return $this->_lang_attr.$editBar.$this->_textareas;
    }
    
    public function getGroupGeneralAttr()
    {
        $this->_lang_attr = '';
        $this->_textareas = '';
        $editArr = $this->_attr->getGroupGeneralAttr();
        $this->_primaryKey = $this->_service->getPrimaryKey();
        //$product_id = $this->_param[$this->_primaryKey];
        //$this->_one = $this->_service->getByPrimaryKey($product_id);
        // add translate
        if (!empty($editArr) && is_array($editArr)) {
            foreach ($editArr as $k => $v) {
                $editArr[$k]['label'] = Yii::$service->page->translate->__($k);
                if (isset($v['display']['type']) && in_array($v['display']['type'], ['select', 'editSelect'])) {
                    if (isset($v['display']['data']) && is_array($v['display']['data'])) {
                        $select_data = [];
                        foreach ($v['display']['data'] as $v2) {
                            if ($v['display']['type'] == 'select') {
                                $select_data[$v2] = Yii::$service->page->translate->__($v2);
                            } else {
                                $select_data[$v2] = $v2;
                            }
                        }
                        $editArr[$k]['display']['data'] = $select_data;
                    }
                }    
            }
            $editBar = $this->getEditBar($editArr);

            return $this->_lang_attr.$editBar.$this->_textareas;
        }

        return '';
    }
    
    //public $showImgAttr;
    
    public function getSpuImageAttr()
    {
        $arr = [];
        $editArr = $this->_attr->getGroupSpuAttr();
        //var_dump($editArr );exit;
        if (is_array($editArr) && !empty($editArr)) {
            foreach ($editArr as $spuOne) {
                $name = $spuOne['name'];
                $showAsImg = $spuOne['showAsImg'];
                if ($showAsImg) {
                    
                    return $name;
                }
            }
        }
        
        return '';
    }
        
    
    public function getGroupSpuAttrB($spuAttrValArr)
    {
        $arr = [];
        $editArr = $this->_attr->getGroupSpuAttr();
        //var_dump($editArr );exit;
        if (is_array($editArr) && !empty($editArr)) {
            foreach ($editArr as $spuOne) {
                $name = $spuOne['name'];
                //$showAsImg = $spuOne['showAsImg'];
                //if ($showAsImg) {
                //    $this->showImgAttr = $name;
                //}
                $displayData = isset($spuOne['display']['data']) ? $spuOne['display']['data'] : '';
                if ($name && is_array($displayData)) {
                    $diffArr = [];
                    if (is_array($spuAttrValArr[$name])) {
                        //var_dump($displayData);
                        $diffArr = array_diff($spuAttrValArr[$name], $displayData);
                        // var_dump($diffArr);
                    }
                    $arr[$name] = array_merge($displayData, $diffArr);
                }
                
            }
        }
        
        return $arr;
    }
    // 得到spu产品中,spu属性select的数组值
    // @param $spuImgAttr | 显示图片的属性
    public function getGroupSpuAttrSelected($spu, $spuImgAttr)
    {
        // 通过spu查询所有的sku
        
        // 得到sku对应的所有的值
        $editArr = $this->_attr->getGroupSpuAttr();
        if (!is_array($editArr)  || empty($editArr)) {
            
            return [];
        }
        foreach ($editArr as $spuOne) {
            $spuAttrs[] = $spuOne['name'];
        }    
        //var_dump($spuAttrs);exit;
        //$collArr, $attrKeyArr
        
        list($spuAttrValArr, $attrKeyArr, $attrImgs) = Yii::$service->product->getSpuSelectSpuAttrVal($spu, $spuAttrs, $spuImgAttr); // getBySpu($spu);
        //var_dump($spuAttrValArr, $attrKeyArr, $attrImgs);exit;
        // $spuAttrValArr 
        if (!is_array($spuAttrValArr)  || empty($spuAttrValArr)) {
            
            return [ [], [], $attrImgs];
        }
        return [$spuAttrValArr, $attrKeyArr, $attrImgs];
    }
    
    public function getVal($name, $column){
        if (isset ($this->_one[$name]) ) {
            
            return ($this->_one[$name] || $this->_one[$name] === 0) ? $this->_one[$name] : $column['default'];
        } else if(isset($this->_one['attr_group_info']) && $this->_one['attr_group_info']) {  //  mysql model类型
            $attr_group_info = $this->_one['attr_group_info'];
            if (isset($attr_group_info[$name])) {
                return $attr_group_info[$name];
            } else {
                return '';
            }
        }
    }  

    public function getImgHtml()
    {
        if (isset($this->_one['image']['main']) && !empty($this->_one['image']['main'])) {
            $main_image = $this->_one['image']['main'];
        }
        if (isset($this->_one['image']['gallery']) && !empty($this->_one['image']['gallery'])) {
            $gallery_image = $this->_one['image']['gallery'];
        }
        //var_dump($this->_one);exit;
        $str =
        '<div>
			<table class="list productimg" width="100%" >
				<thead>
					<tr>
						<td>' . Yii::$service->page->translate->__('Image') . '</td>
						<td>' . Yii::$service->page->translate->__('Label') . '</td>
						<td>' . Yii::$service->page->translate->__('Sort Order') . '</td>
                        <td>' . Yii::$service->page->translate->__('Main Image') . '</td>
                        <td>' . Yii::$service->page->translate->__('Window Img') . '</td>
						<td>' . Yii::$service->page->translate->__('Description Img') . '</td>
                        <td>' . Yii::$service->page->translate->__('Delete') . '</td>
					</tr>
				</thead>
				<tbody>';
        if (!empty($main_image) && is_array($main_image)) {
            $is_thumbnails = $main_image['is_thumbnails'] ? $main_image['is_thumbnails'] : 1;
            $is_detail = $main_image['is_detail'] ? $main_image['is_detail'] : 1;
            
            $str .= '<tr class="p_img" rel="1" style="border-bottom:1px solid #ccc;">
						<td style="width:120px;text-align:center;"><img  rel="'.$main_image['image'].'" style="width:100px;height:100px;" src="'.Yii::$service->product->image->getUrl($main_image['image']).'"></td>
						<td style="width:220px;text-align:center;"><input  type="text" class="image_label" name="image_label"  value="'.$main_image['label'].'" /></td>
						<td style="width:220px;text-align:center;"><input  type="text" class="sort_order"  name="sort_order" value="'.$main_image['sort_order'].'"  /></td>
						<td style="width:30px;text-align:center;"><input type="radio" name="image" checked  value="'.$main_image['image'].'" /></td>
						
                        <td style="width:220px;text-align:center;">
                            <select name="is_thumbnails" class="is_thumbnails">
                                '.$this->getYesNoOptions($is_thumbnails).'
                            </select>
                        </td>
                        <td style="width:220px;text-align:center;">
                            <select name="is_detail" class="is_detail">
                                '.$this->getYesNoOptions($is_detail).'
                            </select>
                        </td>
                        
                        <td style="padding:0 0 0 20px;"><a class="delete_img btnDel" href="javascript:void(0)"><i class="fa fa-trash-o"></i></a></td>
					</tr>';
        }
        if (!empty($gallery_image) && is_array($gallery_image)) {
            $i = 2;
            
            foreach ($gallery_image as $gallery) {
                $is_thumbnails = $gallery['is_thumbnails'] ? $gallery['is_thumbnails'] : 1;
                $is_detail = $gallery['is_detail'] ? $gallery['is_detail'] : 1;
            
                $str .= '<tr class="p_img" rel="'.$i.'" style="border-bottom:1px solid #ccc;">
									<td style="width:120px;text-align:center;"><img  rel="'.$gallery['image'].'" style="width:100px;height:100px;" src="'.Yii::$service->product->image->getUrl($gallery['image']).'"></td>
									<td style="width:220px;text-align:center;"><input  type="text" class="image_label" name="image_label"  value="'.$gallery['label'].'" /></td>
									<td style="width:220px;text-align:center;"><input  type="text" class="sort_order"  name="sort_order" value="'.$gallery['sort_order'].'"  /></td>
									<td style="width:30px;text-align:center;"><input type="radio" name="image"   value="'.$gallery['image'].'" /></td>
                                   <td style="width:220px;text-align:center;">
                                        <select name="is_thumbnails" class="is_thumbnails">
                                            '.$this->getYesNoOptions($is_thumbnails).'
                                        </select>
                                    </td>
                                    <td style="width:220px;text-align:center;">
                                        <select name="is_detail" class="is_detail">
                                            '.$this->getYesNoOptions($is_detail).'
                                        </select>
                                    </td>
									<td style="padding:0 0 0 20px;"><a class="delete_img btnDel" href="javascript:void(0)"><i class="fa fa-trash-o"></i></a></td>
								</tr>';
                $i++;
            }
        }

        $str .= '</tbody>
			</table>
		</div>';

        return $str;
    }
    
    public function getYesNoOptions($val){
        if($val == 1){
            return '
                <option  value="1" selected="selected" >' . Yii::$service->page->translate->__('Yes') . '</option>
                <option  value="2">' . Yii::$service->page->translate->__('No') . '</option>
            ';
        }else{
            return '
                <option  value="1">' . Yii::$service->page->translate->__('Yes') . '</option>
                <option  value="2" selected="selected">' . Yii::$service->page->translate->__('No') . '</option>
            ';
        }
    }

    public function getCustomOpImgHtml()
    {
        if (isset($this->_one['image']['main']) && !empty($this->_one['image']['main'])) {
            $main_image = $this->_one['image']['main'];
        }
        if (isset($this->_one['image']['gallery']) && !empty($this->_one['image']['gallery'])) {
            $gallery_image = $this->_one['image']['gallery'];
        }
        $str = '';
        if (!empty($main_image) && is_array($main_image)) {
            $str .= '<span><img  rel="'.$main_image['image'].'" style="width:80px;" src="'.Yii::$service->product->image->getUrl($main_image['image']).'"></span>';
        }
        if (!empty($gallery_image) && is_array($gallery_image)) {
            $i = 2;
            foreach ($gallery_image as $gallery) {
                $str .= '<span><img  rel="'.$gallery['image'].'" style="width:80px;" src="'.Yii::$service->product->image->getUrl($gallery['image']).'"></span>';
                $i++;
            }
        }
        $str .= '';

        return $str;
    }

    public function getEditArr()
    {
    }

    /**
     * save article data,  get rewrite url and save to article url key.
     */
    public function save()
    {
        $this->initParamType();
        /*
         * if attribute is date or date time , db storage format is int ,by frontend pass param is int ,
         * you must convert string datetime to time , use strtotime function.
         */
        // var_dump()

        if (Yii::$app->request->post('operate') == 'copy') {
            $productPrimaryKey = Yii::$service->product->getPrimaryKey();
            if (isset($this->_param[$productPrimaryKey])) {
                unset($this->_param[$productPrimaryKey]);
                //echo 111;
                //var_dump($this->_param);
                //exit;
            }
        }
        
        $spu_attrs = Yii::$app->request->post('spu_attrs');
        $spuImgAttr = Yii::$app->request->post('spuImgAttr');
        $spuArr = $this->getSpuArr($spu_attrs, $spuImgAttr);
        $editFormSku = $this->_param['sku'];
        if (!$editFormSku && (!$spuArr || empty($spuArr))) {
            echo  json_encode([
                'statusCode' => '300',
                'message'    => 'spu属性为空,如果您当前选择的产品没有spu属性,请使用单个产品添加',
            ]);
            exit;
        }
        $edit_spu = Yii::$app->request->post('edit_spu');
        $product_id =  Yii::$app->request->post('product_id');
        if ($product_id) {
            $this->productHasRole($edit_spu);
        }
        
        $this->_param['bdmin_user_id'] = $this->_bdmin_user_id;
        $this->checkSaveData($this->_param);
        $this->_service->tbSave($edit_spu, $this->_param, $spuArr);
        
        echo  json_encode([
            'statusCode' => '200',
            'message'    => Yii::$service->page->translate->__('Save Success'),
        ]);
        exit; 
    }
     /**
     * 如果是添加新产品,检查spu是否存在
     */
    public function checkSaveData($one)
    {
        $productId = Yii::$app->request->post('product_id');
        // 如果是添加产品,那么需要查询是否已经存在此spu
        if (!$productId) {
            $products = Yii::$service->product->getBySpu($one['spu']);  // $this->_productModel->findOne(['spu' => $one['spu']]);
            if (!empty($products)) {
                echo  json_encode([
                    'statusCode' => '300',
                    'message'    => '该spu已经存在,请勿添加相同spu的产品',
                ]);
                exit;
            }
        }
        
    }
    // 字符串解析出来数组。
    public function getSpuArr($spu_attrs, $spuImgAttr)
    {
        if (!$spu_attrs) {
            return [];
        }
        //echo $spuImgAttr;exit;
        $imgArr = [];
        $spuImgAttrArr = explode('|||', $spuImgAttr);
        if (is_array($spuImgAttrArr) && !empty($spuImgAttrArr)) {
            foreach ($spuImgAttrArr as $one) {
                list($attrName, $attrVal, $ImgKey) = explode('####', $one);
                if ($attrName && $attrVal && $ImgKey) {
                    $imgArr[$attrName.'###'.$attrVal] = $ImgKey;
                }
                
            }
        }
        
        $arr = [];
        $spu_arrs = explode('***', $spu_attrs);
        foreach ($spu_arrs as $spu_arr) {
            if ($spu_arr) {
                $spu_attr_arr = explode('|||', $spu_arr);
                $arr2 = [];
                foreach ($spu_attr_arr as $spu_attr_one) {
                    if ($spu_attr_one) {
                        list($attr, $val) = explode('###', $spu_attr_one);
                        $arr2[$attr] = $val;
                        $key = $attr.'###'.$val;
                        if (isset($imgArr[$key]) && $imgArr[$key]) {
                            $arr2['main_image'] = $imgArr[$key];
                        }
                    }
                }
                $arr[] = $arr2;
            }
            
        }
        //var_dump($arr);exit;
        
        return $arr;
    }

    protected function initParamType()
    {
        $request_param = CRequest::param();
        $this->_param = $request_param[$this->_editFormData];
        $this->_param['attr_group'] = CRequest::param('attr_group');
        $custom_option = CRequest::param('custom_option');
        //var_dump($custom_option);
        $custom_option = $custom_option ? json_decode($custom_option, true) : [];
        $custom_option_arr = [];
        if (is_array($custom_option) && !empty($custom_option)) {
            foreach ($custom_option as $option) {
                if(is_array($option) && !empty($option)){
                    foreach($option as $key => $val){
                        if($key == 'qty'){
                            $option[$key] = (int) $option[$key];
                        } else if ($key == 'price') {
                            $option[$key] = (float) $option[$key];
                        } else {
                            $option[$key] = html_entity_decode($val);
                        }
                    }
                }
                $custom_option_arr[$option['sku']] = $option;
            }
        }
        
        $this->_param['custom_option'] = $custom_option_arr;
        //var_dump($this->_param['custom_option']);
        $image_gallery = CRequest::param('image_gallery');
        $image_main = CRequest::param('image_main');
        $save_gallery = [];
        // Category
        $category = CRequest::param('category');
        if ($category) {
            $category = explode(',', $category);
            if (!empty($category)) {
                $cates = [];
                foreach ($category  as $cate) {
                    if ($cate) {
                        $cates[] = $cate;
                    }
                }
                $this->_param['category'] = $cates;
            } else {
                $this->_param['category'] = [];
            }
        } else {
            $this->_param['category'] = [];
        }
        // init image gallery
        if ($image_gallery) {
            $image_gallery_arr = explode('|||||', $image_gallery);
            if (!empty($image_gallery_arr)) {
                foreach ($image_gallery_arr as $one) {
                    if (!empty($one)) {
                        list($gallery_image, $gallery_label, $gallery_sort_order,$gallery_is_thumbnails,$gallery_is_detail) = explode('#####', $one);
                        $save_gallery[] = [
                            'image'            => $gallery_image,
                            'label'              => $gallery_label,
                            'sort_order'      => $gallery_sort_order,
                            'is_thumbnails' => $gallery_is_thumbnails,
                            'is_detail'         => $gallery_is_detail,
                        ];
                    }
                }
                $this->_param['image']['gallery'] = $save_gallery;
            }
        }
        // init image main
        if ($image_main) {
            list($main_image, $main_label, $main_sort_order,$main_is_thumbnails,$main_is_detail) = explode('#####', $image_main);
            $save_main = [
                'image'             => $main_image,
                'label'               => $main_label,
                'sort_order'       => $main_sort_order,
                'is_thumbnails'   => $main_is_thumbnails,
                'is_detail'          => $main_is_detail,
            ];
            $this->_param['image']['main'] = $save_main;
        }
        //qty
        $this->_param['qty'] = $this->_param['qty'] ? (float) ($this->_param['qty']) : 0;
        $this->_param['package_number'] = (int)abs($this->_param['package_number']);
        //is_in_stock
        $this->_param['is_in_stock'] = $this->_param['is_in_stock'] ? (int) ($this->_param['is_in_stock']) : 0;
        //price
        $this->_param['cost_price'] = $this->_param['cost_price'] ? (float) ($this->_param['cost_price']) : 0;
        $this->_param['price'] = $this->_param['price'] ? (float) ($this->_param['price']) : 0;
        $this->_param['special_price'] = $this->_param['special_price'] ? (float) ($this->_param['special_price']) : 0;
        //date
        $this->_param['new_product_from'] = $this->_param['new_product_from'] ? (float) (strtotime($this->_param['new_product_from'])) : 0;
        $this->_param['new_product_to'] = $this->_param['new_product_to'] ? (float) (strtotime($this->_param['new_product_to'])) : 0;
        $this->_param['special_from'] = $this->_param['special_from'] ? (float) (strtotime($this->_param['special_from'])) : 0;
        $this->_param['special_to'] = $this->_param['special_to'] ? (float) (strtotime($this->_param['special_to'])) : 0;
        //weight
        $this->_param['weight'] = $this->_param['weight'] ? (float) ($this->_param['weight']) : 0;
        //长
        $this->_param['long'] = $this->_param['long'] ? (float) ($this->_param['long']) : 0;
        //宽
        $this->_param['width'] = $this->_param['width'] ? (float) ($this->_param['width']) : 0;
        //高
        $this->_param['high'] = $this->_param['high'] ? (float) ($this->_param['high']) : 0;
        //体积重
        $this->_param['volume_weight'] = Yii::$service->shipping->getVolumeWeight($this->_param['long'], $this->_param['width'], $this->_param['high']) ;
        
        $this->_param['score'] = $this->_param['score'] ? (int) ($this->_param['score']) : 0;
        //status
        $this->_param['status'] = $this->_param['status'] ? (float) ($this->_param['status']) : 0;
        // 供应商
        $this->_param['bdmin_user_id'] = $this->_param['bdmin_user_id'] ? (int) ($this->_param['bdmin_user_id']) : 0;
        
        //image main sort order
        if (isset($this->_param['image']['main']['sort_order']) && !empty($this->_param['image']['main']['sort_order'])) {
            $this->_param['image']['main']['sort_order'] = (int) ($this->_param['image']['main']['sort_order']);
        }
        //image gallery
        if (isset($this->_param['image']['gallery']) && is_array($this->_param['image']['gallery']) && !empty($this->_param['image']['gallery'])) {
            $gallery_af = [];
            foreach ($this->_param['image']['gallery'] as $gallery) {
                if (isset($gallery['sort_order']) && !empty($gallery['sort_order'])) {
                    $gallery['sort_order'] = (int) $gallery['sort_order'];
                }
                $gallery_af[] = $gallery;
            }
            $this->_param['image']['gallery'] = $gallery_af;
        }
        // 自定义属性 也就是在 @common\config\fecshop_local_services\Product.php 产品服务的 customAttrGroup 配置的产品属性。
        $custom_attr = \Yii::$service->product->getGroupAttrInfo($this->_param['attr_group']);
        if (is_array($custom_attr) && !empty($custom_attr)) {
            foreach ($custom_attr as $attrInfo) {
                $attr = $attrInfo['name'];
                $dbtype = $attrInfo['dbtype'];
                if (isset($this->_param[$attr]) && !empty($this->_param[$attr])) {
                    if ($dbtype == 'Int') {
                        if (isset($attrInfo['display']['lang']) && $attrInfo['display']['lang']) {
                            $langs = Yii::$service->fecshoplang->getAllLangCode();
                            if (is_array($langs) && !empty($langs)) {
                                foreach ($langs as $langCode) {
                                    $langAttr = Yii::$service->fecshoplang->getLangAttrName($attr, $langCode);
                                    if (isset($this->_param[$attr][$langAttr]) && $this->_param[$attr][$langAttr]) {
                                        $this->_param[$attr][$langAttr] = (int) $this->_param[$attr][$langAttr];
                                    }
                                }
                            }
                        } else {
                            $this->_param[$attr] = (int) $this->_param[$attr];
                        }
                    }
                    if ($dbtype == 'Float') {
                        if (isset($attrInfo['display']['lang']) && $attrInfo['display']['lang']) {
                            $langs = Yii::$service->fecshoplang->getAllLangCode();
                            if (is_array($langs) && !empty($langs)) {
                                foreach ($langs as $langCode) {
                                    $langAttr = Yii::$service->fecshoplang->getLangAttrName($attr, $langCode);
                                    if (isset($this->_param[$attr][$langAttr]) && $this->_param[$attr][$langAttr]) {
                                        $this->_param[$attr][$langAttr] = (float) $this->_param[$attr][$langAttr];
                                    }
                                }
                            }
                        } else {
                            $this->_param[$attr] = (float) $this->_param[$attr];
                        }
                    }
                }
            }
        }

        //tier price
        $tier_price = $this->_param['tier_price'];
        $tier_price_arr = [];
        if ($tier_price) {
            $arr = explode('||', $tier_price);
            if (is_array($arr) && !empty($arr)) {
                foreach ($arr as $ar) {
                    list($tier_qty, $tier_price) = explode('##', $ar);
                    if ($tier_qty && $tier_price) {
                        $tier_qty = (int) $tier_qty;
                        $tier_price = (float) $tier_price;
                        $tier_price_arr[] = [
                            'qty'    => $tier_qty,
                            'price'    => $tier_price,
                        ];
                    }
                }
            }
        }
        $tier_price_arr = \fec\helpers\CFunc::array_sort($tier_price_arr, 'qty', 'asc');
        $this->_param['tier_price'] = $tier_price_arr;
    }

    // 批量删除
    public function delete()
    {
        $ids = '';
        if ($id = CRequest::param($this->_primaryKey)) {
            $ids = $id;
        } elseif ($ids = CRequest::param($this->_primaryKey.'s')) {
            $ids = explode(',', $ids);
        }
        $this->_service->remove($ids);
        $errors = Yii::$service->helper->errors->get();
        if (!$errors) {
            echo  json_encode([
                'statusCode' => '200',
                'message' => Yii::$service->page->translate->__('Remove Success'),
            ]);
            exit;
        } else {
            echo  json_encode([
                'statusCode' => '300',
                'message' => $errors,
            ]);
            exit;
        }
    }
}

voima#44年前 0 个赞

@Fecmall [#1楼](#comment1) 我升级后,整体测试了一下,和spu 无关,主要是 自定义 spu 属性

sku编码,如果有和上一个产品一样的编码,会导致当前编辑的产品被删除,或者无法保存。但是弹出的依然是保存成功

Fecmall#54年前 0 个赞

@voima #4楼

本人感觉和你交流很费劲,代码都给你贴出来了,还用了截图,你能仔细看不?

你自己解决吧,本人表示帮不上忙。

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics