*/ /** * 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(); ?>