Следующим в иерархии классов блоголёта после TDataClass является TEventClass, который реализует механизм событий в блоголёте. Это очень важный класс - именно от него и TItems порождены практически все классы блоголёта. Если TDataClass реализует сохранение и восстановление данных объекта, то TEventClass управляет всеми событиями. Рассмотрим подробнее, что такое событие, как добавить событие, и как подписаться на событие.

Событие - это метод класса, который может быть вызван в любом месте, например в TPosts (класс для управления записями) это события Added, Edited, Deleted, Changed - которые вызываются в конце соответствующих методов и означают, что запись была только что создана, отредактирована или удалена. Если вы хотите, чтобы ваш класс реагировал на эти события, то необходимо подписаться на них. Делается это очень просто


$posts = &TPosts::Instance();
$posts->Added = $this->PostAdded;

Где PostAdded - это метод вашего класса следующего вида:


public function PostAdded($postid)

и теперь, когда будет создана новая запись в блоге, то будет создан экземпляр вашего класса и вызван метод PostAdded, в котором вы можете реагировать нужным вам способом. Описание событий для каждого класса находятся в описании класса.

Помимо подписки на события необходима симметричная операция - отписка от события. В классе TEventClass для этого есть несколько методов:

  • public function UnsubscribeEvent($EventName, $ClassName) - отписывает одно событие от одного класса, оба параметра строки
  • public function UnsubscribeClass(&$obj) - отписывает объект от всех событий, на которые был подписан класс, экземпляром которого является объект
  • public function UnsubscribeClassName($class) - отписывает класс, параметр строка - название класса, обычно берется из get_class($this)

Чтобы добавить событие в свой класс необходимо в методе CreateData вызвать AddEvents со списком добавляемых событий. Пример из класса TItems (базовый класс для управления элементами):


protected function CreateData() {
  parent::CreateData();
  $this->AddEvents('Added', 'Deleted');
  $this->AddDataMap('items', array());
  $this->AddDataMap('lastid', 0);
}

Теперь в классе TItems есть два события Added и Deleted на которые может подписаться любой объект. Список событий наследуется и в потомке от TItems классе TPosts будут уже эти два события, и их добавлять в TEventclass не следует.

В методе CreateData вы также заметили вызов методов AddDataMap - это специальный метод для связывания элементов массива Data, о котором рассказано в TDataClass, со свойствами класса. Если свойство простое, например это строка или число, то такого связывания как правило не нужно, но если таким элементом является массив, то при обращению к нему может сказаться самым фатальным образом для системы - будет пожрано много памяти. Чтобы этого не происходило можно связать объявленные свойства с элементами массива Data. В классе TItems таким образом связывается items, вызов AdddDataMap в этом случае аналогичен следующему коду:


$this->items = &$this->Data['items'];

Но чтобы эта связь не терялась после каждого восстановления данных из файла, необходимо производить связывание через метод AddDataMap, который добавляет в пару "название свойства" и "ключ массива Data" в специальный массив. Это гарантирует всегда одни и теже данные в обоих случаях.

Помимо управления событиями TEventClass делает еще следующее: в конструкторе инициализирует данные (метод CreateData) и загружает данные (Load - метод класса TDataClass). В результате после создания потомка от TEventClass мы имеем уже готовый к употреблению объект, данные которого были уже восстановлены из соответствующего файла. Например для TPosts это будет список записей.