实现这种处理有两种方法,一种是嵌入点,二是特殊主题。特殊主题可以通过 newthread_submit_end() 来实现,在这里就不提了。下面这种方法的原理是通过嵌入点向 PHP 注册一个终止执行函数,这样能够保证发帖成功后无论程序进行了什么操作都能完成我们的需求。当然这个方法也适用于特殊主题。- <?php
- if(!defined('IN_DISCUZ')) {
- exit('Access Denied');
- }
- class plugin_test {
- public static function execute() {
- // 如果帖子发布成功, 必会产生 $tid 和 $pid
- global $tid, $pid;
- if(!$tid || !$pid) {
- return;
- }
- // 这个例子为了看到效果, 得先清除输出缓冲
- @ob_end_clean();
- @header('location: ');
- // 下面是处理代码
- echo "这个主题的 tid 是 $tid, pid 是 $pid.";
- exit;
- }
- }
- class plugin_test_forum extends plugin_test {
- // 注册一个 forum/post 嵌入点
- public function post_() {
- switch($GLOBALS['_G']['gp_action']) {
- // 发新帖, 当然编辑帖子或者发布回帖也可以通过类似方法来实现完成后处理数据
- case 'newthread':
- register_shutdown_function(__CLASS__.'::execute');
- break;
- }
- }
- }
- ?>
复制代码
上面的代码建议在 chrome 下测试。。。IE 下可能会由于跳转的问题无法看到效果。
之所以我要提这个问题是因为之前做的一个插件需要在帖子发布成功后处理附件,一开始我用的是嵌入 showmessage() 的办法,但发现若 showmessage() 里面通过 header() 跳转的话嵌入点就无法执行,因此奉劝大家不要相信 showmessage() 的嵌入点!如果要这样做,建议模仿这个帖子的方法对输出进行拦截再判断,这样更保险一些。另外要感谢一下猴子,据说 register_shutdown_function 这宝贝函数是被他挖出来的。
|