zoukankan      html  css  js  c++  java
  • 夺命雷公狗ThinkPHP项目之----商城8商品品牌管理以及图片上传和分页

    本章的主要目标是为了对商品品牌进行CRUD(增删改查)操作。

    我们在写的时候就要了解业务逻辑,也就是了解表结构

    每个字段代表什么含义,为什么是这个类型的

    logo:保存的是图片,一般是分两个途径来保存的,

    1.保存图片的本身,保存在目录之下

    2.将图片的路径保存到数据表中

    我们先创建一个名字为BrandController的控制器,和在view视图里面创建一个Brand的文件夹来进行存放模版文件,如下图所示:

    然后将add里面的css和图片路径该下即可代码如下:

    <!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=brand&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 method="post" action="" name="theForm" enctype="multipart/form-data" onsubmit="return validate()">
    <table cellspacing="1" cellpadding="3" width="100%">
      <tbody><tr>
        <td class="label">品牌名称</td>
        <td><input type="text" name="brand_name" maxlength="60" value=""><span class="require-field">*</span></td>
      </tr>
      <tr>
        <td class="label">品牌网址</td>
        <td><input type="text" name="url" maxlength="60" size="40" value=""></td>
      </tr>
      <tr>
        <td class="label"><a href="javascript:showNotice('warn_brandlogo');" title="点击此处查看提示信息">
            <img src="__ADMIN__/images/notice.gif" width="16" height="16" border="0" alt="点击此处查看提示信息"></a>品牌LOGO</td>
        <td><input type="file" name="brand_logo" id="logo" size="45">    <br><span class="notice-span" style="display:block" id="warn_brandlogo">
            请上传图片,做为品牌的LOGO!        </span>
        </td>
      </tr>
      <tr>
        <td class="label">品牌描述</td>
        <td><textarea name="brand_desc" cols="60" rows="4"></textarea></td>
      </tr>
      <tr>
        <td class="label">排序</td>
        <td><input type="text" name="sort_order" maxlength="40" size="15" value="50"></td>
      </tr>
      <tr>
        <td class="label">是否显示</td>
        <td><input type="radio" name="is_show" value="1" checked="checked"><input type="radio" name="is_show" value="0"> 否        (当品牌下还没有商品的时候,首页及分类页的品牌区将不会显示该品牌。)
        </td>
      </tr>
      <tr>
        <td colspan="2" align="center"><br>
          <input type="submit" class="button" value=" 确定 ">
          <input type="reset" class="button" value=" 重置 ">
        </td>
      </tr>
    </tbody></table>
    </form>
    </div>
    
    
    <div id="footer">
        版权所有 &copy; 2014-2016 夺命雷公狗 - 技术总结 - </div>
    </div>
    
    </body>
    </html>

    然后我们在BrandController.class.php里面进行修改配置add方法。

    add方法是添加品牌的方法,提示,在刚才的表单中name属性,最好尽量和数据表字段的一样。

    我们直接在浏览器上打开http://www.shop.com/index.php/Admin/brand/add 即可看到如下所示:

    这里面有一个红色的*号,一般都是代表必须填写的,而且还有一个图片上传的地方,那么我们可以通过以下方法来进行解决。

    先决解必填的这个。

    品牌名称,一般都是唯一的,我们可以通过model层来让他进行判断,我们在model目录下创建一个BrandModel.class.php的文件。

    验证可以通过手册进行查找----模型----自动验证---里面有详细的例子

    BrandModel.class.php内容如下所示:

    <?php
        namespace AdminModel;
        use ThinkModel;
        //品牌模型
        class BrandModel extends Model{
            //自动验证规则
            protected $_validate = array(
                array('brand_name','require','品牌名称不能为空'),
                array('brand_name','','该品牌已存在',0,'unique',1),
            );
        }

    要使用自动验证,必须使用create方法代码如下所示

    <?php
        namespace AdminController;
        use ThinkController;
        class BrandController extends CommonController{
            //添加品牌
            public function add(){
                if(IS_POST){
                    //品牌入库 
                    //收集表单数据
                    $data['brand_name'] = I('brand_name');
                    $data['url'] = I('url');
                    $data['brand_desc'] = I('brand_desc');
                    $data['sort_order'] = I('sort_order');
                    $data['is_show'] = I('is_show');
    
                    //调用模型完成入库
                    $brandModel = D('brand'); //因为是调用Model层的所以要使用到D
                    if($brandModel->create($data)){
                        //成功验证,创建数据成功
                        if($brandModel->add()){ //使用create方法之后,这里的add方法不能传参
                                $this -> success('添加品牌成功',U('index'),1);
                            }else{
                                //验证失败
                                $this -> error('添加品牌失败');
                                }
                            }else{
                                $this -> error($brandModel->getError());
                        }
                    return;
                }
                //载入品牌添加页面
                $this -> display();
            }
        }

    这里完成后就还剩下图片上传了,thinkphp里面是已经封装好上传类的了,但上传的太长了,可以到手册----专题-----文件上传。

    详细代码如下所示:

    <?php
        namespace AdminController;
        use ThinkController;
        class BrandController extends CommonController{
            //添加品牌
            public function add(){
                if(IS_POST){
                    //品牌入库 
                    //收集表单数据
                    $data['brand_name'] = I('brand_name');
                    $data['url'] = I('url');
                    $data['brand_desc'] = I('brand_desc');
                    $data['sort_order'] = I('sort_order');
                    $data['is_show'] = I('is_show');
    
                    //上传图片
                    if($_FILES['brand_logo']['tmp_name']!=''){
                        $upload = new ThinkUpload();// 实例化上传类
                        $upload->maxSize   = 3145728 ;// 设置附件上传大小
                        $upload->exts      = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
                        $upload->rootPath  = './';  //这个一定要加否则很容易中招
                        $upload->savePath  =      'Public/Uploads/'; // 设置附件上传目录
                        $info   =   $upload->uploadOne($_FILES['brand_logo']);
                        if($info){
                            $data['logo'] = $info['savepath'].$info['savename'];
                        }else{
                             $this->error($upload->getError());
                        }
    
                    }
                    var_dump($_FILES);
                    //调用模型完成入库
                    $brandModel = D('brand'); //因为是调用Model层的所以要使用到D
                    if($brandModel->create($data)){
                        //成功验证,创建数据成功
                        if($brandModel->add()){ //使用create方法之后,这里的add方法不能传参
                                $this -> success('添加品牌成功',U('index'),1);
                            }else{
                                //验证失败
                                $this -> error('添加品牌失败');
                                }
                            }else{
                                $this -> error($brandModel->getError());
                        }
                    return;
                }
                //载入品牌添加页面
                $this -> display();
            }
        }

    这里好了那么下一步就是显示品牌列表了,在BrandController.class.php控制器里面写个index的方法,然后在View视图下的list.html也改名成index.html噢,

    控制器代码如下所示:

    public function index(){
                $brand = M('brand')->order('sort_order asc')->select();
                $this -> assign('brand',$brand);
                $this -> display();
    
            }

    让他把变量分配到前台去,然后再前台用volist让他们进行遍历,如下所示:

    <!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=brand&a=add">添加品牌</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="form-div">
      <form action="javascript:search_brand()" name="searchForm">
        <img src="__ADMIN__/images/icon_search.gif" width="26" height="22" border="0" alt="SEARCH">
         <input type="text" name="brand_name" size="15">
        <input type="submit" value=" 搜索 " class="button">
      </form>
    </div>
    
    <form method="post" action="" name="listForm">
    <!-- start brand list -->
    <div class="list-div" id="listDiv">
    
      <table cellpadding="3" cellspacing="1">
        <tbody>
            <tr>
                <th>品牌名称</th>
                <th>品牌网址</th>
                <th>品牌描述</th>
                <th>排序</th>
                <th>是否显示</th>
                <th>操作</th>
            </tr>
        <volist name="brand" id="vo">
           <tr>
                <td class="first-cell"><span style="float:right"><a href="../data/brandlogo/1240803062307572427.gif" target="_brank"><img src="__ADMIN__/images/picflag.gif" width="16" height="16" border="0" alt="品牌LOGO"></a></span>
                <span onclick="javascript:listTable.edit(this, 'edit_brand_name', 1)" title="点击修改内容" style="">{$vo['brand_name']}</span>
                </td>
                <td><a href="{$vo['url']}" target="_brank">{$vo['url']}</a></td>
                <td align="left" >{$vo['brand_desc']}</td>
                <td align="right"><span onclick="javascript:listTable.edit(this, 'edit_sort_order', 1)">{$vo['sort_order']}</span></td>
                <td align="center"><img src='
            <if condition="$vo['is_show'] eq 1">
              __ADMIN__/images/yes.gif' 
            <else />
            __ADMIN__/images/no.gif'
            </if>
            /></td>
                <td align="center">
                    <a href="__CONTROLLER__/edit/id/{$vo['brand_id']}" title="编辑">编辑</a> |
                    <a href="__CONTROLLER__/del/id/{$vo['brand_id']}" onclick="return confirm('您是否真的删除这个品牌呢?')" title="编辑">移除</a> 
                </td>
            </tr>
            </volist>
        <tr>
            <td align="right" nowrap="true" colspan="6">
                <div id="turn-page">
                总计  <span id="totalRecords">11</span>
            个记录分为 <span id="totalPages">2</span>
            页当前第 <span id="pageCurrent">1</span>
            页,每页 <input type="text" size="3" id="pageSize" value="10" onkeypress="return listTable.changePageSize(event)">
            <span id="page-link">
              <a href="javascript:listTable.gotoPageFirst()">第一页</a>
              <a href="javascript:listTable.gotoPagePrev()">上一页</a>
              <a href="javascript:listTable.gotoPageNext()">下一页</a>
              <a href="javascript:listTable.gotoPageLast()">最末页</a>
              <select id="gotoPage" onchange="listTable.gotoPage(this.value)">
                <option value="1">1</option><option value="2">2</option>          </select>
            </span>
          </div>
          </td>
        </tr>
      </tbody></table>
    
    <!-- end brand list -->
    </div>
    </form>
    
    
    <div id="footer">
        版权所有 &copy; 2014-2016 夺命雷公狗 - 技术总结 - </div>
    </div>
    
    </body>
    </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=brand&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 method="post" action="" name="theForm" enctype="multipart/form-data" onsubmit="">
    
    <table cellspacing="1" cellpadding="3" width="100%">
      <tbody><tr>
        <td class="label">品牌名称</td>
        <td><input type="text" name="brand_name" maxlength="60" value="{$brand['brand_name']}"><span class="require-field">*</span></td>
      </tr>
      <tr>
        <td class="label">品牌网址</td>
        <td><input type="text" name="url" maxlength="60" size="40" value="{$brand['url']}"></td>
      </tr>
      <tr>
        <td class="label"><a href="javascript:showNotice('warn_brandlogo');" title="点击此处查看提示信息">
            <img src="__ADMIN__/images/notice.gif" width="16" height="16" border="0" alt="点击此处查看提示信息"></a>品牌LOGO</td>
        <td><input type="file" name="brand_logo" id="logo" size="45">    <br>
            <?php  if(empty($brand_info['brand_logo'])) :?>
            <span class="notice-span" style="display:block" id="warn_brandlogo">请上传图片,做为品牌的LOGO!</span>
            <?php else :?>
            <span class="notice-span" style="display:block" id="warn_brandlogo">你已经上传过图片。再次上传时将覆盖原图片!</span>
            <?php endif;?>
        </td>
      </tr>
      <tr>
        <td class="label">品牌描述</td>
        <td><textarea name="brand_desc" cols="60" rows="4">{$brand['brand_desc']}</textarea></td>
      </tr>
      <tr>
        <td class="label">排序</td>
        <td><input type="text" name="sort_order" maxlength="40" size="15" value="{$brand['sort_order']}"></td>
      </tr>
      <tr>
        <td class="label">是否显示</td>
        <td>
            <input type="radio" name="is_show" value="1" 
        <if condition="$brand['is_show'] eq 1">checked="checked"</if>
        > 是        
            <input type="radio" name="is_show" value="0" 
        <if condition="$brand['is_show'] eq 0">checked="checked"</if>
        > 否        (当品牌下还没有商品的时候,首页及分类页的品牌区将不会显示该品牌。)
        </td>
      </tr>
      <tr>
        <td colspan="2" align="center"><br>
          <input type="submit" class="button" value=" 确定 ">
          <input type="reset" class="button" value=" 重置 ">
          <input type="hidden" name="act" value="update">
          <input type="hidden" name="brand_id" value="<?php echo $brand_info['brand_id'] ;?>">
        </td>
      </tr>
      <input type="hidden" name="brand_id" value="{$brand['brand_id']}">
    </tbody></table>
    </form></div>
    
    
    <div id="footer">
        版权所有 &copy; 2014-2016 夺命雷公狗 - 技术总结 - </div>
    </div>
    
    </body>
    </html>

    注意,上面有个隐藏传参噢(brand_id)

    下一步就开始到写他的控制器了,不过在修改的时候,要考虑到一些问题,如,对方如果不改图片,那么我们的原图片即不动,如果改图片即要删除原图片的原则,代码如下所示:

    //修改
            public function edit(){
                $id = I('id',0,'int');
                if (IS_POST) {
                    $data['brand_name'] = I('brand_name');
                    $data['url'] = I('url');
                    $data['brand_desc'] = I('brand_desc');
                    $data['sort_order'] = I('sort_order');
                    $data['is_show'] = I('is_show');
                    $data['brand_id'] = I('brand_id');
    
                    //判断是否有图片上传,如果上传,则删除原来图片
                    if ($_FILES['brand_logo']['tmp_name'] != '') {    
                        $upload = new ThinkUpload();// 实例化上传类
                        $upload->maxSize   =   3145728 ;// 设置附件上传大小    
                        $upload->exts      =   array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
                        $upload->rootPath  =   './';  //这个一定要加否则很容易中招
                        $upload->savePath  =   'Public/Uploads/'; // 设置附件上传目录
                        $info  =  $upload->uploadOne($_FILES['brand_logo']);
                        if($info) {
                            //删除原来的图片
                            $brand = M('brand')->find($data['brand_id']);
                            unlink($brand['logo']);
                            // 上传成功 获取上传文件信息         
                            $data['logo'] = $info['savepath'].$info['savename'];     
                        }
    
                    }
                    
                    $brandModel = D('brand');
                    if ($brandModel->create($data)) {
                        if ($brandModel->save()) {
                            $this->success('编辑品牌成功',U('Brand/index'),1);
                        } else {
                            $this->error('编辑品牌失败');
                        } 
                    }else {
                        $this->error($brandModel->getError());
                    }     
    
                    return;
    
                }
                
                $brand = M('brand')->find($id);
                $this->assign('brand',$brand);
                $this->display();
            }

    删除的话,那就更加的简单了,只要在模版里传递id过来,如下所示:

    <a href="__CONTROLLER__/del/id/{$vo['brand_id']}" onclick="return confirm('您是否真的删除这个品牌呢?')" title="编辑">移除</a>

    在后台即可删除掉了,控制器下的方法如下所示:

            //移除
            public function del(){
                $id = I('id',0,'int');
                $brand = M('brand')->find($id);
                if (M('brand')->delete($id)) {
                    //删除的同时删除图片
                    unlink($brand['logo']);
                    $this->success('删除成功');
                } else {
                    $this->error('删除失败');
                }
            }

    这里好了,那么下一步,就是右下角的分页部分了,Thinkphp里面封装好了分页类,直接调用他的即可,在手册上可以查看得到如何调用---专题---数据分页---即可找到如何调用。

    分页一般分为两步:

    1.通过SQL语句完成取数据,这是使用模型完成的

    2.输出分页信息,这是使用分页类完成的

    先来完BrandController.class.php成控制器下的index方法

    //品牌列表
            public function index(){
                //1.显示分页工具条
                $mod = M('brand');
                $totalRows = $mod->count();
                //创建分页对象时,分页对象需要总记录数和分页条数
                $page = new ThinkPage($totalRows,2);
                $page -> rollPage =5; //分页列表上显示多少条
                $page->setConfig('theme','%FIRST% %UP_PAGE% %LINK_PAGE% %DOWN_PAGE% %END%   %HEADER%');
                $page->setConfig('first','首页');
                $page->setConfig('prev','上一页');
                $page->setConfig('next','下一页');
                $page->setConfig('last','尾页');
                $pageHtml = $page -> show();//生成分页的连接诶效果(分页工具条的html代码)
                $this -> assign('pageHtml',$pageHtml);//分配分页栏到模版
                
                //2.查询出当前页面的列表数据
                $brand = $mod -> page(I('get.p',1),$page->listRows)->select();
                $this -> assign('brand',$brand);
                $this -> display();
            }

    结果发现首页和尾页用不了,没办法,框架有Bug只好去修改框架上的配置文件了,在shoppThinkPHPLibraryThinkPage.class.php

    在里面找到

    public function setConfig($name,$value) {
            if(isset($this->config[$name])) {
                $this->config[$name] = $value;
            }
        }   

    改成这样即可

    public function setConfig($name,$value) {
            if(isset($this->config[$name])) {
                $this->config[$name] = $value;
                if($name == 'last'){
                   $this->lastSuffix = false;
                }
            }
      }

    下一步就是开始改写模版文件

    <!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" />
    <style type="text/css">
    .num{
      padding-left:10px;
    }
    .current{
      padding-left:10px;
      color:blue;
      font-weight:bold;
      font-size:16px;
    }
    </style>
    </head>
    <body>
    
    <h1>
    <span class="action-span"><a href="index.php?p=admin&c=brand&a=add">添加品牌</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="form-div">
      <form action="javascript:search_brand()" name="searchForm">
        <img src="__ADMIN__/images/icon_search.gif" width="26" height="22" border="0" alt="SEARCH">
         <input type="text" name="brand_name" size="15">
        <input type="submit" value=" 搜索 " class="button">
      </form>
    </div>
    
    <form method="post" action="" name="listForm">
    <!-- start brand list -->
    <div class="list-div" id="listDiv">
      <table cellpadding="3" cellspacing="1">
        <tbody>
            <tr>
                <th>品牌名称</th>
                <th>品牌网址</th>
                <th>品牌描述</th>
                <th>排序</th>
                <th>是否显示</th>
                <th>操作</th>
            </tr>
        <volist name="brand" id="vo">
           <tr>
                <td class="first-cell" ><span style="float:right"><a href="../data/brandlogo/1240803062307572427.gif" target="_brank"><img src="__ADMIN__/images/picflag.gif" width="16" height="16" border="0" alt="品牌LOGO"></a></span>
                <span onclick="javascript:listTable.edit(this, 'edit_brand_name', 1)" title="点击修改内容" style="" >{$vo['brand_name']}</span>
                </td>
                <td align="center"><a href="{$vo['url']}" target="_brank">{$vo['url']}</a></td>
                <td align="center" >{$vo['brand_desc']}</td>
                <td align="center"><span onclick="javascript:listTable.edit(this, 'edit_sort_order', 1)">{$vo['sort_order']}</span></td>
                <td align="center"><img src='
            <if condition="$vo['is_show'] eq 1">
              __ADMIN__/images/yes.gif' 
            <else />
            __ADMIN__/images/no.gif'
            </if>
            /></td>
                <td align="center">
                    <a href="__CONTROLLER__/edit/id/{$vo['brand_id']}" title="编辑">编辑</a> |
                    <a href="__CONTROLLER__/del/id/{$vo['brand_id']}" onclick="return confirm('您是否真的删除这个品牌呢?')" title="编辑">移除</a> 
                </td>
            </tr>
            </volist>
        <tr>
            <td align="right" nowrap="true" colspan="6">
                <div id="turn-page" class="page">
                {$pageHtml}
          </div>
          </td>
        </tr>
      </tbody></table>
    
    <!-- end brand list -->
    </div>
    </form>
    
    
    <div id="footer">
        版权所有 &copy; 2014-2016 夺命雷公狗 - 技术总结 - </div>
    </div>
    
    </body>
    </html>
  • 相关阅读:
    假设用一个名为text的字符串向量存放文本文件的数据,其中的元素或者是一句话或者是一个用于表示段分隔的空字符串。将text中第一段全改为大写形式
    迭代器介绍
    从cin读入一组词并把它们存入一个vector对象,然后设法把所有词都改写为大写字母。
    标准库类型vector
    css 滤镜之AlphaImageLoader
    css设置背景图片自适应
    网易云音乐怎么免费下载付费歌曲
    font-family,font-size,color
    css设置图片居中、居左、居右
    数据库语句之建表、拷贝数据表
  • 原文地址:https://www.cnblogs.com/leigood/p/4944197.html
Copyright © 2011-2022 走看看