Chamilo is a learning management system focused on ease of use and accessibility
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
chamilo-lms/main/inc/lib/hook/HookEvent.php

193 lines
5.1 KiB

<?php
/* For licensing terms, see /license.txt */
/**
* This file contains an abstract Hook event class
* Used for Hook Events (e.g Create user, Webservice registration).
*
* @package chamilo.library.hook
*/
/**
* Class HookEvent
* This abstract class implements Hook Event Interface to build the base
* for Hook Events. This class have some public static method,
* e.g for create Hook Events.
*/
abstract class HookEvent implements HookEventInterface
{
public $observers;
public $eventName;
public $eventData;
public $manager;
public static $hook;
/**
* Construct Method.
*
* @param string $eventName
*
* @throws Exception
*/
protected function __construct($eventName)
{
$this->observers = new SplObjectStorage();
$this->eventName = $eventName;
$this->eventData = [];
$this->manager = HookManagement::create();
$this->loadAttachments();
}
/**
* Return the singleton instance of Hook event.
*
* @return static
*/
public static function create()
{
static $result = null;
if ($result) {
return $result;
} else {
try {
$class = get_called_class();
return new $class();
} catch (Exception $e) {
return null;
}
}
}
/**
* Attach an HookObserver.
*
* @see http://php.net/manual/en/splsubject.attach.php
*
* @param \HookObserverInterface| $observer <p>
* The <b>HookObserver</b> to attach.
* </p>
*/
public function attach(HookObserverInterface $observer)
{
$observerClass = get_class($observer);
self::$hook[$this->eventName][$observerClass] = [
'class_name' => $observerClass,
'path' => $observer->getPath(),
'plugin_name' => $observer->getPluginName(),
];
$this->observers->attach($observer);
$this->manager->insertHook($this->eventName, $observerClass, HOOK_EVENT_TYPE_ALL);
}
/**
* Detach an HookObserver.
*
* @see http://php.net/manual/en/splsubject.detach.php
*
* @param \HookObserverInterface| $observer <p>
* The <b>HookObserver</b> to detach.
* </p>
*/
public function detach(HookObserverInterface $observer)
{
$observerClass = get_class($observer);
unset(self::$hook[$this->eventName][$observerClass]);
$this->observers->detach($observer);
$this->manager->deleteHook($this->eventName, $observerClass, HOOK_EVENT_TYPE_ALL);
}
/**
* Notify an observer.
*
* @see http://php.net/manual/en/splsubject.notify.php
*/
public function notify()
{
foreach ($this->observers as $observer) {
$observer->update($this);
}
}
/**
* Return the event name refer to where hook is used.
*
* @return string
*/
public function getEventName()
{
return $this->eventName;
}
/**
* Return an array containing all data needed by the hook observer to update.
*
* @return array
*/
public function getEventData()
{
return $this->eventData;
}
/**
* Set an array with data needed by hooks.
*
* @return $this
*/
public function setEventData(array $data)
{
foreach ($data as $key => $value) {
// Assign value for each array item
$this->eventData[$key] = $value;
}
return $this;
}
/**
* Detach all hook observers.
*
* @return $this
*/
public function detachAll()
{
self::$hook[$this->eventName] = null;
$this->observers->removeAll($this->observers);
}
/**
* Clear all hookObservers without detach them.
*
* @return mixed
*/
public function clearAttachments()
{
$this->observers->removeAll($this->observers);
}
/**
* Load all hook observer already registered from Session or Database.
*
* @return $this
*/
public function loadAttachments()
{
if (isset(self::$hook[$this->eventName]) && is_array(self::$hook[$this->eventName])) {
foreach (self::$hook[$this->eventName] as $hookObserver => $val) {
$hookObserverInstance = $hookObserver::create();
$this->observers->attach($hookObserverInstance);
}
} else {
// Load from Database and save into global name
self::$hook[$this->eventName] = $this->manager->listHookObservers($this->eventName);
if (isset(self::$hook[$this->eventName]) && is_array(self::$hook[$this->eventName])) {
foreach (self::$hook[$this->eventName] as $hookObserver => $val) {
$hookObserverInstance = $hookObserver::create();
$this->observers->attach($hookObserverInstance);
}
}
}
return $this;
}
}