dz插件开发

合集下载

[DZ X2.0教程]教你快速了解Discuz!程序文件功能,修改文件从此不用再求人以及扩展文本的创建

[DZ X2.0教程]教你快速了解Discuz!程序文件功能,修改文件从此不用再求人以及扩展文本的创建

相信有不少人热衷于基于修改原有系统文件所做的插件,当然了解程序文件功能是最重要的,下面我把Discuz! X2.0主要的程序文件功能说一下。

我只是整理,不是自己原创编辑的,所有权归原创作者所有哦。

Tips:Q:针对说明的文件是?A:我只基于原版文件对upload目录中基本的程序文件(php,htm,js,除了极少数无关紧要的)进行解释,其余文件(如图片文件),一般不做说明Q:某些目录下空白的index.htm是用来做什么的?A:用来防止列目录的Q:文件名颜色和标识的意义是?A:粗体表示这个文件比较重要,除非你非常了解其功能,否则修改错误会导致全站瘫痪;斜体表示这个文件已被加密,一般情况下修改没有意义;下划线表示这个文件一般99.99%的修改是用不上的,了解即可绿色的是函数库文件,蓝色的是常量调用文件,红色的是系统全局核心文件Q:文件名命名有什么特别规律吗?A:有的,一般inc的是调用文件,func是函数库文件,class是库文件,lng的是语言包文件,了解这些后缀能快速掌握文件功能。

Q:我看了你的帖子,可是我还是看不懂文件内是什么意思啊?A:这个嘛,还是要有一定基础了,一般掌握SQL,PHP和Htm你就可以去改文件做你要的功能了,这个不是我的任务了哦。

一般来说,如果随便指个地方,你能在1分钟内说出大概位置及所在的文件,那么你基本就算合格了。

不过我个人认为最重要的还是多改多读,在实践中提高自己的能力下面开始了,请看你的upload目录里面的文件,表述的格式依次为文件名,功能描述等等先从根目录开始,根目录文件一般都是入口,即执行具体功能的代码一般不在这些文件中,而是在其调用的文件中admin.php 系统站点管理入口文件api.php Discuz!合作应用入口文件(例如漫游、支付宝什么的都走这里)connect.php QQ互联入口文件cp.php 应用入口文件crossdomain.xml 数据交互文件,如果在里面定义其它站点的地址,那么这两个不同站点就可以交互数据favicon.ico图标文件,显示在浏览器的标题栏forum.php 论坛入口文件group.php 群组入口文件home.php 家园入口文件index.php 功能与portal.php基本相同member.php 用户信息入口文件misc.php 网站用户常用操作入口文件,例如像评分、收藏等功能都是走这个文件的plugin.php 插件入口文件portal.php 门户入口文件robots.txt在这个文件中加上具体的地址,可以防止被搜索蜘蛛检索到search.php 搜索功能入口程序userapp.php 用户应用入口程序API目录中的文件主要是和Discuz!进行合作的商家的应用程序,一般不要也无需修改,这里不多说明。

adobe acrobat插件开发的基本流程

adobe acrobat插件开发的基本流程

adobe acrobat插件开发的基本流程Adobe Acrobat插件开发的基本流程Adobe Acrobat是一款广泛使用的PDF阅读和编辑工具,在许多应用场景中都扮演着重要的角色。

为了满足用户的特定需求,Adobe提供了插件开发的功能,使用户能够根据自己的业务需求扩展Acrobat的功能。

下面将一步一步回答中括号内的主题,介绍Adobe Acrobat插件开发的基本流程。

1. 确定需求(500字)在进行Adobe Acrobat插件开发之前,首先需要明确开发的目标和需求。

这包括确定要实现的功能、改进哪些操作、提高哪些效率等。

明确需求有助于确定插件的功能范围、界面设计和技术实现。

2. 学习Adobe Acrobat SDK(500字)要进行Adobe Acrobat插件开发,需要详细了解和学习Adobe Acrobat SDK。

Adobe Acrobat SDK是为插件开发者提供的一套文档和工具,可帮助开发者理解Acrobat 的功能和开发流程。

在学习过程中,可以了解插件的构架、接口和API使用,以及常见的开发技术和工具。

3. 设计插件框架(500字)在开发插件之前,需要设计插件的框架。

这包括确定插件的基本功能、界面设计和交互方式。

根据需求和用户习惯,设计一个简洁易用的插件界面,使用户能够轻松理解和使用插件提供的功能。

同时,还需要考虑插件的可扩展性,以便在今后的版本中进行功能的增添和改进。

4. 编写代码(1000字)一旦插件的框架设计完成,就可以开始编写代码。

Adobe Acrobat插件开发支持多种编程语言,包括JavaScript、C++、C等。

根据自己的编程能力和项目要求,选择合适的编程语言进行开发。

在编写代码的过程中,需要调用Acrobat的API接口,实现插件的各种功能。

根据API文档和SDK提供的示例代码,开发者可以完成插件的具体实现。

在编码过程中,还需要进行测试和调试,确保插件的稳定性和功能完善性。

DiscuzX插件机制开发文档及实例201311整理(官方资料)

DiscuzX插件机制开发文档及实例201311整理(官方资料)

Discuz! 的插件机制准备工作| 插件接口| 参数读取| 页面嵌入| 插件嵌入点列表| 特殊主题|第三方拓展类| 其它模块| 安装卸载升级| 模板和语言包| 注意事项| 插件开发实例准备工作插件实现流程开始编写社区插件,您应当首先对插件实现的流程有一个大致的了解,以下是我们推荐的插件编写流程:∙熟练使用 Discuz! 社区系统后,对希望完善或补充的个性化功能进行评估,进而提出插件的功能需求。

∙对插件做一个概括性的设计,例如:需要使用什么菜单、什么参数,配置哪些选项、数据结构如何设计、前后台实现哪些功能等等。

∙阅读本文档并在系统设置中实际体验 Discuz! 插件接口所实现的功用,例如:您的插件应当如何设计才能良好的挂接到社区系统中来。

插件接口能够实现哪些功能、不能实现哪些功能,插件为此而需要做的优化、改造和取舍。

∙编写相应程序代码和模板语句,实现所需的功能并进行代码测试、兼容性测试和代码改进。

∙如果需要公开您的插件,可以用插件导出的方式,将插件配置信息导出到一个 XML 文件中,连同相应的程序和模板文件一同打包。

同时,编写一个适合新手的插件的说明书也是必不可少的,其中包括:插件适用的 Discuz!版本、功能概述、兼容性声明、安装方法、使用方法、卸载方法等等。

∙将插件提供给他人,或自己使用,根据使用者反馈,对插件进行完善。

插件实现流程至此结束。

文件命名规范Discuz! 按照如下的规范对程序和模板进行命名,请在设计插件时尽量遵循此命名规范:∙可以直接通过浏览器访问的普通程序文件,以 .php 后缀命名。

∙被普通程序文件引用的程序文件,以 .inc.php 后缀命名。

∙被普通程序文件,或引用程序文件引用的函数库或类库,以 .func.php(函数库) 或 .class.php(类库) 后缀命名。

∙模板文件,以 .htm 后缀命名,插件模板文件存在于 source/plugin/identifier/template/ 目录中,手机版插件模板存在于 source/plugin/identifier/template/mobile/目录中∙模板语言包文件,以 .lang.php 后缀命名,插件语言包文件开发时存放于 data/plugindata/ 目录中,文件名为ng.php。

DZ插件实例讲解

DZ插件实例讲解

['myrepeats']['use
rgroups']);
if(in_array('', $myrepeatsusergroups)) {
$myrepeatsusergroups = array();
}
$userlist = array();
有权限, 则当
/* 对当前登录用户进行马甲验证, 即当前用户组不再权限许可范围内, 但其他帐号所在用户组 前用户也有使用权限。*/
$_GET['username']);
ajaxshowheader();
echo $Plang['deleted'];
ajaxshowfooter();
}
$ppp = 100; $resultempty = FALSE; $srchadd = $searchtext = $extra = $srchuid = ''; $page = max(1, intval($_GET['page'])); if(!empty($_GET['srchuid'])) {
添加的语言包文件,初始化状态如下:
<?php
$scriptlang['myrepeats'] = array( 'login_strike' => "密码错误次数过多,请重新设置马甲账号信息并在 15 分钟后再尝试切换。",
/* 含有变量值的语言包一般用在脚本文件中调用, 其中变量可以在showmessage(), lang()等函数中某
global $_G;
if(!$_G['uid']) {

discuz插件开发

discuz插件开发

discuz使用与插件开发使用开源产品:能后台配置的尽量后台配置其实写插件其次修改JS/css再其次修改模板再其次修改PHP文件最后修改数据库discuz安装与后台功能介绍1:论坛开启与关闭, 全局-->站点信息当论坛临时维护时,可以时间关闭站点,2: 论坛开放与关闭注册:3: 修改注册链接,防止机器人注册(几乎无用)默认的注册链接如右图可以不修改php文件,并自定义注册链接.全局-->注册访问控制-->注册地址注册链接变为4: 验证用户的email全局--->用户注册与访问--->新用户注册验证选择email验证.5:如果4中,选择email验证,还需要在”站长-->邮件设置”中设置发邮件的方式1:用sendmail发送(在Linux下,且正常支持sendmail)2:用smtp协议发送,要求有1个支持smtp的邮箱,如126,163等老牌邮箱.配置用户名及密码,及可用来发邮件6: 禁用词过滤内容--->词语过滤7: 用户发表的链接控制要从2个方面来控制1: 用户--->用户级--->基本设置-->站外URL解析2: 但是用户发的任何链接,都无法解析如果我们用合法站点,比如百度网盘,或华为网盘等,允许发送. 全局-->注册与访问控制-->访问控制discuz的DIY功能diy是通过图形化的配置,让不懂程序的使用者,也能动态调用系统的相关数据. 如:最新帖, 热门帖, 最新文章等等.DIY功能里,有框架和模块框架的作用是把页面或div,拆成指定块, 如长度1:3的2个div,把页面拆成两部分. 而且框架是可以嵌套的,有可能做出比较复杂的框架效果来.模块:模块的作用是取出指定的信息---如论坛帖子模块,可以取出最新帖,热门帖等等.静态模块,可以允许用户填写自定义的HTML内容.一句话:框架是为了布局用的.模块是为了取数据用的并设定帖子模块的相关参数.保存后: 论坛首页即出现如下调用效果.tab切换标签我们选择tab框架,插入已有框架中.再把普通模块拖入标签中,起一个标签就可以了.默认的标签切换效果需要鼠标点击, 如果要变成鼠标划过,切换的效果, 可以编辑tab标签,选择”切换类型”discuz插件开发插件开发的意义:插件是可插拔的, 即可以在不改动源码的情况下, 增改论坛的功能.以后升级论坛的过程中,升级过程不受影响.比如,论坛有member.php,为了达到防机器人注册的功能1: 直接修改member.php,达到目的.2: 添加插件来完成.然后----论坛程序升级, member.php被官方最新的member.php代替.那么:对于1: 之前的改动,要再做一遍.对于2: 插件接口的API往往不会变,所以只需要把插件再注册一遍就可以用.discuz插件的运行原理:大多数系统的插件运行原理都类似, 即在程序指定处,留下钩子. 开发人员按照要求(比如按与钩子有关联的函数名) 来写程序. 那么钩子会运行用户的预留函数唱歌带包烟假设PHP是一个服务员,从连接数据库--->输出模板这一路上,有几个关键点,如”唱歌”,”买烟”,服务员经过这几点,会看这个点有没有数据或函数,有则调用.继而影响最终的输出结果.discuz插件的位置及文件格式位置: 在系统的source/plugin/目录下,一个插件一个目录.如下图:是一个简单而典型的插件:包括:描述插件的XML文件插件.class.phpXML文件是用来描述插件的名称,作者,位置,类名等等.PHP文件,是插件的具体运行页面.第一个插件开发直接把一个简单的插件(如上面的soso_smiles) ,复制一份,改名, 如下打开XML文件,其中name是插件名称identifier 是插件的标识,不能重复.directory 是指插件目录然后在weibo.class.php中,写入如下类此时这个类还是空的,没有具体作用,但是,一个插件的壳已经完成了. 管理员进入后台,查看应用,插件,看到如下信息则说明,我们的微博插件的壳已经正常了.接下来,再开发具体的插件功能确认插件在哪个.php文件上的哪个位置发挥作用根据forum.php的’forum’,再写一个子类根据位置,找到hook名称根据Hook名称,我们再写方法, 注意,方法名与hook点的关系.方法的返回值,就会出现在hook点上.嵌入点列表:/library/plug/plugin/plugin_hook.htm允许用户输出参数的插件我们需要在XML里,加上var 定义title: 输入框前的提示variable:变量名type: text ,普通文本框如何在插件的类里,如weibo.class.php中访问该插件变量?答: discuz的网站信息,配置信息,栏目信息,用户信息,缓存信息,插件信息.... 都被初始化一个普通全局变量$_G中.因此,我们可以通过$_G来获取插件的相关变量值.具体语法是$_G[‘cache’][‘plugin’][插件名][变量名]以weibo插件来说, $_G[‘cache’][‘plugin’][‘weibo’][‘weiboid’];discuz开发者模式, 自动创建XML打开config_global.php修改$_config['plugindeveloper'] = 1;如果没有,直接加上这一句作业:自行开发一个防机器人注册插件.思路:机器人插件一般是用HTTP协议提交,不通过浏览器.我们写一个插件,让用户点击提交瞬间,触发JS,动态创建一个hidden表单域及其值. 后台检测此值.如果是机器人,没通过浏览器,没有这个值.。

DZ X2.0 教你快速了解Discuz!程序文件功能,修改文件不求人

DZ X2.0 教你快速了解Discuz!程序文件功能,修改文件不求人

点评信有不少的下面我把Discuz! X主要的程序文件功能说一下
Tips: Q:针对说明的文件是? A:我只基于原版文件对upload目录中基本的程序文件(phphtmjs除了极少数无关紧要的)进行解释其余文件(如图片文件)一般不做说明 Q:某些目录下空白的是用来做什么的? A:用来防止列目录的 Q:文件名颜色和标识的意义是? A:粗体表示这个文件比较重要除非你非常了解其功能否则修改错误会导致全站瘫痪斜体表示这个文件已被加密一般情况下修改没有意义;下划线表示这个文件一般%的修改是用不上的了解即可 绿色的是函数库文件蓝色的是常量调用文件红色的是系统全局核心文件 Q:文件名命名有什么特别规律吗? A:有的一般inc的是调用文件func是函数库文件class是库文件lng的是语言包文件了解这些后缀能快速掌握文件功能 Q:我看了你的帖子可是我还是看不懂文件内是什么意思啊? A:这个嘛还是要有一定基础了一般掌握SQLPHP和Htm你就可以去改文件做你要的功能了这个不是我的任务了哦一般来说如果随便指个地方你能在分钟内说出大概位置及所在的文件那么你基本就算合格了不过我个人认为最重要的还是多改多读在实践中提高自己的能力下面开始了请看你的upload目录里面的文件表述的格式依次为文件名功能描述等等先从根目录开始根目录文件一般都是入口即执行具体功能的代码一般不在这些文件中而是在其调用的文件中adminphp 系统站点管理入口文件apiphp Discuz!合作应用入口文件(例如漫游支付宝什么的都走这里)connectphp QQ互联入口文件cpphp 应用入口文件crossdomainxml 数据交互文件如果在里面定义其它站点的地址那么这两个不同站点就可以交互数据faviconico 图标文件显示在浏览器的标题栏forumphp 论坛入口文件groupphp 群组入口文件homephp 家园入口

Discuz安装插件的方法

Discuz安装插件的方法

Discuz! 安装插件的方法(以x3版本为例)1、登录至您的论坛后台管理中心,在“应用”菜单下点击选择“获取更多插件”。

2、在搜索框中,输入您需要安装的插件名称,如“用户登录日志”。

3、根据搜索结果,您可以选择进行安装4、打开具体插件,点击右上方“安装插件”,即可自动开始安装。

5、安装完成之后,返回“应用中心”,选择相应插件的“启用”选项,即可正常开启日志功能,在其日志查询中可以查看到所有来访用户的相关信息。

注意:1、在安装之前,请使用管理中心的“文件校验”功能,检查网站程序文件是否完整。

2、检查您的网站程序权限是否正确,如果出现无法写入的情况,您可先增添写入权限,等待插件安装完成之后重新改回即可。

3、上述步骤只是按照通用流程进行描述的,如果本文介绍的安装流程与插件说明书中的描述不符,请以插件提供者的描述为准。

附:使用Discuz插件的风险安装和使用Discuz插件无疑为使用者提供了令人兴奋的扩展特性,但您在动手之前必须要考虑清楚使用插件的风险,依据对风险的评估来决定是否安装Discuz插件,毕竟对于网站论坛来说,运行稳定和访问快速是压倒一切的根本目标。

插件由第三方开发的性质,决定了插件的质量可能参差不齐,可能导致的问题有:1. 由于对系统权限控制的不精通和安全编码经验的不充足导致的论坛安全性下降,严重时插件可能会被作为攻击论坛系统、非法获取管理权限的入口;2. 并不是所有的插件作者和开发团队都深谙高效的编码技术和优化的[[数据结构]]设计,例如一条编写不当的[[SQL]]语句,可能会耗费比整个论坛系统更多的[[服务器]]资源。

因此有些插件可能导致论坛变得不稳定、访问速度变慢、资源消耗提高;3. 由于Discuz! 开发组长期坚持对论坛系统的功能及结构进行改进,以实现更优化的系统效率和更强大的系统功能。

虽然采用插件接口推荐的设计方式,可以尽可能的避免兼容性问题,但由于插件实现方式的多样性,您使用的插件仍然有可能无法兼容于未来的Discuz! 版本。

dz的缓存机制说明

dz的缓存机制说明

Discuz! X系列,缓存扩展机制说明Discuz! X系列中加入了全新的缓存机制,我们在开发插件或者是增加新的功能的时候可以很方便的为系统增加一个全新的缓存,并在任何页面中使用。

下面以一个名为 example 的缓存为例,详细说一下这个机制。

新建一个文件:1.<?php2.if(!defined('IN_DISCUZ')) {3. exit('Access Denied');4.}5.6.function build_cache_example() {7. $data = array();8. $data[] = 'Hello World';9. $data[] = 'Hello Discuz!';10. save_syscache('example', $data);11.}12.13.?>复制代码这就是一个标准的生成缓存的文件。

其中有几点重要的为:1.需要生成名字为 example 的缓存,那么这个文件的名字需要命名为:cache_example.php2.文件中的 build_cache_xxxx 类似的这个函数名应为build_cache_example3.save_syscache('xxxx', $data); 应该为 save_syscache('example',$data);4.为了安全性,文件头部必须增加1.if(!defined('IN_DISCUZ')) {2. exit('Access Denied');3.}复制代码其中 build_cache_example 函数就是主要的对需要缓存的数据做处理的函数,所有的组织数据,都可以放到这个函数里面执行,或者放到多个小函数,然后统一在这个函数中执行。

而且结尾必须要以 save_syscache('example', $data);结尾,才能写入缓存数据。

DiscuzX3.2教程

DiscuzX3.2教程

DiscuzX3.2教程插件制作的基本思路是:(初学者适用)1.形成插件思路2.制作插件界面3.构架程序模块4.搭建存储数据5.填充功能语句6.检查应用错误7.完善插件功能前言:为方便互联网数万Discuz!爱好者,更加深入了解Discuz!软件,本人在熟悉Discuz!过程中,顺便将个人经验写给大家。

本贴内容由本人定期更新。

本贴只介绍Discuz!中部分技术点,本贴紧属个人观点,不足之处,请各位多多指教,在下先此谢过!。

“Discuz!”在下文中简称“DZ”。

要弄DZ二次开发,必须至少具备如下技能:1)能够理很好理解MVC构架的原理(虽然DZ不是MVC架构的)2)扎实的PHP基础,熟悉结构化程序,OOP程序的写法及应用3)熟悉MYSQL就用,掌握SQL语言,懂SQL优化者更佳4)熟悉使用Discuz!的各项功能一)Discuz!的文件系统目录注:想搞DZ开发,就得弄懂DZ中每个文件的功能。

a) Admin:后台管理功能模块b) Api:DZ系统与其它系统之间接口程序c) Archiver:DZ中,用以搜索引擎优化的无图版d) Attachments:DZ中,用户上传附件的存放目录e) Customavatars:DZ中,用户自定义头像的目录f) Forumdata:DZ缓存数据的存放目录g) Images:DZ模板中的图片存放目录h) Include:DZ常用函数库,基本功能模块目录i) Ipdata:DZ统计IP来路用的数据j) Plugins:DZ插件信息的存放目录k) Templates:DZ模板文件的存放目录l) Wap:DZ无线,Wap程序处理目录二)必须记熟Discuz!数据库设计的每个表的功能,每个表中每个字段的功能。

关于DZ数据库设计文档,请参阅DZ相关的项目文档(请从本贴附件中下载)三)Discuz!的流程控制a) 后台流程控:DZ后台所有的功能,均需要注册到admincp.php文件,每个功能都至少有一个或一个以上的Action(动作),在admincp.php中,可以定义Action的执行权限,分别为:“admin==1”管理员,或“admin==2 || admin==3”超级版主和版主,每个Action对应一个脚本文件,脚本文件的命名为action.inc.php(*.inc.php),并存放在admin目录下,如执行:admincp.php?action=dodo,相当于执行admin目录下的dodo.inc.php文件b) 前台流程控制:前台的流程控制比较简单:流程是自由的,如:首页:index.php会员注册:register.php;会员登录:logging.php发贴程序:post.php会员信息:member.php论坛内容:forumdisplay.php查看贴子:member.php…大部分功能,此处不一一列出…c) DZ根目下的config.inc.php属于整个DZ系统的配置文件四)Discuz!的数据处理过程a) DZ对mysql的数据库操作处理全部封装在dbstuff(db_mysql.class.php)类中b) 所在的外部数据均通过“daddslashes()”初步过滤,然后再过滤,再根据需要处理五)Discuz!的显示控制(网站多样式风格输出)a) 显示层就是大家通常所看到的网站风格了。

Phpwind和Discuz谁能更胜一筹?

Phpwind和Discuz谁能更胜一筹?

Phpwind和Discuz谁能更胜一筹?phpwind和discuz这两个是目前最为广泛的论坛系统。

他们之间互相竞争,不断的进步,究竟谁比较优越?谁的前景更好?今天就对两个熟悉的论坛系统在一些功能上进行比较。

我们先来认识下phpwind和discuz两个论坛系统,请看下表基本参数对比:对比参数Phpwind Discuz最新版本号V7。

5 7。

0官方地址 速度与承载速度快,承载力可以速度可以,承载力强论坛插件方面PW总量少,插件单一,实用性不强,优秀大型插件不多.例如银行插件,只有有简单存取汇款,以及活定期就没其他了。

DZ总量多,插件多元素,优秀大型插件不少.例如银行插件,除了pw所拥有的外,会员还可自设银行,增加的娱乐互动性。

使用人数PW较多,较为集中于个人,例如近期火热的农场游戏论坛,开设的论坛较多为PW DZ非常多,一般技术型的论坛都偏向于DZAlexa排名22,389 4,604功能上特点Phpwind独创的技术架构和程序设计,获得国家专利认证,从根基着手塑造快速、稳健、可扩展的论坛程序。

7年砺炼,在用户需求基础上进行不断创新与完善,无论企业还是娱乐,全面满足论坛建设。

数据库分卷技术等就比较实用而且Discuz没有,普通人也没可能开发这样的功能插件。

Discuz从创立之初即以提高产品效率为突破口,随着编译模板,语法生成内核,数据缓存和自动更新机制等独创或独有技术的应用,和坚固的数据结构及最少化数据库查询设计,使得Discuz可以在极为繁忙的服务器环境下快速稳定运行,切实节约企业成本,提升企业形象。

discuz每一次升级都是有非常巨大的变革而,phpwind却太全面,很多插件都捆绑了,比如个人自定义风格的插件等,但可以说用到的人不会超过1%。

但这样却会减弱了Phpwind 一直以来比discuz优秀所在--速度总评:两者各有千秋,discuz承载力强,插件多而优秀等,phpwind却速度快,数据分卷技术好等,发展方向各有不同,两者将会长期共存,并且长期竞争。

DZ插件模板安装说明

DZ插件模板安装说明

DZ插件、模板安装教程
一、DZ插件安装教程
一般情况下把插件文件夹上传到根目录/source/plugin/里面即可,如图:
部分插件直接根目录上传覆盖即可,如图:
二、DZ模板安装教程
正常情况下把插件文件夹上传到根目录/template/里面即
可,如图:
部分模板需要导入DIY,打开相应页面,选择“DIY”高级模式,选择“导入”,导入相应DIY文件即可,如图:
三,“对不起,你安装的应用不是正版”解决办法
在网站的根目录下找到
/source/function/function_cloudaddons.php这个文件,然后打开,删去或者注释cpmsg('cloudaddons_genuine_message', '', 'error', array('addonid' => $addonid));这句代码,如图:
打开文件后,删除上述代码即可,如果不想删除按照下面图例用/* */ 把代码注释掉即可,如图:
技术支持:叮当网络科技、九天网络服务有限公司
旺旺:叮当网络技术、九天网络服务有限公司
QQ:85483706。

dz论坛分类模板

dz论坛分类模板

dz论坛分类模板
Discuz论坛的分类模板是用于展示论坛中不同主题或板块的界面模板。

通过使用分类模板,可以更好地组织论坛内容,提高用户体验。

要创建分类模板,可以按照以下步骤进行操作:
登录Discuz论坛后台,进入“模板管理”选项。

在模板管理中选择“分类信息模板”,然后点击“添加模板”按钮。

为模板设置一个名称,例如“论坛分类模板”,然后选择模板类型和所属版块。

在模板编辑器中,可以添加HTML和CSS代码来定义分类信息的显示样式。

可以添加表格、表单、样式等元素,根据自己的需求进行设计。

在模板中添加所需的变量,例如标题、发布时间等。

这些变量将在论坛内容中动态填充相应的值。

保存并应用模板。

使用分类模板的好处在于,它可以自定义论坛的界面风格,提高用户的浏览体验。

同时,通过合理的分类,可以让用户更容易找到自己感兴趣的主题或板块,增加用户的黏性和活跃度。

除了自定义模板之外,还可以通过其他方式对Discuz论坛进行管理和优化,例如使用插件、设置版块规则、调整权限等。

这些操作都可以在Discuz论坛的后台管理中进行设置和调整。

总之,Discuz论坛的分类模板是用于展示论坛内容的重要组成部分,通过合理地使用自定义模板和其他管理功能,可以打造一个友好、有序、有吸引力的论坛社区。

海康威视视频WEB插件开发指南说明书

海康威视视频WEB插件开发指南说明书

视频WEB插件开发指南版权所有©杭州海康威视数字技术股份有限公司2020版权所有©杭州海康威视数字技术股份有限公司2020。

保留一切权利。

本文档的任何部分,包括文字、图片、图形等均归属于杭州海康威视数字技术股份有限公司或其关联公司(以下简称“海康威视”)。

未经书面许可,任何单位或个人不得以任何方式摘录、复制、翻译、修改本手册的全部或部分。

除非另有约定,海康威视不对本手册提供任何明示或默示的声明或保证。

责任声明在法律允许的最大范围内,本文档是“按照现状”提供,可能存在瑕疵或错误。

海康威视不对本文档提供任何形式的明示或默示保证,包括但不限于适销性、质量满意度、适合特定目的、不侵犯第三方权利等保证;亦不对使用或是分发本文档导致的任何特殊、附带、偶然或间接的损害进行赔偿,包括但不限于商业利润损失、系统故障、数据或文档丢失产生的损失。

目录简介 (5)1.1前言 (5)1.2术语 (5)1.3运行环境 (3)1.4约束说明 (3)2.版本更新 (3)3.JS接口说明 (4)3.1JS_S TART S ERVICE启动插件服务接口 (4)3.2JS_D ISCONNECT断开服务接口 (5)3.3JS_C REATE W ND创建插件窗口接口 (5)3.4JS_R ESIZE调整插件窗口大小、位置接口 (6)3.5JS_C UTTING P ART W INDOW扣除部分插件窗口接口 (6)3.6JS_R EPAIR P ART W INDOW扣除插件窗口还原接口 (7)3.7JS_H IDE W ND插件窗口隐藏接口 (7)3.8JS_S HOW W ND插件窗口显示接口 (8)3.9JS_D ESTROY W ND插件窗口销毁接口 (9)3.10JS_W AKE U P唤醒W EB C ONTROL.EXE接口 (9)3.11JS_S ET D OC O FFSET设置IFRAME偏移量接口 (10)3.12JS_R EQUEST I NTERFACE通用请求响应接口 (10)3.12.1申请RSA公钥 (11)3.12.2初始化 (12)3.12.3反初始化 (16)3.12.4根据监控点编号视频预览 (16)3.12.5根据监控点编号录像回放 (18)3.12.6停止所有视频预览 (20)3.12.7停止所有录像回放 (20)3.12.8销毁播放实例 (21)3.12.9获取当前布局 (21)3.12.10设置当前布局 (22)3.12.11播放抓图 (23)3.12.12画面字符叠加 (24)3.12.13根据监控点编号批量视频预览 (25)3.12.14根据监控点编号批量录像回放 (26)3.12.15批量停止播放 (28)3.12.16设置接口认证信息参数 (29)3.12.17进入全屏 (30)3.12.18退出全屏 (31)3.12.19获取版本号 (31)3.12.20设置时间轴级别 (32)3.13JS_S ET W INDOW C ONTROL C ALLBACK设置消息回调接口 (33)3.13.1窗口选中消息 (33)3.13.2预览/回放播放消息 (34)3.13.3抓图结果消息 (35)3.13.4预览紧急录像/回放录像剪辑结果消息 (36)3.13.5进入全屏/退出全屏消息 (36)3.13.6切换布局消息 (37)3.13.7播放窗口双击事件消息 (37)3.13.8时间轴级别变化消息 (38)4.视频WEB插件对接指南 (38)4.1开发流程 (38)4.2网页开发指南 (39)4.2.1引用JS文件 (39)4.2.2创建WebControl实例 (40)4.2.3启动插件 (40)4.2.4监听事件 (41)4.2.5申请RSA公钥 (42)4.2.6插件初始化 (42)4.2.7视频预览业务功能 (43)4.2.8断开插件服务连接 (44)4.3IFRAME对接指南 (44)4.3.1iframe demo使用 (44)4.3.2iframe对接步骤 (44)5.视频WEB插件UI集成控件列表 (45)6.错误码定义 (47)7.附录 (48)7.1如何获取APPK EY和APPS ECRET (48)7.2依赖O PEN API接口汇总 (48)7.3问题排查 (48)简介1.1前言非常感谢您使用我们公司的产品,我们将竭诚为您提供最好的服务。

dz手机模板制作教程

dz手机模板制作教程

竭诚为您提供优质文档/双击可除dz手机模板制作教程篇一:discuzx3.2模板的制作方法教程discuzx3.2模板的制作方法教程discuz模板的制作相对还是比较简单,现在应用中心的上线又涌现出来一大批模板开发作者,不管大家做免费模板还是商业模板,都希望每个开发者可以维护好自己的模板,给站长们一个好模板。

discuz模板的创建步骤每个都不尽相同,今天在站帮网分享下discuz模板的创建方法。

一、创建discuz模板存放文件夹在论坛程序根目录中的template文件夹中创建自己命名的模板目录g8f8,如下图所示:二、论坛后台模板管理里面的新增模板后台--界面--模板管理--新增模板,具体填写如下图所示:三、复制默认风格界面配色方案或者新增篇二:dz模板开发教程discuz!模板二次开发的模板语法介绍:相信大多数朋友都看过discuz的模板文件的代码了。

不同于传统的静态html代码,dz的静态模板可以说是动态化得模板文件了。

这里集合了,一些特有的php变量和逻辑判断。

下面我将为大家整理一下常用的dz模板二次开发规范,希望有助于大家更好的制作模板。

dz的模板引擎原理是通过特殊的discuz!模板标签来完成特定的循环和判断的。

它不同于php本身自带的脚本语言。

大家可能有很多人写过php的程序,也都使用过类似if($abc==1){}else{}的判断。

discuz!模板引擎会将discuz!模板标签中的关键字替换成php自身的脚本语句,然后存入缓存目录forumdata/templates目录中生成一个可供php程序包含和调用的模板文件。

那在dz的模板引擎中我们该如何使用discuz!模板标签呢?下面给大家列举dz模板引擎中常见、常用的模板语句:一、直接输出变量:{$abc}或{echo$abc}二、输出数组中某个变量:{$arr[0]}三、iF判断语句:我abc小于1我abc为1我abc大于1四、loop循环语句:这里是{$val}上面这段loop语句,dz会将其转换成php自身的循环语句:if(is_array($abc)){Foreach($abcas$key=>$val){}}五、在模版文件中使用php语句:{eval$abc=1;}注意:这里必须带”;”结尾。

Discuz开发教程

Discuz开发教程

Discuz开发教程.txt跌倒了,爬起来再哭~~~低调!才是最牛B的炫耀!!不吃饱哪有力气减肥啊?真不好意思,让您贱笑了。

我能抵抗一切,除了诱惑……老子不但有车,还是自行的……插件制作的基本思路是:(初学者适用)1.形成插件思路2.制作插件界面3.构架程序模块4.搭建存储数据5.填充功能语句6.检查应用错误7.完善插件功能前言:为方便互联网数万Discuz!爱好者,更加深入了解Discuz!软件,本人在熟悉Discuz!过程中,顺便将个人经验写给大家。

本贴内容由本人定期更新。

本贴只介绍Discuz!中部分技术点,本贴紧属个人观点,不足之处,请各位多多指教,在下先此谢过!。

“Discuz!”在下文中简称“DZ”。

要弄DZ二次开发,必须至少具备如下技能:1)能够理很好理解MVC构架的原理(虽然DZ不是MVC架构的)2)扎实的PHP基础,熟悉结构化程序,OOP程序的写法及应用3)熟悉MYSQL就用,掌握SQL语言,懂SQL优化者更佳4)熟悉使用Discuz!的各项功能一) Discuz!的文件系统目录注:想搞DZ开发,就得弄懂DZ中每个文件的功能。

a) Admin:后台管理功能模块b) Api:DZ系统与其它系统之间接口程序c) Archiver:DZ中,用以搜索引擎优化的无图版d) Attachments:DZ中 ,用户上传附件的存放目录e) Customavatars:DZ中,用户自定义头像的目录f) Forumdata:DZ缓存数据的存放目录g) Images:DZ模板中的图片存放目录h) Include:DZ常用函数库,基本功能模块目录i) Ipdata:DZ统计IP来路用的数据j) Plugins:DZ插件信息的存放目录k) Templates:DZ模板文件的存放目录l) Wap:DZ无线,Wap程序处理目录二)必须记熟Discuz!数据库设计的每个表的功能,每个表中每个字段的功能。

关于DZ数据库设计文档,请参阅DZ相关的项目文档(请从本贴附件中下载)三) Discuz!的流程控制a) 后台流程控:DZ后台所有的功能,均需要注册到admincp.php文件,每个功能都至少有一个或一个以上的Action(动作),在admincp.php中,可以定义Action的执行权限,分别为:“admin==1”管理员,或“admin==2 || admin==3”超级版主和版主,每个Action对应一个脚本文件,脚本文件的命名为action.inc.php(*.inc.php),并存放在admin目录下,如执行:admincp.php?action=dodo,相当于执行admin目录下的dodo.inc.php文件b) 前台流程控制:前台的流程控制比较简单:流程是自由的,如:首页:index.php会员注册:register.php;会员登录:logging.php发贴程序:post.php会员信息:member.php论坛内容:forumdisplay.php查看贴子:viewthread.php…大部分功能,此处不一一列出…c) DZ根目下的config.inc.php属于整个DZ系统的配置文件四) Discuz!的数据处理过程a) DZ对mysql的数据库操作处理全部封装在dbstuff(db_mysql.class.php)类中b) 所在的外部数据均通过“daddslashes()”初步过滤,然后再过滤,再根据需要处理五) Discuz!的显示控制(网站多样式风格输出)a) 显示层就是大家通常所看到的网站风格了。

DISCUZ插件开发新手入门

DISCUZ插件开发新手入门

DISCUZ插件开发新手入门作者:联想锋行QQ445663314前言:本文所谓插件开发是指按照DISCUZ官方用户手册所说明的插件开发流程所进行的开发。

在阅读本文之前,假设读者是已经了解DISCUZ程序中的include/common.inc.php这个公共处理程序。

如果您不了解此程序功能,请阅读手用户册中的插件开发说明,并阅读程序。

本文基于DISCUZ 6.1.0 GBK版。

水平有限,仅供新手参考。

如有错误,请指正。

第一步:后台增加插件1,添加新插件(点击添加新插件)2,编辑插件信息(点击详情)设置插件信息注意插件目录是相对于./plugins/的,因为插件文件是要放在./plugins/这个文件夹下的。

为了方便和统一管理,一般都是按照自己的插件项目命名一个文件夹,然后此插件的程序放在此目录下。

一般此目录名与您的唯一标识符是相同的,以便于识别。

当然,不是必需,但是,为了良好习惯和标准,最好还是同名。

一般会在前面加plugins_以区分这是插件数据表。

另外注意数据库表不要有前缀。

当然,写在那里只是备份数据的时候要用到。

如果你觉得你的数据表不用备份到里,也可以不必填写。

当然,大部分时候还是推荐您填写。

3,增加模块程序模块名填写英语,名称填写中文的链接显示名称。

模块类型选择“前台调用(前台下拉菜单)”,此时直接URL可以不填写。

如果此模块是给会员用的,使用等级设为普通用户。

4,把插件设为可用回到论坛插件管理,把刚才新增的插件设为可用。

如下图:把前面的勾打上。

OK,现在论坛首页去看看,测试一下插件有没有显示出来。

OK,出来了。

成功一半了。

点击插件的链接,会出现以下提示:这是正常的,因为我们还没有正式开始写程序嘛!第二步:编写程序和模板1,在plugins目录下增加插件目录,此目录名example 要与插件设置的“插件目录”里的一致!2,在plugins目录下增加模块程序注意,文件名要按“模块名.inc.php”来,如本文中的kaifa.inc.php。

插件制作规范标准最新

插件制作规范标准最新

插件制作规范标准最新随着软件开发的不断进步,插件作为一种扩展软件功能的重要手段,其制作规范也日益完善。

为了确保插件的兼容性、稳定性以及安全性,制定一套最新的插件制作规范标准显得尤为重要。

以下是一些关键点,用以指导插件开发者遵循最佳实践。

1. 兼容性插件必须确保与宿主软件的最新版本兼容。

开发者需要定期更新插件以适应宿主软件的更新。

2. 安全性插件应遵循严格的安全标准,避免引入安全漏洞。

开发者应实施代码审查和安全测试,确保插件不会对用户数据造成威胁。

3. 性能插件应优化性能,避免对宿主软件造成不必要的负担。

这包括但不限于内存使用、CPU占用和响应时间。

4. 用户界面插件的用户界面应简洁直观,与宿主软件的风格保持一致。

同时,应提供清晰的用户指南和帮助文档。

5. 错误处理插件应具备良好的错误处理机制,能够优雅地处理异常情况,并向用户提供有用的错误信息。

6. 可维护性代码应遵循清晰的结构和命名规范,便于维护和升级。

同时,应提供足够的文档支持,帮助其他开发者理解插件的工作原理。

7. 版本控制插件应使用版本控制系统进行管理,以追踪代码的变更历史,并确保不同版本的插件可以共存。

8. 测试插件发布前应经过严格的测试,包括单元测试、集成测试和用户验收测试,以确保其功能正确无误。

9. 许可和版权插件的开发者应确保遵守相关的许可和版权法规,不侵犯他人的知识产权。

10. 文档和支持提供详尽的文档和用户支持是插件成功的关键。

文档应包括安装指南、功能说明、常见问题解答等。

结束语随着技术的发展,插件制作规范标准也在不断更新。

开发者应持续关注最新的技术动态和用户需求,不断优化插件,以提供更高质量的产品。

通过遵循上述规范,可以确保插件的稳定性、安全性和用户满意度,从而在竞争激烈的市场中脱颖而出。

火车采集器插件开发手册

火车采集器插件开发手册

火车采集器插件开发手册1.火车采集器插件使用C#语言开发,用户开发时需要引用Release目录下的super.dll和AppInerFace.dll 两个类库即可。

开发的插件需要实现ILocoySpider和ISuperJob 两个接口,程序在运行时会加载并执行插件程序集中的方法。

插件的开发细节请查看开发示例。

2.开发插件时需要注意以下几个方法A.程序集的目标Framework 为.Net Framework 2.0B.程序集的目标平台为x86C.插件开发完成后,除插件文本本身外,其它引用的dll文件需要放在采集器的System目录下。

本程序引用的super.dll和AppInerFace.dll 文件程序已自带并加密,不需要复制。

复制会引起程序运行错误。

我们从接口的源码中解析一下插件中需要实现的各个方法和属性的功能和使用的位置:using System;using System.Collections.Generic;using System.Text;namespace LeWell.Api{///<summary>///火车采集器采网址,保存内容时的插件///</summary>public interface ILocoySpider{///<summary>///是否处理起始网址,如果是,则调用MakeStartAddress方法,对每个起始网址再进行处理///</summary>bool UseMakeStartAddress { get; }///<summary>///对起始网址进行处理,即通过每个起始网址生成一个或多个网址链接,并将最终生成的网址做为起始网址。

注意这里的起始网址是采集器对起始规则进行解析后生成的新的起始网址。

比如我们从生成的真实的递增网址中再生成新的网址。

///</summary>///<param name="urlData">单个的起始网址</param>///<param name="useragent">浏览器user-agent</param>///<param name="refer">来源页</param>///<param name="cookie">网页cookie</param>///<returns>如果UseMakeStartAddress,请直接返回空List或null</returns>List<string> MakeStartAddress(string urlData,string useragent,string refer,.CookieCollection cookie);///<summary>///在请求多级网址前更改http请求,处理的是多级网址请求时的Request对象,可以修改user-agent,Cookie等属性。

关于一些插件开发的参考代码

关于一些插件开发的参考代码

K/3 BOS开发百问百答应用集成部客户化管理部2005年12月目录一,插件开发篇【问题1】在插件中以新增,修改和查看方式打开另一单据【解答】使用代码调用序时簿'********************************************'功能:显示BOS单据,显示的方式为新增,修改和浏览'参数:lClassTypeID—显示BOS单据的ID'********************************************Private Sub ShowBill(ByVal lClassTypeID As Long)Dim oDataSrv As ObjectDim oBill As ObjectOn Error GoTo err_ctrSet oDataSrv = m_BillInterface.K3Lib.CreateK3Object("K3ClassTpl.DataSrv")oDataSrv.ClassTypeID = lClassTypeIDSet oBill = CreateObject("K3SingleClassBill.ClassInfoManager")With oBill.DataSrv = oDataSrv.ISNetControl = True.ISCheckRight = True.Show'**********************'Show 参数类型'第一个参数Optional ByVal lID As Long = 0 ;描述修改或查看的单据ID'第二个参数Optional ByVal bShowGroup As Boolean = False ;如是基础资料时,是否显示分组'第三个参数Optional ByVal BillStatus As Long = Enu_BillStatus_New ;显示方式0—查看;1—新增;2—修改'第四个参数Optional ByVal dctData As KFO.Dictionary '单据初始值'**********************End WithSet oDataSrv = NothingSet oBill = NothingExit Suberr_ctr:Set oBill = NothingEnd Sub【问题2】我想在投料变更单的菜单上加入一个菜单项,需要插入一个插件,但投料变更单上已经有一个插件了,我想了解一下怎样才可以再插入一个插件呢【解答】点插件管理中的按钮,可以通过浏览来选择自定义插件,并选择多个插件对象,BOS允许多个插件同时存在.【问题3】如何通过插件代码动态设置基础资料或业务单据序时薄过滤条件【解答】业务场景:在开发BOS单据时,经常需要根据前面录入的字段值来过滤选择的基础资料.例如录入客户后,在选择客户对应客户地址基础资料时,在基础资料F7查询界面只显示当前单据上客户对应地址.根据当前物料,在选择物料对应批次.我们下面就以批次为例说明实现方法:需求:在选择批次前要求必须录入物料,批次查询界面只显示物料对应的批次开发步骤:假设:物料对应FKey="FItemID",批次对应FKey="FBatchNo"单据类型200000001只需更新对应元数据即可实现:update ICClassTableinfo set FFilter='(FItemID=GetFldValue(FItemID,1))' where FKey="FBatchNo" and FClassTypeID=200000001如果不要求先录入物料update ICClassTableinfo set FFilter='(FItemID=GetFldValue(FItemID,0))' where FKey="FBatchNo" and FClassTypeID=200000001再举个例子根据工艺路线过滤工序名称假设:工艺路线FKey="FNewRoutingID",工序名称FKey="FOperID"单据类型200000001update ICClassTableinfo set FFilter='FInterID In (Select FOperID from t_routingoper where FinterID=GetFldValue(FNewRoutingID,1))' where FKey='FOperID' and FClassTypeID=200000001其中GetFldValue为BOS内部函数,取单据上指定字段值,第一个参数为字段对应FKey,第二个参数为是否要求该字段先录入,1 要求0 不要求此方法虽能实现,但不是最好方法.希望能在插件接口中提供在函数.【问题4】在插件中调用序时簿并返回选中的数据【回答】请参考下面代码'********************************************'功能:显示BOS序时簿并返回选中的值'参数:lClassTypeID—显示BOS单据的ID'********************************************Private Function ShowListByReturn(ByVal lClassTypeID As Long) As ObjectDim objLookup As ObjectOn Error GoTo err_ctrSet oDataSrv = m_BillInterface.K3Lib.CreateK3Object("K3ClassTpl.DataSrv")oDataSrv.ClassTypeID = lClassTypeIDIf oDataSrv.showfilter ThenSet objLookup = CreateObject("K3ClassLookUp.BillLookUp")objLookup.ClassTypeID = lClassTypeIDSet objLookup.DataSrv = oDataSrvobjLookup.LookupSet ShowListByReturn = objLookup.VectReturnEnd IfSet oDataSrv = NothingSet objLookup = NothingExit Functionerr_ctr:Set oDataSrv = NothingSet objLookup = NothingEnd Function【问题5】在自定义的BOS单据上,通过插件作生成凭证的功能,但是在调用凭证的组件时,需要一个二次登录后才能使用相应的模块.请问:如何处理隐身的二次登录,或者其他的变通处理.【解答】凭证组件的调用是不需要二次登录的,可能你是在VB调试状态下运行,编译后就没事了.请参考下面代码Private Sub m_BillInterface_MenuBarClick(ByVal BOSTool As K3ClassEvents.BOSTool, Cancel As Boolean)Dim glvch As Object '中间层凭证对象Dim mvch As KFO.Dictionary '待保存凭证头Dim mvchentry As KFO.Vector '待保存凭证分录集Dim entry As KFO.Dictionary '待保存凭证分录Dim mvchdetail As KFO.Vector '核算项目明细集Dim detail As KFO.Dictionary '核算项目明细Dim i, iCount As LongDim vValue As Variant'TODO: 请在此处添加代码响应事件MenuBarClickSelect Case BOSTool.ToolNameCase "生成凭证"vValue = m_BillInterface.GetFieldValue("FUser1")If Not (CStr(vValue) = "" Or CLng(vValue = 0)) ThenMsgBox "当前合同已经生成凭证!", vbExclamation, "金蝶提示" Exit SubEnd If'此处添加处理生成凭证菜单对象的Click 事件Set mvch = New KFO.Dictionarymvch("FDate") = Nowmvch("FGroup") = "金华泰项目"mvch("FReference") = m_BillInterface.GetFieldValue("FID") Set mvchentry = New KFO.VectorvValue = m_BillInterface.GetFieldValue("FInteger") '合同金额'创建凭证分录Set entry = New KFO.Dictionaryentry("FExplanation") = m_BillInterface.GetFieldValue("FNote") entry("FAccountID") = m_BillInterface.GetFieldValue("FBase") entry("FDC") = 1entry("FAmount") = vValue'数量&单价entry("FQuantity") = 0entry("FUnitPrice") = 0entry("FMeasureUnitID") = 0'创建核算项目明细Set mvchdetail = New KFO.VectorSet detail = New KFO.Dictionarydetail("FItemClassNumber") = "002"detail("FItemNumber") = "02"mvchdetail.Add detailSet entry("_Details") = mvchdetailmvchentry.Add entrySet mvch("_Entries") = mvchentrySet entry = New KFO.Dictionaryentry("FExplanation") = m_BillInterface.GetFieldValue("FNote") entry("FAccountID") = m_BillInterface.GetFieldValue("FBase1") entry("FDC") = 0entry("FAmount") = vValue'数量&单价entry("FQuantity") = 0entry("FUnitPrice") = 0entry("FMeasureUnitID") = 0'创建核算项目明细Set mvchdetail = New KFO.VectorSet detail = New KFO.Dictionarydetail("FItemClassNumber") = "002"detail("FItemNumber") = "02"mvchdetail.Add detailSet entry("_Details") = mvchdetailmvchentry.Add entrySet mvch("_Entries") = mvchentryDim s As Strings = "ConnectString={Provider=SQLOLEDB.1;User ID=sa;Password=ahyj;Data Source=JAMES;Initial Catalog=xt_3};UserName=administrator;UserID=16394;DBMS Name=Microsoft SQL Server;DBMS Version=2000;SubID=GL;AcctType=gy;Setuptype=Industry;Language=chs;IP=192.168.1.92;Mac hineName=JAMES;UUID=800A878D-F574-4877-B79C-D88AB721ECA0"Set glvch = CreateObject("EBSGLV oucher.V oucherUpdate")glvch.Create s, mvchs = "Update t_BOS_ht set fUser1=" & m_erID & " where fid=" & m_BillInterface.GetFieldValue("FID")m_BillInterface.K3Lib.UpdateData sm_BillInterface.RefreshBillMsgBox "凭证生成成功!", vbInformation, "金蝶提示"Case "变更"End SelectEnd Sub【问题6】在设计BOS单据的过程中,经常会有关联的下拉列表框操作,如我在客户上选择"建设银行",那么在客户相对应的地址的下拉列表框中应动态显示"建设银行所对应的地址".也就是说客户地址是随着客户的变化而变化的.【解答】BOS不支持运行时动态修改下拉列表框的列表值,否则序时簿显示有问题.建议通过其它变通方法实现.客户改变时把相关地址取回到字典包中,用户录入后,自动匹配地址并自动回写.保存时判断地址是否正确.可以首先定义一个基础资料(客户地址对应表),将下拉框字段改为基础资料字段,关联到客户地址对应表上,并设置动态过滤条件,条件设置方法为:K/3 BOS 开发秘籍之单据录入时动态改变基础资料过滤条件(:8000/forum/article.asp id=37977)通过插件的Change事件更新ICClassTableInfo 的FLookUpList字段值,运行正常,但是下拉列表框的数据没有变化,据推测好像是新增BOS单据时将所有的元数据规则加载到单据上,即使在单据操作过程中更改元数据规则单据也不能马上更新.不知道将下拉列表框类型替换为基础资料类型,在Change事件时更新基础资料的过滤条件,是否可行,仅供参考.Private Sub m_BillInterface_Change(ByVal dct As KFO.IDictionary, ByVal dctFld As KFO.IDictionary, ByVal Col As Long, ByVal Row As Long, Cancel As Boolean)Dim iDeptID As IntegerDim rs As ADODB.RecordsetDim sSql As String'TODO: 请在此处添加代码响应事件ChangeIf dct("FKey") = "FDept" TheniDeptID = m_BillInterface.BillHeads(1).BOSFields("FDept").ValuesSql = "Update ICClassTableInfo set FLookUpList='SQL{ SELECT fItemID,fname FROM t_emp where fdepartmentID=" & iDeptID & "}' where (FClassTypeID = '200000003') and FID='7265'"Set rs = m_BillInterface.K3Lib.GetData(sSql)End IfEnd Sub【问题7】如何可以物料多选【解答】'/* 判断物料是否为为多选If TypeOf ReturnItem.ReturnObject Is KFO.Vector Then'/*如物料是多选,返回值是vectorFor lCount = 1 To ReturnItem.ReturnObject.UBoundIf ReturnItem.ReturnObject.Item(lCount).ItemID 0 ThenSet dicItem = New KFO.DictionarydicItem("Value") = ReturnItem.ReturnObject.Item(lCount).ItemIDdicItem("Number") = ReturnItem.ReturnObject.Item(lCount).Numberend ifnextEnd If注意目前只有物料能多选,其他核算项目不支持多选.【问题8】在表单分录里需要在第一列中使用F7键或点击菜单调出某一窗体(在插件中自定义Form,上有Spread表单),在Form中选中数据(多条或一条),返回到源单,请问在插件中用什么事件可以完成在单据中添加一菜单,用MenuBarClick事件,F7不易实现.返回的数据需用赋值方法填写到表体中.是什么样的需求不能用BOS单据或基础资料完成"Spread表单" 【解答】Private Sub m_BillInterface_MenuBarClick(ByVal BOSTool As K3ClassEvents.BOSTool, Cancel As Boolean)Dim dct As KFO.DictionaryDim row As LongDim col As Long'TODO: 请在此处添加代码响应事件MenuBarClickIf BOSTool.ToolName = "mnuDataLookUp" Thenm_BillInterface.GetActiveField dct, col, rowIf dct("FKey") = "要处理字段FKey" Thenfrm.Show 1'通过frm返回值If ok Thenm_BillInterface.UpdateNormalFld dct, 值, rowEnd IfCancel = TrueEnd IfEnd IfEnd Sub还需要处理下面事件Private Sub m_BillInterface_BeginEdit(ByVal dct As KFO.IDictionary, ByVal Col As Long, ByVal Row As Long)If dct("FKey") = "要处理字段FKey" Thenm_BillInterface.MenuBar.BOSTools("mnuDataLookUp").Enabled = TrueEnd IfEnd Sub【问题9】插件中字定义系统中如何获取当前系统字符连接串有个项目中,需要作一个年结功能,进行土地数据结转,在vb中定义了年结功能窗口,要在主控台子系统中调用,怎样或得当前数据库连接信息,亦无法通过k3lib获得,因为我没必要去调用bos表单或序时簿.另外,一些复杂报表,我也是通过vb中单独实现,这些报表也需要获的连接字符串才能调用【解答】连接串获取方式:(注意不支持调试,调试的话可以用实际连接串代替)Private Declare Function GetCurrentProcessId Lib "kernel32" Alias "GetCurrentProcessID" () As Long'获取连接串Public Function GetPropsString() As StringDim lProc As LongDim spmMgr As ObjectlProc = GetCurrentProcessIdSet spmMgr = CreateObject("PropsMgr.ShareProps")GetPropsString = spmMgr.GetProperty(lProc, "PropsString") End Function需要申请MMTS.bas的源代码,还需要申请ICKDListener的接口.另外,如果需要调试程序,就还需要申请KDMain的源代码.【问题10】关于K3Billtransfer.dll组件无法使用问题【解答】K3BillTransfer是工业单据里的接口组件,不是K/3BOS的接口组件,K/3 BOS的接口组件是K3ClassEvents. K/3 BOS插件中不能调用K3BillTransfer.【问题11】BOS单据插件里的取分录的合计值该怎么做【解答】工业单据自定义里面有个GetSumGridText方法取得分录某一列的合计值,现在BOS单据里面需要取某一列的合计,请问有什么方法可以调用.我注意到有个sum方法,但不知道该怎么用里面带BRow和ERow两个参数,应该是起始行和结束行吧,但分录的行是可以改变的,这两个值怎么取得我也有个客户使用Sum时有问题,在用bos做开发的时候,想计算一个表体中某一个字段的和,我们不明白如何使用函数Object.Sum (dct As Dictionary, [BRow As Long], [ERow As Long])中另外,从单据体下推单据头能通过插件来实现吗,因为我看你给我们的资料上写的是单据体不能下推单据头.Object.Sum (dct As Dictionary, [BRow As Long], [ERow As Long])参数说明:dct-字段的模板字典BRow-合计开始行,可选参数,默认值是1ERow-合计结束行,可选参数,默认值是最大行举例(要求税额合计值):Set dct = m_BillInterface.GetFieldInfoByKey("FTaxFor", "", 0) dblTaxSum = m_BillInterface.Sum(dct)参考(表体行数的取值方法):BillEntry.MaxRows【问题12】隐藏选单时序时簿不要的菜单和工具栏.K/3单据查看和选单使用的是同一个序时簿,在插件中用MenuBarInitialize添加的菜单和工具栏在选单时也显示出来.【解答】在MenuBarInitialize事件中使用m_ListInterface.List.ShowMode判断(查看和选单)1—查看;2—选单.如:If m_ListInte rface.List.ShowMode = 1 Then ……end.如需隐藏其他的菜单和工具栏,参考以下代码:Dim oTool As K3ClassEvents.BOSToolDim oBand As K3ClassEvents.BOSBand'*************** 开始设置BOS 原有菜单***************'获得mnuEdit 菜单对象,并设置属性Set oBand = oMenuBar.BOSBands("menu")Set oTool = oBand.BOSTools("mnuEdit")With oTool.Visible = False.Enabled = FalseEnd With【问题13】标体行高设置和值更新事件表单的表体的行高的属性在哪里,我找不到,如果发布后到主控台里去调,表体的标题行会同比例变化,非常不美观.在值更新事件里怎么能调用sql呢对于已携带辅助属性的字段再定义值更新事件,如果值更新事件里包含该辅助属性,计算公司无效.也就是值更新事件公式里调用的辅助属性是更新前的.事件函数描述中,tkeyword参数应该是fkeyword的笔误,能否改正.【解答】标体的行高目前不能调整.插件中调用SQL的方法有:m_BillInterface.K3Lib.GetData 和m_BillInterface.K3Lib.UpdateData.在插件中使用更新后事件.谢谢提醒,在下一版本中改之.【问题14】事务处理BOS的插件开发中,事务怎样处理啊又不能直接操作数据库.有什么好方法吗否则数据可能就乱掉了.在事务完整性处理上,目前的BOS插件还有很多需要改进.说个简单例子:BOS是支持多插件的,那么多插件之间如何保证事务完整性呢同样是审核事件,有2个插件响应了这个事件,如果第一个插件通过了审核,但是第二个插件却不能通过,那么第一个插件处理了的数据又如何回滚【解答】如在插件中编写大量的更新SQL请使用中间层插件,中间层插件能保证事务的完整性.如果在客户端希望执行SQL时保证事务一致性,建议使用K3Lib.UpdateData 方法,将希望在同一事物中处理的SQL语句通过它一次性提交,BOS会自动启用事务处理来保证;如果像多个插件中的审核等操作的一致性问题,解决的方法是制定一个中间层的审核前插肩来判断处理;这类的问题都可以在中间层的相关事件中处理,来保证一致性.【问题15】如何在新的BOS单据中通过代码逐行添加分录数据在BOS单据中新增菜单,功能为向当前新单据(单据为BOS创建)中添加物料等数据,因需加入的数据来自多张表,所以不适用于BOS的单据流程下推功能生成,而采用插件的方式实现.但在用SetFieldValue 方法向分录中添加数据时发现第一行总是顺利通过,但写下一行(即第二行)时就写不下去了,错误提示:Err.Description : 没有找到给定字段名的字段的值Err.Number : -2147221403Err.Source : K3ClassEvents.BillEvent请问是什么原因附部分代码:With rsItemlngRow = 1.MoveFirstDo Until .EOFm_BillInterface.SetFieldValue "FItemID", !FNumber, lngRowm_BillInterface.SetFieldValue "FQty", lngRow, lngRowlngRow = lngRow + 1.MoveNextLoopEnd With【解答】参考下列代码With rsItemlngRow = 1MoveFirstDo Until EOFm_BillInterface.InsertNewRowAndFill 2,lngRow,"FItemID", !FNumber,"FQty", lngRow lngRow = lngRow + 1MoveNextLoopEnd With【问题16】在单据体中有没有办法让下一条分录自动携带上一条分录的数据(只是部分字段). 【解答】用插件可以实现.示例代码:'物料录入后,第二行的值自动默认第一行的值If dct("FKey") = "FItemID" And row > 1 Thenm_BillInterface.SetFieldValue "FBase_TH", m_BillInterface.GetFieldValue("FBase_TH", row - 1, Enu_ValueType_FFND), row '提货地点endif【问题17】否有办法完成单据体中的行点击事件现在有需要在点击BOS单据中单据体的某一行时,在另一个表体中显示与该行有关的信息,请问各位有什么好的实现方法,特别是怎么获取点击事件和所点击的行数据信息.【解答】【问题18】多分录序时簿浏览,字段权限.在多表体单据中,用序事簿预览时,不出现第二个表体的内容.怎么实现查询第二个表体的内容.在使用单据的序事簿查询时,想看单据的全部内容,但在选单时想看一少部分内容,现在不能实现. 可用字段授权对不同的人进行授权解决(给选单人字段权限少一些字段)【解答】目前序时薄只能实现单据头+一个单据体的预览方式,但单据体在过滤界面是可选择的.如果问题的要求是实现多单据体的同时展现,则为需求,目前暂不能实现,待后续版本规划.此问题要求选单与单据序时薄有不同的展现设置,字段授权的方式解决不了这个问题,请确定这个需求的通用性.如不通用建议通过序时薄插件开发来实现.FillRow时,不可见字段内容作屏蔽.【问题19】怎么样可以用代码调出单据的序时薄窗口.【解答】调用序时簿不返回选中值'lClassTypeID ——BOS单据IDPrivate Function ShowList(ByVal lClassTypeID As Long) As BooleanDim oDataSrv As ObjectDim objLookup As ObjectOn Error GoTo err_ctrSet oDataSrv = m_BillInterface.K3Lib.CreateK3Object("K3ClassTpl.DataSrv")oDataSrv.ClassTypeID = lClassTypeIDIf oDataSrv.showfilter ThenSet objLookup = CreateObject("K3ClassLookUp.BillLookUp") objLookup.ClassTypeID = lClassTypeID 'oDataSrv.ClassTypeIDSet objLookup.DataSrv = oDataSrvobjLookup.ShowEnd IfSet oDataSrv = NothingSet objLookup = NothingExit Functionerr_ctr:Set oDataSrv = NothingSet objLookup = NothingEnd Function调用序时簿返回选中值Private Function ShowListByReturn(ByVal lClassTypeID As Long) As ObjectDim oDataSrv As ObjectDim objLookup As ObjectOn Error GoTo err_ctrSet oDataSrv = m_BillInterface.K3Lib.CreateK3Object("K3ClassTpl.DataSrv") oDataSrv.ClassTypeID = lClassTypeIDIf oDataSrv.showfilter ThenSet objLookup = CreateObject("K3ClassLookUp.BillLookUp") objLookup.ClassTypeID = lClassTypeIDSet objLookup.DataSrv = oDataSrvobjLookup.LookupSet ShowListByReturn = objLookup.VectReturnEnd IfSet oDataSrv = NothingSet objLookup = NothingExit Functionerr_ctr:Set oDataSrv = NothingSet objLookup = NothingEnd Function【问题20】K/3 BOS SDK 二次开发组件(k3Billtransfer组件)嵌入K/3系统,数据库端按装后(update ictransactiontype... 后),再在..../system32/ls_DV.dll,并注册,最后进入K/3,没有效果!是不是K3 V10.2不支持二次组件开发还是不支持K/3 BOS SDK中的K3billtransfer组件【解答】为了支持多二次开发的结构,单据二次开发记录现在在t_ThirdPartyComponent表里维护. FTypeID,INT,4,用于区分事件类型(0,表示单据,1,表示序时簿,2,表示其它通用业务); FTypeDetailID,INT,4,对应单据,序时簿上的具体ID,在单据上使用时,该事件ID对应单据的TranType,在序时簿上使用时,对应序时簿的FID,对于FTypeID=2的类型,FTypeDetailID表示只有中间层的二次开发类型,比如审核;FIndex,INT,4,对于一个FTypeDetailID,可以有多个二次开发操作,中间用FIndex来决定执行顺序,(标记为负数的会在ictransactiontype中记录的二次开发之前执行,ictransactiontype中的FIndex默认为0),非空; FComponentName,V ARCHAR,200,二次开发组件名称(ComName.clsName);FCompenentSrv,VARCHAR,200,中间层二次开发组件;FDescription,NV ARCHAR,255,二次开发组件说明;【问题21】如何在单据插件代码中通过条件判断来启动多级审核.【解答】在保存后事件(AfterSave)中添加下列代码:'条件判断If m_BillInterface.MultiCheckMgr.MultiCheckBill(m_BillInterface.BillCtl.CurBillID) Thenm_BillInterface.RefreshBillEnd If【问题22】在插件开发中,如何获得当前登陆的用户ID 比如administrator登陆,如何得到ID 另外,如何得到选中多行单据时的集合一个表体中,有职员编码和职员名称,想通过输入编码后,直接关联出名称来.名称这个字段用职员类型,还是文本值更新事件好象不管用.【解答】获得当前登陆的用户ID:erID.选中多行的函数GetSelectedBillInfo(),此函数返回一个KFO.Vector数据包,Vector的Size和选中的行数一致.每行包含一个KFO.Dictionary数据包,此数据包包含FClassTypeID,FID,FEntryID.FClassTypeID表示单据类型;FID表示当前行所属单据的内码;FEntryID表示单据分录ID.示例获取选中的第一行所属单据的分录ID:Dim I As LongDim dct as KFO.DictionaryDim vct As KFO.VectorSet vct = m_ListInterface.GetSelectedBillInfoSet dct = vct(1)I = dct("FEntryID")职员名称用"基础资料属性",不要用文本.【问题23】在销售系统中增加了一张BOS开发的单据. 单据上也指定了相应的插件.(插件是依据BOS 开发向导生成的. 插件的功能只是增加一个自定的菜单项).组件中也引用了:K3ClassEvents.dll,但在单据测试时,却总是提示错误: "单据接口无效" 的错误. 请问BOS新开发的单据是不是不能调用自定义的插件如果有调用是不是要做其它处理【解答】插件调试时要编译或运行起来.BOS单据可以调用插件,也可以在插件中调用其他组件.请把你的Project Properties->Project Name改为和组件名一致.【问题24】Bos 开发的单据还能不能调用k3billtransfer.dll 这个组件BOS插件中如何取得连接字符串(以前m_nstring ) 我想把连接字符串做为参数传递给其它语言开发的程序.【解答】BOS 开发的单据不能调用k3billtransfer.dll,只有在工业单据里能调用.目前BOS插件不能获取连接字符串.【问题25】需要通过工具栏上的按钮,实现单据体分录的上移和下移功能,请问BOS插件的如何实现【解答】可通过m_BillInterface_MenuBarInitialize事件实现"上移","下移"按钮的添加,通过在m_BillInterface_MenuBarClick事件中重写单据体和数据包,实现该功能.【问题26】新增BOS 单据分录中有数量及基本单位数量字段, 基本单位数量关联字段为数量, 但输入完数量后,基本单位数量仍然为空.【解答】保存后基本单位数量就有了.【问题27】我在做k3BillTransfer开发时需要取表体中的"批次"列是否可以录入,即该物料是否批次管理,请问控件fpSpread中,怎么才能知道哪一个单元格可以录入或不能录入或者可以取到该物料的内码也可以.EnteryCtl都有那些属性啊,我只知道一个fieldname,其他的比如内码等是什么在单据二次开发参考组件没有描述,在哪有详细的说明【解答】1,获取分录某一分录物料的内码你可以通过EndGridLookUp(BeforGridLookUp)在分录执行查找功能后(前)激化这个事件,你就可以获取当前行,列,当前查询的资料类型(例如返回4说明是物料).EnteryCtl对应分录各列,记录每个分录列个属性的数组,在数组属性里面会有物料内码的属性!2,当TEntryCtl(Col).LookUpCls = 4 为按F7时查询物料Col为物料在单身对应的列TEntryCtl(Col).DInterID(CurRow)保存的就是物料ID,Col:为物料在单身对应的列,CurRow:分录行号.【问题28】K/3 BOS单据,序时簿和工业单据,序时簿中分别如何获得当前用户的信息(比如ID)【解答】BOS单据单据和序时簿都能读"当前用户",方法为:erID.工业单据单据目前还不能没有办法实现你的需求,请另想办法.【问题29】通过工业单据插件怎么获得当前K/3的版本号工业单据插件是否支持所有账套类型的单据,不区分工业供应链,商业供应链【解答】通过以下代码可以解决:Dim read As ObjectDim reg As StringDim result As StringSet read = CreateObject("WScript.Shell")reg = "HKEY_LOCAL_MACHINE\SOFTWARE\Kingdee\Registered\PRODUCTVERSION" result = read.RegRead(reg)MsgBox resultSet read = Nothing在ictransactiontype表中管理的单据,都可以应用工业单据插件【问题30】在工业单据的插件中如何得到单据的FInterID (工业单据)【解答】BillID = m_BillTransfer.SaveVect.Item(1).Value("FInterID")【问题31】在BOSV10.2中,填充新行数据可以用m_BillInterface.InsertNewRowAndFill方法实现,但是在BOSV10.1中不知道用什么方法可以向单据体逐行插入数据如果单据体中有物料,计量单位等查找类型字段,其赋值是否一样【解答】将10.1的KFO.DLL换成10.2 KFO.DLL,是兼容的m_BillInterface.Data("Page2").Add dctRow.CloneAll【问题32】请问10.2的工业老单(非BOS),作k3BillTransfer插件的时候,是否可以在BeforHeadLookUp事件中指定基础资料的过滤条件,如:m_BillTransfer.HeadCtl(CtlIndex).Filter = " 1=2 ".我发现这段代码所指定的过滤条件不起作用.【解答】参考以下代码:Private Sub m_BillTransfer_BeforHeadLookUp(ByVal CtlIndex As Long, ByVal nLookUpClsID As Long, Cancel As Boolean)If nLookUpClsID = 5 ThenDim tHeadCtl As VarianttHeadCtl = m_BillTransfer.HeadCtltHeadCtl(CtlIndex).Filter = tHeadCtl(CtlIndex).Filter & " AND 1=2 "'m_BillTransfer.HeadCtl(CtlIndex).Filter = " 1=2 "m_BillTransfer.HeadCtl = tHeadCtlEnd IfEnd Sub【问题33】我们在使用K/3 BOS+VB6为新港湾开发一个完全个性的项目管理系统,是使用一套帐的方式实现的,帐套理面将会创建几十或更多的工程项目,这就涉及到基础资料,项目计划,项目施工记录,项目有关单据等诸多信息要跟具体的项目邦定起来,用户一旦选定当前项目后,所有的数据维护,查询及报表都只针对当前项目操作,现在录入时跟项目邦定的问题我已解决,可查询(主要是序时薄,包括基础资料序时薄与业务单据序时薄如何与当前选定项目邦定,即序时薄只显示属于当前选定项目的数据)的问题还没解决,这就是我提出问题的背景,该问题若解决不了,整个使用K/3 BOS进行开发的解决方案将行不通,面临几十万元退款损失的风险,故十分重要.需求如下(举个例):如用BOS定义了一个名为"项目任务"的基础资料,包含工程项目,任务代码,任务名称等字段,如下所示:工程项目任务代码任务名称-------------------------------00000001 01 进场准备00000001 02 进场00000002 01 进场准备00000002 02 进场........ .. ........写插件时,请问想要达到进入该基础资料序时薄时只显示某一个工程项目的相关基础资料记录该如何编码(在那个事件入口处理,怎样处理),同样,如果是业务单据序时薄,又该如何设置过滤条件(在那个事件入口处理,怎样处理),本人看过开发手册,好象没有合适的事件入口,更没有该方面的例子. 【解答】在K/310.2+SP1的环境下,基础资料序时簿和单据序时簿有"ListFilterString"应可以实现.但在重新查询,过滤条件失效,在SP2解决此问题【问题34】怎么找每个字段的索引【解答】参考下列代码'表头THeadCtl = m_BillTransfer.HeadCtlFor i = 1 To UBound(THeadCtl)If UCase(THeadCtl(i).FieldName) = "FBILLERID" Thenm_BillTransfer.head(i).text = "张三"Exit ForEnd IfNext'表体EntryCtl = m_BillTransfer.EntryCtlFor i = 1 To UBound(m_BillTransfer.EntryCtl)If UCase(EntryCtl(i).FieldName) = "FQTY" ThenExit ForEnd IfNext【问题35】BOS 开发一张新的单据. 在选单返回时, 希望能在表体自动添加一行分录.事件测试代码如下:Private Sub m_BillInterface_AfterSelBillBeforeFillData(ByVal dcData As KFO.IDictionary, ByVal dctLink As KFO.IDictionary)Dim CoDict As KFO.DictionarySet CoDict = dcData("Page2")(1).CloneAll //拷贝第一条分录数据dcData("Page2").Add CoDict //添加到dcDatadcData("Page2")(dcData("Page2").Count)("_-0001_FIndex2")("FFLD") = dcData("Page2").Count //更改分录号'Stopset CoDict=NothingEnd Sub我用watch 查看DcData 的值. DcData("Page") 也有增加一条, 但返回后,新添加的分录并未带到目标单据上请问我还要修改哪些地方【解答】此方法在调试状态下是不能把值传过去的,编译之后就可以了.你的代码有以下问题:1,取分录号使用dcData("Page2")(dcData("Page2").UBound)("FEntryID").2,Vect的最大值用UBound,而不是count.3,去字段的key值使用m_BillInterface.TableInfo("map")("FPrice")'FPrice是字段名.正确的代码是:Dim CoDict As KFO.Dictionary'dcData("Page2")(1)(m_BillInterface.TableInfo("map")("FPrice"))("FFLD") = 1000Set CoDict = dcData("Page2")(1).CloneAll ''拷贝第一条分录数据dcData("Page2").Add CoDict '添加到dcDatadcData("Page2")(dcData("Page2").UBound)("FEntryID") = dcData("Page2").UBound - 1 '更改分录号'StopSet CoDict = Nothing【问题18】BOS单据插件里的BusinessCheck事件有何用途写在BusinessCheck里面的代码也不执行,不知道这个事件到底是什么时候触发的.在AfterBusinessCheck事件中写的代码在打了10.2SP1之后就不执行了,我把代码放到BusinessCheck事件中也不执行,不知道什么原因,但AfterUnBusinessCheck中的代码却执行了.我只做了一级审核.AfterBusinessCheck事件和BusinessCheck事件触发时点的问题,以查看状态打开单据进行审核时,这两个事件不触发,只有在修改状态打开单据并进行审核,这两个事件才会被触发.之前没有打SP1的时候是没有这个问题的.因为强制审核人必须要打开单据检查后再进行审核,所以我在该单据的序时簿中把审核菜单去掉了,只能打开单据审核.不知道有没有人遇到这个问题.【解答】经检查,以查看状态打开单据,进行多级审核,在业务审核级次被审核时,能够触发业务审核事件,另外,昨天发现的业务审核事件在某条件下会多次触发的BUG已经修改,将会随8.31日须完成的功能点一起发放.估计还是因为用户没有针对单据插件进行编码,所以没有捕捉到事件. 二,方案篇【问题1】客户的产品是通过图纸来制造的,图纸有些是客户自己提供标准图纸,有些是客户的需求自己根据需求画出来的,报价单很大的部分是根据图纸来的,而且图纸是公司的机密.现在用户需求是图纸需要有严格的权限控制,最好能够放在数据库里面统一管理,有图纸单据有:报价单,销售定单,合同;现在我们的K/3v10.2的附件的权限不好管理不能满足客户的需求.如何提供解决方案【解答】这样的话可以对图纸管理进行开发(如果对方有PDM系统就不需要),图纸存放可以用局域网FTP或数据库存储解决,后者比较容易进行权限控制,自己设定权限控制,下载,浏览,更新,删除,都能进行控制;而且关于图纸管理也比较容易解决,如图纸的版本控制.K/3 BOS解决不了.【问题2】客户需要开发一张外贸报价单,里面涉及到物料对应表的内容,对应代码具体能实现的功能跟现有的报价单的一致,现在不知道怎么样能够具体的实现这样的功能,因为BOS 的基础资料里面没有物料对应表,可以新增BOS基础资料和物料对应表共用一个表名,但是怎么可以做到跟原有的报价单在物料对应这一块的一摸一样的功能.【解答】不可能具有原来一模一样的功能,"BOS新增基础资料,映射到原有的数据表或视图"方式只能。

idea插件开发方法

idea插件开发方法

idea插件开发方法第一步:编写插件的基本结构一个idea插件是一个独立的Java工程,我们需要创建一个新的项目来开始插件的开发。

在创建项目的过程中,我们需要选择Plugin 模板,并填写相关的项目信息。

创建完成后,我们就可以开始编写插件的基本结构了。

第二步:定义插件的功能在开发插件之前,我们需要明确插件的功能是什么。

通过分析我们的需求,确定插件需要实现的功能和功能的具体实现方式。

然后,我们可以在插件的代码中定义相关的类和方法,来实现这些功能。

第三步:处理插件的生命周期插件的生命周期包括插件的加载、激活和卸载等阶段。

在插件的代码中,我们可以通过实现相关的接口或者继承相关的类来处理插件的生命周期。

这样,我们可以在插件的不同阶段执行相应的操作,以实现插件的功能。

第四步:处理插件的扩展点idea提供了很多扩展点,我们可以利用这些扩展点来实现插件的功能。

在插件的代码中,我们可以通过注册扩展点来扩展idea的功能,或者通过监听扩展点的方式来处理idea的事件。

通过合理利用扩展点,我们可以实现插件和idea的深度集成。

第五步:测试和调试插件在插件开发的过程中,我们需要对插件进行测试和调试,以确保插件的功能正常。

可以通过在idea中运行插件的方式来进行测试,也可以通过idea提供的模拟环境进行调试。

在测试和调试的过程中,我们可以通过日志输出和断点调试等方式来定位和解决问题。

第六步:发布和分享插件当我们开发完成一个功能完善的插件后,可以考虑将插件发布和分享给其他开发者使用。

可以将插件上传到idea的插件市场,或者将插件的源代码分享到开源社区。

通过发布和分享插件,我们可以得到更多的反馈和贡献,也可以帮助其他开发者提高开发效率。

总结:通过以上几个步骤,我们可以完成一个idea插件的开发。

在开发插件的过程中,我们需要明确插件的功能,处理插件的生命周期和扩展点,测试和调试插件,最后发布和分享插件。

通过不断的实践和学习,我们可以开发出更加强大和实用的idea插件,提高开发效率和开发质量。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

网站的基本数据在DX的这个框架中,我们会经常用到一些使用的数据,这些数据包括:系统常量、全局变量、系统调用,首先我们从系统常量说起系统常量DX里面对一些常量做了自己的定义,接下来的表格列举了,更多的变量可以使用附录里的全局变量DX的全局变量事实上全部压缩到了一个变量:$_G里面,接下来的表格列举了常用的$_G数据内部的变量,更多的变量可以使用附录里的代码获得。

系统调用系统调用里面,恐怕最重要的调用要数DB这个静态对象了。

这是一个数据库的静态对象,对其的使用也是经常用到的,其方法包括:另外,系统的一些其它的系统调用,包括:获取用户信息、插入帖子等内容,都可以在:souce/function/ 文件夹下找到对应的文件来查看。

1. 查看全部常量:1.<?php2.require_once './source/class/class_core.php';3.require_once './source/function/function_home.php';4.$discuz = & discuz_core::instance();5.$discuz->init();6.print_r(get_defined_constants());7.?>复制代码2. 查看$_G变量中内容1.<?php2.require_once './source/class/class_core.php';3.require_once './source/function/function_home.php';4.$discuz = & discuz_core::instance();5.$discuz->init();6.print_r($_G);7.?>复制代码[以上内容整理自monkee]接下来.我们就已 "扩展中心"插件为例制作一个简易,却很实用的论坛扩展插件.本帖隐藏的内容首先.打开论坛后台: 插件 -> 插件 -> 设计新插件注:唯一标识符提交后.将不能在此修改.提交后,会切换到插件的设置页面.如果不涉及到其他编码.可以不选用"插件语言包"接下来.我们就可以开始添加插件的模块文件了.打开程序目录:/source/plugin/ 建立新文件包 dst_Expand (这里的文件包名要与唯一标识符一致)第一步.我们先做一个admincp.inc.php在/source/plugin/唯一标识符/下新建一个文件 admincp.inc.php因为扩展中心不需要后台设置所以该文件不需要编写内容只需复制一下内容即可1.<?php2.3.4.if(!defined('IN_DISCUZ')) {5. exit('Access Denied');6.}7.8.9.?>复制代码文件写好后.返回后台的模块设置.按下图样式填写:写好只有点击提交.返回到插件列表页.点击开启.后台部分便完成了.之后开始编写其他模块文件返回设计 -> 模块按下图添加新模块添加完毕后界面 -> 导航栏 -> 选择"扩展" 可用在/source/plugin/唯一标识符/下新建一个文件 Expand.inc.php在里面编写1.<?php2./**3.* [New.DST] (C)2010-2011 New PHP Support Forum4.* This is NOT a freeware, use is subject to license terms5.*6.* $Id: Expand.inc.php 2010-07-31Z [DST]ZannYount $7.*/8.9.if(!defined('IN_DISCUZ')) {10. exit('Access Denied');11.}12. include template("dst_Expand:Expand");13.14.?>复制代码其中1. include template("dst_Expand:Expand");复制代码template:表示dst_Expand插件文件包目录下的模板文件dst_Expand:表示该插件的唯一标识符Expand:表示template下的模板文件名接下来在dst_Expand插件文件包目录下新建新文件包 template在 template 文件包下新建文件 Expand.htm在 Expand.htm 文件里编写1.{template common/header}2.<div id="wp" class="wp">3. <div id="pt" class="wp"><a href="index.php"class="nvhm">$_G[setting][bbname]</a> &rsaquo; 扩展中心</div>4.这里是内页所显示的内容5.{template common/footer}复制代码其中1.{template common/header}复制代码表示调用页头文件1.<div id="pt" class="wp"><a href="index.php"class="nvhm">$_G[setting][bbname]</a> &rsaquo; 扩展中心</div>复制代码表示:1.{template common/footer}复制代码表示调用页底文件这样, 一个内页就算完成了.接下来,我们就根据上面的教程制作一个扩展中心的内页template 文件包下的 Expand.htm可以做任何的形式,只要你熟悉CSS和DIV下面,贴出扩展中心的代码把上面教程中 "这里是内页所显示的内容" 替换成1. <link rel="stylesheet" type="text/css"href="source/plugin/dst_Expand/template/Expand.css">2.<div id="ct" class="wp cl">3. <div class="mn mw">4. <div class="bm bml">5. <div class="bm_c cl">6. <div id="forum_rules">7. <div class="pbm xg2">8.<ul class="tb cl">9.<li id="Id_About_Us"> <ahref="plugin.php?id=dst_Expand:Expand&amp;to=Id_About_Us">关于我们</a></li>10.<li id="Id_Team_News"> <ahref="plugin.php?id=dst_Expand:Expand&amp;to=Id_Team_News">团队动态</a></li>11.<li id="Id_License_Agreement"> <ahref="plugin.php?id=dst_Expand:Expand&amp;to=Id_License_Agreement">授权协议</a></li>12.<li id="Id_Team_Rules"> <ahref="plugin.php?id=dst_Expand:Expand&amp;to=Id_Team_Rules">团队规章</a></li>13.<li id="Id_Business_Support"> <ahref="plugin.php?id=dst_Expand:Expand&amp;to=Id_Business_Support">商业支持</a></li>14.<li id="Id_Partners"> <ahref="plugin.php?id=dst_Expand:Expand&amp;to=Id_Partners">合作伙伴</a></li>15.<li id="Id_Team_Concept"> <ahref="plugin.php?id=dst_Expand:Expand&amp;to=Id_Team_Concept">团队理念</a></li>16.<li id="Id_Contact_us"> <ahref="plugin.php?id=dst_Expand:Expand&amp;to=Id_Contact_us">联系我们</a></li>17.<li id="Id_Site_Map"> <ahref="plugin.php?id=dst_Expand:Expand&amp;to=Id_Site_Map">网站地图</a></li>18.<li id="Id_Advertising"> <ahref="plugin.php?id=dst_Expand:Expand&amp;to=Id_Advertising">广告服务</a></li>19.<li id="Id_Site_Help"> <ahref="plugin.php?id=dst_Expand:Expand&amp;to=Id_Site_Help">网站帮助</a></li>20.</ul> <br />21.22.23.<!--{if $_G['gp_to'] == 'Id_Team_News'}-->{templatedst_Expand:Id_Team_News}24.<!--{elseif $_G['gp_to'] == 'Id_License_Agreement'}-->{templatedst_Expand:Id_License_Agreement}25.<!--{elseif $_G['gp_to'] == 'Id_Team_Rules'}-->{templatedst_Expand:Id_Team_Rules}26.<!--{elseif $_G['gp_to'] == 'Id_Business_Support'}-->{templatedst_Expand:Id_Business_Support}27.<!--{elseif $_G['gp_to'] == 'Id_Partners'}-->{templatedst_Expand:Id_Partners}28.<!--{elseif $_G['gp_to'] == 'Id_Team_Concept'}-->{templatedst_Expand:Id_Team_Concept}29.<!--{elseif $_G['gp_to'] == 'Id_Contact_us'}-->{templatedst_Expand:Id_Contact_us}30.<!--{elseif $_G['gp_to'] == 'Id_Site_Map'}-->{templatedst_Expand:Id_Site_Map}31.<!--{elseif $_G['gp_to'] == 'Id_Advertising'}-->{templatedst_Expand:Id_Advertising}32.<!--{elseif $_G['gp_to'] == 'Id_Site_Help'}-->{templatedst_Expand:Id_Site_Help}33.<!--{else}-->{template dst_Expand:Id_About_Us}34.<!--{/if}-->35. </div>36. </div>37. </div>38. </div>39. </div>40.</div>41. </div>42.43.44.<script type="text/javascript">45.<!--46. var ishave=true;47. var isset=false;48. querystring=document.location.search;49. lo=querystring.indexOf('to=');50. if (lo>0) {51. var result=querystring.substr(lo+3);52. if (result=="") ishave=false;53. }54. else { ishave=false; }55. divob=document.getElementById('forum_rules');56. lis=divob.getElementsByTagName('li');57. if (ishave) {58. for (var i=0; i<lis.length; i++) {59. if (lis[i].id==result) {60. lis[i].className="a";61. isset=true;62. break;63. }64. }65. }66. else {67. lis[0].className="a";68. }69. if (!isset) lis[0].className="a";70.//-->71.</script>复制代码然后再写个CSS文件 Expand.css1.#ct {2.background:none !important;3.}复制代码这回去看看发生了什么吧下面我来详细的解剖一下上面的导航栏的写法在上面的导航栏效果中:1.<li id="Id_About_Us"> <ahref="plugin.php?id=dst_Expand:Expand&amp;to=Id_About_Us">关于我们</a></li>复制代码href="" 中的路径表示的是各个分类的路径关于我们则表示的导航栏的文字而下面1.<!--{if $_G['gp_to'] == 'Id_Team_News'}-->{templatedst_Expand:Id_Team_News}复制代码等等中的{template dst_Expand:Id_Team_News}表示的是 dst_Expand这个插件文件包下的template文件包下的Id_Team_News.htm 文件因为该插件下面要输写的内容过多.为了方便整理和修改.我们在这里采用了外调的方法. 也就是说每一个导航栏单独写成一个.htm的文件然后再由Expand.htm 这个文件总的来调用.这样每一个分类下的内容就简洁多了但是这里一定要注意几点:一.文件的目录{template dst_Expand:Id_Team_News} 里的Id_Team_News.htm 文件要和Expand.htm为同一个目录.二.<li>中的ID 以及变量$_G['gp_to'] == '里的ID 一定要保持和文件名也就是&to= 后面的一致否则就会产生模板文件找不到的错误最后.我们就可以在分类下,填写自己想要的内容了.按照上面已经写好的Expand.htm 我们新建一个文件 Id_About_Us.htm 这个是"关于我们"的文件新建好以后我们在文件中任意输入任何文字内容以上,我们就可以根据上述的教程,制作出一个简单的"扩展中心"插件了当然,如果你可以熟练的运用CSS+Div 的话.还可以做出更精美的效果. 您可以参考/plugin.php?id=dst_Expand:Expand根据自己的需要运用CSS+Div。

相关文档
最新文档