WeiCN

修改typecho保存评论用户信息为javascript模式
修改这个是因为上一篇文章有同学评论说会缓存评论人的信息当然,我没注意到这个是因为我们的Chakhsu同学在老高的技...
扫描右侧二维码阅读全文
26
2016/04

修改typecho保存评论用户信息为javascript模式

修改这个是因为上一篇文章有同学评论说会缓存评论人的信息
当然,我没注意到这个是因为我们的Chakhsu同学在老高的技术博客也提到这个问题
而我用的模板也是来自于Chakhsu的,所以他在模板里面已经修改过这个问题,直接不读取cookies来回填用户信息
我就小小的修改了一下,采用js来读取并回填,登录状态还无所谓,没登陆的用户确实造成了小小的不便(当然,对我这种常年只有我一个人访问的博客没什么影响……)

首先分析了一下typecho的函数

模板文件comments.php里获取的函数是

    <?php $this->remember('author'); ?>
    <?php $this->remember('mail'); ?>
    <?php $this->remember('url'); ?>

跟随函数到了\var\Widget\Archive.php

函数原型

        /**
         * 输出cookie记忆别名
         *
         * @access public
         * @param string $cookieName 已经记忆的cookie名称
         * @param boolean $return 是否返回
         * @return string
         */
        public function remember($cookieName, $return = false)
        {
            $cookieName = strtolower($cookieName);
            if (!in_array($cookieName, array('author', 'mail', 'url'))) {
                return '';
            }
        
            $value = Typecho_Cookie::get('__typecho_remember_' . $cookieName);
            if ($return) {
                return $value;
            } else {
                echo htmlspecialchars($value);
            }
        }

继续跟随Typecho_Cookie::get

        public static function setPrefix($url)
        {
            self::$_prefix = md5($url);
            $parsed = parse_url($url);
    
            /** 在路径后面强制加上斜杠 */
            self::$_path = empty($parsed['path']) ? '/' : Typecho_Common::url(NULL, $parsed['path']);
        }
    ******中间省略******
        /**
         * 获取指定的COOKIE值
         *
         * @access public
         * @param string $key 指定的参数
         * @param string $default 默认的参数
         * @return mixed
         */
        public static function get($key, $default = NULL)
        {
            $key = self::$_prefix . $key;
            $value = isset($_COOKIE[$key]) ? $_COOKIE[$key] : (isset($_POST[$key]) ? $_POST[$key] : $default);
            return is_array($value) ? $default : $value;
        }

发现原来前缀不是随机的,而是当前url的md5哈希

然后当然直接读取填写啦

comments.php里删除

<?php $this->remember('author'); ?>
<?php $this->remember('mail'); ?>
<?php $this->remember('url'); ?>

三句

然后在合适的位置添加(当然是在</script>里面啦)

<?php if(!$this->user->hasLogin()){ ?>
function getCookie(name){
    var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");
    if(arr=document.cookie.match(reg))
        return unescape(decodeURI(arr[2]));
    else
        return null;
    }
function adduser(){
    document.getElementById('author').value = getCookie('<?php echo md5($this->request->getUrlPrefix()); ?>__typecho_remember_author');
    document.getElementById('mail').value = getCookie('<?php echo md5($this->request->getUrlPrefix()); ?>__typecho_remember_mail');
    document.getElementById('url').value = getCookie('<?php echo md5($this->request->getUrlPrefix()); ?>__typecho_remember_url');
}
adduser();
<?php } ?>

搞定收工

没有用到jquery,因为模板不需要,我也喜欢轻量级~

Last modification:April 29th, 2016 at 10:58 pm

11 comments

  1. Nopa

    icon_mad.gif 很棒的功能,顺便能请教下表情是怎么添加的吗

    1. WeiCN
      @Nopa

      表情是插件Smilies

  2. Deerweak

    确实有用。

  3. 拾叁

    看不懂0 0

    1. WeiCN
      @拾叁

      icon_smile.gif 前面凑字数的,只需要看最后一段,当然文笔太乱...

  4. lonelypers

    对呀,就是那个表情和博主识别,还显示评论人的操作系统

    1. WeiCN
      @lonelypers

      icon_evil.gif 表情是插件“Smilies”(http://www.jzwalk.com/archives/net/smilies-for-typecho)
      博主显示和useragent是在模板functions.php和comments.php手动加的代码

  5. lonelypers

    博主,你的评论系统看着很炫啊,能分享不?

    1. WeiCN
      @lonelypers

      评论系统是自带的呀 icon_confused.gif 你说的是哪里炫,我就加了表情和博主识别,其他是模板原装的

  6. 早喵

    icon_arrow.gif 非常感谢,这个功能还是挺方便的~

    1. WeiCN
      @早喵

      icon_wink.gif 于是,又有了一篇水文

Leave a Comment