XCL2.1のイベント通知にデリゲート XoopsNotificationHandler.Trigger があるのは知っていたのですが、一番書き換えたい部分が値渡しなので、イマイチ使えませんでした。
3日前、2.1.7の準備として、minahitoさんが Request#2642987 をコミットしてくれたので、一気に使いやすくなりました。
そのデリゲート名は、XoopsNotificationHandler.TriggerPreaction です。
ちなみに、新しいD3モジュールであればD3NotificationHandlerを使っているでしょうから、それとほぼ引数互換の D3NotificationHandler.Trigger が利用出来ます。
これでお蔵入りしていたpreloadが公開できます。
html/preload/NotificationExtraAssign.class.php
として保存してください。
動作環境は、XCL2.1.7RC以上です。今すぐ試したければ、ここから html/kernel/notification.php を落として上書きする、というのも手です。(もしくはsvn update)
http://xoopscube.svn.sourceforge.net/viewvc/xoopscube/Package_Legacy/trunk/ht...<?php
if( ! defined( 'XOOPS_ROOT_PATH' ) ) exit ;
class NotificationExtraAssign extends XCube_ActionFilter
{
function postFilter()
{
$this->mRoot->mDelegateManager->add( 'XoopsNotificationHandler.TriggerPreaction' , array( &$this , 'legacyHook' ) ) ;
$this->mRoot->mDelegateManager->add( 'D3NotificationHandler.Trigger' , array( &$this , 'd3Hook' ) ) ;
}
function legacyHook( &$category , &$event , &$item_id , &$extra_tags , &$module , &$user_list , &$omit_user_id , &$not_config , &$force_return )
{
$extra_tags = $this->appendExtraTags( $extra_tags ) ;
// $omit_user_id = array() ;
return ;
}
function d3Hook( &$category , &$event , &$item_id , &$extra_tags , &$module , &$user_list , &$omit_user_id , $not_config , &$force_return , &$mail_template_dir , $mydirname , $mytrustdirname )
{
$extra_tags = $this->appendExtraTags( $extra_tags ) ;
// $omit_user_id = array() ;
return ;
}
function appendExtraTags( $extra_tags )
{
if( is_object( $GLOBALS['xoopsUser'] ) ) {
$extra_tags['X_TRIGGER_UID'] = $GLOBALS['xoopsUser']->getVar('uid','n') ;
$extra_tags['X_TRIGGER_UNAME'] = $GLOBALS['xoopsUser']->getVar('uname','n') ;
$extra_tags['X_TRIGGER_NAME'] = $GLOBALS['xoopsUser']->getVar('name','n') ;
} else {
$extra_tags['X_TRIGGER_UID'] = 0 ;
$extra_tags['X_TRIGGER_UNAME'] = _GUESTS ;
$extra_tags['X_TRIGGER_NAME'] = _GUESTS ;
}
return $extra_tags ;
}
}
このpreloadは、イベント通知テンプレート変数として、以下の3つを追加定義します。
{X_TRIGGER_UID} イベント通知相手のuid
{X_TRIGGER_UNAME} イベント通知相手のuname
{X_TRIGGER_NAME} イベント通知相手のname
イベント通知テンプレートでこれらの変数を書けば、通知文に「本名」フィールドを使うことも可能です。
あと、コメントアウトしてありますが、
// $omit_user_id = array() ;
この行の//を外せば、通知対象となるイベントをトリガーした本人にも、イベント内容が通知されます(2箇所)。これは自分で開発しているモジュールのイベント通知機能を確認するときに便利です。実運用サイトでもそういう動作が欲しいケースは当然あるでしょう。
なお、このpreloadは、あくまでサンプルです。
実際のサイトで運用するときには、$categoryや$eventによる振り分けをするケースがほとんどでしょう。
# いつの間にかSVNに移行してたんですね。CVSの方を見ていて、「fixedになっているのに変更なしって変だなあ」とか首をかしげてました。