服务报价 | 域名主机 | 网络营销 | 软件工具| [加入收藏]
 热线电话: #
当前位置: 主页 > php教程 > php教程 >

shopex添加仓库模块二次开发实战

时间:2014-12-20 14:38来源:未知 作者:最模板 点击:
近期在做一个shopex网店的修改,因为shopex不是完全开源,作二次开发不是很方便。网上这方面的资料也不多,这里我总结一下自己的开发过程。 这里介绍的是添加一个仓库模块,此处只

近期在做一个shopex网店的修改,因为shopex不是完全开源,作二次开发不是很方便。网上这方面的资料也不多,这里最模板总结一下自己的开发过程。

这里介绍的是添加一个仓库模块,此处只介绍仓库的管理,并不涉及仓库与商品的整合部分。

一、效果预览

1.在‘商品’菜单栏中添加‘仓库’的菜单组:

2.仓库列表:

3.添加/编辑仓库

二、添加菜单及创建数据表

1.思路

1)因为后台的菜单是加密了,网上有通过用户自定义目录的方式来添加后台菜单,不过讲得不够详细,没试成功=.=

于是最模板直接修改后台菜单的php,文件路径为:core\include_v5\adminSchema.php

使用 dezender工具将这个文件解密。这里顺带说一下解密,如图:

选择 “解密内核3”,经测试,其他两个都不能正常解密php文件。

解密后的 adminSchema.php 文件中,有一个 $menu['goods'] 的数组,这个就是后台的‘商品’菜单组了。

然后最模板在’商品‘管理这一个菜单组后面添加’仓库管理‘,如下:

[php] view plaincopy
 
  1. array"type" => "group""label" => __( "仓库管理" ),   
  2.        "items" => array(  
  3.                 array(  
  4.                    "type" => "menu", 、  
  5.                    "label" => __( "仓库列表" ),   
  6.                    "link" => "index.php?ctl=goods/warehouse&act=index" ),  
  7.                 array(   
  8.                    "type" => "menu",   
  9.                    "label" => __( "添加仓库" ),   
  10.                    "link" => "index.php?ctl=goods/warehouse&act=addNew")  
  11.                )  
  12.  )  
其中 type="group"表示这是一个菜单组,items 就是里面的子菜单。type="menu"就是一个可以点击的菜单,如果添加target="_blank"属性,就会以新开窗口的形式打开菜单链接。

 

2.准备数据库

 

[sql] view plaincopy
 
  1. DROP TABLE IF EXISTS `hx_warehouse`;  
  2. CREATE TABLE `hx_warehouse` (  
  3.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  4.   `namevarchar(200) NOT NULL,  
  5.   `information` varchar(255) DEFAULT NULL,  
  6.   `disabled` enum('true','false'CHARACTER SET utf8 DEFAULT 'false',  
  7.   `data0` varchar(255) DEFAULT NULL,  
  8.   `data1` varchar(255) DEFAULT NULL,  
  9.   PRIMARY KEY (`id`)  
  10. ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=gbk;  

这里并没有使用 shopex 里面的前缀。

三、添加Model层

shopex 也是使用MVC分层结构,其中模型层位于:core/model 和 core/model_v5 这两个文件夹,_v5 就是php的版本在5以上时使用。

这里的仓库模块隶属于商品,所以最模板在 core/model_v5/goods 下新建一个 mdl.warehouse.php,注意命名格式,不然无法被检索到这个model。

里面为 mdl_warehouse 类,继承于 shopObject。也可以继承于 modelFactory,因为shopObject 也是modelFactory的子类。

如果对于 模型层这里不是很了解,可以解密其他的 mdl 文件来看看他们的结构。

下面是仓库模型类:

 

[php] view plaincopy
 
  1. <?php  
  2. /*********************/  
  3. /*                   */  
  4. /*  Dezend for PHP5  */  
  5. /*         NWS       */  
  6. /*      Nulled.WS    */  
  7. /*                   */  
  8. /*********************/  
  9.   
  10. include_once"shopObject.php" );  
  11. class mdl_warehouse extends shopObject  
  12. {  
  13.   
  14.         public $idColumn = "id";  
  15.         public $adminCtl = "goods/brand";  
  16.         public $textColumn = "name,information,data0";  
  17.         public $defaultCols = "id,name,information,data0";  
  18.         public $tableName = "hx_warehouse";  
  19.           
  20.         public function getHouseById($nLvId){  
  21.             $aTemp = array( );  
  22.             $aTemp = $this->db->select( "SELECT id,name,information,data0 FROM hx_warehouse WHERE id=".$nLvId);  
  23.             return $aTemp;  
  24.         }  
  25.   
  26.         public function deleteById($id){  
  27.             $sql = "delete from hx_warehouse where id=".$id;  
  28.             return $this->db->exec$sql );  
  29.         }  
  30.           
  31.         public function insertHouse($data){  
  32.             $aRs = $this->db->query( "SELECT * FROM hx_warehouse WHERE id=0" );  
  33.             $sSql = $this->db->getInsertSql( $aRs$data );  
  34.             return !$sSql || $this->db->query( $sSql );  
  35.         }  
  36.           
  37.         public function updateHouse($aData){  
  38.             $id = $aData['id'];  
  39.               
  40.             $sql ="update hx_warehouse set name='".$aData['name']."' , information='".$aData['information']."'";  
  41.             $sql.=" , data0='".$aData['data0']."' where id=".$id;  
  42.               
  43.             return $this->db->query( $sql );  
  44.         }  
  45.   
  46. }  
  47.   
  48. ?>  

四、添加控制层

 

后台的controller位于:core\admin\controller

同样地,最模板们在 goods 这个目录下新建 ctl.warehouse.php

类中有两个属性:

[php] view plaincopy
 
  1. var $workground = 'goods';  
  2.   
  3. var $object = 'goods/warehouse';//模型定位  

代码如下:

 

[php] view plaincopy
 
  1. <?php  
  2. include_once('objectPage.php');  
  3.   
  4. class ctl_warehouse extends objectPage {  
  5.   
  6.     var $workground = 'goods';  
  7.     var $object = 'goods/warehouse';  
  8.       
  9.     public function index(){  
  10.         $houses = &$this->system->loadModel('goods/warehouse');  
  11.         $list = $houses->getList();  
  12.           
  13.         $this->pagedata['list']= &$list;  
  14.         $this->pagedata['house_count']=$houses->count();  
  15.         $this->page('product/warehouse/map.html');  
  16.     }  
  17.       
  18.     public function addNew(){  
  19.         $this->page('product/warehouse/info.html');  
  20.     }  
  21.       
  22.     public function edit($id){  
  23.         $houses = &$this->system->loadModel('goods/warehouse');  
  24.         $house = $houses->getHouseById($id);  
  25.           
  26.         $this->pagedata['house'] = $house[0];  
  27.         $this->page('product/warehouse/info.html');  
  28.     }  
  29.       
  30.     public function deleteDo($id){  
  31.         $this->begin('index.php?ctl=goods/warehouse&act=index');  
  32.         $houses = &$this->system->loadModel('goods/warehouse');  
  33.           
  34.         if($houses->deleteById($id)){  
  35.             $this->end(true,__('仓库删除成功'));  
  36.         }else{  
  37.             $this->end(false,__('仓库删除失败'));  
  38.         }  
  39.     }  
  40.       
  41.     public function addDo(){  
  42.         if(empty($_POST['name'])){  
  43.             $this->splash('failed','index.php?ctl=goods/warehouse&act=index',__('请输入仓库名称'));  
  44.             exit;  
  45.         }  
  46.           
  47.         $houses = &$this->system->loadModel('goods/warehouse');  
  48.           
  49.         if(empty($_POST['id'])){  
  50.             $info = "添加";  
  51.             $r =  $houses->insertHouse($_POST);  
  52.         }else{  
  53.             $info = "修改";  
  54.             $r =  $houses->updateHouse($_POST);  
  55.         }  
  56.          
  57.           
  58.         if($r)  
  59.             $this->splash('success','index.php?ctl=goods/warehouse&act=index',__($info.'仓库成功'));  
  60.         else  
  61.             $this->splash('failed','index.php?ctl=goods/warehouse&act=index',__($info.'仓库失败'));  
  62.     }  
  63.       
  64.     /** 
  65.      * 设置商品仓库 
  66.      * @param unknown_type $id 
  67.      */  
  68.     public function count($id,$goodsName){  
  69.         $houses = &$this->system->loadModel('goods/warehouse');  
  70.         $list = $houses->getLogList($id);  
  71.           
  72.         $this->pagedata['gid'] = $id;  
  73.         $this->pagedata['houses'] = $list;  
  74.         $this->pagedata['goodsName'] = $goodsName;  
  75.           
  76.         $this->singlepage('product/warehouse/count.html');  
  77.     }  
  78.       
  79.     public function countDo($gid){  
  80.         $this->begin('index.php?ctl=goods/product&act=index');  
  81.           
  82.         $houses = &$this->system->loadModel('goods/warehouse');  
  83.         $list = $houses->getList();  
  84.           
  85.         foreach ($list as $key => $h){  
  86.             if(empty($_POST['count_'.$h['id']]))  
  87.                 $size = 0;  
  88.             else  
  89.                 $size = $_POST['count_'.$h['id']];  
  90.             $list[$key]['size'] = $size;  
  91.         }  
  92.           
  93.         if($houses->updateHouseCount($gid$list)){  
  94.             $this->end(true,__('仓库库存修改成功,请关闭此窗口'));  
  95.         }else{  
  96.             $this->end(false,__('仓库库存修改失败,请关闭此窗口'));  
  97.         }  
  98.     }  
  99. }  
  100. ?>  

view 层位于:

 

core\admin\view

 

仓库列表的html文件:

 

[php] view plaincopy
 
  1. <{area inject=".mainHead"}>  
  2.     <div class="action-bar"><span class="sysiconBtn addorder" onclick="W.page('index.php?ctl=goods/warehouse&act=addNew')"><{t}>添加仓库<{/t}></span> (共有<{$house_count}>个仓库)</div>  
  3.     <div class='gridlist-head mainHead'>  
  4.         <div class='span-1' ><{t}>序号<{/t}></div>  
  5.         <div class='span-1' ><{t}>编辑<{/t}></div>  
  6.         <div class='span-1' ><{t}>删除<{/t}></div>  
  7.         <div class='span-4' ><{t}>仓库名称<{/t}></div>  
  8.         <div class='span-8'><{t}>说明信息<{/t}></div>  
  9.         <div class='span-4'><{t}>附件属性[可选]<{/t}></div>  
  10.     </div>  
  11. <{/area}>  
  12.   
  13. <div id="cat_tree" class='gridlist'>   
  14.     <{foreach from=$list item=item name="item"}>  
  15.     <div depath="<{$item.step}>" class="clear_cat row" cid="<{$item.id}>">  
  16.         <div class='row-line'>  
  17.             <div class='span-1'><{$item.id}></div>  
  18.             <div class='span-1' >  
  19.                 <span class="opt" onClick="W.page('index.php?ctl=goods/warehouse&act=edit&p[0]=<{$item.id}>')">  
  20.                     <{img src="images/bundle/editcate.gif" border="0" alt="编辑" }>  
  21.                 </span>  
  22.             </div>  
  23.             <div class='span-1'>  
  24.                 <span class="opt" onclick="deleteRow('index.php?ctl=goods/warehouse&act=deleteDo&p[0]=<{$item.id}>',event)">  
  25.                     <{img src="images/bundle/delecate.gif" border="0" alt="删除"}>  
  26.                 </span>  
  27.             </div>  
  28.             <div class='span-4'><{$item.name}></div>  
  29.             <div class='span-8'><{if $item.information}><{$item.information}><{else}> <{/if}></div>  
  30.             <div class='span-4'><{$item.data0}></div>  
  31.         </div>  
  32.     </div>  
  33.     <{/foreach}>   
  34. </div>  
  35.   
  36. <script>  
  37.     function deleteRow(act,event){  
  38.         e=$(new Event(event).stop().target);  
  39.         var row=e.getParent('.row');  
  40.           
  41.         if(confirm('您确定要删除该仓库?')){   
  42.             W.page(act,{  
  43.             method:'get',  
  44.             update:'messagebox',  
  45.             onComplete:function(re){  
  46.                   
  47.                 if(re.contains('successSplash')){row.remove();}  
  48.               
  49.                 }  
  50.             });  
  51.         }  
  52.     }     
  53. </script>  
view 层 可以参考原有的,因为html文件是开源的哈。

 

 

五、总结

至此,仓库模块已经基本完成管理的功能。再需要其他功能,可以在这上面扩展,遇到问题可以看看源码。

(责任编辑:最模板)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------