Tips Tạo 1 add-on hoàn chỉnh trên xenForo 2 - Phần 2

  • Bạn không tìm được Add-on hay Style xenForo 1 trên hệ thống xFv2 hiện tại ?
    Đăng bài yêu cầu ngay !
  • Can't find your Add-on or Style on xFv2 ?
    Request now !

Updater

xFv2's Updater
8/2/18
3
8
3
xfv2.com
Extending the forum entity

Cho đến nay, chúng tôi đã thêm một cột vào bảng xf_forum, bây giờ là lúc mở rộng cơ cấu tổ chức của Diễn đàn. Chúng ta cần làm điều này để thực thể biết về cột mới của chúng tôi và để dữ liệu có thể được đọc và ghi vào nó qua thực thể.

Các bước sau đây sẽ yêu cầu bật Chế độ phát triển. Nhớ đặt Demo/Portal làm giá trị defaultAddOn trong config.php.
Bước đầu tiên trong quá trình này là tạo ra một "Code event listener". Điều này có thể được thực hiện trong phần AdminCP trong phần phát triển, nhấp vào liên kết "Code event listeners" và nhấp vào nút "Add code event listener".

Chúng ta cần lắng nghe sự kiện entity_structure. Chúng tôi sẽ sử dụng điều này để sửa đổi cấu trúc tổ chức diễn đàn mặc định để thêm cột demo_portal_auto_feature mới được tạo ra của chúng tôi.

Trong field "Event hint", chúng tôi sẽ nhập tên của lớp chúng tôi đang mở rộng, ví dụ: XF\Entity\Forum. Điều này sẽ đảm bảo rằng người nghe của chúng tôi chỉ thực hiện trên diễn đàn diễn đàn.

Đối với lớp "Execute callback", hãy nhập Demo\Portal\Listener và cho phương pháp nhập forumEntityStructure.

Cần thêm một mô tả để giải thích người nghe này là gì, vì điều này sẽ giúp xác định người nghe trong danh sách code event listener dễ dàng hơn. "Extends the XF\Entity\Forum structure" nên đầy đủ. Cuối cùng, hãy chắc chắn rằng tiện ích "Demo-Portal" được chọn.

Trước khi nhấp vào "Lưu", chúng ta cần thực sự tạo lớp Listener. Vì vậy hãy tạo một tệp mới có tên Listener.php trong src/addons/Demo/Portal. Nội dung của tập tin này nên như sau, ban đầu. Chúng ta biết các đối số mà hàm này yêu cầu từ tài liệu bên dưới bộ chọn event listener.

PHP:
<?php

namespace Demo\Portal;

use XF\Mvc\Entity\Entity;

class Listener
{
    public static function forumEntityStructure(\XF\Mvc\Entity\Manager $em, \XF\Mvc\Entity\Structure &$structure)
    {

    }
}
Chú ý khai báo use giữa namespace và tên class. Chúng ta sẽ tham khảo lớp được khai báo ở đây nhiều lần, vì vậy khai báo ở đây cho phép chúng ta tham khảo nó bằng bí danh ngắn hơn nhiều, trong trường hợp này là Entity.

Mã này sẽ không thực sự làm bất cứ điều gì được nêu ra, nhưng bây giờ là một thời gian tốt để lưu các người lắng nghe sự kiện mã, do đó, đi trước và nhấp vào "Lưu" nút.

Trước khi thêm một số mã chức năng vào chức năng mới của chúng tôi, giờ đây có thể là thời điểm tốt để xem hệ thống đầu ra phát triển hoạt động ra sao. Kiểm tra các thư mục và tệp tin mới được thêm vào thư mục tiện ích của bạn. Cụ thể là có một tệp JSON mới trong thư mục _output/code_event_listeners, sẽ giống như sau:

PHP:
{
    "event_id": "entity_structure",
    "execute_order": 10,
    "callback_class": "Demo\\Portal\\Listener",
    "callback_method": "forumEntityStructure",
    "active": true,
    "hint": "XF\\Entity\\Forum",
    "description": "Extends the XF\\Entity\\Forum structure"
}
Bất cứ khi nào thay đổi được thực hiện cho người nghe tập tin này sẽ tự động cập nhật.

Phải, chúng ta hãy thêm một số mã nữa. Quay trở lại bên trong lớp Listener, thêm các lệnh sau vào chức năng forumEntityStructure:

PHP:
$structure->columns['demo_portal_auto_feature'] = ['type' => Entity::BOOL, 'default' => false];
Các thực thể diễn đàn bây giờ là nhận thức của cột mới của chúng tôi, nhưng có một vài bước nữa chúng ta nên chăm sóc đầu tiên trước khi chúng tôi có thể bắt đầu thực hiện một cách để thực sự bắt đầu thiết lập các giá trị trên cột đó.

Extending the thread entity

Một lần nữa, vì chúng ta đã thêm một cột mới vào bảng xf_thread, chúng ta nên làm cho đối tượng Thread nhận thức được điều đó. Điều này rất giống với những gì chúng tôi đã làm ở trên.

Quay trở lại "Add code event listener" và lắng nghe entity_structure một lần nữa. "Event hint" thời gian này sẽ là XF\Entity\Thread. Chúng ta có thể sử dụng cùng một lớp gọi lại như trước (Demo\Portal\Listener) nhưng lần này phương pháp sẽ được đặt tên là threadEntityStructure. Thêm mô tả tương tự như trước. Trước khi lưu, chúng ta nên thêm mã, trực tiếp dưới chức năng forumEntityStructure:

PHP:
public static function threadEntityStructure(\XF\Mvc\Entity\Manager $em, \XF\Mvc\Entity\Structure &$structure)
{
    $structure->columns['demo_portal_featured'] = ['type' => Entity::BOOL, 'default' => false];
}
Mã này hầu như giống với những gì chúng tôi thêm vào cấu trúc tổ chức diễn đàn; thực sự khác biệt duy nhất là tên cột. Nhưng, chúng ta cần phải thêm cái gì đó khác. Chúng ta nên tạo ra một mối quan hệ thực thể để sau đó, chúng ta cần phải truy cập vào các thực thể thread đặc trưng (mà chúng tôi tạo ra trong phần tiếp theo). Xuống dưới dòng $structure->columns và thêm vào đoạn sau

PHP:
$structure->relations['FeaturedThread'] = [
    'entity' => 'Demo\Portal:FeaturedThread',
    'type' => Entity::TO_ONE,
    'conditions' => 'thread_id',
    'primary' => true
];
Xem Quan hệ để biết thêm thông tin về các mối quan hệ. Nhấn "Save" để lưu listener.

Còn tiếp...
Bài viết được dịch từ bài gốc của xenForo: https://xenforo.com/xf2-docs/dev/lets-build-an-add-on/
 
Reactions: datdaik000 and tuna

gangster

Active User
16/3/18
5
0
1
21
Reunion
cảm ơn lời giải thích của bạn rất tốt tôi sẽ theo xf2 ngay bây giờ
 

Members online

No members online now.

Latest resources