Boris Böhne
Drupal Developer, Sindelfingen, Germany
06/11/2015
loadable thingies, that can optionally be fieldable
https://www.drupal.org/node/460320
class Contact extends ContentEntityBase implements ContactInterface {
...
}
Content Entities
Configuration entities
Aggregator feed / item
Block content
Comment
Message
File
Menu link
Content (aka node)
Shortcut
Taxonomy term
User
Action
Block
Breakpoint
Comment type
Content type
Date format
Field
Image Style
Language
Menu
Role
View
...
entities, implemented by something called Entity API
// Load a single node
$customer = node_load(526);
// Load multiple users
$users = user_load_multiple(array(77, 83, 121));
// Load a single term
$category = taxonomy_term_load(19);
// Load a single node
$storage = \Drupal::entityManager()->getStorage('node');
$customer = $storage->load(526);
// Load multiple users
$storage = \Drupal::entityManager()->getStorage('user');
$users = $storage->loadMultiple(array(77, 83, 121));
// Load a single term
$storage = \Drupal::entityManager()->getStorage('taxonomy_term');
$category = $storage->load(19);
Better: use Dependency Injection, not static calls!
// Load a single node
$customer = Node::load(526);
// Load multiple users
$users = User::loadMultiple(array(77, 83, 121));
// Load a single term
$category = Term::load(19);
// Load a single node
$customer = entity_load('node', 526);
// Load multiple users
$users = entity_load_multiple('user', array(77, 83, 121));
// Load a single term
$category = entity_load('taxonomy_term', 19);
$node = new stdClass();
$node->type = 'article';
node_object_prepare($node);
$node->title = 'Breaking News';
node_save($node);
$storage = \Drupal::entityManager()->getStorage('node');
$node = $storage->create(array('type' => 'article', 'title' => 'Breaking News'));
$node->save();
$node = Node::create(array('type' => 'article', 'title' => 'Breaking News'));
$node->save();
$node = node_load(331);
$node->title = 'Changed title';
node_save($node);
$storage = \Drupal::entityManager()->getStorage('node');
$node = $storage->load(526);
$node->setTitle('Changed title');
$node->save();
$node = entity_load('node', 526);
$node->setTitle('Changed title');
$node->save();
node_delete(529);
node_delete_multiple(array(22,56,77));
entity_delete_multiple('node', array(529));
entity_delete_multiple('node', array(22,56,77));
$storage = \Drupal::entityManager()->getStorage('node');
$node = $storage->loadMultiple(array(529));
$storage->delete($node);
$storage = \Drupal::entityManager()->getStorage('node');
$nodes = $storage->loadMultiple(array(22,56,77));
$storage->delete($nodes);
$car = node_load(23);
$title = $car->title;
$color = $car->field_color['und'][0]['value']
$manufacturer = $car->field_manufacturer['und'][0]['target_id']
...
Or, thanks to Entity Metadata Wrapper (contrib):
$car = entity_metadata_wrapper('node', 23);
$title = $car->title;
$color = $car->field_color->value();
$manufacturer = $car->field_manufacturer->raw();
...
No getter / setter methods, but some lovely arrays:
$nid = $car->id();
$nid = $car->get('nid')->value;
$nid = $car->nid->value;
$title = $car->label();
$title = $car->getTitle();
$title = $car->get('title')->value;
$title = $car->title->value;
$created = $car->getCreatedTime();
$created = $car->get('created')->value;
$created = $car->created->value;
$color = $car->field_color->value;
$color = $car->get('field_color')->value;
$uid = $car->getOwnerId();
$uid = $car->get('uid')->target_id;
$uid = $car->uid->value;
$user = $car->getOwner();
$user = $car->get('uid')->entity;
Getter / setter methods in core, but ambivalent:
Reasonable, or just bad DX ?
Drupal\node\Entity\Node Object(
[values:protected] => Array(
[vid] => Array([x-default] => 1)
[langcode] => Array ([x-default] => en)
[revision_timestamp] => Array([x-default] => 1433958690)
[revision_uid] => Array([x-default] => 1)
[revision_log] => Array([x-default] => )
[nid] => Array([x-default] => 1)
[type] => Array([x-default] => test)
[uuid] => Array([x-default] => 46b4af73-616a-494a-8a16-22be8dfe592e)
[isDefaultRevision] => Array([x-default] => 1)
[title] => Array([x-default] => Breaking News)
[uid] => Array([x-default] => 1)
[status] => Array([x-default] => 1)
[created] => Array([x-default] => 1433958679)
[changed] => Array([x-default] => 1433958679)
[promote] => Array([x-default] => 1)
[sticky] => Array([x-default] => 0)
[default_langcode] => Array([x-default] => 1)
)
[fields:protected] => Array()
[fieldDefinitions:protected] =>
[languages:protected] =>
[langcodeKey:protected] => langcode
[defaultLangcodeKey:protected] => default_langcode
[activeLangcode:protected] => x-default
[defaultLangcode:protected] => en
[translations:protected] => Array(
[x-default] => Array([status] => 1)
)
[translationInitialize:protected] =>
[newRevision:protected] =>
[isDefaultRevision:protected] => 1
[entityKeys:protected] => Array(
[bundle] => test
[id] => 1
[revision] => 1
[label] => Breaking News
[langcode] => en
[uuid] => 46b4af73-616a-494a-8a16-22be8dfe592e
[default_langcode] => 1
)
[entityTypeId:protected] => node
[enforceIsNew:protected] =>
[typedData:protected] =>
[_serviceIds:protected] => Array()
)
$node->values['title']['x-default'] ?
$node->entityKeys['label'] ?
Don't even think of it!
$query = new EntityFieldQuery();
$query
->entityCondition('entity_type', 'node')
->entityCondition('bundle', array('product', 'movies'))
->propertyCondition('status', 1)
->fieldCondition('body', 'value', 'discount', 'CONTAINS')
->propertyOrderBy('created', 'DESC');
$result = $query->execute();
if (!empty($result['node'])) {
$nodes = node_load_multiple(array_keys($result['node']))
}
Useful, but
$storage = \Drupal::entityManager()->getStorage('node');
$query = $storage->getQuery();
$query
->Condition('type', array('product', 'movies'))
->Condition('status', 1)
->Condition('body', 'value', 'discount', 'CONTAINS')
->OrderBy('created', 'DESC');
$result = $query->execute();
$nodes = $storage->loadMultiple($result);
http://slides.com/drubb
http://slideshare.net/drubb
By Boris Böhne
Working with entities in Drupal 8 modules, a presentation at Drupal Meetup Stuttgart, 06/11/2015