美文网首页Android知识Android开发Android技术知识
耳朵(八)文章详情的评论及收藏

耳朵(八)文章详情的评论及收藏

作者: a_mean | 来源:发表于2016-09-22 20:42 被阅读198次

    tags: 耳朵_android


    最终效果图:


    之前已经登录成功, 并将cookie保存至本地, 今天的内容有点多, 需要完成文章的评论、收藏以及分享功能。

    如果你的后台已经能给你提供满足上述功能的所有接口, 那自行跳过这一段. 目前 http://ear.life 采用的是WordPress搭建的网站, 评论的接口是有的, 但收藏并没有提供, 我们可以配合着WP Favorite Posts来使用.

    先进后台去添加并配置WP Favorite Posts,


    简单配置后可以在web端看到收藏的按钮了:

    可是它并没有为我们提供供APP调用的API, 那我们就自己写一个:
    先查一下数据库, 看看WP Favorite Posts保存数据的位置在哪:

    后面的meta_value里的176、172、178这些其实就是我们文章的post_id了,
    OK, 知道了它的位置, 我们自己写一个接口放出来:

    下面代码为PHP:

    public function get_favorite(){ 
            global $json_api;
    
            //首先对cookie进行验证
            if (!$json_api->query->cookie) {
    
                $json_api->error("You must include a 'cookie' var in your request. Use the `generate_auth_cookie` Auth API method.");
    
            }
            
            $user_id = wp_validate_auth_cookie($json_api->query->cookie, 'logged_in');
    
            if (!$user_id) {
                $json_api->error("Invalid authentication cookie. Use the `generate_auth_cookie` method.");
            }
            
            //接着查找收藏的所有postid
            $post_ids = array();
            if($result = mysql_query(" SELECT `meta_value` FROM `wp_usermeta` WHERE `meta_key` = 'wpfp_favorites' AND `user_id` = " .$user_id)){
     
                while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {
                    $str = substr($row[0], 4);
                    $str = explode(";",$str);
                    foreach ($str as $key => $value) {
                        if(strstr($value, "s:3:")){
                            $temp = strtr($value, array("s:3:" => "", '"' => ""));
                            $post_ids[count($post_ids)] = $temp;
                        }
                    }
                }
                $str_ids = "";
                foreach ($post_ids as $id) {
                    $str_ids = $str_ids.",".$id;
                }
                $str_ids = substr($str_ids, 1);
    
                //最后查询所有postid的信息并返回
                if($result = mysql_query("SELECT `ID`, `post_date`, `post_title` FROM `wp_posts` WHERE `post_status` = 'publish' AND `post_password` = '' AND `ID` IN (".$str_ids.") ")){
                    $results = array();
                    while ($row = mysql_fetch_assoc($result)) {
                        $results[] = $row;
                    }
    
                    return array(
                        'status' => 'ok',
                        'msg' => "",
                        'list' => $results
                    );
                }
    
                // 关闭连接
                mysql_free_result($result);
    
            }else{
                echo mysql_error();
            }
        }
    

    OK, 如果没出意外的话可以看到接口列表处已经多了一个get_favorite,



    现在我们请求了看一看, 为了节省资源我这里只返回了id、data和title, 并且没有对分页加载做处理, 后面可以根据需求再来修改.



    正常的查询出来了... 呃, 我怎么感觉不像在做APP反而像写接口了... 后面还要加上收藏和取消收藏的接口, 这里直接上图, 步骤略过, 不然观众都没兴趣了.

    花了点时间, 为WordPress增加了get_favorite、get_favorite_ids和post_favorite三个接口, 现在我们来尽情的使用它吧.

    回到ArticleDetailActivity, 首先是评论, 评论需要判断是否登录, 否则的话跳至登录界面:

        tv_comment.onClick {
            if (!App.checkCookie(this)) {
                return@onClick
            }
            showComment("", "请输入评论内容")
        }
    

    其次是刚刚添加的收藏功能:

        iv_collect.onClick {
            if (!App.checkCookie(this)) {
                return@onClick
            }
    
            val params = App.createParams
            params.put("json", "user/post_favorite")
            params.put("post_id", article!!.id!!)
            params.put("doAction", true)
            showLoading()
    
            HMRequest.go<FavoriteModel>(params = params, activity = this) {
                cancelLoading()
                iv_collect.setImageResource(if (it!!.after) R.drawable.icon_collected else R.drawable.icon_collect)
            }
        }
    

    OK, 最后在onResume事件中记得查一查收藏的状态, 避免跳转登录后没有及时刷新:

    override fun onResume() {
        super.onResume()
        webView?.onResume()
    
        //先查查当前是否已经收藏过
        if (App.cookie != null && article != null) {
            val params = App.createParams
            params.put("json", "user/post_favorite")
            params.put("post_id", article!!.id!!)
    
            HMRequest.go<FavoriteModel>(params = params) {
                iv_collect.setImageResource(if (it!!.before) R.drawable.icon_collected else R.drawable.icon_collect)
            }
        }
    }
    

    好了, 跑起来看一看,效果已经实现了.


    github: https://github.com/bxcx/ear
    本节分支: https://github.com/bxcx/ear/tree/comment

    相关文章

      网友评论

        本文标题:耳朵(八)文章详情的评论及收藏

        本文链接:https://www.haomeiwen.com/subject/wjozettx.html