Publisher - hooks ve Etkinlikler
Publisher Kancaları ve Etkinlikleri
Section titled “Publisher Kancaları ve Etkinlikleri”Etkinlikleri, kancaları ve eklentileri kullanarak Publisher işlevselliğini genişletmeye yönelik eksiksiz kılavuz.
Etkinlik Sistemine Genel Bakış
Section titled “Etkinlik Sistemine Genel Bakış”Etkinlikler Nelerdir?
Section titled “Etkinlikler Nelerdir?”Etkinlikler, diğer modüllerin Publisher eylemlerine tepki vermesine olanak tanır:
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 indexEtkinlik Akışı
Section titled “Etkinlik Akışı”graph LR A[Action in Publisher] -->|Trigger| B[Event fired] B -->|Listeners notified| C[Other modules react] C -->|Execute callbacks| D[Plugins/Hooks run]Mevcut Etkinlikler
Section titled “Mevcut Etkinlikler”Öğe (Makale) Etkinlikleri
Section titled “Öğe (Makale) Etkinlikleri”Publisher.item.created
Section titled “Publisher.item.created”Yeni bir makale oluşturulduğunda tetiklenir.
// Trigger point in Publisherxoops_events()->trigger('publisher.item.created', array( 'item' => $item, 'itemid' => $item->getVar('itemid'), 'title' => $item->getVar('title'), 'uid' => $item->getVar('uid')));Örnek Dinleyici:
// 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);}Publisher.item.updated
Section titled “Publisher.item.updated”Bir makale güncellendiğinde tetiklenir.
xoops_events()->trigger('publisher.item.updated', array( 'item' => $item, 'itemid' => $itemId, 'changes' => $changes));Publisher.item.deleted
Section titled “Publisher.item.deleted”Bir makale silindiğinde tetiklenir.
xoops_events()->trigger('publisher.item.deleted', array( 'itemid' => $itemId, 'title' => $title, 'categoryid' => $categoryId));Publisher.item.published
Section titled “Publisher.item.published”Makale durumu yayınlandı olarak değiştiğinde tetiklenir.
xoops_events()->trigger('publisher.item.published', array( 'item' => $item, 'itemid' => $itemId));Publisher.item.approved
Section titled “Publisher.item.approved”Bekleyen makale onaylandığında kovuldu.
xoops_events()->trigger('publisher.item.approved', array( 'item' => $item, 'itemid' => $itemId, 'uid' => $uid));Publisher.item.rejected
Section titled “Publisher.item.rejected”Makale reddedildiğinde tetiklenir.
xoops_events()->trigger('publisher.item.rejected', array( 'item' => $item, 'itemid' => $itemId, 'reason' => $reason));Kategori Etkinlikleri
Section titled “Kategori Etkinlikleri”Publisher.kategori.oluşturuldu
Section titled “Publisher.kategori.oluşturuldu”Kategori oluşturulduğunda tetiklenir.
xoops_events()->trigger('publisher.category.created', array( 'category' => $category, 'categoryid' => $categoryId, 'name' => $name));Publisher.kategori.güncellendi
Section titled “Publisher.kategori.güncellendi”Kategori güncellendiğinde tetiklendi.
xoops_events()->trigger('publisher.category.updated', array( 'category' => $category, 'categoryid' => $categoryId));Publisher.kategori.deleted
Section titled “Publisher.kategori.deleted”Kategori silindiğinde tetiklenir.
xoops_events()->trigger('publisher.category.deleted', array( 'categoryid' => $categoryId, 'name' => $name, 'itemCount' => $itemCount));Yorum Etkinlikleri
Section titled “Yorum Etkinlikleri”Publisher.comment.created
Section titled “Publisher.comment.created”Yorum yayınlandığında tetiklendi.
xoops_events()->trigger('publisher.comment.created', array( 'comment' => $comment, 'commentid' => $commentId, 'itemid' => $itemId));Publisher.comment.approved
Section titled “Publisher.comment.approved”Yorum onaylandığında tetiklenir.
xoops_events()->trigger('publisher.comment.approved', array( 'comment' => $comment, 'commentid' => $commentId));Publisher.comment.deleted
Section titled “Publisher.comment.deleted”Yorum silindiğinde tetiklenir.
xoops_events()->trigger('publisher.comment.deleted', array( 'commentid' => $commentId, 'itemid' => $itemId));Etkinlikleri Dinleme
Section titled “Etkinlikleri Dinleme”Etkinlik İşleyiciyi Kaydet
Section titled “Etkinlik İşleyiciyi Kaydet”Modülünüzde veya eklentinizde:
<?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');?>Dinleyici Sınıfı Yöntemi
Section titled “Dinleyici Sınıfı Yöntemi”<?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 }}?>Dinleyici İşlevi
Section titled “Dinleyici İşlevi”<?phpfunction my_module_on_item_created($data) { $itemId = $data['itemid']; $title = $data['title']; $uid = $data['uid'];
// Send notification notifyUser($uid, "Article created: $title");}?>Etkinlik Örnekleri
Section titled “Etkinlik Örnekleri”Örnek 1: Makale Oluşturma Konusunda E-posta Gönderin
Section titled “Örnek 1: Makale Oluşturma Konusunda E-posta Gönderin”<?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); }}?>Örnek 2: Arama Dizinini Güncelleyin
Section titled “Örnek 2: Arama Dizinini Güncelleyin”<?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') ));}?>Örnek 3: Sosyal Medyaya Otomatik Gönderim
Section titled “Örnek 3: Sosyal Medyaya Otomatik Gönderim”<?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}?>Örnek 4: Harici Sistemle Senkronizasyon
Section titled “Örnek 4: Harici Sistemle Senkronizasyon”<?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);}?>Kanca Sistemi
Section titled “Kanca Sistemi”Publisher Kancaları
Section titled “Publisher Kancaları”hooks, Publisher davranışında değişiklik yapılmasına izin verir:
Publisher.view.article.start
Section titled “Publisher.view.article.start”Makale işlenmeden önce çağrılır.
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);}Publisher.view.article.end
Section titled “Publisher.view.article.end”Makale işlendikten sonra çağrılır.
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>';}Publisher.permission.check
Section titled “Publisher.permission.check”permissions kontrol edilirken çağrılır.
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; }}Eklenti Sistemi
Section titled “Eklenti Sistemi”Bir Eklenti Oluşturun
Section titled “Bir Eklenti Oluşturun”Eklentiler Publisher’ın işlevselliğini genişletir:
Dosya Yapısı:
modules/publisher/plugins/├── myplugin/│ ├── plugin.php (main file)│ ├── language/│ │ └── english.php│ ├── templates/│ └── css/eklenti.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(); }}?>Eklentiyi Yükle
Section titled “Eklentiyi Yükle”Publisher’ın başlatılmasında:
<?php// Load plugin$pluginPath = XOOPS_ROOT_PATH . '/modules/publisher/plugins/myplugin/plugin.php';if (file_exists($pluginPath)) { include_once $pluginPath;}?>Filtreler
Section titled “Filtreler”İçerik Filtreleri
Section titled “İçerik Filtreleri”Filtreler verileri değiştirir before/after işleniyor:
<?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);?>Kayıt Filtresi
Section titled “Kayıt Filtresi”<?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>';}?>Aksiyon Kancaları
Section titled “Aksiyon Kancaları”Özel Eylemler
Section titled “Özel Eylemler”Kodu belirli noktalarda yürütün:
<?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();}?>Eklentilerle Genişletme
Section titled “Eklentilerle Genişletme”Örnek Eklenti: İlgili Makaleler
Section titled “Örnek Eklenti: İlgili Makaleler”<?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();?>En İyi Uygulamalar
Section titled “En İyi Uygulamalar”Etkinlik Dinleyici Yönergeleri
Section titled “Etkinlik Dinleyici Yönergeleri”✓ 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 neededPerformans İpuçları
Section titled “Performans İpuçları”✗ 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 operationsHata Ayıklama Etkinlikleri
Section titled “Hata Ayıklama Etkinlikleri”Hata Ayıklama Modunu Etkinleştir
Section titled “Hata Ayıklama Modunu Etkinleştir”<?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));}?>Olayları Günlüğe Kaydet
Section titled “Olayları Günlüğe Kaydet”<?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);}?>İlgili Belgeler
Section titled “İlgili Belgeler”- API Referans
- Özel templates
- Makale Oluşturma
Kaynaklar
Section titled “Kaynaklar”#Publisher #hooks #etkinlikler #eklentiler #uzantılar #özelleştirme #xoops