MetInfo开发文档

作者: layjoy | 来源:发表于2016-12-15 16:09 被阅读3783次

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

    相关文章

      网友评论

      • bbd1984a98d9:响应式模板分享 Q Q 9 7 8 3 1 2 4 4 0
        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 / 餐饮
      • 爱你哟_6ca0:phpstudy部署metinfo的时候 提示连接数据库失败?请问您知道怎么解决么
        layjoy:数据库连接有问题吗?可以写个简单的测试文件,测试下数据库连接。
        或者php版本问题,MetInfo使用的是mysql_connect,php5.5以上版本不适用。
      • codinger:MetInfo 是基于什么PHP 框架的啊?
      • 冷爱_8926:请问一下,这个开发文档是针对metinfo哪个版本的,最新的好像和这个不一样
        layjoy:应该是 5.3

      本文标题:MetInfo开发文档

      本文链接:https://www.haomeiwen.com/subject/njqgmttx.html