承接上一篇:http://zhoumengkang.com/337.html 弄清楚是怎么发微博怎么读取微博之后就简单了。
下面记录下笔记,从这次修改可以看出ThinkSNS的很多地方还是在OOP的框架里面写着面向过程的代码,也可以所现有面向过程,然后才慢慢的优化,抽象成OOP,而下面的修改呢,就会发现代码的耦合度很高了,我要增加一个中微博模版,就需要修改很多文件。这是我们开发的时候所不希望看到的。
如图我们要增加一个课程学习的微博模版
1、发现其资源链接变了,这样就需要修改\core\OpenSociax\functions.inc.php
里面的_parse_url
函数,增加一种判断
/** * 格式化微博,替换链接地址 * 修改内容:增加了一种发的是课程的微博,条件为域名为网站域名切在地址中能找到course * @modify zhoumengkang <zhoumengkang@php.net> * @param string $url */ function _parse_url($url){ $hostArr = parse_url(SITE_URL); $urlArr = parse_url($url[0]); $str = '<div class="url">'; if ( preg_match("/(youku.com|youtube.com|ku6.com|sohu.com|mofile.com|sina.com.cn|tudou.com|yinyuetai.com)/i", $url[0] , $hosts) ){ $str .= '<a href="'.$url[0].'" target="_blank" event-node="show_url_detail" class="ico-url-video"></a>'; } else if ( strpos( $url[0] , 'taobao.com') ){ $str .= '<a href="'.$url[0].'" target="_blank" event-node="show_url_detail" class="ico-url-taobao"></a>'; } else if ( strpos( $url[0] , 'course') && ($hostArr['host'] == $urlArr['host'])){ $str .= '<a href="'.$url[0].'" target="_blank" event-node="show_url_detail" class="ico-url-course"></a>'; } else { $str .= '<a href="'.$url[0].'" target="_blank" event-node="show_url_detail" class="ico-url-web"></a>'; } $str .= '<div class="url-detail" style="display:none;">'.$url[0].'</div></div>'; return $str; }
2、修改\addons\model\FeedModel.class.php
里面的put
方法,把course_post
加入到类型判断中去。
//微博类型合法性验证 - 临时解决方案 if ( !in_array( $type , array('post','repost','postvideo','postfile','postimage','weiba_post','weiba_repost','course_post') )){ $type = 'post'; }
3、增加.ico-url-course
样式
.ico-url-course{display: inline-block;vertical-align: middle;width: 95px;height: 22px;background: url(../image/course.jpg) no-repeat;margin-left: 8px;margin-bottom: 3px;}
4、新增课程专用的微博模版\apps\public\Conf\course_post.feed.php
<feed app='public' type='course_post' info='发课程微博'> <title> <![CDATA[{$actor}]]> </title> <body> <![CDATA[{$body|t|replaceUrl} <div class="kechengs comment"> <div class="kechengPic"><a href="{$source_url}"><img src="{$coursePic}" alt=""></a></div> <dl> <dt> <a href="{$source_url}" class="name" target="_blank"></a> <a href="{$source_url}" target="_blank" show="no">{$courseTitle}</a> </dt> <dd> 所属分类:{$courseType}</dd> <dd> 主讲老师:{$courseTeacher}</dd> </dl> <div class="clear"></div> <p>所学进度</p> <div class="progress_kuang"> <div class="progress_tiao"></div> <span class="progressNumL">0%</span> <span class="progressNumR">100%</span> <span class="progressNum">{$learningProgress}</span> </div> </div> ]]> </body> <feedAttr comment="true" repost="true" like="false" favor="true" delete="true" /> </feed>
5、修改\addons\model\FeedModel.class.php
里的getFeedInfo
,增加对课程类型微博的支持
if( $data['type'] == 'course_post'){ $data['courseUrl'] = $fd['courseUrl']; $data['courseTitle'] = $fd['courseTitle']; $data['coursePic'] = $fd['coursePic']; $data['courseType'] = $fd['courseType']; $data['courseTeacher'] = $fd['courseTeacher']; $data['learningProgress'] = $fd['learningProgress']; }
6、修改转发的模版\apps\public\Conf\repost.feed.php
{* 课程微博 *} <eq name="sourceInfo.feedType" value="course_post"> <div class="kechengs comment"> <div class="kechengPic"><a href="{$source_url}"><img src="{$sourceInfo.coursePic}" alt=""></a></div> <dl> <dt> <a href="{$sourceInfo.source_url}" class="name" target="_blank"></a> <a href="{$sourceInfo.source_url}" target="_blank" show="no">{$sourceInfo.courseTitle}</a> </dt> <dd> 所属分类:{$sourceInfo.courseType}</dd> <dd> 主讲老师:{$sourceInfo.courseTeacher}</dd> </dl> <div class="clear"></div> <p>所学进度</p> <div class="progress_kuang"> <div class="progress_tiao"></div> <span class="progressNumL">0%</span> <span class="progressNumR">100%</span> <span class="progressNum">{$sourceInfo.learningProgress}</span> </div> </div> </eq>
好啦,到这里就修改完毕啦,这样转发也OK了。
小结下,ThinkSNS内部框架的代码可扩展性不高,耦合度太高,体会一把为什么要走模式,要走架构了。对面向对象继承、多态的特性有了一定的认识,而封装我暂时感觉和面向过程中封装差不多。有一次这样的修改经验,再结合我们面向对象的思想,不把课程、视频、图片的所有数据的判断都写在一起,而是继承出来,单独写,是不是更好呢?
如何添加数据呢?演示代码如下:
$data = array( 'body'=>'周梦康添加了一门课程', 'source_url'=>'http://chanpingou.com/course/1', 'courseUrl'=>'http://chanpingou.com/course/1', 'courseTitle'=>'计算机操作系统', 'coursePic' =>'/addons/theme/stv1/_static/image/kc.jpg', 'courseType' =>'计算机学院 计算机信息管理专业', 'courseTeacher'=>'周梦康', 'learningProgress'=>'20%' ); $res = model('Feed')->put($this->uid,'public','course_post',$data);