dede

在discuz外部调用discuz登录及状态

最近做了一个dede二次开发的小项目,这也算是我真真第一次接触dede,之前有听说过其强大和灵活性,但一直没有去亲身去了解!项目的时间大概用了3天左右,简单的说也就是一个做了一个小站而已!期间通过看百度文库自己写了一个活动招募的插件,dede的插件确实非常简单(至少相对于一般discuz插件来说),而且流程也特别的清晰!不过说这么多,我还是只能作为新手的层面来表述,说的不好、不对望大神们原谅!

 说完了没用的,就说一下重点吧。因为这个项目比较小,当时提供模板的时候没有想到做登录和注册的模板同时要做到和discuz之间的通信,我也安装uc和discuz并做了两个应用之间的通信。但问题还是出来了,因为两个应用通信只是单纯的实现了,同步登陆和退出。具体的登录和注册还是要分开进行的,模板是独立开的!

我的目的很简单,就是在cms的首页放上discuz的登陆框,并且登录和注册都去discuz完成然后返回登录状态,这样就可以免去安装uc,以及设置通信、同时还能满足同步登陆、同步退出,大大的提高用户体验!

我的具体做法步骤很简单:

第一、在discuz的根目录新建文件 discuz_denglu.php 这个文件用来调用discuz的核心类,因为class_core.php文件里面有限制,不允许在discuz外部调用该类,所以为了保持核心文件的完整性、原始性我们选择在discuz根目录建新文件用来调用核心类!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php //调用discuz公共执行类等核心代码 begin
 require './source/class/class_core.php';
 $discuz = &amp; discuz_core::instance();
 $discuz-&gt;init();

//调用discuz公共执行类等核心代码 end

if($_GET['action'] == 'login'){
  if (empty($_G['uid'])) {
    echo '1';
  }
  else
  {
    echo '您好,尊贵的会员 <strong><span style="text-decoration: underline;">'.$_G['username'].'</span> '.'<a href="http://www.xxx.com/bbs/home.php?mod=space&amp;uid='.$_G['uid'].'&amp;do=index&amp;view='.$_G['username'].'">我的地盘</a>  <a href="http://www.xxx.com/bbs/home.php?mod=space&amp;do=home">最新动态</a>  <a href="http://www.xxx.com/bbs/member.php?mod=logging&amp;action=logout&amp;fromhash='.FROMHASH.'">退出登录</a>';
  }
}
?>

从该文件代码我们不难看出,这几句代码就可以实现discuz登录和未登录状态。同时可以在文件里使用discuz的所有全局变量。
看到这里大家是不是就可以看出我下部要做什么了,因为我的最终目的是实现在模板显示登录和未登录两种状态,这种情况下我们肯定会果断选择通过ajax来实现其效果,这样才能做到完美无缺。
贴一下模板代码(js):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<script type="text/javascript">
$(window).load(function(){
    $.ajax({
        url:'http://www.xxx.com/bbs/discuz_denglu.php?action=login',
        type:'GET',
        cache:false,
        success:function(msg)
        {
            if(msg == 1)
            {
                $('#lsform').show();
                $('#logging').hide();
            }
            else
            {
                $('#lsform').hide();
                $('#logging').show();
                     $('#logging').html(msg);
            }
        }
    });
});
</script>

cms首页html代码:

1
2
3
4
5
6
<form id="lsform" class="legReg" style="display: none;" action="http://www.xxx.com.cn/bbs/member.php?mod=logging&amp;action=login&amp;loginsubmit=yes&amp;infloat=yes&amp;lssubmit=yes" method="post" onsubmit="return lsSubmit();">用户名:<input class="inputSty" type="text" name="username" />
密码:<input class="inputSty" type="password" name="password" />
<input class="submitBtn" type="submit" value="提交" />
<a class="reg" href="http://www.xxx.com/bbs/member.php?mod=register"><img src="{dede:global.cfg_templets_skin/}/images/btn.jpg" alt="立即注册" width="64" height="21" /></a>
</form>
<p style="display:none; margin-left:100px;" id="logging"></p>

第二种解决方式(解决跨域调用):
修改上面的discuz_denglu.php文件为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
 //调用discuz公共执行类等核心代码 begin
 require './source/class/class_core.php';
 $discuz = & discuz_core::instance();
 $discuz->init();
//调用discuz公共执行类等核心代码 end
if (empty($_G['uid'])) {
//这里做一下修改
  echo '<form id="lsform" class="legReg" style="display: none;" action="http://www.xxx.com.cn/bbs/member.php?mod=logging&amp;action=login&amp;loginsubmit=yes&amp;infloat=yes&amp;lssubmit=yes" method="post" onsubmit="return lsSubmit();">用户名:<input class="inputSty" type="text" name="username" />
密码:<input class="inputSty" type="password" name="password" />
<input class="submitBtn" type="submit" value="提交" />
<a class="reg" href="http://www.xxx.com/bbs/member.php?mod=register"><img src="{dede:global.cfg_templets_skin/}/images/btn.jpg" alt="立即注册" width="64" height="21" /></a>
</form>'
;
}
else
{
  echo '您好,尊贵的会员 <strong><span style="text-decoration: underline;">'.$_G['username'].'</span></strong> '.'<a href="http://www.xxx.com/bbs/home.php?mod=space&amp;uid='.$_G['uid'].'&amp;do=index&amp;view='.$_G['username'].'">我的地盘</a> <a href="http://www.xxx.com/bbs/home.php?mod=space&amp;do=home">最新动态</a> <a href="http://www.xxx.com/bbs/member.php?mod=logging&amp;action=logout&amp;fromhash='.FROMHASH.'">退出登录</a>';
}
?>

通过以上修改,我们如果需要在页面调用可以直接在html页面加入

1
<iframe src="http://bbs.xxx.com/discuz_denglu.php"></iframe>

iframe的属性自己定制就可以,以下是iframe的基本用法。

iframe可选的属性

属性 描述 DTD
align
  • left
  • right
  • top
  • middle
  • bottom
不赞成使用。请使用样式代替。

规定如何根据周围的元素来对齐此框架。

TF
frameborder
  • 1
  • 0
规定是否显示框架周围的边框。 TF
height
  • pixels
  • %
规定 iframe 的高度。 TF
longdesc URL 规定一个页面,该页面包含了有关 iframe 的较长描述。 TF
marginheight pixels 定义 iframe 的顶部和底部的边距。 TF
marginwidth pixels 定义 iframe 的左侧和右侧的边距。 TF
name frame_name 规定 iframe 的名称。 TF
scrolling
  • yes
  • no
  • auto
规定是否在 iframe 中显示滚动条。 TF
src URL 规定在 iframe 中显示的文档的 URL。 TF
width
  • pixels
  • %
定义 iframe 的宽度。 TF

以上就是我的解决方式,这样我们就可以非常轻松的解决这个问题。

如果有说的不好、不明白的地方,请高手指点!!

分享到:

13 条评论

点击这里取消回复。

昵称
  1. 手机贷借钱邀请码

    手机贷贷款邀请码:http://xumeinv.com RA9FCV ,借钱、贷款、信用卡贷款,额度灵活到账快!

  2. 趣头条

    同步登陆和退出实现了,不错。趣头条:http://www.qutoutiaow.com

  3. 小祥

    退出登陆有问题,地址应改为:member.php?mod=logging&action=logout&formhash=’.FORMHASH.’

  4. xo

    不好用啊,空白页面。是不是ajax有问题? $(‘#loggong’).hide();应该是 $(‘#logging’).hide();吧???改完还不好用!

    1. 子涛

      你好,谢谢反应的问题,我看一下。我不知道你现在是什么问题,我帮你看下~~~

      1. 子涛

        你检查下 你是不是没有调用jquery.js文件,如果没有调用jquery的话ajax肯定是无效的啊!

        1. xo

          jquery调用了,版本也换了一下测试,都不行。discuz_denglu.php?action=login没有问题,正常判断。

          1. 子涛

            哦,这样子的。能否页面提供一下,我帮你看看吧!

    2. 子涛

      我QQ 568125xxx 你可以QQ联系我!

      1. xo

        加你了 ,麻烦你

        1. 子涛

          已添加第二种调用方式,希望对你有用!

  5. 瞎扯吧软件

    这个适合整合的时候使用!

    1. 子涛

      嗯,是的。但是相对于uc整合来说无疑是比较简单的方法了!