Drupal 8 Entities
Content vs Configuration
Andy Postnikov, 2013
Entity? Node != Content?
Drupal 7 entities
● Node
● Comment
● User
● Term
● Vocabulary
●
● Contrib … Commerce, Message, ECK, ...
●
● Entity API, Rules, DS
Drupal 8 entities
Ctools + Entity API + DS + Rules
EntityInterface
ContentEntityInterface
ConfigEntityInterface
Entity
Taxonomy vocabulary
D8 entity - taxonomy_vocabulary
core/profiles/standard/config/taxonomy.vocabulary.tags.yml
● vid: tags
● name: Tags
● description: 'Use tags to group articles on similar topics into categories.'
● hierarchy: '0'
● weight: '0'
● status: '1'
● langcode: en
Role — Drupal 8 changes!
Role = user_role config
/core/profiles/standard
/config/user.role.administrator.yml
● id: administrator
● label: Administrator
● weight: 2
● langcode: en
Node & NodeType
type: article
name: Article
base: node_content
module: node
disabled: '0'
locked: '0'
custom: '1'
status: '1'
langcode: und
description: 'Use
<em>articles</em> for
time-sensitive content like
news, press releases or
blog posts.'
help: ''
has_title: '1'
title_label: Title
settings:
node:
preview: '1'
options:
status: status
promote: promote
sticky: '0'
revision: '0'
submitted: '1'
Node = nid, uuid, vid, type, langcode [tnid, translate]
{node_field_data} + {node_field_revision} = title, uid...
NodeType http://dgo.to/111715 - conversion
Content vs Config
● Contact
● Vocabulary
● View
● Custom block
● Role
● Menu
Block config vs Block content → Content
ContentEntityInterface
ConfigEntityInterface
getOriginalID() + setStatus()
Language Entity or Class
● Each entity contains
– UUID - Universally unique identifier for this entity. (128)
– LANGCODE - varchar(12)
● Modules:
– Locale
– language
– translation @deprecated
– translation_entity
Entity translation in core
Entity = Plugin (wtf)
DrupaluserPluginCoreEntityUser
/**
* Defines the user entity class.
*
* @EntityType(
* id = "user",
* label = @Translation("User"),
* module = "user",
* controllers = {
* "storage" =
"DrupaluserUserStorageController",
* "access" =
"DrupaluserUserAccessController",
* "render" =
"DrupalCoreEntityEntityRenderController",
* "form" = {
* "profile" =
"DrupaluserProfileFormController",
* "register" =
"DrupaluserRegisterFormController"
* },
* "translation" =
"DrupaluserProfileTranslationController"
* },
* default_operation = "profile",
* base_table = "users",
* uri_callback = "user_uri",
* route_base_path =
"admin/config/people/accounts",
* label_callback = "user_label",
* fieldable = TRUE,
* translatable = TRUE,
* entity_keys = {
* "id" = "uid",
* "uuid" = "uuid"
* }
* )
*/
class User extends EntityNG implements
UserInterface {
…
interface UserInterface extends
EntityInterface {}
class Entity implements
IteratorAggregate, EntityInterface {}
class EntityNG extends Entity {}
Entity API
● Definition:
– Annotation @EntityType
– hook_entity_info(&$entity_info) +
hook_entity_info_alter(&$entity_info)
– hook_entity_bundle_info() +
hook_entity_bundle_info_alter(&$bundles)
– Display entity via RenderController
● ViewMode
● EntityDisplay
● EntityFormDisplay
Entity API
● Controllers:
– EntityStorageControllerInterface
– EntityAccessControllerInterface
– EntityRenderControllerInterface
– EntityFormControllerInterface — many
– EntityTranslationControllerInterface
Entity NG
● Why Drupal 8 slow (x4) => entityBCdecorator
<?php
/**
* @file
* Contains DrupalCoreEntityEntity.
*/
/**
* Implements DrupalCoreEntityEntityInterface::getBCEntity().
*/
public function getBCEntity() {
return $this;
}
/**
* Implements DrupalCoreEntityEntityInterface::getNGEntity().
*/
public function getNGEntity() {
return $this;
}
Entity NG - BC
● Magic methods vs native properties
<?php
/**
* @file
* Contains DrupalCoreEntityEntityNG.
*/
/**
* Overrides Entity::getBCEntity().
*/
public function getBCEntity() {
if (!isset($this->bcEntity)) {
// Initialize field definitions so that we can pass them by reference.
$this->getPropertyDefinitions();
$this->bcEntity = new EntityBCDecorator($this, $this->fieldDefinitions);
}
return $this->bcEntity;
}
Fields NG
● Bundles are separated from entity definition
● Field and Field instance are config objects
● Todo:
– Replace most field-hooks with TypedData
– Review mega patches in sandboxes
– Allow use widgets and formatters for any data
object (none-configurable field)
Fields for menu links
● * @EntityType(
● * id = "menu",
● * label = @Translation("Menu"),
● * module = "system",
● * controllers = {
● * "storage" = "DrupalCoreConfigEntityConfigStorageController"
● * },
● * config_prefix = "menu.menu",
● * entity_keys = {
● * "id" = "id",
● * "label" = "label",
● * "uuid" = "uuid"
● * }
TypedData
Validation
● #2002152 by fago, amateescu: Implement
entity validation based on symfony validator.
●
● Make formatters and widgets work on
nonconfigurable fields
https://drupal.org/node/1950632
Todo
● [meta] Unified Entity Field API
– https://drupal.org/node/1346214
● Move entity-type specific storage logic into
entity classes
– https://drupal.org/node/1893772
● [META] Unify entity fields and field API
– https://drupal.org/node/1949932
Questions
● http://entity.worldempire.ch
● http://realize.be/field-api/
● http://buytaert.net/want-more-features-in-drupal-8-h

Drupal 8 entities & felds

  • 1.
    Drupal 8 Entities Contentvs Configuration Andy Postnikov, 2013
  • 2.
  • 3.
    Drupal 7 entities ●Node ● Comment ● User ● Term ● Vocabulary ● ● Contrib … Commerce, Message, ECK, ... ● ● Entity API, Rules, DS
  • 4.
    Drupal 8 entities Ctools+ Entity API + DS + Rules EntityInterface ContentEntityInterface ConfigEntityInterface Entity
  • 5.
  • 6.
    D8 entity -taxonomy_vocabulary core/profiles/standard/config/taxonomy.vocabulary.tags.yml ● vid: tags ● name: Tags ● description: 'Use tags to group articles on similar topics into categories.' ● hierarchy: '0' ● weight: '0' ● status: '1' ● langcode: en
  • 7.
    Role — Drupal8 changes!
  • 8.
    Role = user_roleconfig /core/profiles/standard /config/user.role.administrator.yml ● id: administrator ● label: Administrator ● weight: 2 ● langcode: en
  • 9.
    Node & NodeType type:article name: Article base: node_content module: node disabled: '0' locked: '0' custom: '1' status: '1' langcode: und description: 'Use <em>articles</em> for time-sensitive content like news, press releases or blog posts.' help: '' has_title: '1' title_label: Title settings: node: preview: '1' options: status: status promote: promote sticky: '0' revision: '0' submitted: '1' Node = nid, uuid, vid, type, langcode [tnid, translate] {node_field_data} + {node_field_revision} = title, uid... NodeType http://dgo.to/111715 - conversion
  • 10.
    Content vs Config ●Contact ● Vocabulary ● View ● Custom block ● Role ● Menu Block config vs Block content → Content
  • 11.
  • 12.
  • 13.
    Language Entity orClass ● Each entity contains – UUID - Universally unique identifier for this entity. (128) – LANGCODE - varchar(12) ● Modules: – Locale – language – translation @deprecated – translation_entity
  • 14.
  • 15.
    Entity = Plugin(wtf) DrupaluserPluginCoreEntityUser /** * Defines the user entity class. * * @EntityType( * id = "user", * label = @Translation("User"), * module = "user", * controllers = { * "storage" = "DrupaluserUserStorageController", * "access" = "DrupaluserUserAccessController", * "render" = "DrupalCoreEntityEntityRenderController", * "form" = { * "profile" = "DrupaluserProfileFormController", * "register" = "DrupaluserRegisterFormController" * }, * "translation" = "DrupaluserProfileTranslationController" * }, * default_operation = "profile", * base_table = "users", * uri_callback = "user_uri", * route_base_path = "admin/config/people/accounts", * label_callback = "user_label", * fieldable = TRUE, * translatable = TRUE, * entity_keys = { * "id" = "uid", * "uuid" = "uuid" * } * ) */ class User extends EntityNG implements UserInterface { … interface UserInterface extends EntityInterface {} class Entity implements IteratorAggregate, EntityInterface {} class EntityNG extends Entity {}
  • 16.
    Entity API ● Definition: –Annotation @EntityType – hook_entity_info(&$entity_info) + hook_entity_info_alter(&$entity_info) – hook_entity_bundle_info() + hook_entity_bundle_info_alter(&$bundles) – Display entity via RenderController ● ViewMode ● EntityDisplay ● EntityFormDisplay
  • 17.
    Entity API ● Controllers: –EntityStorageControllerInterface – EntityAccessControllerInterface – EntityRenderControllerInterface – EntityFormControllerInterface — many – EntityTranslationControllerInterface
  • 18.
    Entity NG ● WhyDrupal 8 slow (x4) => entityBCdecorator <?php /** * @file * Contains DrupalCoreEntityEntity. */ /** * Implements DrupalCoreEntityEntityInterface::getBCEntity(). */ public function getBCEntity() { return $this; } /** * Implements DrupalCoreEntityEntityInterface::getNGEntity(). */ public function getNGEntity() { return $this; }
  • 19.
    Entity NG -BC ● Magic methods vs native properties <?php /** * @file * Contains DrupalCoreEntityEntityNG. */ /** * Overrides Entity::getBCEntity(). */ public function getBCEntity() { if (!isset($this->bcEntity)) { // Initialize field definitions so that we can pass them by reference. $this->getPropertyDefinitions(); $this->bcEntity = new EntityBCDecorator($this, $this->fieldDefinitions); } return $this->bcEntity; }
  • 20.
    Fields NG ● Bundlesare separated from entity definition ● Field and Field instance are config objects ● Todo: – Replace most field-hooks with TypedData – Review mega patches in sandboxes – Allow use widgets and formatters for any data object (none-configurable field)
  • 21.
    Fields for menulinks ● * @EntityType( ● * id = "menu", ● * label = @Translation("Menu"), ● * module = "system", ● * controllers = { ● * "storage" = "DrupalCoreConfigEntityConfigStorageController" ● * }, ● * config_prefix = "menu.menu", ● * entity_keys = { ● * "id" = "id", ● * "label" = "label", ● * "uuid" = "uuid" ● * }
  • 22.
  • 23.
    Validation ● #2002152 byfago, amateescu: Implement entity validation based on symfony validator. ● ● Make formatters and widgets work on nonconfigurable fields https://drupal.org/node/1950632
  • 24.
    Todo ● [meta] UnifiedEntity Field API – https://drupal.org/node/1346214 ● Move entity-type specific storage logic into entity classes – https://drupal.org/node/1893772 ● [META] Unify entity fields and field API – https://drupal.org/node/1949932
  • 25.
    Questions ● http://entity.worldempire.ch ● http://realize.be/field-api/ ●http://buytaert.net/want-more-features-in-drupal-8-h