Discuz添加自定義模塊


功能描述:每個會員都可以寫下自己的心情,游客不可以留言。按時間倒序顯示最新的留言。
我們的宗旨是
盡量不要去修改或過多依懶默認模板或程序,否則,Discuz!升級時會給你帶來無盡的痛苦...

目錄

   [隱藏]

設計表結構:

CREATE TABLE pre_mood_wall (
  mid mediumint(8) unsigned NOT NULL auto_increment COMMENT '心情id',
  uid mediumint(8) unsigned NOT NULL default '0' COMMENT '用戶id',
  username varchar(15) NOT NULL default '' COMMENT '用戶名稱',
  dateline int(10) unsigned NOT NULL default '0' COMMENT '發布時間',
  message text NOT NULL COMMENT '內容',
  PRIMARY KEY  (mid),
  KEY dateline (dateline)
) ENGINE=MyISAM COMMENT='心情牆';

創建的文件:(./表示站點根目錄)

  • ./mood.php //入口文件
  • ./source/module/mood/list.php //查看心情
  • ./source/module/mood/publish.php //發布心情
  • ./template/default/mood/list.htm //查看心情列表模板
  • ./template/default/mood/publish.htm //發布心情模板
功能簡單,所以沒有涉及到專用函數和類的文件 (source/class目錄和source/function目錄)

 

moop.php

<?php
// 定義應用 ID 全局記錄當前用戶所在位置,不需要可定義為0 不要省略
define('APPTYPEID', 0);
define('CURSCRIPT', 'mood');

//====================================
// 基礎文件引入
//====================================
require './source/class/class_core.php';

$discuz = & discuz_core::instance();

//====================================
//模塊定義以及模塊緩存定義
//====================================
$modarray = array('list', 'publish');

// 判斷 $mod 的合法性

$mod = !in_array($discuz->var['mod'], $modarray) ? 'list' : $discuz->var['mod'];

//定義當前模塊常量
define('CURMODULE', $mod);

//====================================
// 加載核心處理,各程序入口文件代碼相同
//====================================
$discuz->init();

//====================================
// 以下內容由各個模塊根據需要自行撰寫程序運行環境
// 位於核心處理與mod加載之前,可以處理一些各mod共用的一些數據,或入口權限判斷等...
// 由於本功能只需要游客做發布的限制,所以判斷就要放到module/mood/publish.php中去了。
//====================================


//===================================
//加載 mod
//===================================

require DISCUZ_ROOT.'./source/module/mood/'.$mod.'.php';

?>

list.php

<?php
// mod文件只能被入口文件引用,不能直接訪問
if(!defined('IN_DISCUZ')) {
	exit('Access Denied');
}

//初始化當前頁碼
$page = empty($_GET['page'])?1:intval($_GET['page']);
if($page<1) $page=1;

//分頁
$perpage = 20;
$start = ($page-1)*$perpage;

//獲取當前頁的留言數據
$list = array();
$query = DB::query("SELECT * FROM ".DB::table('mood_wall')." WHERE 1 ORDER BY dateline DESC LIMIT $start, $perpage");
while($mood = DB::fetch($query)) {
	$mood['dateline'] = dgmdate($mood['dateline'], 'u');
	$list[] = $mood;
}

//獲得一個簡單的分頁,只有上一頁和下一頁,這個不需要count()數據表中的所有記錄
$multi = simplepage(count($list), $perpage, $page, 'mood.php?mod=list');

//數據准備完畢,引入相應的模板,准備輸出
include_once template("mood/list");

?>

 

list.htm

<!--//說明: 顯示公共頭部模板-->
<!--{template common/header}-->

<!--//說明: 開始顯示留言-->
<div id="ct" class="wp cl">
	<h1 class="mt">心情牆 - <!--{if $_G[uid]}--><a href="mood.php?mod=publish">發表心情</a><!--{/if}--></h1> 
	<div class="bm">
		<!--{if $list}-->
			<!--//說明: loop 循環一個數組 相當於foreach(){}-->
			<!--{loop $list $mood}-->
				<a href="home.php?mod=space&uid=$mood[uid]" target="_blank"><!--{avatar($value[authorid],small)}--></a><br>
				<a href="home.php?mod=space&uid=$mood[uid]" title="$mood[username]" target="_blank" class="xi2">$mood[username]</a> 發表於: $mood[dateline]
				<br>
				心情: $mood[message]
				<hr>
			<!--{/loop}-->
			<!--//說明: 顯示准備好的分頁鏈接-->
			$multi
		<!--{else}-->
			<p class="emp">暫時沒有記錄...</p>
		<!--{/if}-->
	</div>
</div>

<!--//說明: 顯示公共尾部模板-->
<!--{template common/footer}-->

 

publish.php

<?php
// mod文件只能被入口文件引用,不能直接訪問
if(!defined('IN_DISCUZ')) {
	exit('Access Denied');
}

// 游客不能發表心情的判斷
if(!$_G['uid']) {
	showmessage('抱歉,您尚未登錄,無法進行此操作', '', array(), array('login' => 1));
}

if(submitcheck('submit')) {
	$message = cutstr(dhtmlspecialchars(stripslashes($_POST['message'])), 150, ''); //截取150個字節的內容
	DB::query("INSERT INTO ".DB::table('mood_wall')." (uid, username, dateline, message) VALUES ('$_G[uid]', '$_G[username]', '".TIMESTAMP."', '".daddslashes($message)."')");
	showmessage('發表成功。', 'mood.php?mod=list');
}

//顯示發布表單
include_once template("mood/publish");
?>

 

publish.htm

<!--//說明: 顯示公共頭部模板-->
<!--{template common/header}-->

<!--//說明: 開始顯示表單-->
<div id="ct" class="wp cl">
	<h1 class="mt"><a href="mood.php?mod=list">心情牆</a> - 發表心情</h1>
	<div class="bm">
		<form method="post" action="mood.php?mod=publish" class="pns">
			<input type="hidden" name="formhash" id="formhash" value="{FORMHASH}" />
			<!--FORMHASH 自動產生,submitcheck()函數要判斷這個值-->
			<textarea name="message"></textarea><br><br>
			<input type="submit" class="pn vm" name="submit" value="發表" />
		</form>
	</div>
</div>

<!--//說明: 顯示公共尾部模板-->
<!--{template common/footer}-->

關於語言包的提取

以上示例中的漢字都是寫到模板和程序代碼里的。如果你想支持多種漢字編碼,那么提取到統一的語言包中,與代碼分離會方便很多。

  • 語言包目錄:./source/language
  • 首先給我們的功能建一個專用目錄:./source/language/mood
  • 在專用目錄下創建文件:
lang_template.php 名稱是固定的 lang()函數會自動加載這個文件
	<?php
		$lang = array (
			'mood_name' => '心情牆',
			'mood_publish' => '發表心情',
			'mood_publish_succeed' => '發表成功。',
			'not_loggedin' => '抱歉,您尚未登錄,無法進行此操作',
		  );
	?>
	//注:'not_loggedin' 這個在公共的lang_message.php里已經存面
	//理論上是可以直接使用showmessage('not_loggedin'...),但還是用自己的踏實。showmessage(lang('mood/template', 'not_loggedin')...)
	//模板中的漢字替換成語言包


	<h1 class="mt"><a href="mood.php?mod=list">心情牆</a> - 發表心情</h1>

	變成

	<h1 class="mt"><a href="mood.php?mod=list">{lang mood_name}</a> - {lang mood_publish}</h1>
	

	
	//程序中使用語言包
	
	showmessage('抱歉,您尚未登錄,無法進行此操作', '', array(), array('login' => 1));
	
	變成
	
	showmessage(lang('mood/template', 'not_loggedin'), '', array(), array('login' => 1));


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM