Newer
Older
Wolfgang Ziegler
committed
<?php
/**
* @file
* Test moduel for the entity API.
*/
/**
Wolfgang Ziegler
committed
* Implements hook_entity_info().
Wolfgang Ziegler
committed
*/
function entity_test_entity_info() {
$return = array(
'entity_test' => array(
'label' => t('Test Entity'),
Wolfgang Ziegler
committed
'plural label' => t('Test Entities'),
'description' => t('An entity type used by the entity API tests.'),
Wolfgang Ziegler
committed
'entity class' => 'EntityClass',
Wolfgang Ziegler
committed
'controller class' => 'EntityAPIController',
Wolfgang Ziegler
committed
'base table' => 'entity_test',
'fieldable' => TRUE,
Wolfgang Ziegler
committed
'entity keys' => array(
Wolfgang Ziegler
committed
'id' => 'pid',
'bundle' => 'name',
),
Wolfgang Ziegler
committed
// Make use the class' label() and uri() implementation by default.
'label callback' => 'entity_class_label',
'uri callback' => 'entity_class_uri',
Wolfgang Ziegler
committed
'bundles' => array(),
Wolfgang Ziegler
committed
'bundle keys' => array(
'bundle' => 'name',
),
Wolfgang Ziegler
committed
'module' => 'entity_test',
Wolfgang Ziegler
committed
),
'entity_test_type' => array(
'label' => t('Test entity type'),
'entity class' => 'Entity',
Wolfgang Ziegler
committed
'controller class' => 'EntityAPIControllerExportable',
'base table' => 'entity_test_type',
'fieldable' => FALSE,
'bundle of' => 'entity_test',
'exportable' => TRUE,
'entity keys' => array(
'id' => 'id',
'name' => 'name',
),
Wolfgang Ziegler
committed
'module' => 'entity_test',
Wolfgang Ziegler
committed
),
Wolfgang Ziegler
committed
'entity_test2' => array(
'label' => t('Test Entity (revision support)'),
'entity class' => 'EntityClassRevision',
'controller class' => 'EntityAPIController',
'base table' => 'entity_test2',
'revision table' => 'entity_test2_revision',
'fieldable' => TRUE,
'entity keys' => array(
'id' => 'pid',
'revision' => 'revision_id',
),
// Make use of the class label() and uri() implementation by default.
'label callback' => 'entity_class_label',
'uri callback' => 'entity_class_uri',
'bundles' => array(),
'bundle keys' => array(
'bundle' => 'name',
),
),
Wolfgang Ziegler
committed
);
Wolfgang Ziegler
committed
// Add bundle info but bypass entity_load() as we cannot use it here.
$types = db_select('entity_test_type', 'et')
->fields('et')
->execute()
->fetchAllAssoc('name');
foreach ($types as $name => $type) {
$return['entity_test']['bundles'][$name] = array(
'label' => $type->label,
Wolfgang Ziegler
committed
);
}
// Support entity cache module.
if (module_exists('entitycache')) {
$return['entity_test']['field cache'] = FALSE;
$return['entity_test']['entity cache'] = TRUE;
}
return $return;
Wolfgang Ziegler
committed
}
/**
* Gets an array of all test entity types, keyed by the name.
*
* @param $name
* If set, the type with the given name is returned.
*/
function entity_test_get_types($name = NULL) {
Wolfgang Ziegler
committed
$types = entity_load_multiple_by_name('entity_test_type', isset($name) ? array($name) : FALSE);
return isset($name) ? reset($types) : $types;
Wolfgang Ziegler
committed
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
}
/**
* Load multiple test entities based on certain conditions.
*
* @param $pids
* An array of entity IDs.
* @param $conditions
* An array of conditions to match against the {entity} table.
* @param $reset
* A boolean indicating that the internal cache should be reset.
* @return
* An array of test entity objects, indexed by pid.
*/
function entity_test_load_multiple($pids = array(), $conditions = array(), $reset = FALSE) {
return entity_load('entity_test', $pids, $conditions, $reset);
}
/**
* Delete multiple test entities.
*
* @param $pids
* An array of test entity IDs.
*/
function entity_test_delete_multiple(array $pids) {
entity_get_controller('entity_test')->delete($pids);
}
/**
* Main class for test entities.
*/
Wolfgang Ziegler
committed
class EntityClass extends Entity {
Wolfgang Ziegler
committed
Wolfgang Ziegler
committed
public function __construct(array $values = array(), $entityType = NULL) {
parent::__construct($values, 'entity_test');
}
Wolfgang Ziegler
committed
/**
* Override buildContent() to add the username to the output.
*/
public function buildContent($view_mode = 'full', $langcode = NULL) {
$content['user'] = array(
'#markup' => "User: ". format_username(user_load($this->uid)),
);
return entity_get_controller($this->entityType)->buildContent($this, $view_mode, $langcode, $content);
}
Wolfgang Ziegler
committed
/**
* Specifies the default label, which is picked up by label() by default.
*/
protected function defaultLabel() {
$type = entity_test_get_types($this->name);
return $type->label;
Wolfgang Ziegler
committed
}
/**
* Specifies the default uri, which is picked up by uri() by default.
*/
protected function defaultURI() {
return array('path' => 'custom/' . $this->identifier());
}
Wolfgang Ziegler
committed
}
Wolfgang Ziegler
committed
Wolfgang Ziegler
committed
/**
* Main class for test entities (with revision support).
*/
class EntityClassRevision extends EntityClass {
public function __construct(array $values = array(), $entityType = NULL) {
Entity::__construct($values, 'entity_test2');
}
}
Wolfgang Ziegler
committed
/**
*
*
* Some hook implementations used by the tests.
*
*
*/
Wolfgang Ziegler
committed
/**
Wolfgang Ziegler
committed
* Implements hook_entity_insert().
Wolfgang Ziegler
committed
*/
Wolfgang Ziegler
committed
function entity_test_entity_insert($entity, $entity_type) {
Wolfgang Ziegler
committed
if ($entity_type == 'entity_test_type') {
$_SESSION['entity_hook_test']['entity_insert'][] = entity_id($entity_type, $entity);
}
Wolfgang Ziegler
committed
}
/**
Wolfgang Ziegler
committed
* Implements hook_entity_update().
Wolfgang Ziegler
committed
*/
Wolfgang Ziegler
committed
function entity_test_entity_update($entity, $entity_type) {
$_SESSION['entity_hook_test']['entity_update'][] = entity_id($entity_type, $entity);
Wolfgang Ziegler
committed
}
/**
Wolfgang Ziegler
committed
* Implements hook_entity_delete().
Wolfgang Ziegler
committed
*/
Wolfgang Ziegler
committed
function entity_test_entity_delete($entity, $entity_type) {
Wolfgang Ziegler
committed
if ($entity_type == 'entity_test_type') {
$_SESSION['entity_hook_test']['entity_delete'][] = entity_id($entity_type, $entity);
}
Wolfgang Ziegler
committed
}
/**
Wolfgang Ziegler
committed
* Implements hook_entity_test_type_insert().
Wolfgang Ziegler
committed
*/
Wolfgang Ziegler
committed
function entity_test_entity_test_type_insert($entity) {
$_SESSION['entity_hook_test']['entity_test_type_insert'][] = $entity->identifier();
Wolfgang Ziegler
committed
}
/**
Wolfgang Ziegler
committed
* Implements hook_entity_test_type_update().
*/
Wolfgang Ziegler
committed
function entity_test_entity_test_type_update($entity) {
$_SESSION['entity_hook_test']['entity_test_type_update'][] = $entity->identifier();
// Determine changes on update.
if (!empty($entity->original) && $entity->original->label == 'test_changes') {
if ($entity->original->label != $entity->label) {
Wolfgang Ziegler
committed
$entity->label .= '_update';
}
}
}
/**
Wolfgang Ziegler
committed
* Implements hook_entity_test_type_delete().
*/
Wolfgang Ziegler
committed
function entity_test_entity_test_type_delete($entity) {
$_SESSION['entity_hook_test']['entity_test_type_delete'][] = $entity->identifier();
}
/**
* Implements hook_entity_test_type_presave().
*/
function entity_test_entity_test_type_presave($entity) {
// Determine changes.
if (!empty($entity->original) && $entity->original->label == 'test_changes') {
if ($entity->original->label != $entity->label) {
Wolfgang Ziegler
committed
$entity->label .= '_presave';
}
}
}
Wolfgang Ziegler
committed
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
/**
* Implements hook_entity_property_info_alter() for testing an property of type
* 'entity'.
*/
function entity_test_entity_property_info_alter(&$info) {
$info['node']['properties']['reference'] = array(
'label' => t('Test reference'),
'description' => t('A generic entity reference.'),
'getter callback' => 'entity_test_entity_getter',
'setter callback' => 'entity_test_entity_setter',
'type' => 'entity',
);
}
/**
* Getter callback for the 'reference' property.
*/
function entity_test_entity_getter($node) {
if (empty($node->entity)) {
$node->entity = array('type' => 'user', 'id' => $node->uid);
}
// We have to return the entity wrapped.
return entity_metadata_wrapper($node->entity['type'], $node->entity['id']);
}
/**
* Setter callback for the 'reference' property.
*/
function entity_test_entity_setter($node, $property_name, $wrapper) {
// The entity has to be passed wrapped.
$node->entity = array('type' => $wrapper->type(), 'id' => $wrapper->getIdentifier());
}