/** * Tests the event propagation stopping property * * @return void * @triggers fake.event */ public function testPropagation() { $event = new CakeEvent('fake.event'); $this->assertFalse($event->isStopped()); $event->stopPropagation(); $this->assertTrue($event->isStopped()); }
/** * Dispatches a new event to all configured listeners * * @param string|CakeEvent $event the event key name or instance of CakeEvent * @return CakeEvent */ public function dispatch($event) { if (is_string($event)) { $event = new CakeEvent($event); } $listeners = $this->listeners($event->name()); if (empty($listeners)) { return $event; } foreach ($listeners as $listener) { if ($event->isStopped()) { break; } if ($listener['passParams'] === true) { $result = call_user_func_array($listener['callable'], $event->data); } else { $result = call_user_func($listener['callable'], $event); } if ($result === false) { $event->stopPropagation(); } if ($result !== null) { $event->result = $result; } } return $event; }
/** * Dispatches a new event to all configured listeners * * @param string|CakeEvent $event the event key name or instance of CakeEvent * @return CakeEvent * @triggers $event */ public function dispatch($event) { if (is_string($event)) { $event = new CakeEvent($event); } $listeners = $this->listeners($event->name()); if (empty($listeners)) { return $event; } foreach ($listeners as $listener) { if ($event->isStopped()) { break; } if ($listener['passParams'] === true) { $result = call_user_func_array($listener['callable'], $event->data); } else { $result = call_user_func($listener['callable'], $event); } if ($result === false) { $event->stopPropagation(); } // CUSTOMIZE ADD 2013/09/23 ryuring // ObjectCollection を継承しているイベントの場合、 // 複数のオブジェクトに対するイベントの結果が配列で返ってくるが、 // 全ての結果がNULLの場合、その前のイベントの結果が上書きされてしまう。 // 全ての結果がNULLの場合には、結果がNULLとみなし、上書きしない仕様に変更した // >>> if (is_array($result) && array_key_exists(0, $result)) { $notNull = false; foreach ($result as $key => $val) { if ($val !== null) { $notNull = true; } } if (!$notNull) { $result = null; } } // <<< if ($result !== null) { $event->result = $result; } } return $event; }
/** * beforeDelete * * @param CakeEvent $event * @return boolean */ public function beforeDelete(CakeEvent $event) { if (!method_exists($event->subject(), 'dispatchEvent')) { return true; } $currentEvent = $event->subject->dispatchEvent('beforeDelete', $event->data); if ($currentEvent) { if ($event->isStopped()) { return false; } } return true; }
public function testStopPropagation() { $this->event->stopPropagation(false); $this->assertFalse($this->event->isStopped()); }