周梦康 发表于 2014-09-02 4284 次浏览 标签 : ThinkSNS

承接上一篇:http://zhoumengkang.com/337.html 弄清楚是怎么发微博怎么读取微博之后就简单了。

下面记录下笔记,从这次修改可以看出ThinkSNS的很多地方还是在OOP的框架里面写着面向过程的代码,也可以所现有面向过程,然后才慢慢的优化,抽象成OOP,而下面的修改呢,就会发现代码的耦合度很高了,我要增加一个中微博模版,就需要修改很多文件。这是我们开发的时候所不希望看到的。

如图我们要增加一个课程学习的微博模版

笔记给ThinkSNS增加一种微博模版

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);

评论列表