Penerbit - Kait dan Acara
Kait dan Acara Penerbit
Section titled “Kait dan Acara Penerbit”Panduan lengkap untuk memperluas fungsionalitas Publisher menggunakan acara, kait, dan plugin.
Ikhtisar Sistem Acara
Section titled “Ikhtisar Sistem Acara”Apa Itu Acara?
Section titled “Apa Itu Acara?”Peristiwa memungkinkan module lain bereaksi terhadap tindakan Penerbit:
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 indexAlur Peristiwa
Section titled “Alur Peristiwa”graph LR A[Action in Publisher] -->|Trigger| B[Event fired] B -->|Listeners notified| C[Other modules react] C -->|Execute callbacks| D[Plugins/Hooks run]Acara yang Tersedia
Section titled “Acara yang Tersedia”Item (Artikel) Acara
Section titled “Item (Artikel) Acara”penerbit.item.dibuat
Section titled “penerbit.item.dibuat”Dipecat saat artikel baru dibuat.
// Trigger point in Publisherxoops_events()->trigger('publisher.item.created', array( 'item' => $item, 'itemid' => $item->getVar('itemid'), 'title' => $item->getVar('title'), 'uid' => $item->getVar('uid')));Contoh Pendengar:
// 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);}penerbit.item.diperbarui
Section titled “penerbit.item.diperbarui”Dipecat saat artikel diperbarui.
xoops_events()->trigger('publisher.item.updated', array( 'item' => $item, 'itemid' => $itemId, 'changes' => $changes));penerbit.item.dihapus
Section titled “penerbit.item.dihapus”Dipecat ketika sebuah artikel dihapus.
xoops_events()->trigger('publisher.item.deleted', array( 'itemid' => $itemId, 'title' => $title, 'categoryid' => $categoryId));penerbit.item.diterbitkan
Section titled “penerbit.item.diterbitkan”Diaktifkan ketika status artikel berubah menjadi diterbitkan.
xoops_events()->trigger('publisher.item.published', array( 'item' => $item, 'itemid' => $itemId));penerbit.item.disetujui
Section titled “penerbit.item.disetujui”Dipecat ketika artikel yang tertunda disetujui.
xoops_events()->trigger('publisher.item.approved', array( 'item' => $item, 'itemid' => $itemId, 'uid' => $uid));penerbit.item.ditolak
Section titled “penerbit.item.ditolak”Dipecat ketika artikel ditolak.
xoops_events()->trigger('publisher.item.rejected', array( 'item' => $item, 'itemid' => $itemId, 'reason' => $reason));Kategori Acara
Section titled “Kategori Acara”penerbit.kategori.dibuat
Section titled “penerbit.kategori.dibuat”Diaktifkan saat kategori dibuat.
xoops_events()->trigger('publisher.category.created', array( 'category' => $category, 'categoryid' => $categoryId, 'name' => $name));penerbit.kategori.diperbarui
Section titled “penerbit.kategori.diperbarui”Diaktifkan ketika kategori diperbarui.
xoops_events()->trigger('publisher.category.updated', array( 'category' => $category, 'categoryid' => $categoryId));penerbit.kategori.dihapus
Section titled “penerbit.kategori.dihapus”Diaktifkan ketika kategori dihapus.
xoops_events()->trigger('publisher.category.deleted', array( 'categoryid' => $categoryId, 'name' => $name, 'itemCount' => $itemCount));Komentar Acara
Section titled “Komentar Acara”penerbit.komentar.dibuat
Section titled “penerbit.komentar.dibuat”Dipecat ketika komentar diposting.
xoops_events()->trigger('publisher.comment.created', array( 'comment' => $comment, 'commentid' => $commentId, 'itemid' => $itemId));penerbit.komentar.disetujui
Section titled “penerbit.komentar.disetujui”Dipecat ketika komentar disetujui.
xoops_events()->trigger('publisher.comment.approved', array( 'comment' => $comment, 'commentid' => $commentId));penerbit.komentar.dihapus
Section titled “penerbit.komentar.dihapus”Dipecat ketika komentar dihapus.
xoops_events()->trigger('publisher.comment.deleted', array( 'commentid' => $commentId, 'itemid' => $itemId));Mendengarkan Acara
Section titled “Mendengarkan Acara”Daftarkan Pendengar Acara
Section titled “Daftarkan Pendengar Acara”Di module atau plugin Anda:
<?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');?>Metode Kelas Pendengar
Section titled “Metode Kelas Pendengar”<?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 }}?>Fungsi Pendengar
Section titled “Fungsi Pendengar”<?phpfunction my_module_on_item_created($data) { $itemId = $data['itemid']; $title = $data['title']; $uid = $data['uid'];
// Send notification notifyUser($uid, "Article created: $title");}?>Contoh Acara
Section titled “Contoh Acara”Contoh 1: Kirim Email tentang Pembuatan Artikel
Section titled “Contoh 1: Kirim Email tentang Pembuatan Artikel”<?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); }}?>Contoh 2: Perbarui Indeks Pencarian
Section titled “Contoh 2: Perbarui Indeks Pencarian”<?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') ));}?>Contoh 3: Posting Otomatis ke Media Sosial
Section titled “Contoh 3: Posting Otomatis ke Media Sosial”<?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}?>Contoh 4: Sinkronisasi dengan Sistem Eksternal
Section titled “Contoh 4: Sinkronisasi dengan Sistem Eksternal”<?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);}?>Sistem Kait
Section titled “Sistem Kait”Kait Penerbit
Section titled “Kait Penerbit”Kait memungkinkan modifikasi pada perilaku Penerbit:
penerbit.view.artikel.mulai
Section titled “penerbit.view.artikel.mulai”Dipanggil sebelum artikel dirender.
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);}penerbit.view.artikel.akhir
Section titled “penerbit.view.artikel.akhir”Dipanggil setelah artikel dirender.
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>';}penerbit.izin.periksa
Section titled “penerbit.izin.periksa”Dipanggil saat memeriksa izin.
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; }}Sistem Pengaya
Section titled “Sistem Pengaya”Buat Plugin
Section titled “Buat Plugin”Plugin memperluas fungsionalitas Publisher:
Struktur File:
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(); }}?>Muat Plugin
Section titled “Muat Plugin”Dalam inisialisasi Penerbit:
<?php// Load plugin$pluginPath = XOOPS_ROOT_PATH . '/modules/publisher/plugins/myplugin/plugin.php';if (file_exists($pluginPath)) { include_once $pluginPath;}?>Filter
Section titled “Filter”Filter Konten
Section titled “Filter Konten”Filter mengubah pemrosesan data before/after:
<?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);?>Daftar Filter
Section titled “Daftar Filter”<?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>';}?>Kait Tindakan
Section titled “Kait Tindakan”Tindakan Khusus
Section titled “Tindakan Khusus”Jalankan kode pada titik tertentu:
<?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();}?>Memperluas dengan Plugin
Section titled “Memperluas dengan Plugin”Contoh Plugin: Artikel Terkait
Section titled “Contoh Plugin: Artikel Terkait”<?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();?>Praktik Terbaik
Section titled “Praktik Terbaik”Pedoman Pendengar Acara
Section titled “Pedoman Pendengar Acara”✓ 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 neededKiat Kinerja
Section titled “Kiat Kinerja”✗ 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 operationsMen-debug Acara
Section titled “Men-debug Acara”Aktifkan Mode Debug
Section titled “Aktifkan Mode Debug”<?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));}?>Catat Peristiwa
Section titled “Catat Peristiwa”<?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);}?>Dokumentasi Terkait
Section titled “Dokumentasi Terkait”- Referensi API
- template Khusus
- Pembuatan Artikel
Sumber Daya
Section titled “Sumber Daya”#publisher #hooks #events #plugins #extensions #customization #xoops