Other Cách mở rộng tiêu chí người dùng (sử dụng trong trophy, upgrade và notice/notification)

PVS

Super Moderator
Thành viên BQT
Tham gia
28/02/2015
Bài viết
16,829
Được Like
12,690
Cách mở rộng tiêu chí người dùng (sử dụng trong trophy, upgrade và notice/notification) 1.0

Giới thiệu

Gần đây tôi đã được hỏi những câu hỏi, làm thế nào để mở rộng các tiêu chí để trao danh hiệu?

Hiện đang có một tiêu chí sử dụng gọi là "Người dùng không có avatar":

USoE9.png

Điều này có thể hữu ích để sử dụng trong Notices hoặc Notifications để nhắc nhở ai đó mà họ có thể, hoặc làm thế nào để thêm avatar:

2Xxjp.png

Hãy thêm ngược lại: "Người sử dụng có một avatar". Chúng ta có thể sau đó sẽ sử dụng tiêu chí này để thưởng cho một người nào đó, thông qua một danh hiệu, một số điểm khi họ đã dành thời gian để thêm avatar.


Tạo một add-on

Đầu tiên, cần tạo một add-on. Để làm điều đó, đầu tiên phải đảm bảo đã bật chế độ Debug.
  • Mở library/config.php
  • Thêm các dòng sau:
Mã:
$config['debug'] = true;

  • Điều này sẽ kích hoạt tab "Development" trong Admin CP. Tới tab này trong Admin CP và nhấp vào "Create an Add-on"
  • Hãy cho add-on của bạn ít nhất một ID duy nhất, và một tiêu đề và bấm Save.
  • Với mục đích của hướng dẫn này, ID add-on sẽ là UserCriteriaExample
Tạo một số PHP

Add-on này là đơn giản như vậy, chúng ta chỉ cần viết một chút nhỏ của PHP. Đây là tập tin Listener.php mà sẽ nói với XenForo để lắng nghe khi sự kiện nào đó xảy ra.
  • Đầu tiên, tạo một thư mục mới trong thư mục library của bạn phù hợp với ID add-on của bạn. Trong ví dụ của này, tôi đang tạo ra một thư mục gọi là "UserCriteriaExample".
Trong thư mục đó, tạo ra một tập tin mới gọi Listener.php. Nội dung của nó để bắt đầu sẽ cần phải giống như thế này:
Mã:
<?php

class UserCriteriaExample_Listener
{

}
  • Tên class được tạo thành từ tên tập tin, liên quan đến thư mục libary. Vì vậy, tập tin này nằm ở thư mục UserCriteriaExample với tên là Listener.php (UserCriteriaExample/Listener.php) thì classname của nó là UserCriteriaExample_Listener (dấu gạch chéo thay thế bằng gạch dưới và gỡ bỏ phần mở rộng .php).
  • Trong class này, chúng ta chỉ cần xác định hai chức năng. Chỉ có hai bộ phận rất nhỏ để thêm tiêu chí người dùng. Chúng ta cần phải nghe một event template_hook để thêm các tùy chọn người dùng tiêu chuẩn mới cho các tiêu chuẩn mẫu và event user_criteria mà mở rộng các chức năng userMatchesCriteria trong class XenForo_Helper_Criteria.
  • Để xác định các chức năng đầu tiên, chúng ta cần phải tạo ra các chức năng với chữ ký gọi lại thích hợp. Điều này bây giờ sẽ để lại tập tin Listener.php của như thế này:
    Mã:
    <?php
    
    class UserCriteriaExample_Listener
    {
        public static function templateHook($hookName, &$contents, array $hookParams, XenForo_Template_Abstract $template)
        {
    
        }
    }
  • Template tạo ra những tiêu chí cho trophies, user promotions và notices/notifications được gọi là helper_critera_user. Có một số hooks trong template này mà chúng ta có thể sử dụng. Chúng tôi muốn thêm một avatar liên quan vì vậy hãy tìm kiếm template cho "avatar". Khi bạn làm điều này, bạn sẽ thấy các template code cho tiêu chí avatar. Nếu bây giờ chúng ta di chuyển lên và tìm kiếm các hooks gần nhất, chúng ta sẽ thấy:
    Mã:
    <xen:hook name="user_criteria_profile">
  • Vì vậy, bây giờ chúng ta có thể hạn chế hàm templateHook chỉ làm công cụ trong hook user_criteria_profile. Chúng tôi có thể làm điều đó với một mệnh đề IF đơn giản. Kết quả cuối cùng là:
    Mã:
    <?php
    
    class UserCriteriaExample_Listener
    {
        public static function templateHook($hookName, &$contents, array $hookParams, XenForo_Template_Abstract $template)
        {
            if ($hookName == 'user_criteria_profile')
            {
    
            }
        }
    }
  • Ok, tôi sẽ ăn gian một chút. Bạn thường sẽ tạo ra các template của riêng bạn và thêm mã vào, tôi sẽ làm một cái gì đó hơi nhanh hơn mà chỉ mất 3 dòng mã. Đầu tiên, dòng này được các tiêu chí người dùng hiện đang được chọn trong template.
    Mã:
    $userCriteria = $template->getParam('userCriteria');
  • Tiếp theo, dòng này cho thấy nếu các tiêu chí đã có lựa chọn của chúng tôi đã lựa chọn. Lựa chọn của chúng tôi là sẽ đi bằng tên của "has_avatar". Nếu "has_avatar" giá trị đã được thiết lập, giá trị $checked sẽ được 'checked' ngược lại nó sẽ được để trống. Điều này sẽ có ý nghĩa trong một thời điểm ...
    Mã:
    $checked = $userCriteria['has_avatar'] ? 'checked' : '';
  • Cuối cùng, dòng tiếp theo bổ sung thêm một số mã HTML cho template helper_user_criteria. Chú ý các tham số $checked được nối ở giữa HTML. Điều này về cơ bản đảm bảo các tùy chọn được chọn hay không tùy thuộc vào tiêu chí người dùng thiết lập trong cơ sở dữ liệu.
    Mã:
    $contents .= '<li><label><input type="checkbox" name="user_criteria[has_avatar][rule]" value="has_avatar"' . $checked .' /> User has an avatar</label></li>';
  • Lưu file.
Tạo một Code Event Listener

Bây giờ chúng ta có thể đi đến Admin CP và tạo Code Event Listeners. Để dễ dàng, bạn chỉ cần điền vào nó như thế này:

KJliR.png

  • Lưu lại, chúng ta hãy đi kiểm tra các tiêu chí!
Tiến độ cho đến hiện tại ...

r6FjV.png

Thành công! Chúng ta có một lựa chọn mới. Bạn có thể thiết lập tùy chọn này ngay bây giờ, nhưng ngay bây giờ nó không làm bất cứ điều gì.

Nhiều PHP hơn ...

  • Khi chúng ta lưu tiêu chí nó được lưu như là một mảng của các quy tắc (và sau đó tuần tự) và được lưu trữ trong cơ sở dữ liệu. Nếu bạn kiểm tra HTML trước đó, tên quy tắc của đã được định nghĩa là "has_avatar".
  • Chúng ta cần phải xác định rằng chức năng thứ hai mà chúng ta sẽ gọi criteriaUser. Điều đó sẽ khiến listener giống thế này:
    Mã:
    <?php
    
    class UserCriteriaExample_Listener
    {
        public static function templateHook($hookName, &$contents, array $hookParams, XenForo_Template_Abstract $template)
        {
            if ($hookName == 'user_criteria_profile')
            {
                $userCriteria = $template->getParam('userCriteria');
                $checked = $userCriteria['has_avatar'] ? 'checked' : '';
                $contents .= '<li><label><input type="checkbox" name="user_criteria[has_avatar][rule]" value="has_avatar"' . $checked .' /> User has an avatar</label></li>';
            }
        }
       
        public static function criteriaUser($rule, array $data, array $user, &$returnValue)
        {
    
        }
    }
  • Tiêu chí người dùng là có nghĩa đơn giản như nhìn vào giá trị và sau đó xác định các tiêu chí được đáp ứng (true) hay không (false) với một giá trị trong mảng $visitor (được định nghĩa ở đây là $user). Vậy làm thế nào chúng ta có thể kiểm tra xem người dùng có một avatar? Vâng, nếu họ có một avatar họ sẽ có $user['avatar_date'] hoặc $user['gravatar'] được thiết lập trong bảng xf_user. Với ý nghĩ đó, mã còn lại của chúng ta sẽ trông như thế này:
    Mã:
    <?php
    
    class UserCriteriaExample_Listener
    {
        public static function templateHook($hookName, &$contents, array $hookParams, XenForo_Template_Abstract $template)
        {
            if ($hookName == 'user_criteria_profile')
            {
                $userCriteria = $template->getParam('userCriteria');
                $checked = $userCriteria['has_avatar'] ? 'checked' : '';
                $contents .= '<li><label><input type="checkbox" name="user_criteria[has_avatar][rule]" value="has_avatar"' . $checked .' /> User has an avatar</label></li>';
            }
        }
       
        public static function criteriaUser($rule, array $data, array $user, &$returnValue)
        {
            switch ($rule)
            {
                case 'has_avatar':
                    if (!empty($user['avatar_date']) || !empty($user['gravatar']))
                    {
                        $returnValue = true;
                    }
                break;
            }
        }
    }
  • Chú ý tất cả chúng ta đang nói là nếu $rule là "has_avatar" chúng tôi kiểm tra nếu avatar_date hoặc các lĩnh vực gravatar là không có sản phẩm nào cho người sử dụng. Nếu họ không có sản phẩm nào, $returnValue là đúng (giá trị tiêu chí là đúng nếu họ có hình đại diện). Vì vậy, lưu lại nó! Một chi tiết Code Event Listener trong Admin CP:
h1B2a.png

Hãy tạo ra một danh hiệu và kiểm tra!

Hãy tạo ra một danh hiệu cho các tiêu chí mới. Các tiêu chí chỉ cần là "Người sử dụng có một avatar" ...

JpJr6.png

Kiểm tra tài nguyên kèm theo, và điều chỉnh nó cho phù hợp.

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


Nguồn: xenforo.com​
 

Đính kèm

  • UserCriteriaExample.zip
    1.1 KB · Lượt xem: 4

Hướng dẫn sử dụng

XenForo 1 XenForo 2
Translate by PVS

Dịch vụ XenForo của VNXF

Mobile/Zalo: 0906081284

Telegram: anhanhxf

Chỉ nhận web nội dung lành mạnh

Nhà Tài Trợ

Mút Xốp Không Gian
Mút Sofa Không Gian
Top Bottom