MetInfo开发文档

MetInfo应用开发文档

MetInfo.png

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()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容