1. 开发准备
1.1 前言
MetInfo应用制作介绍
MetInfo企业网站管理系统是米拓公司旗下的一款专门为企业开发的建站CMS,具有简单、易于SEO、安全稳定、多语言的特点,目前有30万活跃企业用户,分布全球各地。
Metinfo应用开发框架是基于MetInfo企业网站管理系统的一个应用开发包,使用Metinfo应用开发框架开发的网站功能可以直接嵌入当前系统,而且因为开发包集成了大量系统底层支持,使整个开发过程简单、快捷,并且支持系统升级。使用Metinfo应用开发框架开发的应用,通过我们审核后,可以上架到MetInfo应用市场,开发人员也可以直接入住MetInfo在线服务平台。
如果您想学习Metinfo企业应用开发,可以参看此文档,通过此文档的学习,可以直接掌握Metinfo企业应用开发方式。另外我们除文档外,也提供视频教程。如果您想直接上课学习Metinfo企业应用开发,直接和我们的开发人员进行交流,可以参加我们的Metinfo企业应用开发的在线课程。
1.2 基础知识与工具
基础知识
进行MetInfo应用开发需要掌握以下基础支持,如果没有相应基础,可以点击后面链接进行学习。
PHP:熟练,PHP教程;
HTML:基本了解,HTML教程;
CSS:基本了解 ,CSS教程;
JavaScript(简称JS)与 Jquery : 基本了解,JS教程、Jquery教程;
1.3 环境搭建
环境搭建
要使用MetInfo开发应用,就必须搭建 MetInfo运行所需要的环境以及安装 MetInfo ,以便在你自己的电脑上就能够制作和测试。搭建完成之后相当于你自己的电脑就是一个网站服务器,能够安装和运行网站,运行浏览器网址栏输入http://localhost/ 就能访问本地网站,当然,外网是无法访问的。
首先,你需要在本地电脑搭建网站运行环境:
MetInfo 基于 PHP+Mysql 架构,因此需要在你的电脑上安装能够支持 PHP+Mysql 程序运行的环境。(Mac OS自带Apache+PHP,下载MySQL即可;Windows可使用wamp、phpstudy等集成环境;Linux搭建lamp或lnmp)
然后,你需要在本地电脑安装 MetInfo :
1、从 MetInfo官网 下载最新版本;
2、在本地电脑 wamp 网站根目录下新建文件夹,名称自定义,如 metinfo ;
3、把下载的 MetInfo 最新版本解压到 metinfo 下;
注意解压后 metinfo 下要直接能找到 index.php 等众多程序文件,而不能在其子文件夹下;
4、运行浏览器,访问 http://localhost/metinfo/ 即可进入安装界面;
5、按照步骤一步一步操作完成安装;
** 注意**:数据库信息中的数据库名称自定义填写,数据库帐号 root ,密码不用填写。
1.4 代码规范
此规范为MetInfo应用开发代码书写建议,代码总体原则是“使代码清晰易读。整体代码风格要保持一致。”如果有书写代码没有规范的,请参考此文档。
代码规范
1、所有类,方法,文件名,链接地址等都要小写。常量要大写。没有强调要大写的,一律小写。(注:只有MetInfo应用框架重要的核心类,方法是大写的,应用中不要使用大写类,方法名称)
2、所有的 SQL语句的关键词都要大写,如:
SELECT * FROM met_applist WEHER
no > 1000 ORDER BY no DESC。
3、运算符,两边要打空格,如:
if ($a == $b || $c > $f) $c .= $m;
4、双引号里面有变量要用{}括起来。如 :
$a = "你好:{$a},有什么事情";
5、使用echo <<进行块输出的时候,里面的变量也要用{}括起来。
<table class="display dataTable ui-table"
data-table-ajaxurl="{$_M[url][own_form]}a=doindex_json"
data-table-pagelength="20">
6、数组的键值要用单引号引起来。如 :
$array['key1']['key2']
7、循环、判断语句等,含有{}这种结构的语句。“{”(开始标签)之前要留空格。“(”之前也要留空格。“}”(结束标签)要另起一行,并且与函数类名或语句的关键词对齐,里面的代码块要一个TAB的缩进。
if ($a > $b) { // 运算符前后有空格, “(”前有空格,“{”前有空格
$a = 1; // 运算符前后有空格
$b = 2; // 一个tab的缩进
} else {// 另起一行,注意else两边有空格
$b = 3;
}
$i = 0;
while ($i > 10) { // 运算符前后有空格, “(”前有空格,“{”前有空格
$i++;// 一个tab的缩进
}
foreach ($array as $key => $val) {//“(”前有空格,“{”前有空格,“=>”前后后空格
$i++;// 一个tab的缩进
}
switch ($i) { //“(”前有空格,“{”前有空格
case 10://一个tab的缩进
$i++;//一个tab的缩进
break;//一个tab的缩进
}
8、当if语句后面只有一行代码的时候可以不是用{}但是()后面要加空格。如:
if ($a == $b || $c > $f) $c = $m; // if 后面有空格
9、函数的参数有用“,”(逗号隔开后)要有空格,函数定义的时候“)”与“{”之间有空格。里面的代码也要有一个tab的缩进。
function ceshi($a, $b) { // “{”前有空格“ $a,”逗号后有空格
$a += $b;//一个tab的缩进
}
10、类定义“{”之前要有空格,属性,方法之间要有一个空行。里面代码要有一个tab的缩进
class metinfo { //“{”前有空格
//一个空行
public $met;//一个tab的缩进
public $met2;
//一个空行
public function doindex() {//public 不要省略,类的方法内部代码规范同函数//一个tab的缩进
}
//一个空行
public function doindex() {//public 不要省略,类的方法内部代码规范同函数
}
}
11、代码中有明显功能区别的区块,可以适当加空行,但空行不宜太多。
注释规范
方法的注释(包括类的方法):
/** // 另起一行
* 函数作用
* @param int $afg 变量作用 // *后面空一格
* @param array $abbcvbcv 变量作用 // 变量对齐
* @param array $a 变量作用 // 变量作用对齐
* @param int $afff 变量作用 // int 对齐
* @return int 返回值作用 // 返回值不用写变量名
*/
functinon ceshi($a) {
}
1、总的来说,*对齐,整体风格保持一致。
2、/**要新起一行。
3、以/**开头,/与functinon的f对齐。
4、以*/结尾,*与functinon的u对齐。
5、*/要换行后,在写被注释代码。
6、中间已*开头,*与functinon的u对其。*之后要空一格
7、内容第一行,说明函数作用。
8、第二行开始说明函数参数,@param开头,之后依次说明类型,名称,作用,之间用空格隔开空格。可以适当加TAB,使类型,名称,作用3列对其。之间距离不宜过宽。
9、内容最后如果函数有返回值,用@return开头,只用依次是类型,作用。
注意:如果说明的变量取值为固定的几个值。较少可以在一行说明。较多可以新起一行说明,内容较多的情况下也可以。如
/*
* 函数作用
* @param int $a (1=左上角,2=右上角)
*/
或
/*
* 函数作用
* @param int $a
* 为1时,表示左上角
* 为2时,表示右上角
*/
//用作单行注释的时候,直接加载要注释的行后,多行注释的时候,单独起一行。如:
//多行注释
a = 1+1;
b = 2+1;//单行注释
类的注释:
/** // 另起一行
* 类作用 // *后面空一格
* 类字段注释
*/
class a {
pbulic b;
}
1、/**,*,*/的使用方法与函数一致,要与被注释的代码开头对其。
2、内容说明类的作用即可。
3、类字段注释写法和函数参数一致。
4、类方法注释写法和函数一致。
2. 创建应用
2.1 创建应用文件
创建一个全新应用的第一步是创建一个应用文件,整个应用框架的文件结构如下图所示。网站根目录下的app文件,就是整个应用的框架开发包。
应用框架文件结构:
|--app 应用框架文件夹,存放框架文件和应用文件
|--system 应用框架系统文件
|--app 应用文件夹
|--entrance.php 应用入口文件,实际指向框架入口。
|--yingyong1 一个应用
|--yingyong2 一个应用
|--admin 应用后台模块
|--templates 应用后台模板文件夹
|--web 应用前台模块
|--templates 应用前台模板文件夹
|--include 应用自定义公用文件
|--class 公用类文件
|--function 公用函数文件
|--plugin 应用插件
|--icon.png 应用图标
如上图所示,所有的企业应用都是放在app/app/
文件夹下,在此目录中新建一个文件夹,就是一个全新的应用。文件夹的名字必须只能由26个小写字母,数字,下划线组成。
yingyong2下的文件结构就是应用的内部文件结构。可以按照实际应用需求新建,比如plugin
文件,如果没有插件,可以不新建。
2.2 创建模块文件
应用模块可以分为两类,后台模块和前台模块,其中后台模块必须继承admin
类(后台模块基类),存放在admin
文件夹中。前台模块必须继承web
类(后台模块基类),存放在web
文件夹中。在应用模块中,模块类名称与方法名称,只能由小写字母,下划线,数字组成。模块文件要已UTF-8无BOM格式保存。
新建后台模块:新建一个“app/app/应用文件夹/admin/模块类名.class.php
”文件,则此文件就是一个后台模块文件。后台模块代码实例如下:
defined('IN_MET') or exit('No permission');//所有文件都是已这句话开头,保证系统单入口。
load::sys_class('admin');//包含后台基类,“.class.php”可以省略。
class 模块类名 extends admin {//继承后台基类。类名称要与文件名一致
public function __construct() {
parent::__construct();//如果重写了初始化方法,一定要调用父类的初始化函数。
}
public function doindex(){//定义自己的方法
global $_M;//引入全局数组
//自己的代码
require $this->template('own/index');//引入模板文件,必须global $_M
}
}
新建前台模块:新建一个“app/app/应用文件夹/web/模块类名.class.php
”文件,则此文件就是一个前台模块文件。前台模块代码实例如下:
defined('IN_MET') or exit('No permission');//所有文件都是已这句话开头,保证系统单入口。
load::sys_class('web');//包含后台基类,“.class.php” 可以省略。
class 模块类名 extends web {//继承后台基类。类名称要与文件名一致
public function __construct() {
parent::__construct();//如果重写了初始化方法,一定要调用父类的初始化函数。
}
public function doindex(){//定义自己的方法
global $_M;//引入全局数组
//自己的代码
require $this->custom_template('own/index',1);//引入模板文件,必须global $_M
}
}
2.3 创建模板文件
应用模板结构同模板制作中的模板结构,当前应用框架可以兼容全站调用的模板标签,但是在某个模块下使用的标签无法再页面中使用。不要在应用框架中使用模板标签。模板标签会在以后专门优化,优化后的模板标签将可以直接在模板制作和应用框架中使用。
模板文件存放在应用文件的模块文件夹下。另外应用的模板文件都是PHP文件,不要用html或htm。模板文件要用utf-8无BOM格式保存。前台模板文件和后台文件语法是一样的。
后台模板文件
一般应用模板结构(后台文件):存放在“app/app/应用文件夹/admin/templates/
”目录下,后台模板一般使用基类的template方法引入。
<!--<?php
# MetInfo Enterprise Content Management System
# Copyright (C) MetInfo Co.,Ltd (http://www.metinfo.cn). All rights reserved.
defined('IN_MET') or exit('No permission');//保持入口文件,每个应用模板都要添加
//PHP代码
require_once $this->template('ui/head');//引用头部UI文件
echo <<<EOT
-->
<a>html代码</a>
<!--
EOT;
require_once $this->template('ui/foot');//引用底部UI文件
# This program is an open source system, commercial use,
# please consciously to purchase commercial license.
# Copyright (C) MetInfo Co., Ltd. (http://www.metinfo.cn). All rights reserved.
?>
//页面结尾-->只有当这个文件是页面整体(包括包含文件)是最后一个文件时候才添加,
// 一般在应用制作中的可以自定义的文件,都不是最后一个,所以一般不需要添加。
注意:复制上面代码时候,请复制后将“//页面结尾”后的代码删除。
前台模板文件
一般应用模板结构(前台文件):存放在“app/app/应用文件夹/web/templates/
”目录下,前台模板一般使用前台基类的custom_template方法引入
<!--<?php
# MetInfo Enterprise Content Management System
# Copyright (C) MetInfo Co.,Ltd (http://www.metinfo.cn). All rights reserved.
defined('IN_MET') or exit('No permission');//保持入口文件,每个应用模板都要添加
//PHP代码
echo <<<EOT
-->
<a>html代码</a>
<!--
EOT;
# This program is an open source system, commercial use,
# please consciously to purchase commercial license.
# Copyright (C) MetInfo Co., Ltd. (http://www.metinfo.cn). All rights reserved.
?>//页面结尾-->只有当这个文件是页面整体(包括包含文件)是最后一个文件时候才添加,
//一般在应用制作中的可以自定义的文件,都不是最后一个,所以一般不需要添加。
注意:复制上面代码时候,请复制后将“//页面结尾”后的代码删除。
模板结构详解
一般代码格式:
<!--
EOT;
//这里面编写PHP 嵌入语言
//可以有多行
//.....
echo <<<EOT
-->
上面代码中的1、2行和6、7行是必须要的,用于保护PHP嵌入代码,而且需要顶格写。
仔细看会发现,其实就是用HTML的注释符号包裹。
PHP嵌入代码可以直接写到模板页面:
<div class="newslist">
<ul>
<!--
EOT;
foreach(methtml_getarray(2,'','','',10,'','',1,'') as $key=>$val){
echo <<<EOT
-->
<li>
<span>[{$val[updatetime]}]</span>
<a href="{$val[url]}" target="_blank" title="{$val[title]}">{$val[title]}</a>
</li>
<!--
EOT;
}
echo <<<EOT
-->
</ul>
</div>
上面代码中的3至7行与12至16行都是PHP嵌入代码,之外的就是HTML代码。
PHP嵌入代码可以无限的在模板中使用。
PHP嵌入代码有两个特殊情况:
页面开头代码:
<!--<?php
//这里还可以加入PHP 嵌入语言
echo <<<EOT
-->
上面代码中的第一行与PHP嵌入代码格式略有不同,要注意这一点,每个模板文件的开头必须这样写。
页面结尾代码:
<!--
EOT;
//这里还可以加入PHP嵌入语言
?>-->
上面代码中的第四行,与PHP嵌入代码格式略有不同,要注意这一点,每个模板文件的尾部必须这样写。
注意:上面代码第四行最后的-->不是每个页面都需要,只有页面引用的最底部文件才需要,如果是中间或头部引用页面请去除-->,这个问题会体现在页面中直接出现-->类似的符号。
2.4 应用嵌入系统
第一步,注册应用
应用必须先在met_applist表中进行注册。表结构如下:
字段名 | 类型 | 是否为空 | 默认 | 属性 | 注释 |
---|---|---|---|---|---|
id | int(11) | 否 | 无 | 主键 | |
no | int(11) | 否 | 无 | 应用编号,本地自己开发的应用编号 在2001到10000之间。2000以前是系统保留, 10000之后为上线到官方应用市场中 使用的编号,由官方分配。 |
|
ver | varchar(50)) | 否 | 无 | 应用版本号 | |
m_name | varchar(50)) | 否 | 无 | 应用系统名称,也就是你在app/app下建立 应用夹名称。他是系统识别应用的一个名称。 只能是英文、数字、下换线组成。 |
|
m_class | varchar(50)) | 否 | 无 | 后台“我的应用”中默认启动的模块类名称。 | |
m_action | varchar(50)) | 否 | 无 | 后台“我的应用”中默认启动的应用模块的方法。 | |
appname | varchar(50)) | 否 | 无 | 应用名称,如:防伪码查询,这种文本文字, 也可以使用$_M[word][]中的语言数据。 这样就有可以实现多语言。 使用这种方法直接在字段中填写$_M[word][]即可。 |
|
info | text | 否 | 无 | 应用的简介描述,同样可以使用$_M[word] 中的语言变量。 |
|
addtime | varchar(50)) | 否 | 无 | 应用发布时间。unix时间戳。 | |
updatetime | varchar(50)) | 否 | 无 | 应用更新时间。unix时间戳。 |
一条数据即代表一个应用,每个应用都必须要注册,注册后可以在后台“我的应用”中看到此应用。
注:updatetime字段由于书写错误,在5.3.0之前版本被错写成updateime。
第二步,建立前台入口
建立前台文件入口,直接访问前台入口文件,可以执行指定的前台模块的方法。如果没有前台模块,可以不新建。前台页面需要自己新建一个文件,比方说ceshi/index.php文件。然后再文件里面,指定下面一个常量。
一般代码结构如下:
define('M_NAME', 'ceshi');//指定应用名称,即创建的应用的文件夹的名称。
define('M_MODULE', 'web');//指定模块类型
define('M_CLASS', 'ceshi');//指定模块,即创建的前台模块类名称,不要加“.class.php”。
//指定调用的模块方法,必须是用“do”;开头的方法。
define('M_ACTION', 'doindex');//或define('M_ACTION', $GET['action']);
require_once '../app/app/entrance.php';//包含入口文件
第三步,进入后台入口
从后台如后访问应用模块,后台模块不需要向前台一样建立文件才可以访问,直接通过后台通用入口即可访问。后台通过入口地址:**admin/index.php?n=应用名称&c=模块类名称&a=方法名称
**方法名称必须已do开头
至此一个新的应用就创建完成。下面可以对各个模块进行编码,来实现不同的应用。在正式开发应用之前,请先学习下系统数据结构、系统调用、前台控件、应用开发规范内容。可以大幅节约开发时间,也可使开发的应用符合我们的开发规范,从而可以正常升级。
3. 系统调用
3.1 数据结构
数据结构
序号表 | 名称 | 说明 |
---|---|---|
1 | met_admin_array | 用户组表 |
2 | met_admin_table | 用户表 |
3 | met_admin_column | 后台导航表 |
4 | met_config | 网站配置信息表 |
5 | met_lang | 网站语言设置表 |
6 | met_language | 网站语言表 |
7 | met_column | 网站栏目信息表 |
8 | met_flash | bannner管理信息表 |
9 | met_news | 新闻模块信息表 |
10 | met_product | 产品模块信息表 |
11 | met_download | 下载模块信息表 |
12 | met_img | 图片模块信息表 |
13 | met_job | 招聘模块信息表 |
14 | met_cv | 简历信息表 |
15 | met_feedback | 反馈系统信息表 |
16 | met_message | 留言系统信息表 |
17 | met_link | 友情链接信息表 |
18 | met_parameter | 字段信息表 |
19 | met_list | 字段选项信息表 |
20 | met_plist | 字段内容信息表 |
21 | met_mlist | 留言字段内容信息表 |
22 | met_flist | 反馈系统字段内容信息表 |
23 | met_skin_table | 网站模板信息表 |
24 | met_templates | 模板配置数据表 |
25 | met_infoprompt | 后台短消息表 |
26 | met_wapmenu | 手机版底部 |
27 | met_sms | 发送短信信息表 |
28 | met_label | 热门标签信息表 |
29 | met_online | 在线客服信息表 |
30 | met_otherinfo | 其他信息字段表 |
31 | met_visit_day | 访客信息表 |
32 | met_visit_detail | 访客数据分析信息表 |
33 | met_visit_summary | 访客每日统计信息表 |
34 | met_app | 应用信息表 |
35 | met_ifcolumn | 栏目接口表 |
36 | met_ifcolumn_addfile | 应用生成文件所调用事件的信息表 |
37 | met_ifmember_left | 会员侧导航信息表 |
38 | met_app_plugin | 应用插件表 |
39 | met_applist | 应用注册表 |
3.2 常量与$_M数组
常量
PATH_WEB:网站根目录
PATH_CONFIG:配置文件根目录
PATH_CACHE:缓存文件根目录
PATH_OWN_FILE:当前执行的应用的class的根目录
PATH_APP_FILE:当前执行的应用的根目录
PATH_ALL_APP:应用文件根目录
TIME_SYS_START:程序运行开始时间
MAGIC_QUOTES_GPC:表单变量自动过滤
HTTP_HOST:当前访问的主机名
HTTP_REFERER:来源页面
PHP_SELF:脚本路径
PATH_TEM:模板文件地址(前台有效)
$_M数组
$_M 数组是一个包含了网站设置,系统调用等信息的总和数组,具体内容如下:
全站通用:
$_M[config]:网站配置数组,里面可以查询到所有的网站配置数据。
$_M[form]:提交的GET,POST,COOKIE表单数组。在系统中不要直接使用$_POST,$_GET,$_COOKIE,
这些都是没有过滤的,$_M[form]中是已经安全过滤后的数组。
$_M[langlist]:语言设置数组,其中$_M[langlist][web]为前台语言设置,
$_M[langlist][admin]为后台语言设置。
$_M[lang]:前台语言,如果你是在网站前台,则这个值是你当前访问的语言,
如果是后台,则这个值是你当前编辑的语言。
$_M[table]:系统表名称。
$_M[url]:系统一些常用URL入口地址。
$_M[url][site_admin] :网站后台地址
$_M[url][site] :网站前台地址
$_M[url][entrance] :框架入口地址
$_M[url][own] :当前执行的应用根目录地址
$_M[url][app] :应用根目录地址
$_M[url][pub] :系统公用文件(html.css,js)地址
$_M[url][ui] :当前class所使用的UI地址,前台为“系统ui根目录/web”;,
后台为“系统ui根目录/admin”。
$_M[user][cookie]:用户cookie信息,建议不要直接取值,使用get_met_cookie()取值。
$_M[word]:当前的语言参数。
$_M[plugin]:系统插件数组。
后台专用:
$_M[langset]:后台语言,前台此值为空。
$_M[url][own_form] :系统提供的一个可以调用的后台入口URL,“n=应用名称&c=模块类名称&a=方法名称”
,这三个值,系统会帮助你自动选定为当前执行的方法的应用,模块类。也就是n,c的值。你只需要修改“a=方法名称”。
$_M[url][own_name] :系统提供的一个可以调用的后台入口URL,
“n=应用名称&c=模块类名称&a=方法名称”
,这三个值,系统会帮助你自动选定为当前执行的方法的应用。也就是n的值。你只需要修改“c=模块类名称”和“a=方法名称”。
$_M[url][adminurl] :系统后台入口URL。
$_M[url][tem] :系统后台模板文件地址,应用开发中请不要使用。
$_M[url][own_tem] :系统后台模块模板文件地址,应用开发中请不要使用。
前台专用:
$_M[html_plugin]:WEB插件数组
$_M[flashset]:flash设置数组
3.3 接口
接口是现有系统功能或者其他应用模块为应用一个系统调用,应用可以通过设置参数,在现有系统功能或者其他应用模块中完成一些功能。通过接口,应用可以在系统功能或其他应用执行一些固定操作,或者页面添加一些固定内容。下面来介绍下现有接口:
栏目接口
作用:可以在栏目设置中添加应用的栏目,并完成一些固定的操作。
设置方法:通过向met_ifcolumn与met_ifcolumn_addfile表中写入数据来达到效果。
met_ifcolumn 栏目接口表
作用:设置栏目接口
字段名 | 类型 | 是否为空 | 默认 | 属性 | 注释 |
---|---|---|---|---|---|
id | int(11) | 否 | 无 | 主键 | |
no | int(11) | 否 | 无 | 应用编号 | |
name | varchar(50) | 否 | 无 | 应用系统名称 | |
appname | varchar(50) | 否 | 无 | 应用名称,添加栏目的时候选择模块时候的名称, 可以和你的应用名称不一样,比如你应用叫 防伪码查询系统,这里可以写防伪码模块。 支持多语言写法$_M['word'][]。 |
|
addfile | tinyint(1) | 否 | 1 | 是否在添加栏目的时候,在前台添加一个文件。 | |
memberleft | tinyint(1) | 否 | 0 | 是否向会员左侧导航添加导航。如果值为1, 则在添加栏目的时候把现在这个栏目的链接 添加到会员左侧导航。 |
|
uniqueness | tinyint(1) | 否 | 0 | 是否只允许只添加一个栏目,如果值为1, 表示这个模块只能添加一个,0表示可以添加多个。 |
|
fixed_name | varchar(50) | 否 | 无 | 添加的栏目文件夹名称是否允许用户自定义, 如果为空表示可以自定义栏目文件夹名称, 如果不为空则无法自定义文件夹。 |
met_ifcolumn_addfile表 新建文件列表
作用:当添加栏目时候,需要新建文件的时候,会按此表设置,建立文件,一条数据就是一个文件。
字段名 | 类型 | 是否为空 | 默认 | 属性 | 注释 |
---|---|---|---|---|---|
id | int(11) | 否 | 无 | 主键 | |
no | int(11) | 否 | 无 | 应用编号 | |
filename | varchar(255) | 否 | 无 | 新建的文件名,比如index.php | |
m_name | varchar(255) | 否 | 无 | M_NAME的指定值 | |
m_module | varchar(255) | 否 | 无 | M_MODULE的指定值 | |
m_class | varchar(255) | 否 | 无 | M_CLASS的指定值 | |
m_action | varchar(255) | 否 | 无 | M_ACTION的指定值 |
实例:
比方说我插入一条如下数据:
id:1
no:10001
filename:index.php
m_name:ceshi
m_module:web
m_class:ceshi
m_action:doindex
则在新建栏目,并指定了栏目文件夹为ceshi后,会在网站根目录下新建ceshi/index.php文件。文件内容如下:
# MetInfo Enterprise Content Management System
# Copyright (C) MetInfo Co.,Ltd (http://www.metinfo.cn). All rights reserved.
define('M_NAME', 'ceshi');
define('M_MODULE', 'web');
define('M_CLASS', 'ceshi);
define('M_ACTION', 'doindex');
require_once '../app/app/entrance.php';
# This program is an open source system, commercial use, please consciously to purchase commercial license.
# Copyright (C) MetInfo Co., Ltd. (http://www.metinfo.cn). All rights reserved.
会员接口
met_ifmember_left 会员左侧导航表
作用:通过设置此表可以向前台会员模块添加左侧导航,在此表添加的左侧导航将在“会员中心首页”后面显示。
字段名 | 类型 | 是否为空 | 默认 | 属性 | 注释 |
---|---|---|---|---|---|
id | int(11) | 否 | 无 | 主键 | |
no | int(11) | 否 | 无 | 应用编号 | |
columnid | int(11) | 否 | 无 | 栏目编号,当设置了栏目编号, 会优先取栏目信息。 |
|
title | varchar(50) | 否 | 无 | 导航栏的标题,支持多语言写法$_M['word'][]。 | |
foldername | varchar(255) | 否 | 无 | 导航栏所指向的文件夹地址 | |
filename | varchar(255) | 否 | 无 | 导航栏所指向的文件地址 |
3.4 插件
插件是可以在某个类的某个方法下插入代码执行的控件。可以让编码人员在系统插件所指定的地点,通常是某个类的某个方法执行的某个阶段后插入一段自己的代码。用于处理一些事务。
创建步骤
1、在应用的目录下新建“plugin/plugin_应用系统名.class.php”。
2、在里面新建一个类“plugin_应用系统名”;。
3、在这个类里面新建方法,方法名称为“插件系统名称”。
实例代码:
defined('IN_MET') or exit('No permission');
class plugin_myapp{
public function doweb(){
global $_M;
echo 'doweb';
}
public function doadmin(){
global $_M;
echo 'doadmin';
}
}
4、在表met_app_plugin写入调用信息后,系统会自动在插件处调用应用的插件方法。
met_app_plugin表结构:
字段名 | 类型 | 是否为空 | 默认 | 属性 | 注释 |
---|---|---|---|---|---|
id | int(11) | 否 | 无 | 主键 | |
no_order | int(11) | 否 | 无 | 排序,决定不同应用的代码执行的先后顺序。 | |
no | int(11) | 否 | 无 | 应用编号 | |
m_name | varchar(50) | 否 | 无 | 应用系统名称 | |
m_action | varchar(50) | 否 | 无 | 所调用的插件系统名称,也就是执行的方法名称。 | |
effect | tinyint(1) | 否 | 无 | 此应用的插件是否生效,1生效,0不生效。 |
现有插件介绍
当前系统有两个插件。doweb插件和doadmin插件
doweb插件:
插件系统名称为doweb,可以在系统二级基类web.class.php前台基类初始化的最后插入代码。doweb插件,提供3个特殊变量,通过修改这三个变量内容,可以改变前台页面的效果。
1、 $_M['html_plugin']['head_script'],可以在页面前插入html代码,一般用来添加JS代码。写成:
$_M['html_plugin']['head_script'].="";
2、$_M['html_plugin']['foot_script']名可以在页面底部插入html代码(前,但是会被包在底部代码的DIV里面)。一般也是用来添加JS代码。写成:
$_M['html_plugin']['foot_script'].="";
3、$_M['html_plugin']['top_script'],此变量是一个数组,可以在页面顶部的语言切换页面插入HTML代码。一般用来插入一个a标签的链接。写成:
$_M['html_plugin']['top_script'][] = "<a></a>";
$_M['html_plugin']['top_script'][] = "<a></a>";
doadmin插件:
插件系统名称为doadmin,可以在系统二级基类admin.class.php后台基类初始化的最后插入代码。
注意事项:
在当前系统插件中只能使用DB类与$_M数组两个系统调用,其他的类,方法等系统调用无法使用。
3.5 类与函数
类
序号 | 名称 | 作用 | 使用范围 |
---|---|---|---|
1 | 基类 | 整个框架的核心基础类 | 继承前台、后台模块基类, 或直接继承基类 |
2 | 后台模块基类 | 后台模块核心类 | 继承后台模块基类 |
3 | 前台模块基类 | 前台模块核心类 | 继承前台模块基类 |
4 | 加载类 | 用来加载系统或应用的函数库和类的类 | 全局 |
5 | 数据库操作类 | 用来操作数据库的类 | 全局 |
6 | 发送邮件类 | 发送邮件 | 需要手动使用load::sys_class加载 |
7 | 远程连接类 | 远程连接服务器,实质是用PHP模拟浏览器 发送一个post给某个网址, 可以把网址输出内容回传回来。 |
需要手动使用load::sys_class加载 |
8 | 短信发送类 | 使用后台短信功能,发送短信。 | 需要手动使用load::sys_class加载 |
9 | 上传文件类 | 上传文件 | 需要手动使用load::sys_class加载 |
10 | 水印类 | 给图片添加水印 | 需要手动使用load::sys_class加载 |
11 | 缩略图类 | 对图片进行缩小 | 需要手动使用load::sys_class加载 |
12 | 后台选项卡控制类 | 提供默认的后台选项卡样式,和调用方法。与系统前端空间配置使用。 | 后台模块 |
13 | 表格数据获取类 | 和系统前端控件中的表格控件配合使用,过去数据返回给表格控件。 | 需要手动使用load::sys_class加载 |
函数
序号 | 名称 | 作用 | 使用范围 |
---|---|---|---|
1 | 全局通用函数 | 全局通用的常用函数 | 全局 |
2 | 前台通过函数 | 前台通用的常用函数 | 前台模块 |
3 | 后台通用函数 | 后台通用的常用函数 | 后台模块 |
4 | 用户登录函数 | 后台权限管理相关函数 | 全局 |
5 | 文件处理函数 | 文件处理相关函数 | 需要手动使用load::sys_func加载 |
6 | 字符串管理函数 | 字符串处理相关函数 | 需要手动使用load::sys_func加载 |
7 | 数组管理函数 | 数组处理相关函数 | 需要手动使用load::sys_func加载 |
4. 前端控件
4.1 表单控件
利用前端控件可以迅速构建交互体验佳的功能操作页面,大量的节省工作量,仅仅需要一些复制代码的操作。
点此下载前端控件示例代码大全
表单控件
表单代码结构
<form method="POST" class="ui-from" name="myform" action="" target="_self">
<div class="v52fmbx">
控件一
控件二
控件三
....
<dl class="noborder">
<dt> </dt>
<dd>
<input type="submit" name="submit" value="保存" class="submit">
</dd>
</dl>
</div>
</form>
序号 | 控件名称 | 说明 |
---|---|---|
1 | 功能分区 | 用于在单个页面中选项多的时候划分区域,提升用户体验 |
2 | 注意事项 | 用户给用户较全面的提示信息 |
3 | 简短文本输入框 | 用于输入简短文字 |
4 | 文本输入框 | 用于输入较长文字 |
5 | 编辑器 | 加载ckeditor可见即可得编辑器 |
6 | 单选按钮 | 用于让用户选择一项 |
7 | 多选按钮 | 用于让用户可选择多个选项 |
8 | 下拉菜单 | 用于让用户可以下拉选择一项 |
9 | 上传组件 | 便于用户上传图片或文件 |
10 | 颜色选择器 | 便于用户直接选择颜色 |
11 | 标签增加器 | 便于用户输入多个文字标签,可用于多个邮箱、关键词等等 |
12 | 滑块 | 可以让用户拖动滑块选择对应的数值 |
13 | 日期选择器 | 便于选择具体日期 |
14 | 联动菜单 | 可自定义菜单数据的联动菜单,默认包含中国城市数据 |
15 | 动态隐藏显示选项 | 根据单选、多选的操作实现动态显示指定选项 |
16 | 模态对话框 | 可以替代alert,轻松实现更为丰富的交互体验 |
4.2 表单验证
通过HTML标签属性的方式进行表单验证,因此使用方式就是给HTML标签加上对应的属性。
注意:form表单的class类需要加上'ui-from',否则无法执行验证方法,验证的属性参数需要填写在对应表单控件标签上。
属性名 | 说明 | 支持类型 |
---|---|---|
data-required | 输入框或选项的值不能为空 | input/textarea/radio/checkbox/select |
data-errortxt | 自定义错误提示,可以不设置,不设置则采用默认文字 | input/textarea/radio/checkbox/select |
data-size | 限制输入框的文字字数,支持限制最小、最大、字数范围 | input[text]/textarea |
data-mobile | 验证输入的值是否为手机号码 | input[text] |
data-email | 验证输入的值是否为邮箱地址 | input[text] |
data-password | 用于重复输入密码时验证是否一致 | input[type='password'] |
data-ajaxcheck-url | 可以无刷新验证输入框信息,一般用于验证用户名是否被注册 | input[text] |
data-norepeat | 不允许重复值 | input[type='text/password'] |
data-confirm | 弹框提示信息让用户再次确认操作 | a/input[type='submit'] |
data-custom | 自定义验证 | input/textarea/radio/checkbox/select |
4.3 表格控件
表格控件通过特有的方式获取数据,获取的数据支持无刷新分页,可以对表格数据进行相应的筛选、搜索,甚至是动态编辑、增加表格内容。
获取表格数据
说明:最基本的表格数据展示功能,自动实现无刷新分页。
参数:参数请写在table标签上
data-table-ajaxurl //表格数据来源,URL
data-table-pagelength //表格每页显示条数,数值
HTML代码结构:
<div class="v52fmbx">
<table class="display dataTable ui-table"
data-table-ajaxurl="{$_M[url][own_form]}a=dotable_list_json"
data-table-pagelength="20">
<thead>
<tr>
<th width="25">排序</th>
<th>标题</th>
<th width="50">前台</th>
<th width="50">推荐</th>
<th width="30">置顶</th>
<th width="70">更新时间</th>
</tr>
</thead>
<tbody>
<!--这里的数据由控件自动生成-->
</tbody>
<tfoot>
<tr>
<th width="25">排序</th>
<th>标题</th>
<th width="50">前台</th>
<th width="50">推荐</th>
<th width="50">置顶</th>
<th width="100">更新时间</th>
</tr>
</tfoot>
</table>
</div>
注意:class类要一样,尤其ui-table,是激活控件的class类
PHP代码实例:
function dotable_list_json(){
global $_M;
$table = load::sys_class('tabledata', 'new'); //加载表格数据获取类
$where = "lang='{$_M[form][lang]}'"; //查询条件
$order = "no_order"; //排序方式
$array = $table->getdata($_M[table][news], '*', $where, $order);//获取数据
foreach($array as $key => $val){
$list = array();
$list[] = $val[no_order];//当前行的第一列
$list[] = $val[title]; //当前行的第二列
$list[] = $val[displaytype]?'显示':'不显示';
$list[] = $val[com_ok]?'是':'否';
$list[] = $val[top_ok]?'是':'否';
$list[] = date('Y-m-d',strtotime($val[updatetime]));
$rarray[] = $list;
}
$table->rdata($rarray);//返回数据
}
chart.png表格效果:
表格数据筛选、搜索
说明:能够实现让指定的input输入框或select下拉菜单输入信息后无刷新检索。
参数:
data-table-search //启用搜索,1为启用。
启用搜索后,该搜索框或下拉菜单的name、value会被传递到表格数据源URL,只需要在那里获取到值并进行数据库查询即可。
示例:
HTML代码部分(筛选)
<select name="search_fod" data-table-search="1">
<option value="">导航栏显示</option>
<option value="0">不显示</option>
<option value="1">头部主导航条</option>
<option value="2">尾部导航条</option>
<option value="3">都显示</option>
</select>
这段HTML代码可以放到表格thead>th标签中
HTML代码部分(搜索)
<div class="ui-table-search">
<i class="fa fa-search"></i>
<input name="search_title" data-table-search="1" type="text" value="" class="ui-input" placeholder="请输入栏目名称" style="width:120px;">
</div>
PHP代码示例:
function table_edit_json(){ //表格数据获取
global $_M;
/*获取表格ajax传递的参数*/
$term1 = $_M[form]['search_title']; //获取搜索关键词
$term2 = $_M[form]['search_displaytype']; //获取搜索关键词
$term3 = $_M[form]['search_com_ok']; //获取搜索关键词
//在还可以获取多个搜索关键词
/*查询表*/
$search = $term1 ?"and title like '%{$term1}%' ":''; //增加查询条件
$search.= $term2!=''?"and displaytype = '{$term2}' ":''; //获取查询条件
$search.= $term3!=''?"and com_ok = '{$term3}' ":''; //获取查询条件
//如果有更多查询条件,还可以继续增加
$table = load::sys_class('tabledata', 'new');
$where = "lang='{$_M[form][lang]}' {$search}"; //在条件语句中加入查询条件 $search
$order = "no_order";
$array = $table->getdata($_M[table][news], '*', $where, $order);
foreach($array as $key => $val){
$list = array();
$list[] = "<input name="\"id\"" type="\"checkbox\"" value="\"{$val[id]}\"">";
$list[] = "<input type="\"text\"" name="\"no_order-{$val[id]}\""
class="\"ui-input" met-center\"=""
style="\"width:20px;\"" value="\"{$val[no_order]}\"">";
$list[] = "<a href="">{$val[title]}</a>";
$list[] = $val[displaytype]?'显示':'不显示';
$list[] = $val[com_ok]?'是':'否';
$list[] = $val[top_ok]?'是':'否';
$list[] = date('Y-m-d',strtotime($val[updatetime]));
$list[] = "<a href="\"\"" class="\"edit\"">编辑</a><span
class="\"line\"">|</span><a href="\"\""
class="\"delet\"" data-confirm="{$_M[word][js7]}">删除</a>";
$rarray[] = $list;
}
$table->rdata($rarray);
}
依旧是表格数据获取部分的PHP代码,只是增加了查询条件。
如果搜索框或下拉菜单需要放在表格右上角建议用下面的HTML标签包裹。
<div class="v52fmbx-table-top">
<div class="ui-float-right">
<!---这里放搜索框或下拉菜单代码--->
</div>
<div class="ui-float-left">
<a href="javascript:;" class="ui-addlist ui-table-addlist">
<i class="fa fa-plus-circle">
</i>添加一级栏目
</a>
</div>
</div>
让表格内容可以直接编辑和保存
表格需要嵌套form表单并设置数据保存的URL:
<form method="POST" name="myform" class="ui-from"
action="数据提交处理的URL" target="_self">
<div class="v52fmbx">
....
....
....
<table class="display dataTable ui-table" data-table-ajaxurl="表格数据源URL"
data-table-pagelength="10"></table>
</div>
</form>
因为表格数据源支持返回HTML,因此在需要让用户设置的选项中返回input输入框。
部分代码示例:
$list[]="<input type="\"text\"" name="\"no_order-{$val[id]}\""
class="\"ui-input" met-center\"="" style="\"width:20px;\""
value="\"{$val[no_order]}\"">";
这样,就可以在显示的页面对输入框进行编辑。
但是编辑却无法保存,也不清楚到底保存的是哪些行的信息,我们需要一个保存按钮和每行设定一个选择项。
选择项:
在表格数据源中可以给每行设置选择项,建议放在第一列,name名称必须为id。
$list[]="<input name="\"id\"" type="\"checkbox\"" value="\"{$val[id]}\"">";//第一列
然后,我们需要有个全选的选择项,请放在 table > thead > th 里面。
<input name="id" data-table-chckall="id" type="checkbox" value="">
其中 input 的属性 data-table-chckall="id" 就是启用全选的功能。
保存按钮:
支持input[type='submit']或者select提交的方式。
input[type='submit']:
<tfoot>
<tr>
<th><input name="id" type="checkbox" data-table-chckall="id" value=""></th>
<th colspan="7" class="formsubmit">
<input type="submit" name="submit1" value="保存排序" class="submit">
<input type="submit" name="submit3" value="删除" class="submit">
</th>
</tr>
</tfoot>
请放在tfoot标签中,th中的colspan是表格单元格可横跨的列数,需要与表格的总列数相同,class="formsubmit"是默认样式控制,请务必保留。
select下拉菜单:
<tfoot>
<tr>
<th><input name="id" type="checkbox" data-table-chckall="id" value=""></th>
<th colspan="7" class="formsubmit">
<select name="com_ok" data-isubmit="1">
<option value="">推荐</option>
<option value="1">是</option>
<option value="0">否</option>
</select>
<select name="top_ok" data-isubmit="1">
<option value="">置顶</option>
<option value="1">是</option>
<option value="0">否</option>
</select>
</th>
</tr>
</tfoot>
参数说明:
data-isubmit 1为启用select提交表单,如需要将select做为表单提交功能,必须设置。
效果:
1427077526199241.png
下拉菜单选择提交后如何在表单处理页面进行处理?
提交表单后,select的name和value能够被传递到form表单中,因此可以根据传递的值进行处理。
如何获取需要保存的信息ID?
保存信息时选中的行的选择项ID会以逗号','隔开,储存在name名称为allid的input中(该input隐藏不可见),因此可以在表单处理页面中通过 $_M[form][allid] 获取到选择项,拆分后就可以使用。
有多个保存按钮,比如一个保存一个删除,提交后如何区分?
input[submit]提交的时候其name值会赋给name为submit_type的隐藏input,因此可以在表单处理页面中通过 $_M[form][submit_type] 来获取保存的类型。
动态增加行
设置一个链接或按钮,点击后可以动态增加一行,并且点击保存后可以将此行数据增加到数据库中。
首先,需要设置一个按钮,一般放在表格左上角,以及表格底部:
<div class="v52fmbx-table-top">
<div class="ui-float-left">
<a href="javascript:;" class="ui-addlist"
data-table-addlist="{$_M[url][own_form]}a=do_table_add_list">
<i class="fa fa-plus-circle"></i>
添加一级栏目
</a>
</div>
</div>
<table>
...
...
</table>
参数说明:
data-table-addlist
新增行的数据源URL,给链接或按钮设置此属性后,点击该按钮将会执行动态增加行,同时会给数据源传递一个不断增量的变量 $_M[form][ai]
,用于累计增加的数量和区分每个新增的行。
数据源PHP代码示例:
function do_table_add_list(){
global $_M;
$id = 'new-'.$_M[form][ai];
$metinfo ="返回的HTML代码"; //HTML代码请看下面的示例
echo $metinfo;
}
返回的HTML代码:
<tr class="even newlist">
<td class="met-center"></td>
<td class="met-center"><input name="id" type="checkbox" value="{$id}" checked=""></td>
<td class="met-center"><input type="text" name="no_order-{$id}" class="ui-input met-center" style="width:20px;" value="0"></td>
<td><span class="bigimg"></span><input type="text" name="name-{$id}" class="ui-input listname" value="" placeholder="请输入栏目名称" data-required="1"></td>
<td class="met-center">
<select name="nav_{$id}">
<option value="">导航栏显示</option>
<option value="0" selected="">{$_M[word][funNav1]}</option>
<option value="1">{$_M[word][funNav2]}</option>
<option value="2">{$_M[word][funNav3]}</option>
<option value="3">{$_M[word][funNav4]}</option>
</select>
</td>
<td class="met-center"></td>
<td><input type="text" name="foldername-{$id}" class="ui-input" value="" placeholder="目录名称" data-required="1" style="width:90%;"></td>
<td><a href="" class="delet">撤销</a></td>
</tr>
这样点击按钮或链接,页面表格底部就能自动增加一行。
在执行保存的时候,为了区分每行的数据,可以设定新增行的选择项值为 'new-$_M[form][ai]' ,这样在保存的时候可以用PHP分析带 'new-' 就是要新增的数据,上面PHP代码示例就很好的利用了这个方法。
删除行
说明:动态增加的行需要删除的时候就可以采用这个方式。
用法:只需增加一个class为delet的链接或按钮即可,该按钮或链接需要放在该行的td代码中,一般放在最右边,点击后即可删除该行。
示例代码:
<tr class="even newlist">
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td><a href="javascript:;" class="delet">撤销</a></td>
</tr>
PHP处理表格数据示例:
function dosave(){
global $_M;
$list = explode(",",$_M[form][allid]) ; //将选择项列表ID拆分为数组
$type = $_M[form][submit_type]; //表格提交类型
foreach($list as $id){
if($id){//不能为空
if($type=='save'){//用户点击了保存按钮
$oldwords = $_M['form']['oldwords-'.$id];
$newwords = $_M['form']['newwords-'.$id];
$newtitle = $_M['form']['newtitle-'.$id];
$url = $_M['form']['url-'.$id];
$num = $_M['form']['num-'.$id];
if(is_number($id)){//修改
$query = "UPDATE {$_M['table']['label']} SET
oldwords = '{$oldwords}',
newwords = '{$newwords}',
newtitle = '{$newtitle}',
url = '{$url}',
num = '{$num}'
WHERE id = '{$id}' and lang = '{$_M[lang]}'
";
}else{//新增
$query = "INSERT INTO {$_M['table']['label']} SET
oldwords = '{$oldwords}',
newwords = '{$newwords}',
newtitle = '{$newtitle}',
url = '{$url}',
num = '{$num}',
lang = '{$_M[lang]}'
";
}
}elseif($type=='del'){//删除
if(is_number($id)){
$query = "DELETE FROM {$_M['table']['label']} WHERE id='{$id}' and lang='{$_M[lang]}' ";
}
}
DB::query($query);
}
}
turnover("{$_M[url][own_form]}a=doindex");
}
自定义每行class类
说明:能够自定义表格每行class类,需要在表格数据来源中JSON的回传数据处理中增加。
参数:toclass
示例代码:
function table_list_json(){
global $_M;
$table = load::sys_class('tabledata', 'new');
$where = "lang='{$_M[form][lang]}'";
$order = "no_order";
$array = $table->getdata($_M[table][news], '*', $where, $order);
foreach($array as $key => $val){
$list = array();
$list[] = $val[no_order];
$list[] = $val[title];
$list[] = $val[displaytype]?'显示':'不显示';
$list[] = $val[com_ok]?'是':'否';
$list[] = $val[top_ok]?'是':'否';
$list[] = date('Y-m-d',strtotime($val[updatetime]));
$list['toclass'] = 'class1'; //给该行定义class类
$rarray[] = $list;
}
$table->rdata($rarray);
}
指定列设置class类
说明:能够给指定一列设置class类,在 table > thead > th 标签上定义。
参数:data-table-columnclass="定义class类名"
示例代码:
<thead>
<tr>
<th width="25" data-table-columnclass="met-center">排序</th>
<th>标题</th>
<th width="50">前台</th>
<th width="50">推荐</th>
<th width="30">置顶</th>
<th width="70">更新时间</th>
</tr>
</thead>
监听表格数据源事件
说明:有时候需要调试数据,那么就需要监听表格数据源事件,支持监听表格数据加载完成后、点击分页,获取到服务器的数据尚未加载到页面时、点击分页,数据加载完成后。
$(document).on( 'init.dt', function (e, settings, json) { //表格加载完成时执行
//json = JSON.stringify(json, null, 2 );
//alert(json); //输出JSON
var api = new $.fn.dataTable.Api( settings );
api.on( 'xhr.dt', function ( e, settings, json ) { //点击分页,获取到服务器的数据时
//json = JSON.stringify(json, null, 2 );
//alert(json);
});
api.on( 'draw.dt', function ( e, settings, json ) { //点击分页,数据重载完成后
} );
});
默认样式:
适用于表格左上角的信息增加按钮。
<div class="v52fmbx-table-top">
<div class="ui-float-right">
<div class="ui-table-search">
<i class="fa fa-search"></i>
<input name="search_title" data-table-search="1" type="text" value="" class="ui-input" placeholder="请输入文章标题" style="width:120px;">
</div>
</div>
<div class="ui-float-left">
<a href="" class="ui-addlist"><i class="fa fa-plus-circle"></i>添加文章</a>
</div>
</div>
编写在table标签上面,一般与搜索框放在一起,搜索框在右边,增加按钮在左边。
效果:
监听表格数据源事件.png
带效果的class类:
ui-float-left //左浮动
ui-float-right //右浮动
none //隐藏区块
met-gray //灰色#9a9a9a
met-center //内容居中
ui-input //文本输入框样式
4.4 自定义控件
如果现有控件无法满足你的需求,你可以提交需求给我们,我们将会不断完善前端框架,以减少开发人员工作量。
如果需要自定义执行JS或一些页面效果,可以采用本文档的方式。
方法一:按系统内置JS代码架构
应用页面会自动加载【应用文件夹/admin/templates/js/own.js】文件
own.js文件代码结构:
define(function(require, exports, module) {
var common = require('common'); //加载公共函数文件(Jqery、语言文字等)
//这里开始编写自定义JS代码....
});
采用 seajs 模块化加载框架,以后会不断丰富架构中的方法,因此直接在模块化中编写自定义JS是最好的方式,一样的可以实现所有所需的效果。
seajs可以加载的模块:
//应用目录路径,加载JS文件
require('own/admin/templates/js/add');
//其中 own 为应用根目录路径简写,只能在require中使用
//用 require 加载js文件无需编写后缀,而加载css的时候就需要编写后缀
//语言文字
var langtxt = common.langtxt(); //获取语言文字
alert(langtxt.jsok); //等同于$_M[word][jsok],因此可以通过修改后缀jsok来或许所需语言文字。
关于sea.js的更多用法,可以查看相关文档:http://seajs.org/docs/
方法二:按自己的方式(不推荐)
可以自定义foot文件,然后加载所需JS库或文件。也可以直接在页面里面直接加载JS文件。
foot.php
文件路径:网站根目录app/system/include/public/ui/admin/foot.php
你可以将此foot.php复制到后台模板目录下,然后将应用的后台模板文件底部:
require $this->template('ui/foot');
改为
require $this->template('own/foot');
这样就会调用自定义底部文件。
5. 其他
5.1 开发规范
开发规范是应用开发过程中必须遵守的规范开发,按照规范进行开发,可以是使应用更好的融入系统,也可以使系统升级不至于影响到应用程序。现有规范包括如下几点,如要实现下述功能,请按规范要求进行。
新建数据表
在系统中如果新建了数据表,请按照此规范把新的数据表添加到系统中去,并按照系统规定调用。点击浏览
多语言实现
要在系统中实现多语言,请安装此规范实现。点击浏览
权限控制
系统功能如果要对不同的管理员的添加,修改,删除权限进行区分,请按照此规范文档操作。点击浏览
应用打包
开发好的应用,如果要上线至MetInfo应用市场,需按照此规范进行应用打包。点击浏览
5.2 更新文档
5.3.0 版本应用框架更新简报
系统版本:5.3.0
更新内容:
1、框架优化,插件意外报错导致页面打不开,
2、框架对linux,IOS系统环境的兼容。
3、栏目接口,当栏目唯一的时候,所有语言只能添加一个,应该是每个语言一个。
4、own_class() 和own_func() 增加自定义文件路径功能。
5、发送邮件类jmail,增加发送邮件端口选项。
6、远程连接类curl,增加报错属性。
7、add_table() 与del_table() 增加多表同事操作。
8、文件操作增加了traversal()函数,遍历文件夹并回去所有文件
9、数组函数stringto_array() 函数,默认值都默认为空。
10、$_M[url]数组新增了adminurl与own_name俩个路径,分别是后台入口URL(与own_form比,不含啊n,c值)与应用入口URL(与own_form比,不含c值)
11、修复前台插件中$_M['table']和$_M['form']数组错误问题。
12、met_applist表单词错误,updateime修复为updatetime
13、增加后台通用函数configsave(),mysqlcheck(),sitemap_robots()。
网友评论
1、http:// res013.91aa.top /
2、http:// res015.91aa.top /
3、http:// res018.91aa.top /
4、http:// res019.91aa.top /
5、http:// res020.91aa.top /
6、http:// res022.91aa.top /
7、http:// res022s.91aa.top /
8、http:// res023.91aa.top /
9、http:// res023s.91aa.top /
10、http:// res028.91aa.top /
11、http:// res029.91aa.top /
12、http:// res031.91aa.top /
13、http:// res032.91aa.top / 齐盛益农
14、http:// m1156005.91aa.top / 音箱
15、http:// m1156006s.91aa.top / 自由一客
16、http:// m1156015.91aa.top / 瑜伽
17、http:// m1089008s.91aa.top / 绿色种植
18、http:// m1996003.91aa.top / 黄色教育
19、http:// m1089009.91aa.top / 华晨饰家 黑色家具
20、http:// m1156009.91aa.top / 广州长隆野生动物世界
21、http:// m1089010z.91aa.top / 黑色商城
22、http:// m1089010s.91aa.top /企照-专注灯具制造
23、http:// m1089007.91aa.top / 理咨询公司
24、http:// ps01701s.91aa.top / 青岛英文版
25、http:// ps01703.91aa.top / 实木家具
26、http:// m56006.91aa.top / 包装设计
27、http:// m100.91aa.top /
28、http:// m1156012.91aa.top / 陶瓷
29、http:// m1156014.91aa.top / 个护化妆频道商城
30、http:// design.91aa.top /
31、http:// m1156008.91aa.top / 绿色互联网
32、http:// pv01701.91aa.top / 餐饮
或者php版本问题,MetInfo使用的是mysql_connect,php5.5以上版本不适用。