ผู้จัดพิมพ์ - Hooks and Events
Hooks และกิจกรรมของผู้จัดพิมพ์
หัวข้อที่มีชื่อว่า “Hooks และกิจกรรมของผู้จัดพิมพ์”คู่มือฉบับสมบูรณ์เพื่อขยายฟังก์ชันการทำงานของผู้เผยแพร่โดยใช้เหตุการณ์ ฮุก และปลั๊กอิน
ภาพรวมระบบกิจกรรม
หัวข้อที่มีชื่อว่า “ภาพรวมระบบกิจกรรม”กิจกรรมคืออะไร?
หัวข้อที่มีชื่อว่า “กิจกรรมคืออะไร?”เหตุการณ์อนุญาตให้โมดูลอื่นตอบสนองต่อการกระทำของผู้เผยแพร่:
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 indexโฟลว์เหตุการณ์
หัวข้อที่มีชื่อว่า “โฟลว์เหตุการณ์”mermaidgraph LR A[Action in Publisher] -->|Trigger| B[Event fired] B -->|Listeners notified| C[Other modules react] C -->|Execute callbacks| D[Plugins/Hooks run]กิจกรรมที่มีอยู่
หัวข้อที่มีชื่อว่า “กิจกรรมที่มีอยู่”เหตุการณ์ (บทความ) รายการ
หัวข้อที่มีชื่อว่า “เหตุการณ์ (บทความ) รายการ”####สำนักพิมพ์.item.created
เริ่มทำงานเมื่อมีการสร้างบทความใหม่
// Trigger point in Publisherxoops_events()->trigger('publisher.item.created', array( 'item' => $item, 'itemid' => $item->getVar('itemid'), 'title' => $item->getVar('title'), 'uid' => $item->getVar('uid')));ผู้ฟังตัวอย่าง:
// 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);}ผู้เผยแพร่.item.updated
หัวข้อที่มีชื่อว่า “ผู้เผยแพร่.item.updated”เริ่มทำงานเมื่อมีการอัปเดตบทความ
xoops_events()->trigger('publisher.item.updated', array( 'item' => $item, 'itemid' => $itemId, 'changes' => $changes));####สำนักพิมพ์.item.ลบแล้ว
เริ่มทำงานเมื่อมีการลบบทความ
xoops_events()->trigger('publisher.item.deleted', array( 'itemid' => $itemId, 'title' => $title, 'categoryid' => $categoryId));####สำนักพิมพ์.item.published
เริ่มทำงานเมื่อสถานะบทความเปลี่ยนเป็นเผยแพร่
xoops_events()->trigger('publisher.item.published', array( 'item' => $item, 'itemid' => $itemId));####สำนักพิมพ์.item.approved
เริ่มทำงานเมื่อบทความที่รอดำเนินการได้รับการอนุมัติ
xoops_events()->trigger('publisher.item.approved', array( 'item' => $item, 'itemid' => $itemId, 'uid' => $uid));####สำนักพิมพ์.item.rejected
เริ่มทำงานเมื่อบทความถูกปฏิเสธ
xoops_events()->trigger('publisher.item.rejected', array( 'item' => $item, 'itemid' => $itemId, 'reason' => $reason));เหตุการณ์หมวดหมู่
หัวข้อที่มีชื่อว่า “เหตุการณ์หมวดหมู่”####สำนักพิมพ์.category.created
เริ่มทำงานเมื่อมีการสร้างหมวดหมู่
xoops_events()->trigger('publisher.category.created', array( 'category' => $category, 'categoryid' => $categoryId, 'name' => $name));####สำนักพิมพ์.category.updated
เริ่มทำงานเมื่อมีการอัปเดตหมวดหมู่
xoops_events()->trigger('publisher.category.updated', array( 'category' => $category, 'categoryid' => $categoryId));Published.category.deleted
หัวข้อที่มีชื่อว่า “Published.category.deleted”เริ่มทำงานเมื่อมีการลบหมวดหมู่
xoops_events()->trigger('publisher.category.deleted', array( 'categoryid' => $categoryId, 'name' => $name, 'itemCount' => $itemCount));กิจกรรมแสดงความคิดเห็น
หัวข้อที่มีชื่อว่า “กิจกรรมแสดงความคิดเห็น”####สำนักพิมพ์.comment.created
เริ่มทำงานเมื่อมีการโพสต์ความคิดเห็น
xoops_events()->trigger('publisher.comment.created', array( 'comment' => $comment, 'commentid' => $commentId, 'itemid' => $itemId));####สำนักพิมพ์.comment.approved
เริ่มทำงานเมื่อความคิดเห็นได้รับการอนุมัติ
xoops_events()->trigger('publisher.comment.approved', array( 'comment' => $comment, 'commentid' => $commentId));####สำนักพิมพ์.comment.deleted
เริ่มทำงานเมื่อมีการลบความคิดเห็น
xoops_events()->trigger('publisher.comment.deleted', array( 'commentid' => $commentId, 'itemid' => $itemId));การฟังเหตุการณ์
หัวข้อที่มีชื่อว่า “การฟังเหตุการณ์”ลงทะเบียนผู้ฟังเหตุการณ์
หัวข้อที่มีชื่อว่า “ลงทะเบียนผู้ฟังเหตุการณ์”ในโมดูลหรือปลั๊กอินของคุณ:
<?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');?>วิธีการเรียนผู้ฟัง
หัวข้อที่มีชื่อว่า “วิธีการเรียนผู้ฟัง”<?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 }}?>ฟังก์ชั่นผู้ฟัง
หัวข้อที่มีชื่อว่า “ฟังก์ชั่นผู้ฟัง”<?phpfunction my_module_on_item_created($data) { $itemId = $data['itemid']; $title = $data['title']; $uid = $data['uid'];
// Send notification notifyUser($uid, "Article created: $title");}?>ตัวอย่างกิจกรรม
หัวข้อที่มีชื่อว่า “ตัวอย่างกิจกรรม”ตัวอย่างที่ 1: ส่งอีเมลเกี่ยวกับการสร้างบทความ
หัวข้อที่มีชื่อว่า “ตัวอย่างที่ 1: ส่งอีเมลเกี่ยวกับการสร้างบทความ”<?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); }}?>ตัวอย่างที่ 2: อัปเดตดัชนีการค้นหา
หัวข้อที่มีชื่อว่า “ตัวอย่างที่ 2: อัปเดตดัชนีการค้นหา”<?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') ));}?>ตัวอย่างที่ 3: โพสต์อัตโนมัติไปยังโซเชียลมีเดีย
หัวข้อที่มีชื่อว่า “ตัวอย่างที่ 3: โพสต์อัตโนมัติไปยังโซเชียลมีเดีย”<?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}?>ตัวอย่างที่ 4: ซิงค์กับระบบภายนอก
หัวข้อที่มีชื่อว่า “ตัวอย่างที่ 4: ซิงค์กับระบบภายนอก”<?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);}?>ระบบตะขอ
หัวข้อที่มีชื่อว่า “ระบบตะขอ”ตะขอผู้จัดพิมพ์
หัวข้อที่มีชื่อว่า “ตะขอผู้จัดพิมพ์”Hooks อนุญาตให้แก้ไขพฤติกรรมของผู้เผยแพร่:
####สำนักพิมพ์.view.article.start
ถูกเรียกก่อนที่จะแสดงผลบทความ
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);}####สำนักพิมพ์.view.article.end
เรียกว่าหลังจากแสดงผลบทความแล้ว
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>';}ผู้เผยแพร่.permission.check
หัวข้อที่มีชื่อว่า “ผู้เผยแพร่.permission.check”เรียกว่าเมื่อตรวจสอบสิทธิ์
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; }}ระบบปลั๊กอิน
หัวข้อที่มีชื่อว่า “ระบบปลั๊กอิน”สร้างปลั๊กอิน
หัวข้อที่มีชื่อว่า “สร้างปลั๊กอิน”ปลั๊กอินขยายฟังก์ชันการทำงานของผู้เผยแพร่:
โครงสร้างไฟล์:
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(); }}?>โหลดปลั๊กอิน
หัวข้อที่มีชื่อว่า “โหลดปลั๊กอิน”ในการเริ่มต้นผู้เผยแพร่:
<?php// Load plugin$pluginPath = XOOPS_ROOT_PATH . '/modules/publisher/plugins/myplugin/plugin.php';if (file_exists($pluginPath)) { include_once $pluginPath;}?>ตัวกรอง
หัวข้อที่มีชื่อว่า “ตัวกรอง”ตัวกรองเนื้อหา
หัวข้อที่มีชื่อว่า “ตัวกรองเนื้อหา”ตัวกรองแก้ไขข้อมูลก่อน/หลังการประมวลผล:
<?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);?>ลงทะเบียนตัวกรอง
หัวข้อที่มีชื่อว่า “ลงทะเบียนตัวกรอง”<?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>';}?>ตะขอแอ็คชั่น
หัวข้อที่มีชื่อว่า “ตะขอแอ็คชั่น”การกระทำที่กำหนดเอง
หัวข้อที่มีชื่อว่า “การกระทำที่กำหนดเอง”รันโค้ดที่จุดเฉพาะ:
<?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();}?>ขยายด้วยปลั๊กอิน
หัวข้อที่มีชื่อว่า “ขยายด้วยปลั๊กอิน”ตัวอย่างปลั๊กอิน: บทความที่เกี่ยวข้อง
หัวข้อที่มีชื่อว่า “ตัวอย่างปลั๊กอิน: บทความที่เกี่ยวข้อง”<?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();?>แนวทางปฏิบัติที่ดีที่สุด
หัวข้อที่มีชื่อว่า “แนวทางปฏิบัติที่ดีที่สุด”หลักเกณฑ์ผู้ฟังเหตุการณ์
หัวข้อที่มีชื่อว่า “หลักเกณฑ์ผู้ฟังเหตุการณ์”✓ 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 neededเคล็ดลับประสิทธิภาพ
หัวข้อที่มีชื่อว่า “เคล็ดลับประสิทธิภาพ”✗ 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 operationsเหตุการณ์การแก้ไขข้อบกพร่อง
หัวข้อที่มีชื่อว่า “เหตุการณ์การแก้ไขข้อบกพร่อง”เปิดใช้งานโหมดแก้ไขข้อบกพร่อง
หัวข้อที่มีชื่อว่า “เปิดใช้งานโหมดแก้ไขข้อบกพร่อง”<?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));}?>บันทึกเหตุการณ์
หัวข้อที่มีชื่อว่า “บันทึกเหตุการณ์”<?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);}?>เอกสารที่เกี่ยวข้อง
หัวข้อที่มีชื่อว่า “เอกสารที่เกี่ยวข้อง”- API อ้างอิง
- เทมเพลตที่กำหนดเอง
- การสร้างบทความ
แหล่งข้อมูล
หัวข้อที่มีชื่อว่า “แหล่งข้อมูล”#publisher #hooks #events #plugins #extensions #customization #xoops