多多系统开放平台

多多返利程序开发流程

一、框架说明

  1. 多多程序主要分为mod和template两部分,mod文件夹负责数据运算,template文件夹负责页面显示。
  2. 通常mod和template配套使用,如商城列表页面,mod文件的位置是:mod/mall/list.act.php,template文件的位置是template/default/mall/list.tpl.php:
  3. 开发者根据应用需要,可灵活控制是否需要mod或者tempalte
  4. 框架只是在形式上区分了mod和template,开发者可根据自身需要,将template里的内容,放到对应mod文件的最下方。或者将mod里的内容,放到对应template文件的最上方(模版开发者可以用此方式避免修改程序文件)
  5. 范例包下载

二、简单修改

  1. 假设现在需要修改“http://demo.duoduo123.com/index.php?mod=mall&act=list”此页面。
  2. 观察网址参数,可得知此页面是mall模块的list行为
  3. /mod/mall/list.act.php文件是此页面的控制文件,打开(请用专业的代码书写工具,如dreamwear等)。
  4. “$pagesize=24;”:控制页面显示的个数。
    “$malls=$duoduo->select_all('mall', 'id,title,url,img,cid,fan,des,score,pjnum', "$where order by sort desc limit $frmnum,$pagesize");”:控制读取字段。
  5. template/default/mall/list.tpl.php文件是此页面的模板文件

三、应用插件结构说明

  1. 所有插件的入口文件都为根目录下的“plugin.php”,由连接参数指向具体的插件,“plugin.php?mod=shijiu&act=index”,mod指的是插件标识码,act指向插件的act文件
  2. 插件页面会自动获取插件的后台的基本设置,赋值给“$plugin_config”,开发者打印查看。
  3. 在plugin.php文件中定义了“PLUGIN_TPLPATH”和“PLUGIN_TPLURL”两个常量,分别是模板的绝对路径和相对于根目录的路径,开发者可直接使用
  4. 在根目录/plugin下新建一个文件夹,名字为“shijiu”
  5. shjiu文件集包含以下文件:admin(存放后台设置文件),mod(存放前台显示控制文件),template(存放前台模板文件),comm.php(全局调用文件),rewrite.php(伪静态文件),set.php(应用信息文件),update.php(安装升级文件)
  6. set.php包含改插件的后台目录,数据库结构,前台行为,安装卸载sql,是否需要伪静态,是否需要全局引入文件等基本信息: 注意:'admin_auto' => array (……部分,“index”键,没有特别需求,请设置为1,提交后系统自动生成插件配置文件
    <?php //多多
    return array (
        'admin_nav' => array (  //后台目录
            'index' => array ('title' => '基本设置'),  //键名“index”表示后台插件的do行为,如果应用需要后台设置,必须有index页面
            'list' => array ('title' => '商品列表'),
            'addedi' => array ('title' => '添加商品'),
            'caiji' => array ('title' => '商品采集','arr'=>array('no_header'=>1)),  //arr指的是在连接后加任意参数
            'url_1' => array ('title' => '查看教程','url' => 'http://bbs.duoduo123.com'),  //如果数组中含有“url”,表示这是一个外部链接
            'url_2' => array('title'=>'会员列表','mod'=>'user','act'=>'list','arr'=>array('page'=>1)),  //如果函数mod和act,表示指向网站后台的的一个模块,arr根据实际情况选择
        ),
      	'admin_auto' => array ('index' => 1,'list' => 1,'addedi' => 1,'del' => 1),  //后台模块数据是否用框架自动处理
    	'table' => array (  //数据库结构,键名“shijiu”表示应用安装时自动创建“duoduo_plugin_shijiu”的表,表结构不需要自己写明,只要在本地开发中创建表“duoduo_plugin_shijiu”,把debug模式改为1,可点击后自动生成
    		'shijiu' => array (
    			'id' => 'int(11) NOT NULL auto_increment',
    			'val' => 'text NOT NULL',
    			'type' => 'tinyint(1) NOT NULL default "0"',
    			'duoduo_table_index' => 'PRIMARY KEY  (`id`),KEY `type` (`type`)',
    		),
            //重复上面的数组可创建多个表
      	),
      	'act_arr' => array (  //应用前台模块,没有特别需求tag可重复应用标识码
    		0 => array (
    			'act' => 'index',
    			'title' => '19.9包邮',
    			'tag' => 'shijiu',
    			'nav' => 1,  //添加nav字段,会自动添加前台导航
    		),
    		1 => array (
            	'act' => 'view',
            	'title' => '',
            	'tag' => 'shijiu',
          	),
      	),
      	'search' => array (  //如果不需要前台页面自动添加搜索,“search”为空
    		'act' => 'index',
    		'search_name' => '十九块九',
    		'search_tip' => '搜索十九块九商品',
    		'search_width' => '70',
      	),
      	'install_sql' => 'select * from {%BIAOTOU%}user where id=5;select * from {%BIAOTOU%}user where id=5;',  //安装sql语句,假设应用需要对现有的表增加字段,便可在这里执行sql,例子中的select只是随便写的
      	'uninstall_sql' => 'select * from {%BIAOTOU%}user where id=5;select * from {%BIAOTOU%}user where id=5;', //卸载sql语句,与安装sql对应,添加过什么字段必须在这里有对应的删除
      	'need_include' => 1,  //是否需要全局调用文件,文件目录在plugin/shijiu/comm.php
      	'debug' => 0,    //调试模式,设置为1应用后台出现“生成配置文件(即set.php)”的按钮,生成后debug会自动置0,调试模式下,系统会自动判断后台代码的a和from表示是否有do和plugin_id,只是友好的提示,开发者自己确定没错可不用理会,本地开发时需要设置为1.
        'banben'=>'20130911',  //应用所试用的多多版本
        'version'=>'0.1',  //应用自身的版本号
    );
    ?>
    
  7. 下面对set.php内的做具体说明:
    admin_nav:表示后台目录,与admin文件夹下的文件对应,在admin_nav下定义数组都会在插件后台显示快捷导航,如果定义了“url”键名,便是一个外部连接。

    admin_auto:表示后台模块是否使用多多默认框架。多多插件后台默认4个模块“index(插件基本设置,每个插件必须默认添加此文件),list(数据库数据列表),addedt(数据库数据添加修改),del(数据库数据删除)”,具体代码参照admin/plugin/admin.act.php,如果您不需要框架默认的数据处理,要自行写逻辑,请把admin_auto对应的模块数值设置为0
    table:如果您的插件不需要新建表,请将table的数组内容留空。table可以添加多个表,第一个表必须以应用标识码为名,如范例中的“shijiu”,安装应用时系统会自定创建表“表头_plugin_shijiu”,如需多个表可为table增加数组,表名必须是“shijiu_名字”。文件中的表结构无需自己书写,开发者只需要本地建好数据库,后面会讲到如何自动生成。
    act_arr:前台行为,安装应用时根据是否有“nav”等于1会自动添加页面管理和导航。
    search:模板导航接口,会在前台搜索框自动增加一个搜索项,关键词参数是q,不需要请留空。
    install_sql:应用安装sql,用分号分开,“{%BIAOTOU%}”表示表头,无需安装sql请留空。
    uninstall_sql:应用卸载sql,用分号分开,“{%BIAOTOU%}”表示表头,无需卸载sql请留空,卸载sql必须与安装sql对应。
    need_include:是否需要给全局添加引入文件,对应插件内的comm.php文件。需要是1,不需要是0
    rewrite:是否有伪静态文件。需要是1,不需要是0
    debug:调试模式,打开这个模式后,在插件后台管理首页,会多一个生成配置文件的按钮,程序会根据你填写的数据库名,自动从你的库中检索出结构,并更新set.php。本地开发时设置为1。
  8. 下面对admin文件夹做具体说明:
    admin下的文件因为结构相对简单,所以不区分mod和template,控制代码和模板代码写在同一个文件中。
    admin下的文件内容中的a,form等标签,连接中必须带有do和plugin_id参数,do表示代码行为,用于指向admin下的文件,plugin_id是该应用的id号。当打开debug模式,框架会自动检查a和form标签是否带有do和plugin_id参数,并提示开发者。(框架只是提醒,如果开发者处理的a和form标签确实不需要do或者plugin_id参数,那么无需理会警告)
    index.php:应用基本设置,提交后会自动生成一个数据文件记录在data/json/plugin/应用标识码.php,调用函数“dd_get_cache('plugin/应用标识码')”,<table>文件内必须引用“<?php include(ADMINROOT.'/template/plugin/dd_set.tpl.php');?>”,只有index必须引入。
    list.php:将“表头_plugin_shijiu”的数据罗列。按照一定的规则筛选数据是列表页的常用需求之一(比如商品表按照分类、标题查询等):

    在list.php页面的上部查询form中,框架对两个input有特殊处理,截图事例:

    name为“sql_where”的input表示查询字段的规则,每个字段用大括号包含,内部规则用英文分号隔开,共分4节,下面对其中一个进行说明,“title:char:like:full”,第一节表示字段名,第二节表示字段类型(字符类型是char,数字类型是int),第三节表示sql语句中的where比较符,是liek就是like,是等于就是等于,第四节有两个状态,一个是“full”,表示当字段为空值时(字段类型是字符)或者字段为0时(字段类型是数字),此字段不参与where,一个是“empty”,表示当字段为空时,此字段依然参与where
    name为“order_by”的input表示sql语句的order by属性。
    注意:框架提供的方法只是提供,并不强制,开发者如果感觉使用不惯,可将list.php的admin_auto设置为0,开发者自行写php代码。
    addedi.php:将“表头_plugin_shijiu”的数据添加修改
    以上三个文件的数据操作是系统内置的,如果需要,请将“admin_auto”的内容分别设置为1,并且在form表单中默认submit的name为sub。
    如果不需要框架自动处理数据,将“admin_auto”的内容分别设置为0。
    开发者可在admin下添加任意文件,文件开头必须判断文件是否定义过“ADMIN”常量,没有定义停止页面运行。
    后台框架是先输出统一的头部代行,再根据do参数引入各个文件,如果引入的文件如果只是数据计算,不需要页面显示,此时就会有点小问题,解决办法是将参数加上&no_header=1(get或者post形式都行),有这个参数后,框架变不会输出统一的头部,直接引入文件。
  9. 下面对mod文件夹做具体说明:
    mod文件夹下的文件名规范为“*.act.php”,如:index.act.php,list.act.php
    mod下的文件用于处理前台数据运算,开发者可自定义多个文件,每个文件开头必须判断是否定义过常量“INDEX”,没有定义停止页面运行
    如果应用前台多个页面需要调用相同的函数,可在mod下新建fun.php,将代码写在里面。函数和变量以应用标识码做前缀,防止和默认程序冲突
  10. 下面对template文件夹做具体说明:
    template文件夹下的文件名规范为“*.tpl.php”,如:index.tpl.php,list.tpl.php
    template下的文件用于处理前台模板显示,每个文件开头必须判断是否定义过常量“INDEX”
  11. comm.php:因为应用已经有自己的mod/fun.php,所以此文件主要用在自制模板中需要调用的全局文件。函数和变量以应用标识码做前缀,防止和默认程序冲突
  12. 自20130911版本开始,开发者无需定义应用的伪静态规则,应用伪静态统一网址为 /plugin/mod-act-**-**,系统会将**-**放入常量“PLUGIN_QUERY”中,开发者在插件中自行对此串进行解析。具体解析代码在comm/dd.config.php中。
  13. update.php:应用安装升级文件,如果应用安装没有特别的需求,此文件留空即可。如果有特别需求,在此文件内写代码。每一个应用(不管是插件还是模板),必须带有plugin/应用标识码/update.php文件,没有特别需求就留空,但是必须要存在

四(1)、添加应用授权判断文件(插件)

  1. 应用插件会自动判断网站使用权限。

四(2)、添加应用授权判断文件(模板)

  1. check_plugin_auth($plugin_code,$plugin_key)函数可全局调用,开发者根据返回值判断授权。$plugin_code是[应用标识码],$plugin_key[应用密钥]
    返回1:不存在授权码
    返回2:授权码无法解密
    返回3:应用不存在或者已到期
    返回4:授权码与网站不符
    返回100:授权正常
  2. 开发者根据返回值,决定是否允许网站继续使用应用。如要停止程序运行,可用exit('授权信息错误');
  3. 将check_plugin_auth函数添加到应用需要加密的文件中,提交应用时注明具体位置。
  4. 上传应用时的密钥建议不要使用“duoduo”,“应用标识码”等常见字符串

五、p($mod,$act,$arr)函数说明

  1. p函数与u函数类似,提供连接生成的功能。p函数是应用专用的,生成plugin.php?mod=aaa&act=bbb的连接

六、模板说明

  1. 多多默认的mod文件全部都是函数,由tpl调用。所以开发者如果认为mod文件不符合自己的模板逻辑,可在tpl中自己写代码,无需更改mod文件
  2. 开发者如果需要对mod/ajax.act.php里的case这个分支做修改,
  3. 新建文件plugin/应用标识码/ajax.php,ajax.php的代码如下:
    <?php
    define('INDEX',1);
    include ('../../comm/dd.config.php');
    include (DDROOT . '/mod/header.act.php');
    
    include (DDROOT . '/comm/Taoapi.php');  //淘宝api相关接口,开发者根据需要是否引入
    include (DDROOT . '/comm/ddTaoapi.class.php');
    
    $num = (int) $_POST['num'];
    if (isset ($_POST['cid'])) {
    	$cid = (int) $_POST['cid'];
    	if ($cid > 0) {
    		$malls = $duoduo->select_all('mall', 'cid,title,id,img,fan', 'cid="' . $cid . '" order by sort desc limit ' . $num);
    		foreach ($malls as $k => $row) {
    			$malls[$k]['url'] = u('mall', 'view', array (
    				'id' => $row['id']
    			));
    		}
    	} else {
    		$taoshop_num = $_POST['taoshop_num'];
    		$shangcheng_num = $_POST['shangcheng_num'];
    		$mall_num = $_POST['mall_num'];
    
    		//淘宝店铺
    		$shops = $duoduo->select_all('shop', 'title,id,pic_path,fanxianlv,nick', '1=1 order by index_top desc,sort desc limit ' . $taoshop_num);
    
    		//商城
    		$shangcheng = $duoduo->select_all('mall', 'cid,title,id,img,fan', '1=1 order by sort desc limit ' . $shangcheng_num);
    
    		foreach ($shops as $i => $row) {
    			$row['url'] = u('tao', 'shop', array (
    				'nick' => $row['nick']
    			));
    			$row['fan'] = $row['fanxianlv'];
    			$row['img'] = TAOLOGO . $row['pic_path'];
    			$shops[$i] = $row;
    		}
    
    		foreach ($shangcheng as $i => $row) {
    			$row['url'] = u('mall', 'view', array (
    				'id' => $row['id']
    			));
    			$shangcheng[$i] = $row;
    		}
    
    		$malls = array_merge($shops, $shangcheng);
    	}
    }
    elseif (isset ($_POST['title'])) {
    	$title = $_POST['title'];
    	if (preg_match("/^[0-9a-zA-Z]*$/", $title)) {
    		$malls = $duoduo->select_all('mall', 'cid,title,id,img,fan', 'pinyin like "' . $title . '%" order by sort desc limit ' . $num);
    	} else {
    		$malls = $duoduo->select_all('mall', 'cid,title,id,img,fan', 'title like "%' . $title . '%" order by sort desc limit ' . $num);
    	}
    	foreach ($malls as $k => $row) {
    		$malls[$k]['url'] = u('mall', 'view', array (
    			'id' => $row['id']
    		));
    	}
    }
    
    echo dd_json_encode($malls);
    ?>
    
  4. 上述代码是原始代码,开发者根据自己的需要修改,单独调用,在模板中的ajax请求网址为“网址/plugin/应用标识码/ajax.php”
  5. 这样多多升级mod/ajax.act.php文件,也不会影响模板的使用。

七、升级说明

  1. 应用有个属性是“应用版本”,此版本号由系统自动增加,在应用第一次上传时,初始值为1.0,开发者每上传一次升级包,应用版本号会增加0.1。站长后台通过检测应用版本号,会提示更新。
  2. 每个应用只有一个升级包,所以升级包内要包含从开始到最后所有升级的文件

八、格式要求

  1. 不管上传的是插件还是模板,plugin/应用标识码/update.php必须有,没有特别需求,留空即可。
  2. 代码必须开源,有加密需求请在给开发者留言里说明。
  3. 开发者不能修改/mod下的任何文件,因为这里的文件都是函数形式,如果觉得不合适就不用,用不着修改。

九、本地开发说明

  1. 后台百宝箱里的数据默认只能通过多多服务器添加,下面提供一段代码,可模拟添加百宝箱数据供本地开发测试
  2. 开发者注意更改“应用标识码”为自己的(随机就好),不能和服务器上现有的应用标识码重复。
  3. //文件在放在根目录,文件名随意
    include('comm/dd.config.php');
    $code='shijiu'; //应用标识码
    $re=add_plugin_test($code);
    if($re==1){
    	echo "安装成功";
    }
    else{
    	echo $re;
    }
    
  4. 本地测试开发是,需要将plugin/标识码/set.php文件中的debug设置为1。

十、上传应用(字段说明)

  1. 应用标示:每个应用都有一个唯一的标识代码,如“juhuasuan,tao_coupon”
  2. 应用名称:应用的中文名
  3. 应用版本号:当前多多系统的最新版本号
  4. 是否通用型:表示此应用是否会随着多多系统的升级而需要更新。假如您开发的代码,完全脱离于多多的原始代码,那么多多系统的更新,对您的应用不会造成影响,此时,您可以选择通用型。假如您开发的应用是修改了多多系统的代码(模板代码除外),那么您的应用就是非通用型。
  5. 原价格:只作为一种促销展示手段,无具体意义
  6. 销售价格:该应用的价格
  7. 应用有效期:该应用的有效时间
  8. 应用预览图:建议大小:220*240
  9. 应用教程:该应用在多多论坛的教程地址,多多论坛开发者板块网址http://bbs.duoduo123.com/thread-htm-fid-100.html
  10. 应用介绍:阐述此应用的具体功能。
  11. 应用安装包:程序文件包,必须是zip格式,供站长在购买后下载
  12. 应用密钥:检测应用授权,开发者随意,默认可使用“duoduo”
  13. 授权信息文件:指定一个文件,并且在文件的适当位置(如模板文件,css文件等)写上标识码“{ADDONVAR}”,平台在站长下载文件之前,会自动把标识码加密,开发者可根据授权码查询授权信息。
    例(css):
    .main{border:1px sold #fff}
    .{ADDONVAR}{padding-left:5px; padding-bottom:5px} /*这一条css在样式上是没有具体含义的,只是掺杂在代码之中作为可查询的标识码*/
    
  14. 状态:应用上传后,便处于“待审核”状态,此时开发者可任意修该应用的内容。应用经审核后,会成为“上架”状态,此时开发者不能修该应用内容。开发者如必须修该应用内容,需要将应用状态更改为“待审核”,由多多管理员从新检查。如果开发者因个人原因,需暂停应用交易,可将应用改为“下架”状态,此时百宝箱内将不再显示该应用
  15. 给审核人留言:简单描述下应用的代码结构和功能,方便审核

十一、注意事项

  1. 如果插件需要产生文件,必须生成在自己的插件内,不准生成在多多默认的文件内。
  2. 开发者上传的代码必须是开源的,以便平台审核
  3. 开发者必须在上传的文件包内附上应用说明,文件名为“说明.txt”,且只能有这一个说明性的文件
  4. 应用介绍里的超链接必须以新窗口的形式打开。
  5. 开发者在文件中添加自己的逻辑代码,变量和函数的命名需添加“应用标识码_”作为前缀,避免和其他插件重复
  6. 应用开发的最主要原则是尽量少改动多多的源码,保证多多程序升级对应用没有直接影响。
  7. 应用介绍可参照此模板http://bbs.duoduo123.com/read-htm-tid-81002.html
  8. 应用预览图不得带有“新品推荐”,“重磅推荐”等字眼
  9. 范例包下载

十二、常见问答

  1. 问:update.php(安装升级文件)写好安装文件,但是安装后如何卸载呢?
    答:如果在set.php中定义了表,那么卸载时系统会自动删除;如果在set.php中定义了安装sql,那么需要开发者同步定义卸载sql;如果插件需要自定义安装代码,在update.php中书写,$_GET['do']为install是安装,$_GET['do']为uninstall是卸载。