欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

[PHP] 商品类型规格属性后台管理(代码流程备忘) - 陶士涵

程序员文章站 2022-04-30 08:22:17
...
实现界面

[PHP] 商品类型规格属性后台管理(代码流程备忘) - 陶士涵

涉及到四张表,type(商品类型表),type_spec(商品类型规格关联表),attribute(商品属性表),attribute_value(商品属性值表)

新建基控制器BaseController.class.php,向上抽取出来的公用方法

BaseController.class.php

php
namespace Admin\Controller;
use Think\Controller;
class BaseController extends Controller {
    protected $pageSize=1;
    /**
     * 获取分页对象
     * @param  [type] $count [description]
     * @return [type]        [description]
     */
    public function getPager($count){
        $pager=new \Common\Libs\MyPage($count,$this->pageSize);
        return $pager;
    }
}

定义基模型文件BaseModel.class.php,继承系统的Model类

BaseModel.class.php

php
namespace Common\Model;
use Think\Model;
class BaseModel extends Model{
    /**
     * 获取分页数据
     * @param  [type] $pager     [description]
     * @param  array  $condition [description]
     * @param  string $order     [description]
     * @return [type]            [description]
     */
    public function getPagerResult($pager,$condition=array(),$order=""){
        if($pager==null){
            return;
        }
        return $this->where($condition)
                    ->limit($pager->firstRow.','.$pager->listRows)
                    ->order($order)
                    ->select();
    }
    /**
     * 获取条数
     * @return [type] [description]
     */
    public function getCount($condition=array()){
        return $this->where($condition)->count();
    }
    /**
     * 添加数据
     * @return [type] [description]
     */
    public function addItem($data){
        $msg=array();
        if(!$this->create($data)){
            $msg['msg']=$this->getError();
            $msg['status']=false;
        }else{
            $id=$this->add($data);
            if($id){
                $msg['status']=true;
                $msg['id']=$id;
            }else{
                $msg['status']=false;
                $msg['msg']=$this->getError();
            }
        }
        return $msg;
    }
    /**
     * 获取单条数据
     * @return [type] [description]
     */
    public function getItem($condition=array()){
        return $this->where($condition)->find();
    }
    /**
     * 获取所有数据
     * @return [type] [description]
     */
    public function getAllResult($condition=array()){
        return $this->where($condition)->select();
    }
    /**
     * 删除数据
     * @return [type] [description]
     */
    public function delItem($condition=array()){
        if(empty($condition)){
            return false;
        }
        return $this->where($condition)->delete();
    }
    /**
     * 编辑数据
     * @return [type] [description]
     */
    public function setItem($condition=array(),$data){
        if(empty($condition)){
            return false;
        }
        $msg=array();
        if(!$this->create($data)){
            $msg['msg']=$this->getError();
            $msg['status']=false;
        }else{
            $id=$this->where($condition)->save($data);
            $msg['status']=true;
            $msg['id']=$id;
        }
        return $msg;
    }
}

新建类型控制器文件TypeController.class.php

TypeController.class.php

php
namespace Admin\Controller;
use Think\Controller;
/**
 * 类型(规格,属性)
 */
class TypeController extends BaseController {
    private $typeModel;
    private $specModel;
    private $attrModel;
    private $typeId;
    public function __construct(){
        parent::__construct();
        $this->typeModel=D("Type");
        $this->specModel=D("Spec");
        $this->attrModel=D("Attr");
    }
    /**
     * 列表
     * @return [type] [description]
     */
    public function index(){
        $nums=$this->typeModel->getCount();
        $pager=$this->getPager($nums);
        $typeList=$this->typeModel->getPagerResult($pager,array(),"type_id desc");
        $pageHtml=$pager->show();

        $this->assign('typeList',$typeList);
        $this->assign('pageHtml',$pageHtml);
        $this->display();
    }
    /**
     * 添加类型(添加进4张表 type,type_spec,attribute,attribute_value)
     * @return [type] [description]
     */
    public function addType(){
        if(IS_POST){
            //添加类型表
            $res=$this->typeModel->addTypeItem($_POST);
            if($res['status']){
                $this->typeId=$res['id'];
                //添加属性
                if($_POST['attr_value'][0]['name']){
                    $this->addAttrData($_POST['attr_value']);
                }
                $this->success("操作成功!");
            }else{
                $this->error($res['msg']);
            }
        }else{
            $specList=$this->specModel->select();
            $this->assign("specList",$specList);
            $this->display(); 
        }
    }
    /**
     * 添加属性
     * @param [type] $data [description]
     */
    private function addAttrData($data){
        foreach ($data as $key => $value) {
            $temp=array();
            $temp['attr_name']=$value['name'];
            $temp['attr_values']=$value['value'];
            $temp['type_id']=$this->typeId;
            $this->attrModel->addAttrItem($temp);
        }
        return true;
    }
    /**
     * 编辑属性
     * @param [type] $data [description]
     */
    private function setAttrData($data){
        foreach ($data as $key => $value) {
            $temp=array();
            $temp['attr_id']=$key;
            $temp['attr_name']=$value['name'];
            $temp['attr_values']=$value['value'];
            $temp['type_id']=$this->typeId;
            $this->attrModel->setAttrItem($temp);
            //添加属性
            if($key=='new'){
                $this->addAttrData($value);
                break;
            }
        }
        return true;
    }
    /**
     * 编辑类型(添加进4张表 type,type_spec,attribute,attribute_value)
     * @return [type] [description]
     */
    public function editType(){
        $typeId=intval($_GET['typeId']);
        
        if(IS_POST){
            $this->typeId=intval($_POST['type_id']);
            //编辑类型表
            $res=$this->typeModel->editTypeItem($_POST);
            if($res['status']){
                //编辑属性
                if(!empty($_POST['attr_value'])){
                    $this->setAttrData($_POST['attr_value']);
                }
                $this->success("操作成功!",U("Type/editType",array('typeId'=>$this->typeId)));
            }else{
                $this->error($res['msg']);
            }
        }else{
            $typeInfo=$this->typeModel->getItem(array('type_id'=>$typeId));
            $this->assign("typeInfo",$typeInfo);

            $specList=$this->specModel->select();
            $this->assign("specList",$specList);

            $specTypeList=M("type_spec")->where(array('type_id'=>$typeId))->getField("spec_id",true);
            $this->assign("specTypeList",$specTypeList);

            $attrList=$this->attrModel->getAllResult(array('type_id'=>$typeId));
            $this->assign("attrList",$attrList);

            $this->display(); 
        }
    }
}

新建类型模型文件TypeModel.class.php

TypeModel.class.php

php
namespace Common\Model;
use Think\Model;
class TypeModel extends BaseModel{
    /**
     * 验证规则
     * @var array
     */
    protected $_validate = array(
        array('type_name','require','类型名称必须!')
    );
    /**
    * 添加类型
    */
    public function addTypeItem($data){
        $res=$this->addItem($data);

        //添加类型规格
        $typeSpecs=$data['spec_id'];
        $typeSpecArray=array();
        foreach ($typeSpecs as $typeSpec) {
            $temp=array();
            $temp['type_id']=$res['id'];
            $temp['spec_id']=$typeSpec;
            $typeSpecArray[]=$temp;
        }
        
        M("type_spec")->addAll($typeSpecArray);
        return $res;
    }
    /**
    * 编辑类型
    */
    public function editTypeItem($data){
        $res=$this->setItem(array('type_id'=>$data['type_id']),$data);

        //编辑类型规格
        M("type_spec")->where(array('type_id'=>$data['type_id']))->delete();
        $typeSpecs=$data['spec_id'];
        $typeSpecArray=array();
        foreach ($typeSpecs as $typeSpec) {
            $temp=array();
            $temp['type_id']=$data['type_id'];
            $temp['spec_id']=$typeSpec;
            $typeSpecArray[]=$temp;
        }
        
        M("type_spec")->addAll($typeSpecArray);

        return $res;
    }
}

新建规格模型文件SpecModel.class.php

SpecModel.class.php

php
namespace Common\Model;
use Think\Model;
class SpecModel extends BaseModel{
    /**
     * 验证规则
     * @var array
     */
    protected $_validate = array(
        array('spec_name','require','规格名称必须!'), 
        array('spec_sort','number','排序必须是数字!')
    );
}

新建属性模型文件AttrModel.class.php

AttrModel.class.php

php
namespace Common\Model;
use Think\Model;
class AttrModel extends BaseModel{
    protected $tableName="attribute";
    /**
     * 验证规则
     * @var array
     */
    protected $_validate = array(
        array('attr_name','require','属性名称必须!'),
        array('type_id','require','类型id必须!'),
        array('attr_values','require','属性值必须!')
    );
    /**
     * 添加属性
     */
    public function addAttrItem($data){
        $res=$this->addItem($data);

        //添加属性值
        $attrValues=explode("|", $data['attr_values']);
        $attrValueArray=array();
        foreach ($attrValues as $attrValue) {
            $temp=array();
            $temp['attr_id']=$res['id'];
            $temp['attr_value']=$attrValue;
            $attrValueArray[]=$temp;
        }
        
        M("attribute_value")->addAll($attrValueArray);
    }
    /**
     * 编辑属性
     */
    public function setAttrItem($data){
        $res=$this->setItem(array('attr_id'=>$data['attr_id']),$data);

        //编辑属性值
        M("attribute_value")->where(array('attr_id'=>$data['attr_id']))->delete();
        $attrValues=explode("|", $data['attr_values']);
        $attrValueArray=array();
        foreach ($attrValues as $attrValue) {
            if(!$attrValue){
                break;
            }
            $temp=array();
            $temp['attr_id']=$data['attr_id'];
            $temp['attr_value']=$attrValue;
            $attrValueArray[]=$temp;
        }
        
        M("attribute_value")->addAll($attrValueArray);
    }
}