【呆子化雨】浅谈Discuz插件开发-邮件验证提醒插件
插件功能介绍:
这是一款提醒用户验证邮箱的插件,主要是当未验证邮箱的用户访问论坛时,会自动弹出提示框,提醒用户验证邮箱,后台可以设置弹出提示后,是否自动对该用户发送验证邮箱的邮件,设置是否发送邮件后根据用户邮箱自动弹出对应的常用邮箱的登录地址!
首先,贴上邮件提醒插件的核心代码(其实也就这一段而已)!
<?php /** *@author 游梦呆子 *date 2013-10-30 */ if(!defined(\'IN_DISCUZ\')){ exit(\'Access Denied\'); } class plugin_daizi_email_verified{ function global_usernav_extra3(){ global $_G; $vars_daizi=$_G[\'cache\'][\'plugin\'][\'daizi_email_verified\']; if($vars_daizi[daizi_on]){ $email_status=DB::result_first("SELECT emailstatus FROM ".DB::table(\'common_member\')." WHERE uid=\'$uid\'"); if(!$email_status){ return $vars_daizi[daizi_top_email_verified]; } } } function global_footer(){ global $_G; $return=\'\'; $uid=$_G[\'uid\']?$_G[\'uid\']:\'\'; $vars_daizi=$_G[\'cache\'][\'plugin\'][\'daizi_email_verified\']; if($vars_daizi[daizi_on]){ if(!empty($uid)){ $email_status=DB::result_first("SELECT emailstatus FROM ".DB::table(\'common_member\')." WHERE uid=\'$uid\'"); if(!$email_status && !isset($_G[\'cookie\'][\'email_verified\'])){ $return=\'<script type="text/javascript">setTimeout(function(){showDialog(\\'\'.$vars_daizi[daizi_email_verified_content].\'\\');},\'.$vars_daizi[daizi_email_verified_showtime1].\');\'; $return.=\'setTimeout(function(){location.href = "/home.php?mod=spacecp&ac=profile&op=password&resend=1";},\'.$vars_daizi[daizi_email_verified_sendtime].\');</script>\'; dsetcookie(\'email_verified\',1,$vars_daizi[daizi_email_verified_showtime]); dsetcookie(\'email_domain\',1,100000); }else if(!empty($_G[\'cookie\'][\'email_domain\']) && $_GET[\'op\']==\'password\' && empty($_GET[\'resend\']) ){ if($vars_daizi[daizi_email_verified_target]){ $mail_domain = \'http://mail.\'.trim(substr(strrchr($_G[\'member\'][\'email\'],\'@\'), 1)); $return.=\'<script type="text/javascript">setTimeout(function(){window.open("\'.$mail_domain.\'")},\'.$vars_daizi[daizi_email_verified_target_time].\');</script>\'; dsetcookie(\'email_domain\',null); } } } } return $return; } } ?>
再来,贴上插件在discuz后台设计的变量图(其实设计的有点乱,小学语文是数学老师教的!!!)
代码浅谈:
首先,上来肯定是discuz的拒绝非法调用文件的机制!
if(!defined(\'IN_DISCUZ\')){ exit(\'Access Denied\'); }
再来,开始插件的核心代码部分!(具体插件怎么命名,怎么定义函数类名,请各位看官看discuz开发技术文档)
function global_usernav_extra3(){ global $_G; $vars_daizi=$_G[\'cache\'][\'plugin\'][\'daizi_email_verified\']; //获取插件变量参数 if($vars_daizi[daizi_on]){ //判断插件是否开启 $email_status=DB::result_first("SELECT emailstatus FROM ".DB::table(\'common_member\')." WHERE uid=\'$uid\'"); //查询数据库,获取邮箱验证字段 if(!$email_status){ //判断邮箱是否验证 return $vars_daizi[daizi_top_email_verified]; } } }
这里其实没什么重点,就是注意查询数据库的时候可以使用DB::result_first($sql);方法来查询,这个方法是获取字段值,同时DB::table($tablename)可以获取table的全称,就是例如我这边的table名是pre_common_header,而我们使用这个方法的话,就可以直接省略前缀,这个方法会自动给你不全!
这个主要是在论坛公共头部,显示验证邮箱的提示!效果如下
接下来就是提示部分代码,也是这个插件的核心了(说是核心,其实也是个很简单的逻辑)
function global_footer(){ global $_G; //定义全局变量$_G,这可是个神奇的变量 $return=\'\'; //初始化返回值 $uid=$_G[\'uid\']?$_G[\'uid\']:\'\'; //$_G[\'uid\']为用户id $vars_daizi=$_G[\'cache\'][\'plugin\'][\'daizi_email_verified\']; //获取插件参数 if($vars_daizi[daizi_on]){ //判断插件是否开启 if(!empty($uid)){ //判断用户是否登录 $email_status=DB::result_first("SELECT emailstatus FROM ".DB::table(\'common_member\')." WHERE uid=\'$uid\'"); //查询数据库,获取用户的email验证字段 if(!$email_status && !isset($_G[\'cookie\'][\'email_verified\'])){ //判断用户是否验证了邮箱,同时email_verified这个cookies变量是否定义过了,这个是我自己加的,为了是判断多久提示用户验证邮箱一次 $return=\'<script type="text/javascript">setTimeout(function(){showDialog(\\'\'.$vars_daizi[daizi_email_verified_content].\'\\');},\'.$vars_daizi[daizi_email_verified_showtime1].\');\'; $return.=\'setTimeout(function(){location.href = "/home.php?mod=spacecp&ac=profile&op=password&resend=1";},\'.$vars_daizi[daizi_email_verified_sendtime].\');</script>\'; //上面两句是组合返回的值,返回js代码,主要功能就是弹出验证的提示和发送验证邮件到用户邮箱 dsetcookie(\'email_verified\',1,$vars_daizi[daizi_email_verified_showtime]); //设置cookies的变量email_verified,具体这个变量啥用,上面说了 dsetcookie(\'email_domain\',1,100000); //这个设置变量是为了后面判断是否发送了验证邮件 }else if(!empty($_G[\'cookie\'][\'email_domain\']) && $_GET[\'op\']==\'password\' && empty($_GET[\'resend\']) ){ if($vars_daizi[daizi_email_verified_target]){ $mail_domain = \'http://mail.\'.trim(substr(strrchr($_G[\'member\'][\'email\'],\'@\'), 1)); //截取邮箱@后面的字段 $return.=\'<script type="text/javascript">setTimeout(function(){window.open("\'.$mail_domain.\'")},\'.$vars_daizi[daizi_email_verified_target_time].\');</script>\'; dsetcookie(\'email_domain\',null); } } } } return $return; }