Shopex的二次开发

u Shopex定制模式

l 文件结构与规范

命名:给定制的项目命名,即为定制项目最高文件夹名称。

文件或目录结构:此项目下的所有文件或者目录,和core目录下的文件或者目录的结构保持一致。基本原则为,和原来文件名称一致时,即为继承core中对应的类;html文件一致时,即为使用当前的html文件。如果是原来系统本身没有的,新开辟的php文件,则继承基本的基类,ctl模式的后台文件继承的是objectPageinclude_once('objectPage.php')),前台文件继承的是shopPagemdl模式的文件继承是shopObject

l 命名结构与规范 

Ctl的文件:ctl_xxx.php,类名clt_xxx;

后台:

include_once('objectPage.php');

Class ctl_<custom_class_name> extends objectPage

{

 var $object = '<master_ctl_dir_name>/<work_ctl_file_name>';

 var $finder_action_tpl = '<mater_view_dir_name>

                     /<work_view_file_name>/

                     <target_view_action.file_name>.html'; 

 var $finder_filter_tpl = null; //默认的过滤器html,可以为null

 var $finder_default_cols = '{(field_name)|(field_name,)}+';

 var $workground = '{member|goods|sale|order|content|service|system}';

 var $filterUnable = true;

function index() {

        <customer_code_list>

        parent::index();

    }

Function <customer_function>()

{

 $this->pagedata

 $this->display('<master_view_dir_name>/<target_view_file_name>.html');

}

function add(){

        $this->begin('index.php?ctl=<master_ctl_dir_name>

                   /<work_ctl_file_name>&act=index');

        if(!$_POST['addon']){

          $atmp['is_total_point']='on';

          $_POST['addon']=serialize($atmp);

        }

        $mdlObj = 

                 &$this->system->loadModel('<master_ctl_dir_name>

                  /<work_ctl_file_name>');

        if($mdlObj->save($_POST)){

            $this->end(true,__('添加成功'));

        }else{

            $this->end(false,__('添加失败'));

        }

 }

function show($<field_key_id>=null) {

        $this->path[] = array('text'=>__('<menu_label_name>'));

        $mdlObj = &$this->system->loadModel('<mater_ctl_dir_name>

                                        /<work_ctl_file_name>');

        if ($<field_key_id>) {

            $this->pagedata['<customer_display_data>']

                = $mdlObj->getObjById($<field_key_id>);

        } else {

            $this->pagedata['<customer_display_data>']['orderlist']

                = $mdlObject->getInitOrder();

        }

        $this->page('<mater_view_dir_name>

                  /<work_view_file_name>/<target_file_name>.html');

    }

<public custom define function_list>

}

后台View文件:

finder_action_tpl:

       <{button type="button" wrapimg="true" 

               label="添加" class="btn-large" 

               icon="finder_add.gif"        

               href="index.php?ctl=<mater_ctl_dir>/

                  <work_ctl_file_name>&act=<work_method>"}>

前台控制:

class ctl_<customer_class_name> extends shopPage

{

  var $type = '<customer_class_name>';

  var $seoTag=array({(<lab>)|(<lab>,)}+);

    function ctl_<customer_class_name>(){

        parent::shopPage();

        $this->title    = $this->system->getConf('<site.custome_class_title>');

        $this->keywords  =

                      $this->system->getConf('<site.custome_meta_key_words>');

        $this->desc     = $this->system->getConf('<site.custome_meta_desc>');

    }

function index($articleid) {

....

$this->pagedata['<display_var_name>'] = <var_or_callFunction>;

$this->output();

}

<public custom define function_list>

}

前台view文件:

  基本是利用基本的页面,继承来进行改造,完全开辟的不多。

mdl的文件mdl_xxx.php,ctl文件和mdl的文件对应。

include_once( "shopObject.php" );

class cmd_<customer_class_name> extends shopObject{

  Public $idColumn = "<field_key_id>";

 Public $textColumn = "<field_name>";

 Public $defaultCols = "{(<field_name>)|(<field_name>,)}+";

 Public $adminCtl = "<master_ctl>/<work_ctl>";

 Public $defaultOrder = array

(

0 => "<field_key_id>",

1 => "desc"

);

 Public $tableName = "<table_name>";

/**/

 public function getColumns( )

 {

$ret = array(

"_cmd" => array(

"label" => __( "操作" ),     "width" => 70, "html" => "<master_view_dir>/<work_view_dir>/command.html"

)

);

return array_merge( $ret, parent::getcolumns( ) );

 }

/**/

public function getList( $cols = "*", 

                   $filter = array( ), 

                   $offset = 0, 

                   $limit = -1, 

                   $orderType = null )

{

$row = parent::getlist( $cols, $filter, $offset, $limit, $orderType );

$objComment = &$this->system->loadModel('<mater_control_dir>/

                                         <work_control_file_fact_name>');

<

foreach ( $row as $key => $val ){

      $commentinfo=$objComment->getFieldById(

                                  $val['comment_id'],

                                  array('display')

                                  );

      if($commentinfo['display']=='true')

      {

        $val['type_name'] = $this->get_type_name( $val['type_id'] );

        $aData[] = $val;

  }

   }

return $aData;

>

<return $row>;

}

<public custom define function_list>

}

数据库的文件:

Core/schemas/

<table_name>.php

<?php

$db['<table_name>']=array (

  'columns' =>

  array (

    'field_name' =>

    array (

      'type' => '{mnumber|varchar(number)|bool|object:<master_ctl>/<work_ctl>'},

      'required' => true,

      'pkey' => true,

      'extra' => 'auto_increment',

      'label' => __('后台grid显示的列名'),

      'width' => 150,

      'editable' => false,

      'hidden'=>true,

    ), 

    'disabled' =>

    array (

      'type' => 'bool',

      'default' => 'false',

      'editable' => false,

    ),

  ),

);

l 案例与详细分析   

项目名称:test_core

配置:config/config.php

最后添加 define('CUSTOM_CORE_DIR', BASE_DIR.'/test_core');

数据库表:core/schemas/goods_test.php

<?php

$db['goods_test']=array (

  'columns' =>

  array (

    'test_id' =>

    array (

      'type' => 'number',

      'required' => true,

      'pkey' => true,

      'extra' => 'auto_increment',

      'label' => __('ID'),

      'width' => 110,

      'editable' => false,

    ),    

    'test_name' =>

    array (

      'type' => 'varchar(255)',

      'default' => 0,

      'label' => __('测试名称'),

      'width' => 60,

      'required' => true,

      'editable' => true,

    ),

    'disabled' =>

    array (

      'type' => 'bool',

      'default' => 'false',

      'editable' => false,

    ),

  ),

);

后台控制文件:test_core/admin/controller/comment/cct.goods_test.php

<?php

include_once('objectPage.php');

class cct_goods_test extends objectPage{

    var $object = 'comment/goods_test';

var $finder_action_tpl = 'comment/goods_test/finder_action.html'; 

var $finder_filter_tpl = null; 

var $finder_default_cols = 'test_id,test_name,disabled';

var $workground = 'member';

    var $filterUnable = true;

    function addGoodsTest(){

        $this->begin('index.php?ctl=comment/goods_test&act=index');

        if(!$_POST['addon']){

          $atmp['is_total_point']='on';

          $_POST['addon']=serialize($atmp);

        }

        $goods_test = &$this->system->loadModel('comment/goods_test');

        if($goods_test->saveGoodsTest($_POST)){

            $this->end(true,__('添加成功'));

        }else{

            $this->end(false,__('添加失败'));

        }

    } 

    function showAddGoodsTest($testId=null) {

        $this->path[] = array('text'=>__('商品测试'));

        $goods_test = &$this->system->loadModel('comment/goods_test');

        if ($testId) {

            $this->pagedata['goods_test'] = $goods_test->getGoodsTestById($testId);

        } else {

            $this->pagedata['goods_test'] = $goods_test->getGoodsTestById($testId);

        }

        $this->page('comment/goods_test/showAddGoodsTest.html');

    }

}

?>

后台view文件:test_core/admin/view/comment/goods_test/command.html

               Test_core/admin/view/comment/goods_test/finder_action.html

               Test_core/admin/view/comment/goods_test/showAddGoodsTest.html

/*command*/

<a href="index.php?ctl=<{$env.get.ctl}>&act=showAddGoodsTest&p[0]=<{$item.test_id}>"><{img src="images/bundle/btn_edit.gif"}><{t}>编辑<{/t}></a>

/*finder_action.php*/

<{button type="button" wrapimg="true" label="添加测试" class="btn-large" icon="finder_add.gif" href="index.php?ctl=comment/goods_test&act=showAddGoodsTest"}>

/*showAddGoodsTest*/

<form method='post' id='comment_type-addPrize' action='index.php?ctl=comment/goods_test&act=addGoodsTest' >

<div class="tableform">

<div class="division">

<table width="100%" border="0" cellspacing="0" cellpadding="0">

  <tr>

    <th><{t}>测试名称:<{/t}></th>

    <td><{input type='text' value=$goods_test.test_name name='test_name' required='true'}></td>

  </tr>

  <tr>

    <th><{t}>测试商品:<{/t}></th>

    <td>

        <{input type="object:goods/products" multiple="true" rowselect="true" value=$goods.glink.items name="linkid" }>

    </td>

  </tr>

</table>

</div>

<{if $goods_test.test_id}>

<input type='hidden' value='<{$goods_test.test_id}>' name='test_id'>

<{/if}>

</div>

<div class="table-action">

<{button label="完成" type="submit"}>

</div>

</form>

前台控制文件:待定。

前台view文件:待定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值