public function MerciDefaultEntityController::save in MERCI (Manage Equipment Reservations, Checkout and Inventory) 7.3
Permanently saves the given entity.
In case of failures, an exception is thrown.
Parameters
$entity: The entity to save.
$transaction: An optional transaction object to pass thru. If passed the caller is responsible for rolling back the transaction if something goes wrong.
Return value
SAVED_NEW or SAVED_UPDATED depending on the operation performed.
Overrides EntityAPIControllerInterface::save
1 call to MerciDefaultEntityController::save()
- MerciLineItemEntityControllerDeprecated::save in merci_line_item/
includes/ merci_line_item.controller.inc - Saves a line item.
1 method overrides MerciDefaultEntityController::save()
- MerciLineItemEntityControllerDeprecated::save in merci_line_item/
includes/ merci_line_item.controller.inc - Saves a line item.
File
- merci_line_item/
includes/ merci_line_item.controller.inc, line 175 - Provides a central controller for Drupal Commerce.
Class
- MerciDefaultEntityController
- @file Provides a central controller for Drupal Commerce.
Code
public function save($entity, DatabaseTransaction $transaction = NULL) {
if (!isset($transaction)) {
$transaction = db_transaction();
$started_transaction = TRUE;
}
try {
// Load the stored entity, if any. If this save was invoked during a
// previous save's insert or update hook, this means the $entity->original
// value already set on the entity will be replaced with the entity as
// saved. This will allow any original entity comparisons in the current
// save process to react to the most recently saved version of the entity.
if (!empty($entity->{$this->idKey})) {
// In order to properly work in case of name changes, load the original
// entity using the id key if it is available.
$entity->original = entity_load_unchanged($this->entityType, $entity->{$this->idKey});
}
$this
->invoke('presave', $entity);
// When saving a new revision, unset any existing revision ID so as to
// ensure that a new revision will actually be created, then store the old
// revision ID in a separate property for use by hook implementations.
if (!empty($this->revisionKey) && empty($entity->is_new) && !empty($entity->revision) && !empty($entity->{$this->revisionKey})) {
$entity->old_revision_id = $entity->{$this->revisionKey};
unset($entity->{$this->revisionKey});
}
if (empty($entity->{$this->idKey}) || !empty($entity->is_new)) {
// For new entities, create the row in the base table, then save the
// revision.
$op = 'insert';
$return = drupal_write_record($this->entityInfo['base table'], $entity);
if (!empty($this->revisionKey)) {
drupal_write_record($this->entityInfo['revision table'], $entity);
$update_base_table = TRUE;
}
}
else {
$op = 'update';
$return = drupal_write_record($this->entityInfo['base table'], $entity, $this->idKey);
if (!empty($this->revisionKey)) {
if (!empty($entity->revision)) {
drupal_write_record($this->entityInfo['revision table'], $entity);
$update_base_table = TRUE;
}
else {
drupal_write_record($this->entityInfo['revision table'], $entity, $this->revisionKey);
}
}
}
if (!empty($update_base_table)) {
// Go back to the base table and update the pointer to the revision ID.
db_update($this->entityInfo['base table'])
->fields(array(
$this->revisionKey => $entity->{$this->revisionKey},
))
->condition($this->idKey, $entity->{$this->idKey})
->execute();
}
// Update the static cache so that the next entity_load() will return this
// newly saved entity.
$this->entityCache[$entity->{$this->idKey}] = $entity;
// Maintain the list of locked entities and release the lock if possible.
unset($this->lockedEntities[$entity->{$this->idKey}]);
$this
->releaseLock();
$this
->invoke($op, $entity);
// Ignore slave server temporarily.
db_ignore_slave();
// We unset the original version of the entity after the current save as
// it no longer accurately represents the version of the entity saved in
// the database. However, if this save was invoked during a previous
// save's insert or update hook, this means that any hook implementations
// executing after this save will no longer have an original version of
// the entity to compare against. Attempting to compare against the non-
// existent original entity in code or Rules will result in an error.
unset($entity->original);
unset($entity->is_new);
unset($entity->revision);
return $return;
} catch (Exception $e) {
if (!empty($started_transaction)) {
$transaction
->rollback();
watchdog_exception($this->entityType, $e);
}
throw $e;
}
}