[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);
}
}
[PHP] 商品类型规格属性后台管理(代码流程备忘)的更多相关文章
- [开源] FreeSql.AdminLTE.Tools 根据实体类生成后台管理代码
前言 FreeSql 发布至今已经有9个月,功能渐渐完善,自身的生态也逐步形成,早在几个月前写过一篇文章<ORM 开发环境之利器:MVC 中间件 FreeSql.AdminLTE>,您可以 ...
- C#常用代码片段备忘
以下是从visual studio中整理出来的常用代码片段,以作备忘 快捷键: eh 用途: 类中事件实现函数模板 private void MyMethod(object sender, Event ...
- httpwebrequest 模拟登录 获取cookies 以前的代码,记录备忘!
2个类,一个基类,一个构建头信息调用类 关于如何获取到post中的内容,你之需要用http抓包工具把你与目标网站的请求信息抓下来后,打开分析下按照抓下来的包中的数 据进行构建就行了 using Sys ...
- 玩转html5(一)-----盘点html5新增的那些酷酷的input类型和属性
今天正式开始学习html5了,相比html以前的版本,html5新增了好多功能,属性,使我们做出来的界面更加的绚丽,而且使用起来超级简单,这篇文章先来说说html增加的那些input类型和属性. 这些 ...
- PHP.40-TP框架商城应用实例-后台15-商品属性与库存量1-不同商品(唯一属性、可选属性),属性类型
思路: 1.不同商品属于不同的类型,如:手机.服装.电脑等类型 2.不同的类型有不同的属性,其中分为唯一属性和可选属性,如服装:可选属性{尺寸:S,M,L……;颜色:白色,黑色……}唯一属性:材质 首 ...
- magento -- 给后台分类管理页的分类商品加一栏商品类型
当使用特定分类来控制前台的商品显示时,后台分类管理页的分类商品只有编号.名称.SKU和价格这几栏,选择特定商品相当不便. 可以在这里多加一栏商品类型用来筛选商品,添加的方式很简单. 打开文件/app/ ...
- 微擎 人人商城 对接京东vop 对接京东商品,同步商品 地址,库存,价格,上下架等。(二) 设置后台管理界面
昨天提到了,由于vop商品池未开通,故对接工作只能暂缓,现在要做一个专门针对vop商品的后台管理, 老规矩,先上设计链路图 因为后台本来就是有比较完善的商品管理系统, 所以我们只是针对vop 进行简单 ...
- 商品类型的下拉框绑定一个事件,通过ajax获取属性
html代码这么写 <!-- 商品属性 --> <table cellspacing="1" cellpadding="3" width=&q ...
- zencart后台管理中选项名称和选项内容和属性控制页面出错解决办法 WARNING: An Error occurred, please refresh the page and try again
后台管理中选项名称和选项内容和属性控制出现以下错误的解决办法WARNING: An Error occurred, please refresh the page and try again zen ...
随机推荐
- 应用于电力电子变压器的双向DC_DC变换器综述(学习笔记)
PET(Powerelectronictransformer):电力电子变压器 PET所具有的优点: (1)体积小.重量轻.无变压器油的污染: (2)具备功率因数调节能力,减小电网谐波污染: (3)能 ...
- 《JavaScript》高级程序设计第7章 函数表达式
7.2 闭包 定义: 闭包是指有权访问另一个函数作用域中的变量的函数. 理解闭包: 作用域链: 当某个函数被调用时,会创建一个执行环境以及相应的作用域链. 作用域链中,外部函数的活动对象始终处于第二位 ...
- rabbitMQ的简单实例——amqp协议带数据回写机制
rabbitMQ是一种高性能的消息队列,支持或者说它实现了AMQP协议(advanced message queue protocol高级消息队列协议). 下面简单讲一讲一个小例子.我们首先要部署好r ...
- mybatis 关联表查询
这段时间由于项目上的需求:需要将数据库中两表关联的数据查询出来展示到前端(包含一对一,一对多): (1)一对一: 在实体类中维护了另一个类的对象: 这里我以用户(User)和产品(Product)为例 ...
- 使用SecureCRT的SFTP传输文件
使用SecureCRT的SFTP传输文件 使用 FileZilla 上传项目更新,因为软件缓存没处理好,三个文件花了三个小时~~ 找一种缓存干扰最小的方式上传文件. 1.在使用 SecureCRT 连 ...
- 深入理解Java接口和抽象类
对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用, ...
- nginx配置跨域、gzip加速、代理详细讲解
1.配置跨域 这个很简单,直接打开配置nginx.conf ,在http下配置下面三行代码:当然如果你是想某一个虚拟主机下跨域,那就在哪个server下面添加 add_header Access-Co ...
- POJ 2339
#include <iostream> #include <algorithm> #define MAXN 205 using namespace std; char _m[M ...
- Android Touch事件派发流程源码分析
分native侧事件派发到java侧和Framework派发事件到UI,流程看源码即可,此处不赘叙, Native侧派发事件的干活类图如下:
- Android 开发工具类 16_NotificationActivity
在前台运行的 Activity 可以通过Dialog.Toast 向用户发出提示信息,而后台运行的程序,如下载.收到信息等 Service 应用,则需要使用 Notification(通知)向用户发出 ...