Nhà xuất bản - Móc và sự kiện
Sự kiện và sự kiện của nhà xuất bản
Phần tiêu đề “Sự kiện và sự kiện của nhà xuất bản”Hướng dẫn đầy đủ về cách mở rộng chức năng của Nhà xuất bản bằng cách sử dụng các sự kiện, hook và plugin.
Tổng quan về hệ thống sự kiện
Phần tiêu đề “Tổng quan về hệ thống sự kiện”Sự kiện là gì?
Phần tiêu đề “Sự kiện là gì?”Các sự kiện cho phép modules khác phản ứng với hành động của Nhà xuất bản:
Publisher Action → Trigger Event → Other modules listen/react
Examples: - Article created → Send notification email - Article published → Update social media - Comment posted → Notify author - Category created → Update search indexLuồng sự kiện
Phần tiêu đề “Luồng sự kiện”graph LR A[Action in Publisher] -->|Trigger| B[Event fired] B -->|Listeners notified| C[Other modules react] C -->|Execute callbacks| D[Plugins/Hooks run]Sự kiện có sẵn
Phần tiêu đề “Sự kiện có sẵn”Mục (Bài viết) Sự kiện
Phần tiêu đề “Mục (Bài viết) Sự kiện”nhà xuất bản.item.created
Phần tiêu đề “nhà xuất bản.item.created”Kích hoạt khi một bài viết mới được tạo ra.
// Trigger point in Publisherxoops_events()->trigger('publisher.item.created', array( 'item' => $item, 'itemid' => $item->getVar('itemid'), 'title' => $item->getVar('title'), 'uid' => $item->getVar('uid')));Trình nghe ví dụ:
// Listen for article creationxoops_events()->attach('publisher.item.created', 'onArticleCreated');
function onArticleCreated($item) { $itemId = $item['itemid']; $title = $item['title']; $uid = $item['uid'];
// Send email notification sendEmailNotification($uid, "New article: $title");
// Log activity logActivity('Article created', $itemId);
// Update search index updateSearchIndex($itemId);}nhà xuất bản.item.updated
Phần tiêu đề “nhà xuất bản.item.updated”Kích hoạt khi một bài viết được cập nhật.
xoops_events()->trigger('publisher.item.updated', array( 'item' => $item, 'itemid' => $itemId, 'changes' => $changes));nhà xuất bản.item.đã xóa
Phần tiêu đề “nhà xuất bản.item.đã xóa”Kích hoạt khi một bài viết bị xóa.
xoops_events()->trigger('publisher.item.deleted', array( 'itemid' => $itemId, 'title' => $title, 'categoryid' => $categoryId));nhà xuất bản.item.published
Phần tiêu đề “nhà xuất bản.item.published”Được kích hoạt khi trạng thái bài viết thay đổi thành đã xuất bản.
xoops_events()->trigger('publisher.item.published', array( 'item' => $item, 'itemid' => $itemId));nhà xuất bản.item.approved
Phần tiêu đề “nhà xuất bản.item.approved”Kích hoạt khi bài viết đang chờ được phê duyệt.
xoops_events()->trigger('publisher.item.approved', array( 'item' => $item, 'itemid' => $itemId, 'uid' => $uid));nhà xuất bản.item.rejected
Phần tiêu đề “nhà xuất bản.item.rejected”Kích hoạt khi bài viết bị từ chối.
xoops_events()->trigger('publisher.item.rejected', array( 'item' => $item, 'itemid' => $itemId, 'reason' => $reason));Danh mục Sự kiện
Phần tiêu đề “Danh mục Sự kiện”nhà xuất bản.category.created
Phần tiêu đề “nhà xuất bản.category.created”Được kích hoạt khi danh mục được tạo.
xoops_events()->trigger('publisher.category.created', array( 'category' => $category, 'categoryid' => $categoryId, 'name' => $name));nhà xuất bản.category.updated
Phần tiêu đề “nhà xuất bản.category.updated”Kích hoạt khi danh mục được cập nhật.
xoops_events()->trigger('publisher.category.updated', array( 'category' => $category, 'categoryid' => $categoryId));nhà xuất bản.category.đã xóa
Phần tiêu đề “nhà xuất bản.category.đã xóa”Được kích hoạt khi danh mục bị xóa.
xoops_events()->trigger('publisher.category.deleted', array( 'categoryid' => $categoryId, 'name' => $name, 'itemCount' => $itemCount));Sự kiện bình luận
Phần tiêu đề “Sự kiện bình luận”nhà xuất bản.comment.created
Phần tiêu đề “nhà xuất bản.comment.created”Kích hoạt khi bình luận được đăng.
xoops_events()->trigger('publisher.comment.created', array( 'comment' => $comment, 'commentid' => $commentId, 'itemid' => $itemId));nhà xuất bản.comment.approved
Phần tiêu đề “nhà xuất bản.comment.approved”Kích hoạt khi nhận xét được phê duyệt.
xoops_events()->trigger('publisher.comment.approved', array( 'comment' => $comment, 'commentid' => $commentId));nhà xuất bản.comment.deleted
Phần tiêu đề “nhà xuất bản.comment.deleted”Kích hoạt khi bình luận bị xóa.
xoops_events()->trigger('publisher.comment.deleted', array( 'commentid' => $commentId, 'itemid' => $itemId));Nghe sự kiện
Phần tiêu đề “Nghe sự kiện”Đăng ký Trình xử lý sự kiện
Phần tiêu đề “Đăng ký Trình xử lý sự kiện”Trong mô-đun hoặc plugin của bạn:
<?php// Register listener in xoops_version.php or initialization filexoops_events()->attach( 'publisher.item.created', array('MyModuleListener', 'onPublisherItemCreated'));
// Or use function namexoops_events()->attach( 'publisher.item.created', 'my_module_on_item_created');?>Phương thức lớp Listener
Phần tiêu đề “Phương thức lớp Listener”<?phpclass MyModuleListener { public static function onPublisherItemCreated($data) { $itemId = $data['itemid']; $title = $data['title'];
// Perform action self::notifySubscribers($itemId, $title); }
protected static function notifySubscribers($itemId, $title) { // Implementation }}?>Chức năng nghe
Phần tiêu đề “Chức năng nghe”<?phpfunction my_module_on_item_created($data) { $itemId = $data['itemid']; $title = $data['title']; $uid = $data['uid'];
// Send notification notifyUser($uid, "Article created: $title");}?>Ví dụ về sự kiện
Phần tiêu đề “Ví dụ về sự kiện”Ví dụ 1: Gửi Email khi tạo bài viết
Phần tiêu đề “Ví dụ 1: Gửi Email khi tạo bài viết”<?php// Listen for article creationxoops_events()->attach( 'publisher.item.created', 'send_article_notification_email');
function send_article_notification_email($data) { $itemId = $data['itemid']; $title = $data['title']; $uid = $data['uid'];
// Get user object $userHandler = xoops_getHandler('user'); $user = $userHandler->get($uid);
if (!$user) { return; }
// Get admin emails $config = xoops_getModuleConfig(); $adminEmails = $config['admin_emails'];
// Prepare email $subject = "New Article: $title"; $message = "A new article has been created:\n\n"; $message .= "Title: $title\n"; $message .= "Author: " . $user->getVar('uname') . "\n"; $message .= "Date: " . date('Y-m-d H:i:s') . "\n"; $message .= "ID: $itemId\n\n"; $message .= "Link: " . XOOPS_URL . "/modules/publisher/?op=showitem&itemid=$itemId\n";
// Send to admins foreach (explode(',', $adminEmails) as $email) { xoops_mail($email, $subject, $message); }}?>Ví dụ 2: Cập nhật chỉ mục tìm kiếm
Phần tiêu đề “Ví dụ 2: Cập nhật chỉ mục tìm kiếm”<?php// Listen for article published eventxoops_events()->attach( 'publisher.item.published', 'update_search_index');
function update_search_index($data) { $itemId = $data['itemid']; $item = $data['item'];
// Update search index $searchHandler = xoops_getModuleHandler('Search'); $searchHandler->indexArticle($itemId, array( 'title' => $item->getVar('title'), 'content' => $item->getVar('body'), 'author' => $item->getVar('uname'), 'date' => $item->getVar('datesub') ));}?>Ví dụ 3: Tự động đăng lên mạng xã hội
Phần tiêu đề “Ví dụ 3: Tự động đăng lên mạng xã hội”<?php// Listen for article publicationxoops_events()->attach( 'publisher.item.published', 'post_to_social_media');
function post_to_social_media($data) { $item = $data['item']; $itemId = $data['itemid'];
// Get config $config = xoops_getModuleConfig();
if ($config['post_to_twitter']) { postToTwitter( $item->getVar('title'), XOOPS_URL . '/modules/publisher/?op=showitem&itemid=' . $itemId ); }
if ($config['post_to_facebook']) { postToFacebook( $item->getVar('title'), $item->getVar('description') ); }}
function postToTwitter($text, $url) { // Twitter API integration // Use Twitter OAuth library}
function postToFacebook($title, $description) { // Facebook API integration}?>Ví dụ 4: Sync với hệ thống bên ngoài
Phần tiêu đề “Ví dụ 4: Sync với hệ thống bên ngoài”<?php// Listen for article creation and updatexoops_events()->attach( 'publisher.item.created', 'sync_external_system');
xoops_events()->attach( 'publisher.item.updated', 'sync_external_system');
function sync_external_system($data) { $item = $data['item']; $itemId = $data['itemid'];
// Get external API config $config = xoops_getModuleConfig(); $apiUrl = $config['external_api_url']; $apiKey = $config['external_api_key'];
// Prepare payload $payload = json_encode(array( 'id' => $itemId, 'title' => $item->getVar('title'), 'content' => $item->getVar('body'), 'date' => date('c', $item->getVar('datesub')) ));
// Send to external system $ch = curl_init($apiUrl); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Authorization: Bearer ' . $apiKey )); curl_exec($ch); curl_close($ch);}?>Hệ thống móc
Phần tiêu đề “Hệ thống móc”Nhà xuất bản Hook
Phần tiêu đề “Nhà xuất bản Hook”Móc cho phép sửa đổi hành vi của Nhà xuất bản:
nhà xuất bản.view.article.start
Phần tiêu đề “nhà xuất bản.view.article.start”Được gọi trước khi bài viết được hiển thị.
xoops_events()->attach( 'publisher.view.article.start', 'modify_article_before_display');
function modify_article_before_display(&$item) { // Modify item before display $title = $item->getVar('title'); $item->setVar('title', '[FEATURED] ' . $title);}nhà xuất bản.view.article.end
Phần tiêu đề “nhà xuất bản.view.article.end”Được gọi sau khi bài viết được hiển thị.
xoops_events()->attach( 'publisher.view.article.end', 'append_to_article');
function append_to_article(&$article) { // Add content after article $article .= '<div class="related-articles">'; $article .= '<!-- Related articles content -->'; $article .= '</div>';}nhà xuất bản.permission.check
Phần tiêu đề “nhà xuất bản.permission.check”Được gọi khi kiểm tra quyền.
xoops_events()->attach( 'publisher.permission.check', 'custom_permission_logic');
function custom_permission_logic(&$allowed, $permission, $itemId) { // Custom permission logic if (custom_rule_applies($itemId)) { $allowed = true; }}Hệ thống plugin
Phần tiêu đề “Hệ thống plugin”Tạo một plugin
Phần tiêu đề “Tạo một plugin”Các plugin mở rộng chức năng của Nhà xuất bản:
Cấu trúc tệp:
modules/publisher/plugins/├── myplugin/│ ├── plugin.php (main file)│ ├── language/│ │ └── english.php│ ├── templates/│ └── css/plugin.php:
<?php// Plugin informationdefine('MYPLUGIN_NAME', 'My Publisher Plugin');define('MYPLUGIN_VERSION', '1.0.0');define('MYPLUGIN_DESCRIPTION', 'Extends Publisher with custom features');
// Register hooks/eventsxoops_events()->attach( 'publisher.item.created', 'myplugin_on_item_created');
xoops_events()->attach( 'publisher.view.article.end', 'myplugin_append_content');
// Plugin functionsfunction myplugin_on_item_created($data) { // Handle item creation}
function myplugin_append_content(&$content) { // Append content to article $content .= '<div class="myplugin-content">Custom content</div>';}
// Plugin APIclass MyPublisherPlugin { public static function getArticles($limit = 10) { $itemHandler = xoops_getModuleHandler('Item', 'publisher'); return $itemHandler->getRecent($limit); }
public static function getCategoryTree() { $catHandler = xoops_getModuleHandler('Category', 'publisher'); return $catHandler->getRoots(); }}?>Tải plugin
Phần tiêu đề “Tải plugin”Trong quá trình khởi tạo Nhà xuất bản:
<?php// Load plugin$pluginPath = XOOPS_ROOT_PATH . '/modules/publisher/plugins/myplugin/plugin.php';if (file_exists($pluginPath)) { include_once $pluginPath;}?>Bộ lọc
Phần tiêu đề “Bộ lọc”Bộ lọc nội dung
Phần tiêu đề “Bộ lọc nội dung”Bộ lọc sửa đổi dữ liệu trước/sau khi xử lý:
<?php// Filter article title$title = apply_filters('publisher_item_title', $title, $itemId);
// Filter article body$body = apply_filters('publisher_item_body', $body, $itemId);
// Filter article display$display = apply_filters('publisher_item_display', $display, $item);?>Bộ lọc đăng ký
Phần tiêu đề “Bộ lọc đăng ký”<?php// Add filteradd_filter('publisher_item_title', 'my_title_filter');
function my_title_filter($title, $itemId) { // Modify title return strtoupper($title);}
// Add filter with priorityadd_filter( 'publisher_item_body', 'my_body_filter', 10, // priority (lower = earlier) 2 // number of arguments);
function my_body_filter($body, $itemId) { // Add watermark to body return $body . '<p class="watermark">© ' . date('Y') . '</p>';}?>Móc hành động
Phần tiêu đề “Móc hành động”Hành động tùy chỉnh
Phần tiêu đề “Hành động tùy chỉnh”Thực thi mã tại các điểm cụ thể:
<?php// Do actiondo_action('publisher_article_saved', $itemId, $item);
// Do action with argumentsdo_action('publisher_comment_approved', $commentId, $comment);
// Listen to actionadd_action('publisher_article_saved', 'my_action_handler');
function my_action_handler($itemId, $item) { // Execute code log_article_save($itemId); update_statistics();}?>Mở rộng bằng Plugin
Phần tiêu đề “Mở rộng bằng Plugin”Plugin ví dụ: Các bài viết liên quan
Phần tiêu đề “Plugin ví dụ: Các bài viết liên quan”<?phpclass RelatedArticlesPlugin { public static function init() { xoops_events()->attach( 'publisher.view.article.end', array(__CLASS__, 'displayRelated') ); }
public static function displayRelated(&$content) { // Get related articles $related = self::getRelatedArticles();
if (count($related) > 0) { $html = '<div class="related-articles">'; $html .= '<h3>Related Articles</h3>'; $html .= '<ul>';
foreach ($related as $article) { $html .= '<li>'; $html .= '<a href="' . $article->url() . '">'; $html .= $article->title(); $html .= '</a>'; $html .= '</li>'; }
$html .= '</ul>'; $html .= '</div>';
$content .= $html; } }
protected static function getRelatedArticles() { // Get current article global $itemId;
$itemHandler = xoops_getModuleHandler('Item', 'publisher'); $item = $itemHandler->get($itemId);
if (!$item) { return array(); }
// Get articles in same category $related = $itemHandler->getByCategory( $item->getVar('categoryid'), $limit = 5 );
// Remove current article $related = array_filter($related, function($article) { global $itemId; return $article->getVar('itemid') != $itemId; });
return array_slice($related, 0, 3); }}
// Initialize pluginRelatedArticlesPlugin::init();?>Các phương pháp hay nhất
Phần tiêu đề “Các phương pháp hay nhất”Nguyên tắc xử lý sự kiện
Phần tiêu đề “Nguyên tắc xử lý sự kiện”✓ Keep listeners performant - Don't do heavy processing in events - Cache results when possible
✓ Handle errors gracefully - Use try/catch - Log errors - Don't break main flow
✓ Use meaningful names - my_module_on_publisher_item_created - Instead of: process_event_1
✓ Document your events - Comment what trigger point is - List expected data - Show usage examples
✓ Unload listeners properly - Clean up on module uninstall - Remove hooks when no longer neededMẹo về hiệu suất
Phần tiêu đề “Mẹo về hiệu suất”✗ Avoid database queries in listeners✗ Don't block execution with slow operations✗ Avoid modifying data unnecessarily
✓ Queue long-running tasks✓ Cache external API calls✓ Use lazy loading for dependencies✓ Batch database operationsSự kiện gỡ lỗi
Phần tiêu đề “Sự kiện gỡ lỗi”Bật Chế độ gỡ lỗi
Phần tiêu đề “Bật Chế độ gỡ lỗi”<?php// In module initializationif (defined('XOOPS_DEBUG')) { xoops_events()->attach( 'publisher.item.created', 'publisher_debug_event' );}
function publisher_debug_event($data) { error_log('Publisher Event: ' . print_r($data, true));}?>Ghi nhật ký sự kiện
Phần tiêu đề “Ghi nhật ký sự kiện”<?php// Log event dataxoops_events()->attach( 'publisher.item.created', 'log_publisher_events');
function log_publisher_events($data) { $log = XOOPS_ROOT_PATH . '/var/log/publisher.log'; $entry = date('Y-m-d H:i:s') . ' - '; $entry .= 'Event: publisher.item.created' . "\n"; $entry .= 'Data: ' . json_encode($data) . "\n\n"; file_put_contents($log, $entry, FILE_APPEND);}?>Tài liệu liên quan
Phần tiêu đề “Tài liệu liên quan”- Tham khảo API
- Mẫu tùy chỉnh
- Tạo bài viết
Tài nguyên
Phần tiêu đề “Tài nguyên”---#publisher #hooks #events #plugins #extensions #customization #xoops