Discuz开发 Discuz! X cookie的详解设置与开发使用

[复制链接]
网友投稿 发表于 2015-12-2 16:37:02 [Discuz开发] 显示全部楼层 |阅读模式 上一主题 下一主题

马上注册,一起探讨正确快速的建站方法

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
最近在做discuz!的插件,需要用到cookie,一直觉得奇怪的一个问题,Discuz!大量使用了cookie,但是我在编写插件的时候如果不加入session_start函数cookie就无法使用,按理说Discuz!使用了这么多cookie它的核心应该有调用session_start呀?而且Discuz!生成的cookie名都是带有一个前缀的,一直不知道这个前缀规律如何,那我又要如何调用内置的cookie呢?

后来查了一下资料,Discuz!把PHP的setcookie函数封装成了dsetcookie。顺藤摸瓜,在function_core.php里面找到了这两个函数:
    function dsetcookie($var, $value = '', $life = 0, $prefix = 1, $httponly = false) {
    源码略
    }
    function getcookie($key)
    {
     global $_G;
     return isset($_G['cookie'][$key]) ? $_G['cookie'][$key] : '';
    }
    那么在Discuz!中调用cookie的思路出来了:

    设置cookie:dsetcookie('cookie名', 'cookie值', '有效时间');

    源码中dsetcookie还有两个参数$prefix与$httponly,$prefix为是否添加cookie前缀,true则自动添加网站的前缀,false则不添加,$httponly表示是否只允许http方式访问,这两个值只要默认值即可,有需要可另外设置,不过当用户访问的是手机版则$httponly会被自动设置为false,见function_core.php第272行
  1.     if(defined('IN_MOBILE')) {
  2.      $httponly = false;
  3.     }
复制代码


Discuz!X cookie生成文件位置   source\function\function_core.php
1、Discuz!X cookie封装源码   生成COOKIE
  1. <?php
  2. function dsetcookie($var, $value = '', $life = 0, $prefix = 1, $httponly = false) {
  3. global $_G;
  4. $config = $_G['config']['cookie'];
  5. $_G['cookie'][$var] = $value;
  6. $var = ($prefix ? $config['cookiepre'] : '').$var;
  7. $_COOKIE[$var] = $value;
  8. if($value == '' || $life < 0) {
  9. $value = '';
  10. $life = -1;
  11. }
  12. if(defined('IN_MOBILE')) {
  13. $httponly = false;
  14. }
  15. $life = $life > 0 ? getglobal('timestamp') + $life : ($life < 0 ? getglobal('timestamp') - 31536000 : 0);
  16. $path = $httponly && PHP_VERSION < '5.2.0' ? $config['cookiepath'].'; HttpOnly' : $config['cookiepath'];
  17. $secure = $_SERVER['SERVER_PORT'] == 443 ? 1 : 0;
  18. if(PHP_VERSION < '5.2.0') {
  19. setcookie($var, $value, $life, $path, $config['cookiedomain'], $secure);
  20. } else {
  21. setcookie($var, $value, $life, $path, $config['cookiedomain'], $secure, $httponly);
  22. }
  23. }
复制代码


2、Discuz!X cookie封装源码   读取COOKIE
<?php
    function getcookie($key)    {     global $_G;     return isset($_G['cookie'][$key]) ? $_G['cookie'][$key] : '';    }

3、Discuz!X cookie封装源码  设置cookie:
<?php
  dsetcookie('cookie名', 'cookie值', '有效时间');

4、Discuz!X cookie封装源码    dsetcookie()方法分析

   function dsetcookie($var, $value = '', $life = 0, $prefix = 1, $httponly = false)
    dsetcookie()还有两个参数$prefix与$httponly
          $prefix为是否添加cookie前缀,true则自动添加网站的前缀,false则不添加
          $httponly表示是否只允许http方式访问,这两个值只要默认值即可,有需要可另外设置,不过当用户访问的是手机版则$httponly会被自动设置为false,
见function_core.php第272行    if(defined('IN_MOBILE')) {     $httponly = false;    }
   
5、读取cookie有两种方法

第一种使用getcookie函数:getcookie('cookie名');
第二种直接访问全局变量$_G:$_G['cookie']['cookie名']




上一篇:HDWiki/HDWiki整合Discuz UCenter会员的方法
下一篇:discuz 通过指定uid,使该用户直接登录
Discuz!技术支持    站帮网全心全意为站长提供简单易懂的快速建站教程
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

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