View source
<?php
class CivicrmEntityController extends EntityAPIController {
public function __construct($entityType) {
parent::__construct($entityType);
}
public function load($ids = array(), $conditions = array()) {
$entities = array();
if (!civicrm_initialize(TRUE)) {
return;
}
if ($this->revisionKey && isset($conditions[$this->revisionKey])) {
$revision_id = $conditions[$this->revisionKey];
unset($conditions[$this->revisionKey]);
}
else {
$revision_id = FALSE;
}
if (!empty($ids)) {
foreach ($ids as $index => $id) {
if (is_array($id)) {
$ids[$index] = !empty($id[0]) ? $id[0] : NULL;
}
}
}
$passed_ids = !empty($ids) && !is_null(reset($ids)) ? array_flip((array) $ids) : FALSE;
if ($this->cache && !$revision_id) {
$entities += $this
->cacheGet($ids, $conditions);
if ($passed_ids) {
$ids = array_keys(array_diff_key($passed_ids, $entities));
}
}
if ($ids === FALSE || $ids || $revision_id || $conditions && !$passed_ids) {
try {
$queried_entities = array();
if ($conditions) {
$queried_entities += $this
->loadEntities($conditions);
}
if (!empty($ids)) {
foreach ($ids as $id) {
$queried_entities += $this
->loadEntities(array(
'id' => $id,
));
}
}
} catch (Exception $e) {
watchdog('civicrm_entity', 'Failed to load ' . $this->entityInfo['description'], $conditions);
}
}
if (!empty($queried_entities)) {
$this
->attachLoad($queried_entities, $revision_id);
$entities += $queried_entities;
}
if ($this->cache) {
if (!empty($queried_entities) && !$revision_id) {
$this
->cacheSet($queried_entities);
}
}
if ($passed_ids) {
$passed_ids = array_intersect_key($passed_ids, $entities);
foreach ($entities as $entity) {
$passed_ids[$entity->{$this->idKey}] = $entity;
}
$entities = $passed_ids;
}
return $entities;
}
public function save($entity, DatabaseTransaction $transaction = NULL) {
if (!civicrm_initialize()) {
throw new Exception('civicrm inaccessible');
}
try {
$entity->is_new = !empty($entity->is_new) || empty($entity->{$this->idKey});
$this
->invoke('presave', $entity);
if ($this->entityType == 'civicrm_activity' && isset($entity->campaign_id) && $entity->campaign_id == 0) {
$entity->campaign_id = NULL;
}
$params = get_object_vars($entity);
$params_to_unset = array(
'is_new',
'rdf_mapping',
'original',
'submit',
'form_build_id',
'form_token',
'form_id',
'op',
'changed',
);
foreach ($params as $key => $value) {
if (in_array($key, $params_to_unset)) {
unset($params[$key]);
}
if (strpos($key, 'field_') === 0) {
unset($params[$key]);
}
if (substr($key, 0, 7) === 'custom_' && empty($entity->original->{$key}) && empty($value)) {
unset($params[$key]);
}
if (substr($key, 0, 7) === 'custom_' && substr($key, -3) === '_id') {
$customkey = substr($key, 0, strlen($key) - 3);
if (!is_numeric($params[$customkey]) && is_numeric($params[$key])) {
$params[$customkey] = $params[$key];
}
unset($params[$key]);
}
}
if ($this->entityType == 'civicrm_relationship') {
if (isset($params['case_id']) && ($params['case_id'] == '' || is_null($params['case_id']))) {
unset($params['case_id']);
}
}
$params['version'] = 3;
$params['sequential'] = 1;
if ($entity->is_new) {
if (isset($params['id'])) {
unset($params['id']);
}
$result = civicrm_api(substr($this->entityType, 8), 'create', $params);
}
else {
$result = civicrm_api(substr($this->entityType, 8), 'create', $params);
}
if (isset($entity->is_new)) {
$is_new = $entity->is_new;
unset($entity->is_new);
}
unset($entity->is_new_revision);
unset($entity->original);
if (!civicrm_error($result)) {
if ($is_new) {
$entity->id = $result['values'][0]['id'];
$this
->invoke('insert', $entity);
}
else {
$this
->invoke('update', $entity);
}
foreach ($result['values'][0] as $key => $value) {
$entity->key = $value;
}
return new CivicrmEntity(array_keys($result['values']), $this->entityType);
}
throw new Exception($result['error_message']);
} catch (Exception $e) {
watchdog_exception($this->entityType, $e);
throw $e;
}
}
public function delete($ids, DatabaseTransaction $transaction = NULL) {
if (!civicrm_initialize()) {
throw new Exception('civicrm inaccessible');
}
$entities = entity_load($this->entityType, $ids);
if (count($entities)) {
foreach ($ids as $id) {
$params['version'] = 3;
$params['id'] = $id;
try {
$entity = $entities[$id];
$this
->invoke('predelete', $entity);
$result = civicrm_api(substr($this->entityType, 8), 'delete', $params);
if (!civicrm_error($result)) {
field_attach_delete($this->entityType, $entity);
return;
}
throw new Exception($result['error_message']);
} catch (Exception $e) {
watchdog_exception($this->entityType, $e);
throw $e;
}
}
}
}
public function buildContent($entity, $view_mode = 'full', $langcode = NULL, $content = array()) {
$entity->content = $content;
$build = parent::buildContent($entity, $view_mode, $langcode, $content);
$langcode = isset($langcode) ? $langcode : $GLOBALS['language_content']->language;
if (!empty($this->entityInfo['fieldable'])) {
$key = isset($entity->{$this->idKey}) ? $entity->{$this->idKey} : NULL;
field_attach_prepare_view($this->entityType, array(
$key => $entity,
), $view_mode);
$entity->content = field_attach_view($this->entityType, $entity, $view_mode, $langcode);
}
$temp_build = $entity->content;
unset($entity->content);
foreach ($temp_build as $key => $value) {
$build[$key] = $value;
}
if (module_exists('ds')) {
$layout = ds_get_layout($this->entityType, $this->entityType, $view_mode);
if (!empty($layout['css']) && empty($layout['settings']['layout_disable_css'])) {
if (isset($layout['module']) && $layout['module'] == 'panels') {
$build['#attached']['css'][] = $layout['path'] . '/' . $layout['panels']['css'];
}
else {
$build['#attached']['css'][] = $layout['path'] . '/' . $layout['layout'] . '.css';
}
}
}
return $build;
}
protected function loadEntities($condition) {
$entities = array();
$fields = civicrm_api3($this->entityInfo['description'], 'getfields', array(
'action' => 'create',
));
if (!empty($fields['values'])) {
$return_fields['return'] = array_keys($fields['values']);
}
$civicrm_entities = civicrm_api3($this->entityInfo['description'], 'get', $condition);
if (!empty($return_fields['return'])) {
$condition['return'] = $return_fields['return'];
$civicrm_entities2 = civicrm_api3($this->entityInfo['description'], 'get', $condition);
}
$new_civicrm_entities = array();
foreach ($civicrm_entities['values'] as $id => $entity) {
if (!empty($civicrm_entities2['values'][$id])) {
$new_civicrm_entities[$id] = array_merge($entity, $civicrm_entities2['values'][$id]);
}
else {
$new_civicrm_entities[$id] = $entity;
}
}
if (count($new_civicrm_entities)) {
foreach ($new_civicrm_entities as $id => $civicrm_entity) {
$entities[$id] = new CivicrmEntity($civicrm_entity, $this->entityType);
if ($this->entityType == 'civicrm_contribution') {
$entities[$id]->source = $entities[$id]->contribution_source;
}
}
return $entities;
}
return $entities;
}
}