*/
/**
* load Event_Dispatcher package
*/
require_once 'Event/Dispatcher.php';
/**
* example sender class
*/
class sender
{
var $_dispatcher = null;
function sender(&$dispatcher)
{
$this->_dispatcher = &$dispatcher;
}
function foo($bubble = true)
{
$this->_dispatcher->post($this, 'onFoo', 'Some Info...', true, $bubble);
}
}
/**
* example observer
*/
function receiver1(&$notification)
{
echo "receiver 1 received notification
\n";
}
/**
* example observer
*/
function receiver2(&$notification)
{
echo "receiver 2 received notification
\n";
}
/**
* example observer
*/
function receiver3(&$notification)
{
echo "receiver 3 received notification
\n";
}
// get the different dispatchers
$dispatcher1 = &Event_Dispatcher::getInstance();
$dispatcher2 = &Event_Dispatcher::getInstance('child');
$dispatcher3 = &Event_Dispatcher::getInstance('grandchild');
// create senders in two different levels
$sender1 = &new sender($dispatcher1);
$sender2 = &new sender($dispatcher2);
// build three levels
$dispatcher1->addNestedDispatcher($dispatcher2);
$dispatcher2->addNestedDispatcher($dispatcher3);
// add observers in level one and two
$dispatcher1->addObserver('receiver1', 'onFoo');
$dispatcher2->addObserver('receiver2', 'onFoo');
// this will bubble up from 1 to 3
echo 'sender1->foo()
';
$sender1->foo();
// this will not bubble up
echo '
';
echo 'sender1->foo(), but disable bubbling
';
$sender1->foo(false);
// this will bubble up from 2 to 3
echo '
';
echo 'sender2->foo()
';
$sender2->foo();
// This observer will receive the two pending notifications on level 3
echo '
';
echo 'dispatcher3->addObserver()
';
$dispatcher3->addObserver('receiver3', 'onFoo');
// remove one level
$success = $dispatcher1->removeNestedDispatcher($dispatcher2);
if ($success === true) {
echo '
';
echo 'removed nested dispatcher2 from dispatcher1
';
}
// this will stay in level 1
echo 'sender1->foo()
';
$sender1->foo();
// this will bubble up from 2-3
echo '
';
echo 'sender2->foo()
';
$sender2->foo();
?>