u Shopex定制模式
l 文件结构与规范
命名:给定制的项目命名,即为定制项目最高文件夹名称。
文件或目录结构:此项目下的所有文件或者目录,和core目录下的文件或者目录的结构保持一致。基本原则为,和原来文件名称一致时,即为继承core中对应的类;html文件一致时,即为使用当前的html文件。如果是原来系统本身没有的,新开辟的php文件,则继承基本的基类,ctl模式的后台文件继承的是objectPage(include_once('objectPage.php')),前台文件继承的是shopPage,mdl模式的文件继承是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文件:待定