Other How to show a forum in a page - Cách hiển thị forum trong trang

PVS

Super Moderator
Thành viên BQT
Tham gia
28/02/2015
Bài viết
17,149
Được Like
12,745
How to show a forum in a page - Cách hiển thị forum trong trang

Hướng dẫn này sẽ giải thích làm thế nào để hiển thị một diễn đàn (danh sách chủ đề) bên trong một trang.

Và đây là kết quả cuối cùng:

2.PNG

Bước 1 - Tạo mã

Các mã sau đây sẽ là responsable cho thực hiện một yêu cầu đến một hành động của controller gọi XenForo_ControllerPublic_Forum. Hành động này là actionIndex và bạn có thể có một cái nhìn vào nó và xem những gì nó mở tập tin library/XenForo/ControllerPublic/Forum.php và đi đến chức năng actionIndex.

Các hành động có được một danh sách các chủ đề trong diễn đàn cụ thể, và làm nhiều thứ khác như kiểm tra quyền truy cập, thứ tự chủ đề và vv

Tạo một file mới trong your_forum_root/library và đặt tên nó là ShowAForum.php.

Mở tập tin này và dán đoạn mã sau:
Mã:
<?php
class ShowAForum
{
    public static function showAForumInPage(XenForo_ControllerPublic_Abstract $controller, XenForo_ControllerResponse_Abstract &$response)
    {
        /* Get the visitor param */
        $visitor = XenForo_Visitor::getInstance();

        /* Create a new request */
        $request = new Zend_Controller_Request_Http();

        /* The ID of the forum to show. In this example, we'll show the forum with the ID 2*/
        $request->setParam('node_id', 2);

        /* Create a new response */
        $responseForum = new Zend_Controller_Response_Http();

        /* New RouteMatch to use when instance the new ControllerPublic */
        $routeMatch = new XenForo_RouteMatch();

        /* The controller that holds the action that we want to call: XenForo_ControllerPublic_Forum */
        $controllerForum = new XenForo_ControllerPublic_Forum($request, $responseForum, $routeMatch);

        /* Pre Dispatch the controller with the actionIndex */
        $controllerForum->preDispatch('forum', get_class($controllerForum));

        /* Call the actionIndex in the Controller. This action show a list of threads. (that's what we want) */
        $controllerResponse = $controllerForum->{'actionForum'}();

        /* Set the param called 'visitor' in the controller response. This param is used in the thread_list template. */
        $controllerResponse->params['visitor'] = $visitor->toArray();

        /*
            Limit the numbers of thread. In this example we set to onyl show 4 threads: 0,1,2,3,4
            The actionIndex in the XenForo_ControllerPublic_Forum will get all threads that it have to get, but now we can limit
        */
        $threadsToShow = 4;
        $controllerResponse->params['threads'] = array_slice($controllerResponse->params['threads'], 0, $threadsToShow - 1);

        /* Unset the param 'totalThreads' so the numbers of totalThreads will not show in the template */
        unset($controllerResponse->params['totalThreads']);

        /* Create the template to show the threads, with all the params requireds */
        $threadList = new XenForo_Template_Public('thread_list', $controllerResponse->params);

        /* Set the param 'forum' with the rendered template so we can use in our page */
        $response->params['forum'] = $threadList;

        /* return the original response to the page, with the new param 'forum' */
        return $response;
    }
}
?>

Chức năng showAForumInPage này sử dụng hai tham số: $controller (bộ điều khiển của trang) và $response (phản ứng của trang). Chúng ta sẽ chỉ sử dụng $response, để thiết lập một số tùy chỉnh. Nhưng làm thế nào để có được một danh sách các chủ đề?

Khi XenForo đã làm điều đó (bạn có thể thấy rằng khách đến thăm bất kỳ diễn đàn, bạn sẽ nhận được một danh sách các chủ đề), chúng ta sẽ gọi cho controller hiện có và hành động để có được tất cả các chủ đề mà chúng ta muốn hiển thị. Sau đó chúng ta chỉ cần thiết lập số lượng các chủ đề mà chúng ta muốn hiển thị (nếu chúng ta muốn giới hạn) và thiết lập nhiều thứ khác như không hiển thị tổng số bài trong template (XenForo nào đó trong template thread_list).

Chúng ta thiết lập diễn đàn mà chúng ta muốn bằng cách sử dụng đoạn mã này:
Mã:
$request->setParam('node_id', 2);

Số 2 là ID của diễn đàn.

Lưu tập tin.

Bước 2 - Tạo trang

Để tạo một trang mới vào AdminCP -> Applications -> Node Tree -> Create New Page. Điền với thông tin dưới đây (Hoặc bất cứ điều gì bạn muốn. Các mục có màu đỏ là cần thiết để được chính xác giống như tôi đã viết ở đây, vì vậy hướng dẫn này sẽ làm việc cho bạn):

Tab - Basic Information
URL Portion:: showsaforum
Title: Showing a Forum
Description: This page shows a forum.
Parent Node: (root node)
Display Order: 1
Display in the node list: 1
Override user style choice: Unchecked

Tab - Page options
Template HTML:
Mã:
<xen:require css="discussion_list.css" />
<div class="discussionList">
{xen:raw $forum}
</div>

Giải thích: Bạn sẽ có thể không hiểu điều này, nhưng những gì chúng ta đang làm là yêu cầu các tập tin .css cho danh sách chủ đề, và bên trong một div chúng ta raw tham số $forum. Sau khi gọi chức năng, chúng ta nhận được phản ứng và sử dụng phản ứng này để tạo ra một template mới. Template này sẽ được thiết lập như là tham số $forum.

Optional Components: Bạn không cần phải check bất cứ điều gì.

Tab - PHP Callback
PHP Callback: ShowAForum::showAForumInPage

Lưu lại.

Bước 3 - Kiểm tra
Để kiểm tra, hãy vào danh sách diễn đàn của bạn và tìm kiếm trang mới tạo ra. Nó sẽ ở đó:

1.PNG

Click vào nó và các diễn đàn mà bạn chọn sẽ được hiển thị trên trang:

2.PNG

Mẹo:

1: Bạn có thể thiết lập danh sách chủ đề để chỉ hiển thị chủ đề của một tiền tố cụ thể sử dụng điều này:
Mã:
$request->setParam('prefix_id', 1);

Trong đó 1 là ID của tiền tố.

2: Nếu bạn chỉ muốn hiển thị chủ đề sticky thêm mã này:
Mã:
$controllerResponse->params['threads'] = array();

3: Nếu bạn chỉ muốn hiển thị chủ đề bình thường (không sticky) thêm mã này:
Mã:
$controllerResponse->params['stickyThreads'] = array();

Chúc các bạn thành công.


Nguồn: xenforo.com​
 

VLVN

Private
Tham gia
13/09/2016
Bài viết
11
Được Like
5
Cám ơn sếp @PVS bài viết rất bổ ích. Em thấy tip này là show 1 forum cho 1 page, cho em hỏi có cách nào để hiện thread của 1 Categry trong 1 page không ạ?
hoặc là nếu e muốn hiện nhiều forum trong 1 page thì làm thế nào ạ?
 

Top Bottom