彼岸网

 找回密码
 立即注册
搜索
热搜: 活动

tag 标签: 开发

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

分享 鸡年股市之空手套白狼
笔记本 2017-2-2 05:52 AM
鸡年股市之空手套白狼
之前很久没有进入 equity 市场,但最近忍无可忍了。根据我对 CPU/GPU 的相关了解,早知道 AMD 在开发新一代的 ZEN 核心 CPU。去年底,AMD 又称 ZEN的性能同等频率下接近或超过 INTEL 的 Core i7 。另外,AMD 又宣布正开发新一代 VEGA GPGPU。而最近CES 上 AMD 展示了这两款新技术,配有大量高端主板... 相比之下,INTEL的新一代 KABY LAKE 性能原地踏步。。。鸡年机不可失。 昨天(1月31日)是 AMD 2016财年的年度报告(包括第四季度营收)的日期。如果下午收盘后,AMD 年度报告不错而且2017年预期不错,很可能突破 $12。反之, 则可能大跌。AMD虽然新产品都还没有推出,但势头好像不错,好消息的几率似乎更大。早上 AMD 股价约 10.6。 此时,我毅然下了一个组合订单。 卖出: 500 AMD 二月三日 $12 PUT 期权 (OPTIONS) 买入: 500 AMD 二月三日 $10.5 PUT 期权 价格:收入 $1.1 期权(OPTION) 是一种合同期限执行权利。从法律上来说,其意思是在某个时间段内根据合同进行交易的权利。就像买房子,你可以给对方定金,保留在1个月时间内以某个价格买入房子的权利,在这个期间内即使房价大涨对方也不能反悔,但你可以不买(对方吃入定金)。这就是 OPTION 。股票期权有两种:一种是在某个时间前以某个价格买入股票的权利,这叫 CALL。 在美国上市公司上班,公司一般会给员工一些 OPTIONS,那都是 CALL。还有 一种是在某个时间以前以某个价格卖出股票的权利,这叫 PUT。 股票期权是衍生物 (derivative)的一种。美国经济离不开衍生物。 当年我刚到美国时,在路上被人给了一本宣传册子,是一个叫 LaRouche的人写的。里面说美国的 derivatives 价值是一个天文数字,就像一个人背上背着一个比人大10倍的吸血虱子(册子里漫画)。D erivative 这个词我是知道的,数学的中文翻译为“导数”,顾名思义是从一个东西“导”出来的数(又称微商)。 虽然我在国内大学也学了西方经济入门,但当时完全不知道经济里derivatives 是什么东东。那本书里的 漫画与这个词 一直给我留下很深的印象,后来才总算明白了一点。 ENRON 公司的CEO/CFO 把气候都作为衍生物买卖,曾经被华尔街投行视为屋子里最聪明的人 (smartest people in the room)。当然那是近乎病态了。美国金融危机为什么那么严重?为什么有的大金融公司破产了? 如果判断错误, 衍生物的放大效应往往让人血本无归 。 言归正传。上面的 二月三日 \$12 PUT 期权是指在 2月 3日之前以 \$12 美元卖出一股 AMD 的权利。谁有这个权利,那么就可以在 2月3日前,将 AMD 以 \$12 块卖出去(无论市场价如何)。我 无中生有 售出 500 个 “ AMD 二月三日 \$12 PUT ”,买了这些期权的人在这三天内可以把手里的AMD股票以 \$12 块卖给我。当时这个 \$12 块 PUT的单价是\$1.74。这样卖出期权可谓空手套白狼,但是有一个很大的风险。万一 AMD 狂跌,那就惨了。如果AMD只值 \$8 块,我却必须 \$12 块买入,虽然我卖期权收了\$1.74 , 还是会损失 \$4 - \$1.74 = \$2.26 (忽略手续费)。 怎么办?买个保险。在卖出 \$12 PUT 的同时,买入 \$10.5 PUT,换言之,购入以 \$10.5 卖出的权利。如果AMD 大跌,那么我这个 \$10.5 PUT就成护身符了。这个 \$10.5 PUT 的单价是 \$0.64。因此我设置上述组合交易的单价 收入 \$1.1。这样我的最大损失是 12 - 10.5 - 1.1 = \$0.4;最大收益为 \$1.1 (忽略手续费) 。组合交易而不是分别交易是为了进一步减少不确定性。 交易记录如下: 01/31/17 Bought To Open 500 AMD Feb 03 '17 \$10.50 Put(AMD) @ \$0.64 -32,391.89 01/31/17 Sold Short 500 AMD Feb 03 '17 \$12 Put(AMD) @ \$1.74 86,606.21 昨天收盘后,AMD 果然不负众望。其CEO宣称,RYZEN CPU已经大量生产,三月初大规模发布。 今天,AMD股价大涨 16%, 以 \$12.06 收盘。如果能再撑两天维持在 \$12 以上,这个 \$1.1 就成了口袋里的零花钱。唉,难怪很多年轻人不愿意刻苦学习硬科学。 另外,鉴于形势一片大好, 估计3月初 RYZEN 上市后,在一片歌颂声中,AMD 股价继续飙升的可能性不可小视。 因此,我今天继续加大筹码,购入 4000 个 AMD 3月 17日 \$14 的 CALL 期权合同。 PS:结果 文章来源: http://www.zhenzhubay.com/home.php?mod=space&uid=2&do=blog&id=34629
0 个评论
分享 从代码修改到插件开发:头像编辑(续)
热度 11 天香公主 2016-10-17 09:57 AM
从代码修改到插件开发:头像编辑(续)
在前文( 链接 )中我们讨论了基于HTML5的插件来替代Discuz原来的基于Flash的头像编辑功能。和Flash一样,HTML5里的画布(canvas)也能在客户端提供生成头像,以及在裁剪头像界面上按选择框和伸缩度的变化实时变动头像显示的作用。但后来我们发现画布也有个缺陷:动画图片经裁剪保存下来后成了静态图片,也就是说裁剪保存的只是动画图片中的第一幅。详见这里的讨论( 链接 )。另外画布还带有一定的安全隐患( 链接 )。所以本文讨论一种替代方案。头像的生成在服务器端完成,而裁剪头像界面则用普通的HTML元素来实现。这种新方法支持动画图片作为头像。 1) 生成头像 Discuz里的图片处理函数并不支持裁剪动画图片,而PHP里常用的GD函数库里的函数也不直接支持裁剪动画图片。所以我们使用了基于GD的函数库 ImageWorkshop (参见 这里 的介绍)。 在Discuz里储存头像是用户中心处理的,那么是不是必须将生成头像的代码加到那去,使之先生成再储存呢?这样做法虽然可行,但改动了Discuz的源代码,这样这个改动就不是一个可以散发的插件了。我们的做法是将生成头像的代码放在插件里。当用户点击提交头像的按钮后,先调用插件提供的PHP代码来生成头像,并将头像数据存在客户端的隐藏元素里,提交给服务器端,这样一来用户中心还是和原来一样储存头像。所以新方法还是插件形式的修改。 2) 头像裁剪界面 用画布来实现裁剪界面非常方便,因为画布提供了在它上面画图的功能。而用HTML元素来实现则费劲些。需要用上四个元素。最底层是用一个image元素来显示头像图片。在它上面是个以灰色为底色的半透明的div元素。在它上面是除边框外全透明的div元素作为选择框。在它上面又是一个image元素,它不透明,它将头像图片作为背景图片来达到只显示头像部分的效果。 这个做法的本身没用到HTML5的任何功能,但一些旧版的浏览器不支持它用到的一些HTML元素的风格设置如半透明。所以和原来的插件一样,在不支持HTML的浏览器里我们将这个插件退化成原来的Flash功能。 更新记录: 11/28/2017更新:防止与其它版本的jQuery发生冲突。 12/01/2017更新:将属性里设置的load事件处理改为在代码里设置,以避免在使用Cloudflare的网站里被其更改而不工作。 插件下载: http://www.bian-wang.com/discuz/data/userupload/10005/txgz_avatar2.zip (12/01/2017最后更新)
个人分类: Discuz|6452 次阅读|37 个评论
分享 Discuz插件开发:上传文件插件
热度 5 天香公主 2016-5-17 05:46 PM
Discuz插件开发:上传文件插件
Discuz插件开发:上传文件插件 彼岸网提供了让网友上传文件的功能,为我写日志提供了很大的方便,但使用下来也感到有一定不足,一是没法删除上传后的文件,二是网友们上传的文件都在一起不容易找到。所以我尝试自己写了个上传文件和管理文件的插件,和网友们分享。 在启用后,站长可以设置每个用户上传的文件总尺寸的限额,默认值是200MB, 和允许上传的文件扩展名, 默认值是 chm, pdf, zip, rar, tar, gz, bzip2, gif, jpg, jpeg, png, txt, doc, mp3, mp4,以及允许哪些用户组的用户使用本插件: 这个插件启用后可以按路径 plugin.php?id=txgz_file_uploader:files 来进入上传网页。这个路径可以放在站长认为合适的地方来让用户使用,比如在上图中在主导航栏的"帮助"下加了个子菜单项"上传文件"来进入这个网页。 用户可以上传的单个文件的最大尺寸受PHP环境中的三个设置值所控制:memory_limit, post_max_size, upload_max_filesize,不能超过其中任何一个(见 链接 中的讨论)。一般有必要加大post_max_size和upload_max_filesize的值。在自己机器上可以在 php.ini 里调整,在托管共用的服务器上要按服务商提供的方法设置。比如在 namecheap.com 里,在 Software and Services - Select PHP Version - Switch To PHP Settings里设置。 如果用户要上传的文件尺寸超过这些设置值的话,会得到类似下面的出错信息: 点击上传后的文件地址末的图标 会将文件地址拷贝到Clipboard里,再粘贴到需要的地方去。 这个插件包含了两个模块。一个'管理中心-列表链接'模块让管理员集中管理所有用户的上传文件。另一个仅供管理员使用的'页面嵌入'模块,它的作用是在网页上的内容管理菜单上添加一个'管理文件'菜单项,让管理员能进入管理中心直接管理当前显示的个人空间用户的文件。 管理员也可以进入管理中心里在应用里点击本插件下的'文件管理'链接来集中管理所有用户上传的文件: 插件下载: http://www.bian-wang.com/discuz/data/userupload/10005/txgz_file_uploader.zip (01/10/2017更新) 更新记录: 05/29/2016: 确保长链接能自动换行 05/30/2016: 1)添加插件设置让站长选择哪些用户组的用户可以使用本插件,2)修补漏洞:当上传文件名中含 时删除失败 06/01/2016: 支持同时上传多个文件 06/02/2016: 解决iPhone上传同名图片image.jpg问题 06/04/2016: 加了个管理中心模块"文件管理",供管理员管理用户上传的文件用 06/05/2016: 1)在文件列表页上添加分页显示(每五十个文件一页),2)在内容管理菜单上添加管理文件菜单项 06/06/2016: 1)遵循PRG模式, 2)设了插件网页标题,3)一些风格改进 06/07/2016: 1)解决昨天的修改后Mac机器上Safari里操作后文件列表不实时更新问题, 2)解决iPad上传同名图片image.jpeg问题 06/25/2016: 1)支持远程空间,2)上传文件夹位置由网站上传设置决定, 3)在上传文件夹里添加空白index.html以避免显示文件目录 06/26/2016: 1)在列表里显示上传时间,2)点击表列标题来按列排序,3)缩短了显示列表所用时间 11/10/2016: 将文件名排序从区分大小写改成不区分大小写 01/10/2017: 不同的FTP服务端软件提供文件修改时刻的做法有所不同,修改代码来兼容这个差异
个人分类: Discuz|17454 次阅读|218 个评论
分享 从代码修改到插件开发:封面插件
热度 3 天香公主 2016-2-20 11:08 PM
从代码修改到插件开发:封面插件
从修改系统代码到开发插件:支持网络图片和油管视频缩影图做为封面图 前几天我讨论了如何修改Discuz系统代码来支持网络图片和油管视频缩影图做为文章和日志的封面图( 链接 和 链接 )。东风兄跟评介绍了他的 北美生活网 使用的一个将油管视频缩影图做为论坛主题帖封面图的插件。用插件形式来修改系统给站长装卸和管理系统改动带来很大的方便。所以这几天我又考虑了下如何将前述修改写成插件的形式,本文记录下心得。 下图显示的是我写的封面插件在开发时的文件结构。非常简单,只包含了一个页面嵌入模块(其中只有一个全局嵌入点函数)和两个Javascript函数文件。 xmp { white-space: pre-wrap; display: block; vertical_align: top; background-color: lightgrey;} th, td { vertical_align: top; } 下面讨论下如何将前述代码修改转换成插件代码。前述修改的代码可以分成下面的三类。 第一类是客户端Javascript函数定义的修改,比如文章封面修改中对系统函数 createImageBox 的修改(见 链接 中的1a))。怎样能在不修改原来的函数的前提修改功能呢?Javascript语言有个好(或坏)的特点:它允许同名函数多次定义,只有最后一次的定义会被调用,也就是说后面的函数定义覆盖了前面定义的同名函数。所以我们可以不修改原来想要修改的函数,而在网页的后部给出个原来函数的修改版。以 createImageBox 为例: 系统代码(static/image/editor/editor_function.js): 修改代码: function createImageBox(fn) { if (typeof fn == 'function' && !fn()) { return false; } var menu = $('icoImg_image_menu'); ... function createImageBox(fn) { if (typeof fn == 'function' && !fn()) { return false; } if ($('conver')) { edit_save(); var imgs = getExternalImages(); ... 插件代码: 1. source/plugin/txgz_cover/cover.class.php: class plugin_txgz_cover { function global_footer() { global $_G; $rv = ''; if (!empty($_G )) { if(CURSCRIPT == 'portal') { if($_GET == 'portalcp' && $_GET == 'article') { $rv .= ' '; ... return $rv; } } 2. source/plugin/txgz_cover/js/cover.js: function createImageBox(fn) { if (typeof fn == 'function' && !fn()) { return false; } edit_save(); var imgs = getExternalImages(); ... 第二类是修改服务器端提供数据的PHP代码,如文章封面修改中的在门户页和文章列表页上显示的封面(见 链接 中的1b)和1c))。不改系统代码的话,这些网页用的网络图片的封面图的链接是无效的。我们的解决办法是在客户端把服务器端提供的无效链接在显示前再转换成有效链接。 以修改文章列表页里得到封面图的代码为例: 系统代码(source/function/function_home.php): 修改代码: function pic_get($filepath, $type, $thumb, $remote, $return_thumb=1, $hastype = '') { global $_G; $url = $filepath; if($return_thumb && $thumb) $url = getimgthumbname($url); ... function pic_get($filepath, $type, $thumb, $remote, $return_thumb=1, $hastype = '') { global $_G; $url = $filepath; if (preg_match('/^https?:\/\//', $url)===1) return $url; if($return_thumb && $thumb) $url = getimgthumbname($url); ... 插件代码: 1. source/plugin/txgz_cover/cover.class.php: class plugin_txgz_cover { function global_footer() { ... $rv .= ' '; return $rv; } } 2. source/plugin/txgz_cover/js/cleanupsrc.js: (function cleanupImageSources() { var imgs = document.getElementsByTagName('img'); for (var i = 0; i = 0) img.src = img.src.substr(sp + 1); } })(); 第三类是修改服务器端储存数据的代码,比如清空文章封面的代码( 链接 中的3))。由于我们现在不允许修改系统代码,我们就没法在最合适的地方做这件事,但是我们可以在插件内找到合适机会干这件事。 系统代码(source/include/portalcp/portalcp_article.php): 修改代码: if($_GET ) { $converfiles = dunserialize($_GET ); $setarr = $converfiles ; $setarr = intval($converfiles ); $setarr = intval($converfiles ); } if($_GET ) { $converfiles = dunserialize($_GET ); $setarr = $converfiles ; $setarr = intval($converfiles ); $setarr = intval($converfiles ); } else { $setarr = ''; $setarr = 0; $setarr = 0; } 插件代码: source/plugin/txgz_cover/cover.class.php: update($aid, $setarr); } } } 通过这两天的尝试,对Discuz插件的强有力的系统扩展机制有了深刻印象。粗看页面嵌入点函数只能在页面的一些特定位置添加些字符,再看发现它也能输出Javascript代码并由此变化和控制网页上任何位置的内容,可以添加Javascript函数来替代系统函数并进而改变系统功能。做为在服务器端执行的函数,它还能做于网页输出内容无关的事,如修改数据库数据。虽然嵌入点函数在被执行时并没有给予任何参数,但通过检查整体变量的值,可以得知很多执行环境的信息,如当前所执行的用户请求信息,并因此区分和决定该做的事。 插件下载: http://www.bian-wang.com/upload/txgz_cover_160302.zip
个人分类: Discuz|155 次阅读|8 个评论
分享 Discuz插件开发:个人日志回收站
热度 1 天香公主 2015-1-23 07:38 AM
Discuz插件开发:个人日志回收站
Discuz插件开发:个人日志回收站 不久前老刘在美中网上的一篇博文的失踪引发了那里的网民议论纷纷,连李宝琪副总编辑也被惊动了 ( 链接 )。在美中网使用的DiscuzX2.5版本里,日志在页面上删除,立刻就从数据库里被删除,也就没法恢复了。应该是意识到了这个问题,DiscuzX的3.0版在管理中心里加入了一个叫日志回收站(recycle bin)的新功能,管理员可以在那里找到被删的日志,并决定是从数据库里彻底删除它还是恢复它。从数据表的内容看,当日志被删除后,它对应的数据表home_blog 里的记录依然存在,只不过它的status项的值变成了-1。在引入这个功能之前,status的值只能是0或1,0代表通过审核,1代表正在审核之中,现在又用-1来代表被删。而在回收站里清除则真的是在数据库里被删除了。 (注意在使用日志回收站前先要在管理中心里的全局-空间设置处开启日志回收站) 有几个自然而然会提出的问题: 1)博主是否能找到被删的日志? 答案是可以的。原文的地址依然有效。即使不知道地址,如果博主的个人空间页里有最新日志栏,那么如果被删的日志是近期发表的,那也会在这个栏目里出现。不了解日志回收功能的网友常会认为这是一个无法删文的bug。这种处理很难说是Discuz公司的原意,不然为何被删日志不出现在日志列表里呢? 2)博主能否恢复被删的日志?答案是可以的。直接进入日志后编辑保存,该文的status就变成0了。 这就意味着博主能恢复被管理员删掉的日志,这是否是Discuz公司的原意呢?当然如果管理员执意要删的话,还是可以尽快在日志回收站里清除,或者封账号。 3)被删的日志会 在数据库里保存多久?答案是一直存在,直到管理员从日志回收站里将该文清除,也就是说博主其实丧失了真正清除日志的权利,不知这是不是Discuz公司的原意? 总结起来新添的功能产生了这样两个副作用:一是管理员删除的日志有可能被博主恢复,二是博主无法彻底删除日志。对于前者,管理员还可以结合其他权力防止博主恢复日志。而后者,的确会使一些博主感到不便或无奈。 本文模仿上述Discuz提供的管理员用的全站日志回收站代码 source/admincp/admincp_blogrecyclebin.php 来提供一个给普通用户用的日志回收站插件,让每个博主拥有彻底清除自己的日志的权力。下面是效果图: = xmp { white-space: pre-wrap; display: block; } 这个插件包含一个快捷导航项目模块 source/plugin/myrecyclebin/blogrecyclebin.inc.php: alert(' '); window.location = "plugin.php?id=myrecyclebin:blogrecyclebin"; 和对应的显示模板 source/plugin/myrecyclebin/template/blogrecyclebin.htm: th, td { padding: 5px !important; height: 25px; } th { font-weight: bold; } a { color: #2366a8; } .btn { margin:3px 0; padding:2px 5px; *padding:4px 5px 1px; border: 1px solid; border-color:#ddd #666 #666 #ddd; cursor:pointer; } label { margin-right: 5px; } $value $value $value $value $value $value $value 个人分类: Discuz|2275 次阅读|5 个评论
分享 Discuz插件开发:文库插件
热度 4 天香公主 2014-2-16 11:09 AM
Discuz插件开发:文库插件
如何开发Discuz插件(二):文库插件 上次我们讨论了如何用插件在现有网页上添加内容( 链接 ),现在我们接着讨论如何加新网页和如何加菜单项来连上这个新网页。作为示范我们要做个网页让用户上传文件,并能找到已经上传的文件。我们称这个功能为文库,类似于相册。 下面是效果图: 我们先介绍一下这个功能的大致框架: 下面是实现这功能所需加入的文件: 这个插件要求在source/plugin加一个子文件夹。所有与这个插件有关的文件都放在这里面。 总共就三个文件,一个PHP文件files.inc.php包含主要功能代码,一个HTML文件files.htm提供显示模板。最后一个HTML文件index.htm是空白的,按PHP的惯例用来防止用户直接浏览文件夹内容。 第一个文件是功能的入口,我们将在设置时将它与一个新的菜单项相连。第二个文件由第一个文件导入。 1) files.inc.php xmp { white-space: pre-wrap; border: 1px solid darkgrey; background-color: lightgrey; } 2) files.htm Test 注意我们这里是在模板里加公共的顶部和底部。我们也可以在PHP文件里用下面的代码加 include template('common/header'); 最后我们在管理中心里通过设置可以添加让用户使用这功能所需的菜单项。 1) 应用-插件页里的插件列表旁点击设计新插件。填写新插件的信息。注意新插件的唯一标识符(identifier)必须是我们新建的文件夹的名字(在这里的示范中是imyoona_files)。然后添加所用到的模块信息。我们这里只需在主导航栏里添加一个菜单项,所以模块类型是主导航项目。程序模块名是前面我们加的第一个文件的名字(files),链接名称是文库。 2)在界面-导航设置-主导航里设置新菜单项在主导航里的位置:显示顺序, 这里我们把它设为20,所以它将出现在现有主导航的末尾。启动插件后,我们就可以在门户页上看到新添加的菜单项。 点击这个菜单项就到了新的一个网页,这个网页有通常的顶部和底部。虽然里面几乎没有内容,但是可以看到我们第二个文件里echo的文字(Test)。 另一种办法是建一个快捷导航项目,然后进界面-导航设置-快捷导航里设置新菜单项在主导航里的位置和导航图标。 这样做的好处是只有登陆用户可以进入快捷导航。 下面我们介绍本插件的具体功能。 我们的这个功能分三个组成部分: 1)用户选择和上传新文件的界面 2)在服务器端得到并储存上传后的文件 3)用户已上传文件的列表,点击可打开文件 1)用户选择和上传新文件的界面 我们用最简单的HTML内置的上传功能:在模板里加入 选择要上传的文件: $msg 2)在服务器端得到并储存上传后的文件 我们得决定储存文件的地方,在这里我们在data文件夹里添加一个uploadfiles子夹,然后在它的下面给每个用户按他们的用户UID建一个子夹储存他们各自上传的文件。 $dir='data/uploadfiles/'; if (!file_exists($dir)) mkdir($dir); $udir = $dir.$_G .'/'; if ($_FILES ) { $msg = $_FILES ; } elseif ($_FILES ) { if ($_G ) { if (!file_exists($udir)) mkdir($udir); move_uploaded_file($_FILES , $udir.$_FILES ); $msg = 'Upload Successful'; } } 3)用户已上传文件的列表,点击可打开文件 if ($_G ) { $existingfiles = array_filter(scandir($udir), function($item) { return !is_dir($udir.$item); }); } 现存文件列表: $value PHP在Windows服务器上好象对存UTF-8文件有问题,在Windows Explorer里看是乱码,但却还是能正确显示在网页上。可以考虑另起文件名,而将原名存入数据库,这需要用个新的数据表。 在Linux服务器上一切正常。 下面是这个网页在iPad上的样子: 上面我们用的上传工具是html的file部件。这个办法非常原始,有着诸多缺陷,如每次只能上传一个文件,无法显示上传进度,必须更新整个网页等。Discuz软件利用基于Flash技术的swfupload组件来上传图片等文件。这里我们用它来举个最简单的上传例子。 0) this.startUpload(); }, upload_success_handler: function (file, data) { var ml = document.getElementById("msg"); var li = document.createElement("li"); li.innerHTML = "文件 " + file.name + " 上传成功"; ml.appendChild(li); } } new SWFUpload(options); 即便是这个很简单的例子也有些优点,一是可以选择多个文件上传,二是不用更新网页。这个办法也有一大缺点,正因为它是基于Flash的,所以在iPad上不工作。 最后我们给出用百度团队新开发的上传组件WebUploader( 链接 )来替代SWFUpload的代码: 1。files.inc.php: 2。files.htm: 选择文件上传 var uploader = WebUploader.create({ auto: true, // 自动上传 swf: 'source/plugin/upload_files/webuploader/Uploader.swf', // swf文件路径 server: 'plugin.php?id=upload_files:files', // 文件接收服务端 pick: '#picker', // 选择文件的按钮 resize: false, // 不压缩image accept: { // 只允许选择文件,可选 title: 'Images', extensions: 'gif,jpg,jpeg,png', mimeTypes: 'image/*' } }); uploader.on('uploadBeforeSend', function (obj, data) { data.id = 'upload_files:files'; // 扩展data对象,就会作为附带参数发过去 }); uploader.on('uploadSuccess', function (file, data) { jQuery('#msglist').append(' ' + (data.msg ? data.msg : '上传成功') + ' '); }); uploader.on('uploadError', function (file) { alert('Upload Failed'); }); 注意我们在上传之前改了表单数据里ID的值,这是因为服务器端用这个值来决定哪个插件来处理这个请求。Discuz要求将这个插件名通过querystring送给服务器,但不幸的是WebUploader在表单数据也带了自己生成的ID值,而Discuz优先使用了后者,因而就找不到插件了。我们这样做就把后者也改成所需的插件名了。 主导航和快捷导航里的链接对应的内容一般都是与任何用户无关或者取决于当前用户。它不适合于提供对当前用户可以选择的某一用户有关的内容。如果文库是给自 己用的,前者足以,如果是给他们直接浏览,则只要对上面的代码略做修改,将当前用户选择观看的用户的编号传给服务器端,困难的是需要把这个功能加到个人空 间的主导航里,这是由装扮空间里的选项决定的。而那里的选项是固定的,要这么做必须改变源码。在template\default\home \spacecp_index.htm 165行$_GET == 'editnv'后。 参考文献: 1)Discuz!模板解析语法 http://dev.discuz.org/wiki/?title=Discuz!%E6%A8%A1%E6%9D%BF%E8%A7%A3%E6%9E%90%E8%AF%AD%E6%B3%95 2)php file upload introduction http://www.w3schools.com/PHP/php_file_upload.asp 3)php file list in a directory http://www.w3schools.com/php/func_directory_scandir.asp http://stackoverflow.com/questions/11886712/how-would-i-get-scandir-to-echo-links-to-files 4)php how to delete a file http://stackoverflow.com/questions/2371408/how-to-delete-a-file-via-php 5)php create directory if not exists http://www.hotscripts.com/forums/php/25915-solved-check-if-directory-exists-if-not-create.html prettyPrint(); 6)SWFUpload V2.2.0 说明文档 http://leeon.me/upload/other/swfupload.html 7)文件上传利器SWFUpload入门简易教程 http://blog.goodje.com/2010-05/swfupload-sample-tutorial.html 注:在本文中的代码中,在<符号和a字符相连的地方在两者之间加了一个不应该有的空格,以避免Discuz在保存日志时自动改变日志内容。
个人分类: Discuz|5632 次阅读|10 个评论
分享 Discuz插件开发:如何开发插件
热度 2 天香公主 2014-1-11 11:36 PM
Discuz插件开发:如何开发插件
如何开发Discuz插件(一) 一个插件(plugin)包含了一些代码文件和一个设置文件。Discuz的管理中心里提供了帮助建立插件设置的工具。首先在config\config_global.php里加入下列一行: $_config = 1; 后,在管理中心的应用-插件页里的插件列表旁就出现了一个新的选项叫设计新插件。在这里就可以开发自用或它用的新插件。在新插件的设计中,得给插件一个唯一标识符(identifier),我将它设为imyoona_test1。它决定了我们所有与这个插件有关的文件将放在source\plugin里的以这个唯一标识符为名的子目录里。 一个插件可以包括多种不同性能的模块,这里我们造一个包含页面嵌入模块(即把要添加的内容显示在某个现有网页的指定位置上)的插件。我们得指明包含插件程序模块的文件名。 当填完相关信息后,最后点击启用后,就能使用这个插件了。但是我们只是完成了插件的设置,也就是说将插件的一些信息告诉了Discuz系统,还没有开发该插件的功能。注意it是我们随意给的文件名,但其包含的类的名称却另有规定,见下文。 接下来我们要造有关的文件并加入代码。 这个it.class.php文件的名字是在设置时规定好的。这里面的类名也是有规定的:plugin_插件唯一标识符. pre { white-space: pre-wrap; display: block; border: 1px solid lightgrey; padding: 5px;} class plugin_imyoona_test1 { function global_header() { return "Hello World"; } } 这个类名符合了要求,那里面的函数又会如何被使用呢?这涉及到一个概念叫嵌入点(又名钩子)。Discuz的网页模板里包含了很多个可以添加内容的嵌入点。当我们把前面config里的那个值改为2以后,我们就能在页面上看到这些嵌入点。(注意改成2后要在管理中心里更新缓存才能在界面上看到所有的嵌入点) 其中一个嵌入点叫global_header,这就是在我们的类里加这样的名字的函数的原因。它的返回值会显示在网页上那个嵌入点的位置里。有两类嵌入点。一类叫全局嵌入点,如global_header,它存在于每个网页上。还有一种是非全局嵌入点,它们只存在于某个网页。如space_blog_title只存在于日志页里。这样的嵌入点得定义在前面的类的一个扩展类里,它的类名必须是基类名加 底线 再加程序块名,这里是home: class plugin_imyoona_test1_home extends plugin_imyoona_test1 { function space_blog_title() { return "Hi"; } } 将config里的值改为0后就能看到这个插件给网页带来的变化。 注意对非全局的某个页面相关的模块的类名和函数名也规定了必须遵守的命名规则: 类名: plugin_插件唯一标识符_CURSCRIPT 函数名: CURMODULE_嵌入点名 在这里CURSCRIPT是home, CURMODULE是space 一个插件可以有多个模块。模块的类型有多种。上面我们讨论的是页面嵌入。我们还可以有扩展项目和程序链接。 程序链接让我们将菜单项目添加在各种导航菜单上。 注意家园导航指的是下图左侧的竖立的菜单,而不是横放的菜单。 当我们加入家园导航项目模块时,没有显示顺序的选择。这得到界面-导航设置-家园导航里去设置,注意新加的家园导航项目模块已经自动的被加在名单里了。 在这页上也可以直接添加导航项目,与导航项目模块的不同,我的理解是前者适合自用,后者可以成为第三方插件。 上面我们介绍的是开发并使用一个插件的基本步骤。如果我们要把自己开发的插件给别人用的话该怎么办呢?在插件设计里有个导出xml的功能,它将插件的设置信息都放入了这个xml文件里。将这个xml文件放入上面提到的该插件所在的目录,然后将该目录里的所有内容交给对方,放入对方网站与上面说的同样的地方,然后从他的管理中心里启动后就能用了。 参考资料: 1。Discuz!插件开发手册 http://faq.comsenz.com/library/plug/plugin/plugin_pre.htm 2。Discuz! 技术文库 http://dev.discuz.org/wiki/index.php 3。2013年第一届Discuz!插件制作开发培训视频 http://v.youku.com/v_show/id_XNTMwNTI3NzU2.html
个人分类: Discuz|29727 次阅读|4 个评论

小黑屋|Archiver|彼岸网  

Powered by Discuz! X3.1 © 2001-2014 Comsenz Inc.
GMT-4, 2026-5-24 10:39 PM , Processed in 0.034352 second(s), 21 queries.

返回顶部