夺命雷公狗ThinkPHP项目之----商城10商品属性管理

我们一般做项目前就要分析业务逻辑先,这次也不例外.

attr_type:是指属性的类型,有唯一,单选和多选之分

唯一属性,是指用户在购买商品时,可以看到的扩展属性如下图所示:

单选属性,是指用户在购买的时候,不需要选择的扩展属性,否则就无法购买,如下所示:

多选和单选是对应的,但是可以选择多个,但是单选的只能选择一个,否则就无法购买。

attr_input_type:是指属性的输入方式,有文本框,下拉列表和文本域之分,如下图所示:

attr_value:是指如果属性是下拉形式的,应该提供可选值。

如果该属性是下拉列表形式的,几必须提供可选值,如下图所示,如果其他输入方式为空即可。

说白了attr_type是提供给普通用户使用的,attr_input_type一般是给后台管理员使用的。

扩展属性在整个商品模块中的位置目前保存属性本身,并不是具体某个商品的属性值。

明白了表结构和逻辑后,那么下一步就开始写代码了。

首先在model层创建一个AttriburtModel.class.php来对他进行验证,

<?php
    namespace Admin\Model;
    use Think\Model;
    class AttributeModel extends Model{
        //自动验证规则
        protected $_validate = array(
            array(‘attr_name‘,‘require‘,‘属性名称不呢个为空‘),
        );
    }

下一步就开始写控制器了,代码如下所示:

<?php
    namespace Admin\Controller;
    use Think\Controller;
    class AttributeController extends CommonController{
        public function index(){
            $this -> display();
        }

        public function add(){
            if(IS_POST){
                //入库
                $data[‘attr_name‘] = I(‘attr_name‘);
                $data[‘type_id‘] = I(‘type_id‘);
                $data[‘attr_type‘] = I(‘attr_type‘);
                $data[‘attr_input_type‘] = I(‘attr_input_type‘);
                $data[‘attr_value‘] = I(‘attr_value‘);

                $attrModel = D(‘attribute‘);
                if($attrModel->create($data)){
                    //通过验证
                    if($attrModel->add()){
                        $this -> success(‘添加属性成功‘,U(‘index‘),1);
                    }else{
                        $this -> error(‘添加属性失败‘);
                    }
                }else{
                    //没通过验证,提示错误信息
                    $this -> error($attrModel->getError());
                }

                return;
            }
            //获取所有的商品类型
            $types = M(‘goods_type‘)->select();
            $this -> assign(‘types‘,$types);
            $this -> display();
        }

        public function edit(){
            $this -> display();
        }

        public function del(){
            $this -> display();
        }
    }

下一步开始写add.html模板了,代码如下所示:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>SHOP 管理中心 - 属性管理 </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="__ADMIN__/styles/general.css" rel="stylesheet" type="text/css" />
<link href="__ADMIN__/styles/main.css" rel="stylesheet" type="text/css" />
</head>
<body>

<h1>
<span class="action-span"><a href="index.php?p=admin&c=attribute&a=index">商品属性</a></span>
<span class="action-span1"><a href="index.php?act=main">SHOP 管理中心</a> </span><span id="search_id" class="action-span1"> - 添加属性 </span>
<div style="clear:both"></div>
</h1>

<div class="main-div">
  <form action="" method="post" name="theForm" onsubmit="return validate();">
  <table width="100%" id="general-table">
      <tbody><tr>
        <td class="label">属性名称:</td>
        <td>
          <input type="text" name="attr_name" value="" size="30">
          <span class="require-field">*</span>        </td>
      </tr>
      <tr>
        <td class="label">所属商品类型:</td>
        <td>
          <select name="cat_id" onchange="onChangeGoodsType(this.value)">
            <option value="0">请选择...</option>
          <volist name="types" id="vo">
            <option value="{$vo[‘type_id‘]}">{$vo[‘type_name‘]}</option>
          </volist>
          </select> <span class="require-field">*</span>        </td>
      </tr>
      <tr id="attrGroups" style="display: none;">
        <td class="label">属性分组:</td>
        <td>
          <select name="attr_group">
                    </select>
        </td>
      </tr>
      <tr>
        <td class="label"><a href="javascript:showNotice(‘noticeAttrType‘);" title="点击此处查看提示信息"><img src="__ADMIN__/images/notice.gif" width="16" height="16" border="0" alt="点击此处查看提示信息"></a>属性是否可选</td>
        <td>
          <label><input type="radio" name="attr_type" value="0" checked="true"> 唯一属性</label>          <label><input type="radio" name="attr_type" value="1"> 单选属性</label>          <label><input type="radio" name="attr_type" value="2"> 复选属性</label>          <br><span class="notice-span" style="display:block" id="noticeAttrType">选择"单选/复选属性"时,可以对商品该属性设置多个值,同时还能对不同属性值指定不同的价格加价,用户购买商品时需要选定具体的属性值。选择"唯一属性"时,商品的该属性值只能设置一个值,用户只能查看该值。</span>
        </td>
      </tr>
      <tr>
        <td class="label">该属性值的录入方式:</td>
        <td>
          <label><input type="radio" name="attr_input_type" value="0" checked="true" onclick="radioClicked(0)">
          手工录入</label>          <label><input type="radio" name="attr_input_type" value="1" onclick="radioClicked(1)">
          从下面的列表中选择(一行代表一个可选值)</label>          <label><input type="radio" name="attr_input_type" value="2" onclick="radioClicked(0)">
          多行文本框</label>        </td>
      </tr>
      <tr>
        <td class="label">可选值列表:</td>
        <td>
          <textarea name="attr_value" cols="30" rows="5" disabled=""></textarea>
        </td>
      </tr>
      <tr>
        <td colspan="2">
        <div class="button-div">
          <input type="submit" value=" 确定 " class="button">
          <input type="reset" value=" 重置 " class="button">
        </div>
        </td>
      </tr>
      </tbody></table>
    <input type="hidden" name="act" value="insert">
    <input type="hidden" name="attr_id" value="0">
  </form>
</div>

<div id="footer">
    版权所有 &copy; 2014-2016 夺命雷公狗 - 技术总结 - </div>
</div>
<script type="text/javascript">
/**
 * 点击类型按钮时切换选项的禁用状态
 */
function radioClicked(n)
{
  document.forms[‘theForm‘].elements["attr_value"].disabled = n > 0 ? false : true;
}

</script>
</body>
</html>
时间: 2024-10-12 17:14:31

夺命雷公狗ThinkPHP项目之----商城10商品属性管理的相关文章

夺命雷公狗ThinkPHP项目之----商城8商品品牌管理

本章的主要目标是为了对商品品牌进行CRUD(增删改查)操作. 我们在写的时候就要了解业务逻辑,也就是了解表结构 每个字段代表什么含义,为什么是这个类型的 logo:保存的是图片,一般是分两个途径来保存的, 1.保存图片的本身,保存在目录之下 2.将图片的路径保存到数据表中 我们先创建一个名字为BrandController的控制器,和在view视图里面创建一个Brand的文件夹来进行存放模版文件,如下图所示: 然后将add里面的css和图片路径该下即可代码如下: <!DOCTYPE html P

夺命雷公狗ThinkPHP项目之----商城6后台首页

废话步多说,我们开工, 首先我们将thinkphp文件都解压到环境目录下的shop文件夹下 然后将里面多余的东西都干掉,留下public文件夹和thinkphp文件夹,即可,别的东西干掉, 然后我们新建一个名字叫index.php的文件,里面的配置文件可以按以下方法进行自定义: <?php // 定义项目目录 define("APP_PATH",'./Shop/'); // 开启调试 define("APP_DEBUG",true); // 引入ThinkPH

夺命雷公狗ThinkPHP项目之----商城2数据库设计

重要难度:五星 难度:无形 数据库的设计,就是体现了你对业务逻辑的了解 数据库设计的好坏,有时候决定了项目的成败 要点: 表与表之间的关系(一对一,一对多,多对多) 每一个字段的数据类型(数值,字符串,日期时间)没有布尔类型,使用tinyint来代替,1是真,0是假 设计数据库,以商品为例 找到核心(中心),然后一步步的展开 核心->商品 先来初步设计一下商品表的字段: 名称.价格.图片.颜色.上架时间.各种规格参数.详细描述,库存,品牌.分类. 品牌和商品是两个不同的东西,设计表的一个理念:一

夺命雷公狗ThinkPHP项目之----商城3编程思想

在实际的开发总,往往都是思想决定了高度. oop思想 OOP:Object Oriented Programming,面向对象程序设计,面向对象编程 OOP的三大特征 封装:通过类实现的,将内部实现细节隐藏起来,给外部提供一个接口进行调用 继承:通过extends来实现的,子类可以继承父类的属性和方法(Protected和public) 多态:php本身就是多态的,php是弱类型语言,在php中一般比较少提到多态的概念 OOP的好处 可维护性好 可扩展性好 可重用性高 灵活度高 MVC模式 M:

夺命雷公狗ThinkPHP项目之----商城5快速入门

本章是快速入门篇,有基础可直接跳过: 1.创建一个数据库名叫shopp的,然后穿件一张表 #创建用户表 create table user( id int unsigned not null auto_increment primary key comment '用户编号', username varchar(50) not null default '' comment '用户名', email varchar(50) not null default '' comment '电子邮箱', p

夺命雷公狗ThinkPHP项目之----企业网站1之快速搭建后台

我们还是老规矩照老方法,将框架里面多余的东西都干掉,然后在index.php里面将框架搭建起来 <?php //定义项目目录 define('APP_PATH','./WEB/'); //开启调试 define('APP_DEBUG',True); //包含thinkphp项目入口文件 require "Thinkphp/Thinkphp.php"; 然后进入WEB目录下,并复制一个Home然后改名为Admin 然后再Index控制器下进行操作 代码如下所示: <?php

夺命雷公狗ThinkPHP项目之----企业网站10之栏目的编辑完善(无限极分类的完成)

我们编辑首先就要考虑将下拉框效果实现出来,然后再进行下一步操作: 我们用到了Model层的操作,在第8讲里面其实已经写好了catTree方法,控制器如下所示: 然后在列表页然他变量进行输出 然后开始通过接收post传过来的参数进行修改,但是有一点必须要考虑的, 水果 为顶级栏目, 苹果为 水果的下一级栏目,所以我们不能让水果变成苹果的下级栏目,我们居然考虑到这了,所以我们还是需要通过判断的, 让爸级栏目不能一下变成孙级栏目,不然发生全家族集体失终的“惨剧”哦.... 我们的解决方法是在显示的时候

夺命雷公狗ThinkPHP项目之----企业网站26之网站前台列表页的显示和完成分页功能

我们用大I接收到我们get过来的栏目页的id然后通过文章的ar_cateid 来判断是不是属于该栏目下的,如果文章表ar_cateid = 栏目表的cate_id 那么就可以选出我们要查找的信息, 然后再遍历到视图即可... <?php namespace Home\Controller; use Think\Controller; class ListsController extends CommonController { public function lists(){ //获取栏目的i

夺命雷公狗ThinkPHP项目之----企业网站2之数据库的快速设计

我们在一个项目的时候,花费最多事件的估计还是数据库的时间了,我们的数据库暂时就这样设计好了: 暂时我们的数据库就这样设计好了用下先,建好后如下所示: