class CivicrmEntityController in CiviCRM Entity 7
Same name and namespace in other branches
- 7.2 civicrm_entity_controller.inc \CivicrmEntityController
Entity Controller for CiviCRM entities
Hierarchy
- class \DrupalDefaultEntityController implements DrupalEntityControllerInterface- class \EntityAPIController implements EntityAPIControllerRevisionableInterface- class \CivicrmEntityController
 
 
- class \EntityAPIController implements EntityAPIControllerRevisionableInterface
Expanded class hierarchy of CivicrmEntityController
1 string reference to 'CivicrmEntityController'
- civicrm_entity_entity_info in ./civicrm_entity.module 
- Here we declare selected CiviCRM entities to Drupal.
File
- ./civicrm_entity_controller.inc, line 6 
View source
class CivicrmEntityController extends EntityAPIController {
  /**
   * Implements DrupalEntityControllerInterface::load().
   *
   * @param array $ids
   * @param array $conditions
   *
   * @return array
   */
  public function load($ids = array(), $conditions = array()) {
    $entities = array();
    if (!civicrm_initialize(TRUE)) {
      return;
    }
    // Not sure about revisioning out at this stage - I don't know if
    // it could have any later use. Revisions are not statically
    // cached, and require a different query to other conditions, so
    // separate the revision id into its own variable.
    if ($this->revisionKey && isset($conditions[$this->revisionKey])) {
      $revision_id = $conditions[$this->revisionKey];
      unset($conditions[$this->revisionKey]);
    }
    else {
      $revision_id = FALSE;
    }
    /*
     * this seems 'harmless' - but not necessarily relevant?
     * ie. deals with caching on the drupal side
     */
    // Create a new variable which is either a prepared version of the $ids
    // array for later comparison with the entity cache, or FALSE if no $ids
    // were passed. The $ids array is reduced as items are loaded from cache,
    // and we need to know if it's empty for this reason to avoid querying the
    // database when all requested entities are loaded from cache.
    $passed_ids = !empty($ids) ? array_flip((array) $ids) : FALSE;
    // Try to load entities from the static cache, if the entity type supports
    // static caching.
    if ($this->cache && !$revision_id) {
      $entities += $this
        ->cacheGet($ids, $conditions);
      // If any entities were loaded, remove them from the ids still to load.
      if ($passed_ids) {
        $ids = array_keys(array_diff_key($passed_ids, $entities));
      }
    }
    /*
     * OK - here is where we will actually 'Do' something that is Civi-Specific
     * In drupal land $ids = FALSE would load all - let's only do specific
     */
    // Load any remaining entities from the database. This is the case if $ids
    // is set to FALSE (so we load all entities), if there are any ids left to
    // load, if loading a revision, or if $conditions was passed without $ids.
    if ($ids === FALSE || $ids || $revision_id || $conditions && !$passed_ids) {
      // Build the query.
      try {
        if ($conditions) {
          $civicrm_entities = civicrm_api3($this->entityInfo['description'], 'get', $conditions);
        }
        foreach ($ids as $id) {
          // we can't rely on civicrm api accepting the 'IN' => array(1,5,6) for all entities
          $civicrm_entities = civicrm_api3($this->entityInfo['description'], 'get', array(
            'id' => $id,
          ));
          if ($civicrm_entities['count']) {
            foreach ($civicrm_entities['values'] as $id => $civicrm_entity) {
              // @TODO improve this casting.
              $queried_entities[$id] = new CivicrmEntity($civicrm_entity, $this->entityType);
            }
          }
        }
      } catch (Exception $e) {
        watchdog('civicrm_entity', 'Failed to load ' . $this->entityInfo['description'], $conditions);
      }
    }
    // Pass all entities loaded from the database through $this->attachLoad(),
    // which attaches fields (if supported by the entity type) and calls the
    // entity type specific load callback, for example hook_node_load().
    if (!empty($queried_entities)) {
      $this
        ->attachLoad($queried_entities, $revision_id);
      $entities += $queried_entities;
    }
    if ($this->cache) {
      // Add entities to the cache if we are not loading a revision.
      if (!empty($queried_entities) && !$revision_id) {
        $this
          ->cacheSet($queried_entities);
      }
    }
    // Ensure that the returned array is ordered the same as the original
    // $ids array if this was passed in and remove any invalid ids.
    if ($passed_ids) {
      // Remove any invalid ids from the array.
      $passed_ids = array_intersect_key($passed_ids, $entities);
      foreach ($entities as $entity) {
        $passed_ids[$entity->{$this->idKey}] = $entity;
      }
      $entities = $passed_ids;
    }
    return $entities;
  }
  /**
   * Implements EntityAPIControllerInterface.
   *
   * @param $entity
   * @param DatabaseTransaction $transaction
   *   Optionally a DatabaseTransaction object to use. Allows
   *   overrides to pass in their transaction object.
   *
   * @throws Exception
   */
  public function save($entity, DatabaseTransaction $transaction = NULL) {
    if (!civicrm_initialize()) {
      throw new Exception('civicrm inaccessible');
    }
    $params = (array) $entity;
    unset($params['is_new']);
    $params['version'] = 3;
    $params['sequential'] = 1;
    try {
      $entity->is_new = !empty($entity->is_new) || empty($entity->{$this->idKey});
      // @TODO should we call this hook when drupal saves (as opposed
      // to Civi?) ditto insert, update.
      $this
        ->invoke('presave', $entity);
      if ($entity->is_new) {
        $result = civicrm_api(substr($this->entityType, 8), 'create', $params);
        // $this->invoke('insert', $entity);
      }
      else {
        $result = civicrm_api(substr($this->entityType, 8), 'update', $params);
        // $this->invoke('update', $entity);
      }
      unset($entity->is_new);
      unset($entity->is_new_revision);
      unset($entity->original);
      if (!civicrm_error($result)) {
        return (object) $result['values'][0];
      }
      throw new Exception($result['error_message']);
    } catch (Exception $e) {
      watchdog_exception($this->entityType, $e);
      throw $e;
    }
  }
}Members
| Name   | Modifiers | Type | Description | Overrides | 
|---|---|---|---|---|
| CivicrmEntityController:: | public | function | Implements DrupalEntityControllerInterface::load(). Overrides EntityAPIController:: | |
| CivicrmEntityController:: | public | function | Implements EntityAPIControllerInterface. Overrides EntityAPIController:: | |
| DrupalDefaultEntityController:: | protected | property | Whether this entity type should use the static cache. | |
| DrupalDefaultEntityController:: | protected | property | Static cache of entities, keyed by entity ID. | |
| DrupalDefaultEntityController:: | protected | property | Array of information about the entity. | |
| DrupalDefaultEntityController:: | protected | property | Entity type for this controller instance. | |
| DrupalDefaultEntityController:: | protected | property | Additional arguments to pass to hook_TYPE_load(). | |
| DrupalDefaultEntityController:: | protected | property | Name of the entity's ID field in the entity database table. | |
| DrupalDefaultEntityController:: | protected | property | Name of entity's revision database table field, if it supports revisions. | |
| DrupalDefaultEntityController:: | protected | property | The table that stores revisions, if the entity supports revisions. | |
| DrupalDefaultEntityController:: | protected | function | Attaches data to entities upon loading. | 4 | 
| DrupalDefaultEntityController:: | protected | function | Gets entities from the static cache. | 1 | 
| DrupalDefaultEntityController:: | protected | function | Stores entities in the static entity cache. | |
| DrupalDefaultEntityController:: | protected | function | Ensures integer entity IDs are valid. | |
| DrupalDefaultEntityController:: | protected | function | Callback for array_filter that removes non-integer IDs. | |
| EntityAPIController:: | protected | property | ||
| EntityAPIController:: | protected | property | ||
| EntityAPIController:: | protected | property | ||
| EntityAPIController:: | public | function | Implements EntityAPIControllerInterface. Overrides EntityAPIControllerInterface:: | |
| EntityAPIController:: | protected | function | Overrides DrupalDefaultEntityController::buildQuery(). Overrides DrupalDefaultEntityController:: | 1 | 
| EntityAPIController:: | public | function | Implements EntityAPIControllerInterface. Overrides EntityAPIControllerInterface:: | |
| EntityAPIController:: | public | function | Implements EntityAPIControllerInterface. Overrides EntityAPIControllerInterface:: | 1 | 
| EntityAPIController:: | public | function | Implements EntityAPIControllerRevisionableInterface::deleteRevision(). Overrides EntityAPIControllerRevisionableInterface:: | |
| EntityAPIController:: | public | function | Implements EntityAPIControllerInterface. Overrides EntityAPIControllerInterface:: | 1 | 
| EntityAPIController:: | public | function | Implements EntityAPIControllerInterface. Overrides EntityAPIControllerInterface:: | |
| EntityAPIController:: | public | function | Implements EntityAPIControllerInterface. Overrides EntityAPIControllerInterface:: | 1 | 
| EntityAPIController:: | public | function | Builds and executes the query for loading. | |
| EntityAPIController:: | protected | function | Renders a single entity property. | |
| EntityAPIController:: | public | function | Overrides DrupalDefaultEntityController::resetCache(). Overrides DrupalDefaultEntityController:: | 1 | 
| EntityAPIController:: | protected | function | Saves an entity revision. | |
| EntityAPIController:: | public | function | Implements EntityAPIControllerInterface. Overrides EntityAPIControllerInterface:: | 1 | 
| EntityAPIController:: | public | function | Overridden. Overrides DrupalDefaultEntityController:: | 1 | 
