小木猫

 找回密码
 立即注册

扫一扫,访问微社区

搜索
热搜: 活动 交友 discuz
查看: 1817|回复: 0
打印 上一主题 下一主题

Discuz功能改进:在微博里加图片

[复制链接]

373

主题

1055

帖子

5657

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5657
跳转到指定楼层
楼主
发表于 2015-10-10 18:43:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
http://www.bian-wang.com/discuz/ ... 0005&do=blog&id=249
天香公主的个人空间Discuz功能改进:在微博里加图片
热度 1已有 1966 次阅读2014-1-3 11:00 PM |个人分类:[color=rgb(153, 153, 153) !important]Discuz

Discuz系统支持BB代码,据维基: BBCode是Bulletin Board Code的缩写,有译为“BB代码”者,属于轻量级标记语言(Lightweight Markup Language)的一种,如字面上所显示的,它主要是使用在BBS、论坛、Blog等网络应用上。 BBCode的语法通常为[标记]这种形式,即标记左右用两个中括号包围,以作为与正常文字间的区别。系统解译时遇上中括号便知道该处是BB代码,会在解译结果输出到客户端时转换成最为通用的HTML语法。

让我们先来见识一下用在日志里的BB代码。简而言之,视频可用[ flash]视频音频地址[ /flash] (去掉空格)的方式来表示,例如[flash=mp3]http://www.zzwave.com/zzw/upload/up/888/9a7f193.mp3[ /flash]也可通过日志编辑器的工具条上的“添加视频FLASH或MP3音乐”这个按钮来添加这句BB代码语句。


注意工具条上有多个按钮能帮助用户添加纯文字以外的内容,如添加超链接和图片。但这些工具都是立刻将用户填进去的东西转化成了html代码,唯有添加的视频和音频是以BB代码的形式存入数据库的。这就需要在读取日志时将这样的代码转换成html代码,因为浏览器只认识html代码。 (工具条里东西是在source\module\home\home_editor.php里定义的)

在显示博文用到的程序source\include\space\space_blog.php里有下面这么一句,很清楚的说明了对从数据库里取出的博文内容里的BB代码要做转换$blog['message'] = blog_bbcode($blog['message']);具体的转换函数见source\function\function_blog.php:

例如下面的BB代码:
[flash=mp3]http://www.zzwave.com/zzw/upload/up/888/9a7f193.mp3[/ flash]就转换成了

显然所有这些视频和音频都用Flash播放器来播放了。


有个常见的问题是如何在微博(Discuz称之为记录)里加入图片?至少有两种办法,一是储存BB代码,在显示前转换成HTML代码。二是在储存时前将BB代码转换成HTML代码。这里我们先来模仿前面说的日志里处理Flash的BB代码的办法来实现前一种作法。
1。新建函数文件source\function\function_doing.php,并加入下面的转换函数:
function doing_bbcode($message) {    $message = preg_replace("/\[img\](.+?)\[\/img\]/ie", "doing_img('\\1')", $message);    return $message;}function doing_img($img_url) {    $width = '300px';    $height = '200px';    $html = "<a href='$img_url' target='_blank' style='display: block;'>
        <img src='$img_url' style='max-width: $width; max-height: $height;'/></a>";;    return $html;}这里我们没有直接按原来的尺寸显示图片因为记录页要显示多条记录单个图片的尺寸不宜过大。所以我们显示一个可能说缩小过的图片,点击后才能看到原来尺寸的图片。另外图片和文字在同一行显示效果不佳,所以让单独站一行。

2。在显示微博的文件source\include\space\space_doing.php里做这个转换:
在赋值语句$dolist[] = $value;前加require_once libfile('function/doing');$value['message'] = doing_bbcode($value['message']);这样改了以后,下面填写的记录
显示出来就成了



接下来我们看看第二种作法:在储存时前将BB代码转换成HTML代码。其实Discuz本身已经提供了这种支持,它甚至在日志评论里将图片的BB代码转换成HTML代码。这是在处理用户提交记录的文件source\include\spacecp\spacecp_doing.php里完成的:
$message = getstr($_POST['message'], 200, 0, 0, 1);这里getstr定义在source\function\function_home.php从中我们看到只要参数$bbcode不是0的话,就会将BB代码转换为HTML代码。if($bbcode) {    require_once DISCUZ_ROOT.'./source/class/class_bbcode.php';    $bb = & bbcode::instance();    $string = $bb->bbcode2html($string, $bbcode);}我们这里设的$bbcode值为1,但它并没有为图片转换代码。这是为什么呢?让我们来看一下bbcode2html的定义。这可在source\class\class_bbcode.php中找到。注意到其中含有下面的语句:if($parseurl==2) {  $this->search_exp[] = "/\[img\]\s*([^\[\<\r\n]+?)\s*\[\/img\]/ies";  $this->replace_exp[] = '$this->bb_img(\'\\1\')';  $message = bbcode::parseurl($message);}所以只有参数$parseurl指为2时才会对图片作代码转换 (在处理日志评论时用的参数值就是2),而我们这里给这个参数赋的值是1。如果我们将前面的一句语句改为$message = getstr($_POST['message'], 200, 0, 0, 2);那图片的BB代码的确就转换成了HTML代码。它的显示尺寸受限于在 template/default/common/common.css 里定义的风格:

.xlda dd img {
    max-width: 550px;
}

也许在那里再加个对 max-height 的限制更好。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表