Index: branches/5.2.x/core/kernel/event_manager.php =================================================================== diff -u -N -r15250 -r15252 --- branches/5.2.x/core/kernel/event_manager.php (.../event_manager.php) (revision 15250) +++ branches/5.2.x/core/kernel/event_manager.php (.../event_manager.php) (revision 15252) @@ -1,6 +1,6 @@ status != kEvent::erSUCCESS ) { + return; + } + + $cache_key = 'email_to_event_mapping[%EmaileventsSerial%]'; + $event_mapping = $this->Application->getCache($cache_key); + + if ( $event_mapping === false ) { + $this->Conn->nextQueryCachable = true; + $sql = 'SELECT EventId, Event, Type, BindToSystemEvent + FROM ' . TABLE_PREFIX . 'EmailEvents + WHERE BindToSystemEvent <> ""'; + $event_mapping = $this->Conn->Query($sql, 'BindToSystemEvent'); + + $this->Application->setCache($cache_key, $event_mapping); + } + + $email_event = Array (); + + if ( isset($event_mapping[(string)$event]) ) { + $email_event = $event_mapping[(string)$event]; + } + elseif ( isset($event_mapping[$event->Prefix . '.*:' . $event->Name]) ) { + $email_event = $event_mapping[$event->Prefix . '.*:' . $event->Name]; + } + + if ( !$email_event ) { + return; + } + + $category_ids = $item_id = $parent_item_id = false; + $where_clause = Array (); + $where_clause['EmailEventId'] = 'EmailEventId = ' . $email_event['EventId']; + + try { + $category = $this->Application->recallObject('c'); + /* @var $category kDBItem */ + + if ( $category->isLoaded() ) { + $category_ids = trim(str_replace('|', ',', $category->GetDBField('ParentPath')), ','); + } + } + catch (Exception $e) { + } + + $where_clause['CategoryId'] = $this->_getSubscriberFilter('CategoryId', $category_ids, true); + + try { + $object = $event->getObject(); + /* @var $object kDBItem */ + + if ( $object->isLoaded() ) { + $item_id = $object->GetID(); + $parent_prefix = $this->Application->getUnitOption($event->Prefix, 'ParentPrefix'); + + if ( $parent_prefix ) { + $parent_item_id = $object->getParentId($parent_prefix); + } + } + } + catch (Exception $e) { + } + + $where_clause['ItemId'] = $this->_getSubscriberFilter('ItemId', $item_id); + $where_clause['ParentItemId'] = $this->_getSubscriberFilter('ParentItemId', $parent_item_id); + + $event_params = Array ( + 'EmailEventId' => $email_event['EventId'], + 'CategoryIds' => $category_ids, + 'ItemId' => $item_id, + 'ParentId' => $parent_item_id, + 'where_clause' => $where_clause, + ); + + $sql_event = new kEvent($event->getPrefixSpecial() . ':OnGetEventSubscribersQuery', $event_params); + $sql_event->MasterEvent = $event; + $this->HandleEvent($sql_event); + + $subscribers = $this->Conn->GetIterator($sql_event->getEventParam('sql')); + + if ( !count($subscribers) ) { + // mapping exists, but nobody has subscribed + return; + } + + $send_params = Array ( + 'Prefix' => $event->Prefix, + 'Special' => $event->Special, + 'PrefixSpecial' => $event->getPrefixSpecial(), + ); + + $send_method = $email_event['Type'] == EmailEvent::EVENT_TYPE_FRONTEND ? 'EmailEventUser' : 'EmailEventAdmin'; + + foreach ($subscribers as $subscriber_info) { + $send_params['to_name'] = $subscriber_info['SubscriberEmail']; + $send_params['to_email'] = $subscriber_info['SubscriberEmail']; + $this->Application->$send_method($email_event['Event'], $subscriber_info['UserId'], $send_params); + } + } + + /** + * Returns filter for searching event subscribers + * + * @param string $field + * @param mixed $value + * @param bool $use_in_clause + * @return string + * @access protected + */ + protected function _getSubscriberFilter($field, $value, $use_in_clause = false) + { + if ( $value ) { + // send to this item subscribers AND to subscribers to all items + $clause = $use_in_clause ? ' IN (' . $value . ')' : ' = ' . $this->Conn->qstr($value); + + return $field . $clause . ' OR ' . $field . ' IS NULL'; + } + + // send to subscribers to all items + return $field . ' IS NULL'; + } + + /** * Checks, that given event is implemented * * @param kEvent $event