Пример #1
0
 /**
  * Calculates the changes done to the entity and stores the audit log event object into the
  * log queue inside the `_auditQueue` key in $options.
  *
  * @param Cake\Event\Event The Model event that is enclosed inside a transaction
  * @param Cake\Datasource\EntityInterface $entity The entity that is to be saved
  * @param ArrayObject $options Options array containing the `_auditQueue` key
  * @return void
  */
 public function afterSave(Event $event, EntityInterface $entity, $options)
 {
     if (!isset($options['_auditQueue'])) {
         return;
     }
     $config = $this->_config;
     if (empty($config['whitelist'])) {
         $config['whitelist'] = $this->_table->schema()->columns();
         $config['whitelist'] = array_merge($config['whitelist'], $this->getAssociationProperties(array_keys($options['associated'])));
     }
     $config['whitelist'] = array_diff($config['whitelist'], $config['blacklist']);
     $changed = $entity->extract($config['whitelist'], true);
     if (!$changed) {
         return;
     }
     $original = $entity->extractOriginal(array_keys($changed));
     $properties = $this->getAssociationProperties(array_keys($options['associated']));
     foreach ($properties as $property) {
         unset($changed[$property], $original[$property]);
     }
     if (!$changed || $original === $changed && !$entity->isNew()) {
         return;
     }
     $primary = $entity->extract((array) $this->_table->primaryKey());
     $auditEvent = $entity->isNew() ? AuditCreateEvent::class : AuditUpdateEvent::class;
     $transaction = $options['_auditTransaction'];
     $auditEvent = new $auditEvent($transaction, $primary, $this->_table->table(), $changed, $original);
     if (!empty($options['_sourceTable'])) {
         $auditEvent->setParentSourceName($options['_sourceTable']->table());
     }
     $options['_auditQueue']->attach($entity, $auditEvent);
 }