JForum 2.1.7還沒提供熱門主題這個功能,但有一個功能類似的最新主題,我試著仿照最新主題的邏輯實作了熱門主題這個功能,以下是主要的修改步驟:
1. 在WEB-INF/config/database/generic/generic_queries.sql的TopicModel.selectRecentTopicsByLimit下新增一個SQL指令
TopicModel.selectHottestTopicsByLimit = SELECT t.*, p.user_id AS last_user_id, p.post_time, 0 AS attach \
FROM jforum_topics t, jforum_posts p \
WHERE p.post_id = t.topic_last_post_id \
AND p.need_moderate = 0 \
ORDER BY topic_views DESC \
LIMIT ?
這裡我是以主題的點閱次數來當作熱門排序的基礎。你可以先執行看看是否可以執行成功。
2.將templates/default/recent_thread.htm複製為templates/default/hottest_thread.htm並且將所有的 "recent" 字串替換為 "hottest"。
3.修改WEB-INF/config/urlPattern.properties (將它們加在含有recentTopics字串的設定底下)
rss.hottestTopics.0 =
# Hottest Topics
hottestTopics.list.0 =
hottestTopics.showTopicsByUser.1 = user_id
hottestTopics.showTopicsByUser.2 = start, user_id
4.修改WEB-INF/config/templatesMapping.properties(將它們加在含有recent字串的設定底下)
hottest.list = hottest_thread.htm
hottest.usertopics.show = user_topics_show.htm
5.修改WEB-INF/config/modulesMapping.properties(將它們加在含有recentTopics字串的設定底下)
hottestTopics = net.jforum.view.forum.HottestTopicsAction
6.複製src/net/jforum/view/forum/RecentTopicsAction.java為src/net/jforum/view/forum/HottestTopicsAction.java, 並將所有的 "recent" 替換為 "hottest", 所有的 "Recent" 替換為 "Hottest", 所有的 "RECENT" 替換為 "HOTTEST"。
7.修改src/net/jforum/util/preferences/TemplateKeys.java(將它們加在含有recent字串的宣告底下)
public static final String HOTTEST_LIST = "hottest.list";
public static final String HOTTEST_USER_TOPICS_SHOW = "hottest.usertopics.show";
8.修改src/net/jforum/util/preferences/ConfigKeys.java(將它們加在含有recent字串的宣告底下)
public static final String HOTTEST_TOPICS = "topic.hottest";
9.修改TopicRepository.java(將它們加在含有recent字串的方法底下)
private static final String HOTTEST = "hottest";
/**
* Get all cached hottest topics.
*
*/
public static List getHottestTopics()
{
List l = (List)cache.get(FQN, HOTTEST);
if (l == null || l.size() == 0
|| !SystemGlobals.getBoolValue(ConfigKeys.TOPIC_CACHE_ENABLED)) {
l = loadHottestTopics();
}
return new ArrayList(l);
}
/**
* Add hottest topics to the cache
*/
public static List loadHottestTopics()
{
TopicDAO tm = DataAccessDriver.getInstance().newTopicDAO();
int limit = SystemGlobals.getIntValue(ConfigKeys.HOTTEST_TOPICS);
List l = tm.selectHottestTopics(limit);
cache.add(FQN, HOTTEST, new LinkedList(l));
return l;
}
10.修改src/net/jforum/dao/TopicDAO.java(將它們加在含有recent字串的方法宣告底下)
/**
* Selects hottest topics
*
* @param limit The number of topics to retrieve
* @return List
*/
public List selectHottestTopics (int limit) ;
11.修改src/net/jforum/dao/generic/GenericTopicDAO.java(將它們加在含有recent字串的方法底下)
/**
* @see net.jforum.dao.TopicDAO#selectHottestTopics(int)
*/
public List selectHottestTopics(int limit)
{
PreparedStatement p = null;
try {
p = JForumExecutionContext.getConnection().prepareStatement(
SystemGlobals.getSql("TopicModel.selectHottestTopicsByLimit"));
p.setInt(1, limit);
List list = this.fillTopicsData(p);
p = null;
return list;
}
catch (SQLException e) {
throw new DatabaseException(e);
}
finally {
DbUtils.close(p);
}
}
12.修改src/net/jforum/view/forum/common/TopicsCommon.java的deleteTopic()方法(將它們加在TopicRepository.loadMostRecentTopics();的陳述底下)
// Updates the Hottest Topics if it contains this topic
TopicRepository.loadHottestTopics();
13.修改src/net/jforum/view/forum/PostAction.java的delete()方法(將它們加在TopicRepository.loadMostRecentTopics();的陳述底下)
TopicRepository.loadHottestTopics();
14.修改src/net/jforum/view/forum/ModerationHelper.java的removeTopics()方法及moveTopicsSave()方法(將它們加在TopicRepository.loadMostRecentTopics();的陳述底下)
TopicRepository.loadHottestTopics();
15.新增topic.hottest參數到WEB-INF/config/SystemGlobals.properties及WEB-INF/config/jforum-custom.conf
topic.hottest = 50
16.新增ForumBase.hottestTopics到WEB-INF/config/languages/en_US.properties及您的本地語系, 如zh_TW.properties
ForumBase.hottestTopics = Hottest Topics
ForumBase.hottestTopics = 熱門主題
17.修改templates/default/header.htm, 新增一個熱門主題的超連結(可以由最新主題複製然後再修改)
18.用ant重新編譯
19.重新啟動Tomcat或用manager重新載入JForum