彼岸网

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

tag 标签: 图片

相关帖子

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

没有相关内容

相关日志

分享 Discuz功能改进:切换宽/窄图片变形问题
carry0987 2016-7-3 01:45 PM
之前看到了2013年的一篇文章...(在这里 https://daxingplay.me/study/css/a-nav-with-auto-width.html) 里面提到了能够将导航栏的位置切换问题修正,但却只用于x1.5 不知是否能够运用在x3.2首页的图片轮播上? 首页的图片轮播宽窄切换后: 窄 宽 后来,问过天香后,天香给出的解决方案: 宽版和窄版的区别在于它加载一个额外的css文件widthauto.css,所以我们可以在template/default/common/widthauto.css加入控制图片幻灯模板里元素长度的风格: ul.slideshow li, ul.slideshow li a img { width: 100% !important; } 更新缓存后应该可以达到需要的效果,如果不完全满意的话,试试微调其中的百分比 现在图片区的问题解决了,不过,还有一个问题,DIY按钮会与导航栏冲突: 当使用窄版时,DIY的设置按钮不会与导航栏冲突,但是当我切换置宽版时,因为导航栏被放大至右边,导致与DIY的设置按钮冲突,不知是否能够将DIY的按钮移置左边?我找了模版的CSS文件,却没找到空置DIY按钮位置的代码,倒是在开发人员控制台下,找到控制的代码,但是不知道在哪个文件里面 窄: 宽: 找到的控制代码,調整top中的數值及可調整按鈕位置: DIY按钮元素定义在 template/default/common/header_diynav.htm里,它的风格定义在 template/default/common/common.css 里, 將top 0改成top 40即可 Finish!!!
个人分类: Discuz 研究|343 次阅读|0 个评论
分享 Discuz功能改进:设置论坛主题帖中的网络图片成为主题图
热度 2 夙興夜寐罔徒勞 2016-6-27 10:33 PM
Discuz功能改进:支持主题帖中的将网络图片(包括相册图片)设置为主题图( 定义见此 ) 借鉴天香公主写的 关于封面图的选择和储存,首先对 source/class/extend/ extend_thread_image.php 进行分析。其中的 after_newthread函数是对发新帖时主题图和封面图的处理。原始代码如下: if($threadimageaid) { //如果主题帖中存在附件图片的话 if(!$threadimage) { $threadimage = C::t('forum_attachment_n')-fetch('tid:'.$tid, $threadimageaid); //从附件数据表(forum_attachment_n)中提取对应帖子相关附件图的信息 } $threadimage = daddslashes($threadimage); C::t('forum_threadimage')-insert(array( //在论坛主题图数据表(forum_threadimage)中新建一行数据 'tid' = $tid, 'attachment' = $threadimage , //附件名字 'remote' = $threadimage , //0为本地附件图片,1为远程附件图片 )); } 我做的修改是在其后,加上一个对于网络图片的查询和处理。考虑到只要一个封面图就够了,所以使用的是preg_match函数,查询到主题帖中的第一个网络图(包含相册图)即停止。 else{ preg_match("/(\ |\ \d{1,4}\])\s*( +?)\s*\ /is", $this-param , $matches); //找到一个网络图 if(!empty($matches)) { //之前少了这个判断,导致木有图片的新帖子也会在forum_threadimage中新建一行空白数据 C::t('forum_threadimage')-insert(array( // 在论坛主题图数据表(forum_threadimage)中新建一行数据 'tid' = $tid, 'attachment' = $matches , 'remote' = 97, //remote变量类型是 tinyint(1),考虑到远程附件服务器的个数,使用97来代表网络图片,应该不会有所冲突 )); } } 以上是对新建主题帖的处理,原则是如果有附件图片,优先选择附件图片,否则(else)查询主题帖中的网络图片。 接下去,发现 source/class/extend/ extend_thread_image.php文件中,还有一个针对编辑已有主题帖的函数 before_editpost($parameters),其中传入的参数来自于/source/include/post/post_edit.php,包括接下去要是用的$parameter-$message变量。 before_editpost 的 原始代码中有一段是: if($isfirstpost $attachupdate) { //判断是否是主题帖的第一楼以及是否有附件的更新 if(!$this-param ) { $this-param = C::t('forum_attachment_n')-fetch_max_image('tid:'.$this-thread , 'pid', $this-post ); $this-param = $this-param ; } if($this-forum ) { if(empty($this-thread )) { setthreadcover($this-post , 0, $this-param ); } else { setthreadcover($this-post , $this-thread , 0, 1); } } if($this-param ) { if(!$this-param ) { $this-param = C::t('forum_attachment_n')-fetch_max_image('tid:'.$this-thread , 'tid', $this-thread ); } C::t('forum_threadimage')-delete_by_tid($this-thread ); C::t('forum_threadimage')-insert(array( 'tid' = $this-thread , 'attachment' = $this-param , 'remote' = $this-param , )); } } 以上针对新的附件上传情形进行处理,并未对新的网络图片增加进行考虑,所以在这个if语句后面加上一段: elseif($isfirstpost) { //判断是否为主题帖的第一楼层, 注意进入这个个子块的前提是附件并未作出修改 preg_match("/(\ |\ \d{1,4}\])\s*( +?)\s*\ /is", $parameters , $matches); if(!empty($matches)) { C::t('forum_threadimage')-delete_by_tid($this-thread ); //无论原先是以附件图片还是网络图片为封面帖,都会删除 C::t('forum_threadimage')-insert(array( //改用主题帖中的网络图片为封面帖 'tid' = $this-thread , 'attachment' = $matches , 'remote' = 97, )); } else{ //还有一种情形,原先有网络图的,后来网络图删掉了 $threadnet =DB::fetch_first("SELECT * FROM ".DB::table('forum_threadimage')." WHERE tid='{ $this-thread } '"); if($threadnet == 97) { //判断原先的封面图是否为网络图片 C::t('forum_threadimage')-delete_by_tid($this-thread ); } } } 这么处理的原则是优先考虑新增的附件图片,如果没有则查询网络图片,将其设置为主题图。 到这里差不多就要完成了,最后一步到论坛首页 / source/module/forum/ forum_index.php 里的四格功能(grid)进行下小小的修改。原始代码如下: if($images ] ) { //判断是否为远程附件图片 $imageurl = $_G .'forum/'.$images ] ; } 现在在里面分成两种情形: if($images ] ) { if($images ] !=97) //判断是否为网络图片 $imageurl = $_G .'forum/'.$images ] ; else $imageurl = $images ] ; } 这样就可以~\(≧▽≦)/~啦啦啦 Ps: 2016年6月29日 修改部分用蓝色标识——正如天香公主所说的缺少了是否存在网络图片的判断,导致无论如何,都会在forum_threadimage当中新建一行数据。。。另外在编辑旧帖的时候,多考虑了一种情形:如果原先是网络图片为封面图,后来主题帖删除了网络图片链接,则在主题帖的封面图也应该同步更新。
个人分类: Discuz|5828 次阅读|73 个评论
分享 Discuz功能改进:论坛日志记录文章的一键帖
热度 5 天香公主 2016-5-13 09:02 AM
Discuz功能改进:论坛日志记录文章的一键帖
Discuz功能改进:支持论坛日志记录文章的一键帖 过去写的一篇介绍在记录里将用户填写的图片和油管地址在显示时自动转换成对应的图片和嵌入油管视频的方法(称为一键贴)的博文( 链接 )近来受到了几位网友的认可和兴趣,所以在这里我把类似的对多种多媒体资源由地址转换成嵌入资源的函数贴出来和网友交流,并介绍下如何在日志,文章和论坛里使用它。 这个函数叫 url2html,它将地址转换成html元素,所以自然第一个参数是地址,第二个参数取值0或1代表了被嵌入的区域的类型。我将区域分成主要区域(日志正文,文章正文,论坛主题贴和跟贴),和次要区域(日志评论,文章评论,记录正文和回复),因为不同的区域类型各有各的合理显示方式,比如一个pdf文件地址在日志正文里应该显示成嵌入pdf显示在日志内,而在记录里因为空间的限制也许显示成超链接更恰当。 1)支持的资源类别,视频网页地址,视频地址 资源类型 备注 举例 图片 以.gif, .jpeg, .jpg, .png结尾的文件 http://budgetstockphoto.com/samples/pics/stones.jpg PDF 以.pdf结尾的文件 http://www.pdf995.com/samples/pdf.pdf 音乐 以.mp3, .wav, .wma结尾的文件 http://www.tonycuffe.com/mp3/tail%20toddle.mp3 http://www.music.helsinki.fi/tmt/opetus/uusmedia/esim/a2002011001-e02.wav http://www.theflute.co.uk/media/BachCPE_SonataAmin_1.wma 视频 以.mp4, .webm, .ogv, .swf, .flv, .wmv结尾的文件 http://techslides.com/demos/sample-videos/small.mp4 http://techslides.com/demos/sample-videos/small.webm http://techslides.com/demos/sample-videos/small.ogv http://www.flashppt.com/images/tangramone.swf http://techslides.com/demos/sample-videos/small.flv http://www.educationalquestions.com/video/ELL_PART_5_768k.wmv YouTube视频 视频网页地址 https://www.youtube.com/watch?v=MD5bFCDfySc https://m.youtube.com/watch?v=MD5bFCDfySc https://youtu.be/MD5bFCDfySc 视频地址 https://www.youtube.com/embed/MD5bFCDfySc https://www.youtube.com/v/MD5bFCDfySc DailyMotion视频 视频网页地址 http://www.dailymotion.com/video/x4xvnz_the-funny-crash-compilation_fun http://dai.ly/x4xvnz 视频地址 http://www.dailymotion.com/embed/video/x4xvnz Vimeo视频 视频网页地址 https://vimeo.com/110145104 视频地址 https://player.vimeo.com/video/110145104 我乐视频 视频网页地址 http://www.56.com/u75/v_MTE3ODg5ODgw.html 视频地址 http://www.56.com/iframe/MTE3ODg5ODgw 哔哩哔哩视频 视频网页地址 http://www.bilibili.com/video/av1286985 http://www.bilibili.com/video/av1286985/index_2.html Flash视频地址 http://static.hdslb.com/miniloader.swf?aid=1286985page=2 凤凰视频 视频网页地址 http://v.ifeng.com/documentary/figure/201605/0362ac12-fd5d-4a16-b836-378c61543ca0.shtml Flash视频地址 ( 寻找方法 ) http://v.ifeng.com/include/exterior.swf?guid=0362ac12-fd5d-4a16-b836-378c61543ca0AutoPlay=false 爱奇艺视频 Flash视频地址 ( 寻找方法 ) http://player.video.qiyi.com/4b40896a102b47584f9573b76b093fa3/0/0/v_19rrlty944.swf-albumId=482534600-tvId=482534600-isPurchase=0-cnId=25 酷6视频 视频网页地址 http://v.ku6.com/show/Es8Bn14RwCZKOS7Lz4ts3Q...html?hpsrc=1_25_1_2_0# http://v.ku6.com/special/show_2562886/SoGnlFVxjStPTJmQ.html Flash视频地址 ( 寻找方法 ) http://player.ku6.com/refer/Es8Bn14RwCZKOS7Lz4ts3Q../v.swf 腾讯视频 视频网页地址 http://v.qq.com/page/q/v/6/q0149bzkuv6.html http://v.qq.com/cover/4/44q2pgwf0tb6hsq.html?vid=y0016wcg0ot http://m.v.qq.com/play/play.html?coverid=vid=z0197m8xrv3 视频地址 http://v.qq.com/iframe/player.html?vid=q0149bzkuv6 新浪视频 视频网页地址 http://video.sina.com.cn/view/250587748.html Flash视频地址 ( 寻找方法 ) http://video.sina.com.cn/share/video/250587748.swf 搜弧视频 Flash视频地址 ( 寻找方法 ) http://share.vrs.sohu.com/3029619/v.swftopBar=1autoplay=falseplid=1000083pub_catecode=0from=page 土豆视频 视频网页地址 http://www.tudou.com/programs/view/xGgArUMPw9I http://www.tudou.com/listplay/Q0MiBE2DPCs/NQjV-Amh1ac.html Flash视频地址 http://www.tudou.com/programs/view/html5embed.action?code=xGgArUMPw9I http://www.tudou.com/l/Q0MiBE2DPCs/iid=132813935resourceId=0_04_05_99/v.swf 优酷视频 视频网页地址 http://v.youku.com/v_show/id_XMTgyMzE0NzE2.html Flash视频地址 ( 寻找方法 ) http://player.youku.com/player.php/sid/XMTgyMzE0NzE2/v.swf 对内容里不符合上述规律的其它地址,我们都转换成了超链接。在不支持Flash的机器如iPad和iPhone上,Flash地址也转换成超链接而不是嵌入资源。 对大多数视频网站,我们可以通过对视频网页的地址的解析找到对应的视频地址。对这样网站,用户只需填写视频网页的地址。但也有些网站,我们需要用户在视频网页上找到对应的视频地址,一般这个信息可以点击网页上的'分享'找到,我文中加了些各个网站的图示。 2)对Discuz代码的修改来使用这个函数,两种方式(用和不用mejs) xmp { white-space: pre-wrap; display: block; background-color: lightgrey; border: 1px solid darkgrey; } table { border-color: darkgrey; } a) 在论坛里支持一键贴 在文件 source/function/function_discuzcode.php 修改函数parseurl $length) { $text = substr($url, 0, intval($length * 0.5)).' ... '.substr($url, - intval($length * 0.3)); } return ' '.$text.' '; } else { $url = substr($url, 1); if(substr(strtolower($url), 0, 4) == 'www.') { $url = 'http://'.$url; } $url = !$scheme ? $_G .$url : $url; return ' '.$text.' '; } } 将原来贴子在显示时的自动加链机制去掉,加上我们的一键贴: function parseurl($url, $text, $scheme) { global $_G; if(!$url && preg_match("/((https?|ftp|gopher|news|telnet|rtsp|mms|callto|bctp|thunder|qqdl|synacast){1}:\/\/|www\.) +/i", trim($text), $matches)) { $url = $matches ; } else { $url = substr($url, 1); if(substr(strtolower($url), 0, 4) == 'www.') { $url = 'http://'.$url; } $url = !$scheme ? $_G .$url : $url; } require_once libfile('function/url2html'); return url2html_url($url, 0); } b) 在日志正文里支持一键贴 在文件 source/include/space/space_blog.php 下面这段代码 require_once libfile('function/blog'); $blog = blog_bbcode($blog ); 后加入 require_once libfile('function/url2html'); $blog = url2html($blog , 0); c) 在日志评论里支持一键贴 c1) 在文件 source/include/space/space_blog.php 下面这段代码 fetch_all_by_id_idtype($id, 'blogid', $start, $perpage, $cid); foreach($query as $value) { 后加入 require_once libfile('function/url2html'); $value = url2html($value ); c2) 在文件 source/include/misc/misc_ajax.php 下面这段代码 fetch_latest_by_authorid($_G , $cid); 后加入 require_once libfile('function/url2html'); $value = url2html($value ); c3) 为支持一键贴,需要去掉Discuz在评论储存前对URL的自动加链的功能因为将在显示前加:在文件 source/class/class_bbcode.php 里的函数 bbcode2html 的下面这段的最后一句去掉 search_exp \s*( +?)\s*\ /ies"; $this->replace_exp = "/\ \s*( +?)\s*\ /ies"; $this->replace_exp .text); } 并在函数 comment_add 里的下面这段 x.get('home.php?mod=misc&ac=ajax&op=comment&inajax=1&cid='+id, function(s){ newdl.innerHTML = s; 后加入 runScript(newdl); 类似的在函数 comment_edit 里的下面这段 x.get('home.php?mod=misc&ac=ajax&op=comment&inajax=1&cid='+ cid, function(s){ obj.innerHTML = s; 后加入 runScript(obj); d) 在文章正文里支持一键贴 在文件 source/module/portal/portal_view.php 下面这段代码 require_once libfile('function/blog'); $content = blog_bbcode($content ); 后加入 require_once libfile('function/url2html'); $content = url2html($content , 0); e) 在文章评论里支持一键贴 e1) 在文件 source/module/portal/portal_view.php 里下面这段代码 $hash = md5($article ."\t".$article ); 之前加入 $value) { $commentlist = url2html($value ); } e2) 我们要控制一下评论里贴图的最大宽度,这可以在风格文件template/default/common/common.css里实现,也可以仿照日志里的做法在文件 template/default/portal/view.htm 的底部下面这句代码 上面加入: resizeImg('comment_ul','450'); 代码下载 1)利用了mejs的一键贴 (Discuz3.2): http://www.bian-wang.com/discuz/data/userupload/10005/url2html_with_mejs.zip (02/07/2017更新) 更新记录: 02/07/2017: 加入对PHP7的支持 05/05/2018: 加入Discuz3.4简体中文UTF8版本 2)不用mejs的一键贴:
个人分类: Discuz|7231 次阅读|49 个评论
分享 测试:将网页图片横向显示并向左滚动
热度 3 东风 2016-3-5 06:34 PM
原来北美生活网上的首页“图个痛快”模块一直图片不动, 很呆板, 周末测试了个模块编码---分别在博客/论坛/门户频道测试, 都没有问题-----如 北美生活网博客页 , 特来这里分享: FONT size=2div id="colee_left" style="overflow:hidden;width:100%;" class="module cl ml" table cellpadding="0" cellspacing="0" border="0" trtd id="colee_left1" valign="top" align="center" table cellpadding="2" cellspacing="0" border="0" tr align="center" ul td li style="width: {picwidth}px;" a href="{url}"{target}img src="{pic}" width="{picwidth}" height="{picheight}" alt="{title}" //a pa href="{url}" title="{title}"{target}{title}/a/p /li/td /ul /tr /table /td td id="colee_left2" valign="top"/td /tr /table /div script var speed=30//速度数值越大速度越慢 var colee_left2=document.getElementById("colee_left2"); var colee_left1=document.getElementById("colee_left1"); var colee_left=document.getElementById("colee_left"); colee_left2.innerHTML=colee_left1.innerHTML function Marquee3(){ if(colee_left2.offsetWidth-colee_left.scrollLeft=0) colee_left.scrollLeft-=colee_left1.offsetWidth else{ colee_left.scrollLeft++ } } var MyMar3=setInterval(Marquee3,speed) colee_left.onmouseover=function() {clearInterval(MyMar3)} colee_left.onmouseout=function() {MyMar3=setInterval(Marquee3,speed)} /script/FONT 真对不起, 我还不知道如何将引用代码进入博客 , 如需要使用, 直接复制下面的就可以 FONT size=2div id="colee_left" style="overflow:hidden;width:100%;" class="module cl ml" table cellpadding="0" cellspacing="0" border="0" trtd id="colee_left1" valign="top" align="center" table cellpadding="2" cellspacing="0" border="0" tr align="center" ul td li style="width: {picwidth}px;" a href="{url}"{target}img src="{pic}" width="{picwidth}" height="{picheight}" alt="{title}" //a pa href="{url}" title="{title}"{target}{title}/a/p /li/td /ul /tr /table /td td id="colee_left2" valign="top"/td /tr /table /div script var speed=30//速度数值越大速度越慢 var colee_left2=document.getElementById("colee_left2"); var colee_left1=document.getElementById("colee_left1"); var colee_left=document.getElementById("colee_left"); colee_left2.innerHTML=colee_left1.innerHTML function Marquee3(){ if(colee_left2.offsetWidth-colee_left.scrollLeft=0) colee_left.scrollLeft-=colee_left1.offsetWidth else{ colee_left.scrollLeft++ } } var MyMar3=setInterval(Marquee3,speed) colee_left.onmouseover=function() {clearInterval(MyMar3)} colee_left.onmouseout=function() {MyMar3=setInterval(Marquee3,speed)} /script/FONT 如何使用--------后台---门户---模块模板---添加----文章/帖子/日志, 选择其中之一(彼岸网因为只开了博客----可以选择日志模块或图片模块, 前者是博客文章的图片, 后者是相册的图片 但是一个网页里面不能同时含有两个上述的滚动模块。 仔细地看, 大家会发现 北美生活网的首页 却有两个滚动的图片模块, 其实一个是我使用上面的css模块实现的, 另一个则是用 jQuery y来实现的。后者比较复杂涉及修改原代码, 而且效果不咋样(没有标题), 是我第一次测试使用, 就不赘言了 首发彼岸网~ var speed=30//速度数值越大速度越慢 var colee_left2=document.getElementById("colee_left2"); var colee_left1=document.getElementById("colee_left1"); var colee_left=document.getElementById("colee_left"); colee_left2.innerHTML=colee_left1.innerHTML function Marquee3(){ if(colee_left2.offsetWidth-colee_left.scrollLeft<=0) colee_left.scrollLeft-=colee_left1.offsetWidth else{ colee_left.scrollLeft++ } } var MyMar3=setInterval(Marquee3,speed) colee_left.onmouseover=function() {clearInterval(MyMar3)} colee_left.onmouseout=function() {MyMar3=setInterval(Marquee3,speed)}
个人分类: Discuz学习|1663 次阅读|12 个评论
分享 从代码修改到插件开发:封面插件
热度 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功能改进:将网络图片设为文章封面
热度 2 天香公主 2016-2-15 01:23 PM
Discuz功能改进:支持将网络图片和油管视频缩影图设为文章封面 Discuz里的文章功能提供了站方一个有序发布资讯如新闻的合适场所。很多网站里的文章都是转载其它网站的内容。文章可以按类别聚合到首页去,Discuz提供了图文模版可以在那里显示文章中的一幅图称为封面图。但现有的功能有个缺陷是封面图只能是在该文章中上传的图片,不仅其它网站的图片连自己网站上现有的图片虽然可以放入文章中,但都成不了封面图。作者为了给文章加封面图不得不将网络图片下载再上传到文章里,这不是种理想的做法,它不必要的占用了过多的网站资源。本文来探讨下如何修改Discuz来让作者可以直接用网络图片当封面图。 先记录下文章编辑页上有关部件的代码文件名和相关代码: xmp { white-space: pre-wrap; display: block; background-color: lightgrey; } 文章编辑页 portalcp_article.htm 编辑工具栏 home_editor.php, 工具栏上的'添加图片'图标的定义是: < a href="javascript:;" class="icoImg" id="icoImg" onClick="parent.createImageBox( );return false;" title=" 对点击工具图标的处理 editor_function.js function createImageBox(fn) 文章提交按钮 portalcp_article.htm {lang submit} 添加图片弹窗及其Tabs home/editor_image_menu.htm ... {lang upload_pic} {lang upload_pic} 添加图片弹窗中上传图片Tab里的内容 home/editor_image_menu.htm 按浏览器是否支持Flash显示下面两者之一: ... $article ... $article 添加图片弹窗中上传图片Tab里内容的数据来源 portalcp_article.php fetch_all_by_aid($aid) as $value) { ... $attachs = get_upload_content($attachs); } function_portalcp.php function get_upload_content($attachs, $dotype) 了解了相关代码的位置,我们就知道要从何着手了。 1。支持将网络图片做为封面图 当作者点击编辑工具栏里的'添加图片'按钮时,分析当前文章的内容,找到其中所有的网络图片,在添加图片弹窗里加入网络图片供作者选择封面图 1a) 在文件 static/image/editor/editor_function.js 里要修改一个函数并添加两个新函数。首先在函数 createImageBox 里开始部分 if (typeof fn == 'function' && !fn()) { return false; } 后加入: 0; i--) { d.removeChild(dts ); } if (dts.length==0) { var tableObj = document.createElement('table'); tableObj.className = 'imgl'; tbodyObj = document.createElement("TBODY"); tableObj.appendChild(tbodyObj); d.appendChild(tableObj); } var tableObj = document.createElement('table'); tableObj.className = 'imgl'; var html = ''; for (var i = 0; i < imgs.length; i++) { var thisConver = getExternalImageConver(imgs ); var check = (conver == thisConver) ? 'checked' : ''; if (i % 4 == 0) html += ' '; html += ' \ \ \ \ \ 设为封面 \ \ '; if (i == imgs.length - 1) { for (var j = 0; j < (4 - i % 4) ; j++) { html += ' '; } } if (i % 4 == 3 || i == imgs.length - 1) html += ' '; } tableObj.innerHTML = html; d.appendChild(tableObj); } 另外在该文件里加入下面两个新函数: function getExternalImageConver(img) { return 'a:3:{s:3:\"pic\";s:' + img.length + ':\"' + img + '\";s:5:\"thumb\";s:1:\"0\";s:6:\"remote\";s:1:\"1\";}' } function getExternalImages() { var hc = $('uchome-ttHtmlEditor').value; var imgs = +src=( )?(https?:\/\/ +)\1? *\/?>/g; while (m = rex.exec(hc)) { var url = m ; if (imgs.indexOf(url) == -1) imgs.push(url); } return imgs; } 注意在Discuz代码多处有个将封面cover写成conver的typo,所以我们也照此处理。 1b) 我们还要修改文章列表页里得到封面图的代码。在文件 source/function/function_home.php 中的函数 pic_get 里的开始部分 global $_G; $url = $filepath; 后加入 if (preg_match('/^https?:\/\//', $url)===1) return $url; 1c) 我们还要修改DIY模块里得到封面图的代码。在文件 source/function/function_block.php 中的函数 block_template 里将下面这句 } elseif($field == 'pic') { 改为 } elseif($field == 'pic' && preg_match('/^https?:\/\//', $replacevalue)!==1) { 2。支持默认封面图 现在Discuz只支持将上传图片为设为封面图,而且自动将第一幅上传的图片设为封面图。现在我们要支持网络图片,在用户不人为设置封面图时最好也能自动选择文中的第一幅网络图片做为封面图。做这个工作的合适时机是当用户点击'提交'按钮后 2a) 在文件 template/default/portal/portalcp_article.htm 中的函数 validate 里在下面这句 edit_save(); 后加入 setDefaultConver(); 2b) 在文件 static/image/editor/editor_function.js 里添加下面这个新函数: 0; i--) { d.removeChild(dts ); } var imgbtns = d.getElementsByTagName('input'); for (var i = 0; i 0) $('conver').value = imgConvers ; } } 3。支持清空封面图 如果我们依据文章里的网络图片设置了封面图,但后来作者修改了文章把那幅图去掉了,那我们怎么能更新封面图的设置呢?2b) 里引入的新函数 setDefaultConver 已经在这种情形下在客户端按情况清空了封面图或选择了文中另一幅图当封面图。但我们还需要支持在服务器端支持清空封面图:在文件 source/include/portalcp/portalcp_article.php 的下面这段 if($_GET ) { $converfiles = dunserialize($_GET ); $setarr = $converfiles ; $setarr = intval($converfiles ); $setarr = intval($converfiles ); } 后加入 else { $setarr = ''; $setarr = 0; $setarr = 0; } 4。支持将油管视频的缩影图做为封面图 我们还可以用文章中的油管视频做为封面图。在1a)里在文件 static/image/editor/editor_function.js 中引入的新函数 getExternalImages 的最后一句 return imgs; 前加入 // youtube video var rex = /https?:\/\/ +/ig; while (m = rex.exec(hc)) { var url = m ; var vid = ''; // e.g. https://www.youtube.com/embed/MD5bFCDfySc // e.g. https://www.youtube.com/v/MD5bFCDfySc var rex2 = /youtube.com\/(embed|v)\/( +)/i; m2 = rex2.exec(url); if (m2) vid = m2 ; // e.g. https://youtu.be/MD5bFCDfySc var rex2 = /youtu.be\/( +)/i; m2 = rex2.exec(url); if (m2) vid = m2 ; // e.g. https://www.youtube.com/watch?v=MD5bFCDfySc // e.g. https://m.youtube.com/watch?v=MD5bFCDfySc var rex2 = /youtube.com\/watch\?( +)/i; m2 = rex2.exec(url); if (m2) { var qs = m2 .split('&'); for (var i in qs) { if (qs .substring(0, 2) == 'v=') { vid = qs .substring(2); } } } if (vid) { url = 'https://img.youtube.com/vi/' + vid + '/0.jpg'; if (imgs.indexOf(url) == -1) imgs.push(url); } } 4/12/2016 补充:如何在提交文章里自动下载远程图片到本站 感觉用网络图片当封面有利有弊,缺点是网络图片随时可能会消失,还有就是图片所在的网站国内网民不一定进得去。另一种确保文章有封面的处理方式是当保存文章时自动将文章里的所有图片都下载到本地,这样做的话就没有用网络图片当封面的必要了。这需要对文件 portalcp_article.htm做几处改动,首先引进一个变量 pa_downloading 来判断是否正在下载远程图片。然后将点击提交按钮后执行的函数 validate 一分为三: var pa_downloading=false; function validate(obj) { pa_downloading=true; downRemoteFile(); check_download_progress(obj); } function check_download_progress(obj) { if (pa_downloading) { setTimeout(function() { check_download_progress(obj); }, 1000); } else { validate_original(obj); } } function validate_original(obj) { var title = $('title'); if(title) { var slen = strlen(title.value); if (slen 80) { alert("{lang article_validate_title}"); title.focus(); return false; } } if(!check_catid()) { return false; } edit_save(); window.onbeforeunload = null; obj.form.submit(); return false; } 先执行下载远程图片函数 downRemoteFile,执行完毕后再执行原来的提交函数 validate。其中用了个定时器来检查下载是否完毕。那么我们怎么能知道下载完毕呢?所以最后还需要加另一个改动: 如果用这种处理方式的话,点击文章"提交"按钮后不要立刻换页,而应等到网页自动转到显示"发布文章成功"的信息页。 注:本文中的代码里的<符号如果后面的字符是a的话,在它们中间加了一个不应该有的空格,以避免Discuz在保存日志时自动改变日志内容。
个人分类: Discuz|2797 次阅读|12 个评论
分享 如何从其它网站导入博文和图片
admin 2015-10-12 10:28 PM
摘自天香公主《 Discuz功能改进:导入博文和图片 》 博主可以这样来将发表在其它网站的博文拷贝到本网站: 点击"发表新日志"按钮 点击"下载远程日志"按钮,在对话框里填写要下载的其它网站的博文的网址 点击"下载远程图片"按钮 点击"保存发布"按钮
1417 次阅读|0 个评论
分享 Discuz系统之上传功能(上)
天香公主 2014-1-19 07:27 PM
Discuz系统之上传功能(上)
本篇旨在比较论坛和日志里上传图片的功能的异同,和解释为何前者在iPad上工作而后者不工作的原因。 论坛的帖子编辑器和日志编辑器都有上传图片的功能,两者的界面非常接近又不完全相同。先看一下他们在我的计算机上的Firefox里的样子: 再看一下他们在iPad里的差异: 可以看出两点: 1)在iPad上没法在日志里添加图片因为没有选择文件上传的按钮,而在论坛里就有选择文件和上传功能,虽然是分成两步走 2)论坛里的添加图片界面在计算机上和IPAD上有所不同,一个是用Flash按钮,一个是用html按钮 所以论坛里的添加图片功能能按客户端的条件选择合适的界面,而日志里的添加图片功能就总是提供Flash按钮,因此无法在iPad上。这是有一个Discuz各部分不一致的地方,日志的功能没论坛强。 让我们来检查一下论坛功能。当网站收到用户的发贴请求如forum.php?mod=postaction=newthreadfid=66时,网站程序内部分派工作的次序 1 forum.php 2 分派给 source\module\forum\forum_post.php 3 分派给 source\include\post\post_newthread.php 4 数据取自 source\class\table\table_forum_post.php 5 格式定义在 template\default\forum\post.htm 6 加入了 template\default\forum\editor_menu_forum.php (包括上传图片的界面) 也是基于MVC,和我们以前讨论过的处理日志目录的请求的流程完全一致。 在格式文件template\default\forum\post.htm里的客户端程序里调用了JavaScript文件static\js\upload.js (通过 template/default/common/upload.htm)并用了其中的SWFUpload类。这个类造出来的对象产生了界面上的Flash object标签,并替代了原来的html内容。 这里用到的SWFUpload是一个第三方的工具: http://code.google.com/p/swfupload/ : SWFUpload is a JavaScript Library that wraps the Flash Player's upload function. It brings your uploads to the next level with Multiple File Selection, Upload Progress and Client-side File Size Checking . Unlike other Flash upload tools, SWFUpload leaves the UI in the developer's hands. Using a set of event handlers developers can display upload progress and status to the user in their own HTML/CSS UI. SWFUpload has been featured in such projects as YouTube and WordPress. http://code.google.com/p/swfupload/source/browse/swfupload/trunk/core/swfupload.js 我们来进一步检查论坛的添加图片功能,计算机上和IPAD上不光界面有所不同,连标题都不同,一个是"上传图片",一个是"普通上传",事实上它们是分开的两部分,只不过一显一隐罢了。如果我们在程序里做个修改就能同时看到它们。 让我们来看看这一显一隐是如何实现的。每个tab都是一个li,定义在editor_menu_form.php里: 从程序里可见,显示"上传图片"还是"普通上传"是由客户端是否支持Flash决定的。 那为何日志里的添加图片功能不能用于iPad呢?类似于template\default\forum\editor_menu_forum.php,日志用的是template\default\home\editor_image_menu.php。这里面的tab只有三个(没有“普通上传”),而且虽然它也用upload.js,但其中在函数disableMultiUpload里隐去“上传图片”的语句有个obj.uploadSource == 'forum'的条件,所以不工作。这就是“上传图片”tab还在但不见按钮的原因。 最后指出一点,在iPad上看到的论坛发贴里的"选择文件"和"未选择文件"的字样不是Discuz带来的简体中文,而是iPad中文版上传文件按钮的带来的。 所以在英文的机器上就会显示为:
个人分类: Discuz|67 次阅读|0 个评论
分享 观点转载 - 阅读文学作品能让人变得更聪明更友好
彼岸网 2013-10-15 11:48 PM
译者: Jambalaya 原文作者: Annie Murphy Paul 发布:2013-09-16 13:03:06,http://select.yeeyan.org/view/255404/378450 最近,诺丁汉大学的哲学教授格雷戈里·柯里(GregoryCurrie)在《纽约时报》上提到,人们不应断言文学能够提升人类品质,因为没有“足够的证据能证明读了托尔斯泰的作品或者其他经典书籍,就能让人在道德上、生活上表现的更出色”。 可实际上,还真有这样的证据。加拿大约克大学的心理学家雷蒙德·玛尔(RaymondMar)和多伦多大学已退休的认知心理学教授基思·奥特利 (KeithOatley)在发表于2006年和2009年的研究报告中曾提到,经常读小说的人似乎更能理解别人,同情别人,并从他人的角度看待问题。 即便研究者们考虑到了越是有同情心的人可能越喜欢读小说这个因素,这种联系依然存在。在2010年的一项研究中,玛尔从儿童中也发现了同样的现象:他们听 过的故事越多,他们的“心智理论”或者是对别人意图的“心智模式”就越敏锐。 “深阅读”——与我们平时在网上进行的浅阅读相反——是一种渐渐被忽视的阅读行为,我们应当像保护古建筑或重要的艺术品那样对其采取保护措施。深阅读的消 失将不利于伴随着网络长大的后代的智力和情感发展,也会影响人类文化重要组成部分的传承:小说、诗歌和其他文学类型,毫不夸张地说,这些作品只有经过阅读 训练的人才能欣赏。 在认知科学、心理学和神经科学方面近期的研究已经证明了深阅读——一种慢速的、沉浸式的、有着丰富的感官细节和复杂的情感、精神体会的阅读——是一种独特 的阅读体验,与单纯的认字型的阅读完全不一样。虽然严格说来,深阅读的载体不一定非得是传统的纸质书,但印刷品的天然的限制对于深阅读体验却是十分有益 的。比如,纸质书上是没有超链接的,这样读者就少了一些干扰——不用纠结是不是得点开链接——从而能保持全身心地沉浸在书中的文字里。 这种沉浸也得益于大脑对于有着丰富细节、暗示、比喻的语言的处理方式:利用与在现实生活中发生这种场景时相同的活跃的大脑区域创建一个心理表征。阅读有关 情感状况和道德困境的文学内容也是对思维进行高强度训练的一种方法,可以激励我们对虚构的人物进行思考,甚至有研究表明,可以增强我们在现实生活中的感同 身受的能力。 这些在我们浏览TMZ网站时是体会不到的。虽然两种行为都被称为阅读,但对书籍的深阅读与在网页上进行的为了获取信息而进行的阅读是不一样的,两者有着 不同的阅读体验,并且培养出了不同的阅读技能。越来越多的证据表明,在线阅读时,读者比较容易走神,而且对于阅读体验也不够满意,就连“数字原住民”都有 这样的感受。比如,英国全国读写素养信托(Britain’sNationalLiteracyTrust)上月公布了一项在32,910名 8~16岁的儿童和青少年中进行的调查结果。研究人员指出有39%的儿童和青少年每天都通过电子设备进行阅读,而每天阅读纸质内容的人数仅占28%。相较 于阅读纸质书的受访者,在只通过电子设备进行阅读的受访者中,不太可能说自己非常喜欢阅读的人数是其三倍,不太可能有最喜欢的一本书的人数占其三分之一。 研究还发现,比起每日都阅读纸质书或者既阅读纸质书也阅读电子书的年轻人而言,有两倍的只阅读电子书的人不太可能成为中等以上水平的读者。 想要理解为什么我们应当关心年轻人如何阅读,而不只是有没有在阅读,可以先了解一下阅读能力的形成方式。塔夫斯大学阅读和语言研究中心主任玛丽安娜·沃夫 (MaryanneWolf)说过“人类并不是天生就会阅读的”,她写过《普鲁斯特与乌贼:阅读如何改变我们的思维》一书。在正常情况下,理解和运用口 头语言的能力会根据由人类基因决定的程序形成,而阅读能力的形成却需要每个人的刻苦练习。“阅读回路”的创建借用了大脑中为其他目的而形成的结构——这些 回路可能很脆弱也可能很稳固,主要取决于它们的使用频率与强度。 深阅读的读者远离了干扰并适应了语言的细微差别,进入了心理学家维克托·内尔(VictorNell)在快乐阅读的心理状态研究中比喻成的一种催眠状 态。内尔发现当读者非常享受阅读过程时,他们的阅读速度实际上是变慢的。快速、流畅的文字解读与缓慢的、从容不迫的阅读速度的结合,使得深阅读的读者能通 过反思、分析并加入自己的回忆与思考来丰富阅读过程。并且在这样的阅读过程中,读者能有时间与作者建立亲密的关系,仿佛两个坠入爱河的人,沉浸在热烈的对 话之中。 深阅读与许多年轻人正在使用的阅读方法是不一样的。他们的阅读是务实的、机械的:体现了文学评论家弗兰克·科莫德(FrankKermode)提出的 “肉体的阅读”与“精神的阅读”之间的区别。如果我们让我们的后代以为阅读就是指肉体的阅读——如果我们不通过早期执着的训练和实践来打开通往精神的阅读 的大门——我们将会使他们失去感受愉悦的甚至是狂喜的阅读体验的机会。并且,我们还会剥夺他们得到鼓舞和启发的机会,而这原本能提升他们作为人的品质。看 到年轻人对电子设备的依赖,部分先进的教育家和溺爱型的父母提到有必要“从孩子出发”,根据孩子们的电子阅读习惯进行指导。这是错误的看法。相反,我们应 当向他们展示一个他们从未到过的境地,一个只有通过深阅读才能到达的境地。
1217 次阅读|0 个评论

小黑屋|Archiver|彼岸网  

Powered by Discuz! X3.1 © 2001-2014 Comsenz Inc.
GMT-4, 2026-6-24 05:54 PM , Processed in 0.044093 second(s), 21 queries.

返回顶部