Wednesday, August 24, 11
Code & Coders Entities - Emerging Patterns of Usage Presented by Ronald Ashri (ronald_istos) Wednesday, August 24, 11
@ronald_istos Web App Development Travel / Semantic Web www.istos.it Solutions for hotels, villas, B&Bs drupalrooms.com w/ Bluespark Labs Drupal Trainer network drupalteachers.com w/ Brightlemon Wednesday, August 24, 11
Building with Entities ✤ How we got to entities ✤ What do they look like, what can we do, what’s missing ✤ When and how should we use them ✤ Learning from how they are used so far ✤ Questions / Next Steps Wednesday, August 24, 11
slice up a drupal and you will find nodes Wednesday, August 24, 11
drupalistas love making lots of nodes and mixing them up in different ways ... much like pasta Wednesday, August 24, 11
they love them so much they nearly turned everything into a node Wednesday, August 24, 11
user pro les = drupal.org/project/content_pro le Wednesday, August 24, 11
taxonomy = drupal.org/project/taxonomy_node Wednesday, August 24, 11
comments = drupal.org/project/comment_nodes Wednesday, August 24, 11
nodes come in different shapes but still tied to the same methods and db structure => need for a more generic core-based solution Wednesday, August 24, 11
but the core development process is never simple Wednesday, August 24, 11
Huge driver turned out to be the Field API work - attaching elds to core “stuff” came rst and the need to streamline followed Wednesday, August 24, 11
“loadable thingies, that can be optionally eldable” (http://drupal.org/node/460320) Wednesday, August 24, 11
entities Wednesday, August 24, 11
Entities in Drupal 7 are the nodes we really wanted but didn’t know it yet The stuff / content that makes up our site nodes, users, taxonomy terms, comments, les User Node Taxonomy Term Comment Taxonomy File Vocabulary Wednesday, August 24, 11
one day drupal will have a yeah... sure smallcore and it will all be OO Drupal Core Developers Summit 2040 Entities bring us closer to Drupal the framework No mention in UI - almost no mention in changelog Wednesday, August 24, 11
CHANGELOG.TXT... “In addition, any other object type may register with Field API and allow custom data elds to be attached to itself.” object type = entity Wednesday, August 24, 11
The relationships between Entities - the ways entities can interact with each other - de ne our Drupal application nodes can have comments users author nodes taxonomy terms are attached to nodes these relationships are implicit - perhaps they could be made explicit? Wednesday, August 24, 11
how to cook - (or build entities) Wednesday, August 24, 11
Your Table PostIt postit_id name property1 property2 property3 + elds (drupal worries about elds) Wednesday, August 24, 11
you de ne an entity via a hook_entity_info (big array!): function postit_entity_info(){ $postit_info['postit'] = array( 'label' => t('PostIt Note'), 'controller class' => 'PostItController', 'base table' => 'postit', 'uri callback' => 'postit_uri', 'fieldable' => TRUE, 'entity keys' => array( 'id' => 'pid', ), 'static cache' => TRUE, 'bundles' => array( 'postit'=> array( 'label' => 'PostIt', 'admin' => array( 'path' => 'admin/structure/postit/manage', 'access arguments' => array('administer postits'), ), ), ), 'view modes' => array( 'full' => array( 'label' => t('Full PostIt'), 'custom settings' => FALSE, ), ) ); return $postit_info; } Wednesday, August 24, 11
function postit_entity_info(){ $postit_info['postit'] = array( 'label' => t('PostIt Note'), 'controller class' => 'PostItController', 'base table' => 'postit', 'uri callback' => 'postit_uri', 'fieldable' => TRUE, You can provide you own controller class - typically 'entity keys' => array( 'id' => 'pid', ), extending the default DrupalDefaultEntityController 'static cache' => TRUE, which worries about caching, querying, revisioning and 'bundles' => array( 'postit'=> array( attaching elds to entities 'label' => 'PostIt', 'admin' => array( 'path' => 'admin/structure/postit/manage', 'access arguments' => array('administer postits'), ), ), ), 'view modes' => array( 'full' => array( 'label' => t('Full PostIt'), 'custom settings' => FALSE, ), ) ); return $postit_info; } Wednesday, August 24, 11
function postit_entity_info(){ $postit_info['postit'] = array( 'label' => t('PostIt Note'), 'controller class' => 'PostItController', 'base table' => 'postit', 'uri callback' => 'postit_uri', 'fieldable' => TRUE, 'entity keys' => array( 'id' => 'pid', ), 'static cache' => TRUE, base table = where our main entity data lives 'bundles' => array( uri callback = where to look up - view entities 'postit'=> array( 'label' => 'PostIt', eldable = are elds to be attached to our entity 'admin' => array( 'path' => 'admin/structure/postit/manage', 'access arguments' => array('administer postits'), ), ), ), 'view modes' => array( 'full' => array( 'label' => t('Full PostIt'), 'custom settings' => FALSE, ), ) ); return $postit_info; } Wednesday, August 24, 11
function postit_entity_info(){ $postit_info['postit'] = array( 'label' => t('PostIt Note'), 'controller class' => 'PostItController', 'base table' => 'postit', 'uri callback' => 'postit_uri', 'fieldable' => TRUE, 'entity keys' => array( 'id' => 'pid', ), 'static cache' => TRUE, 'bundles' => array( 'postit'=> array( 'label' => 'PostIt', 'admin' => array( 'path' => 'admin/structure/postit/manage', 'access arguments' => array('administer postits'), ), ), ), 'view modes' => array( 'full' => array( 'label' => t('Full PostIt'), Bundle = Entity + Con guration + Fields 'custom settings' => FALSE, ), ) 1 entity (Node) can have many bundles (Article, Page) ); return $postit_info; } Wednesday, August 24, 11
tell drupal how to load your entity function postit_load($pid = NULL, $reset = FALSE){ $pids = (isset ($pid) ? array($pid) : array()); $postit = postit_load_multiple($pids, $reset); return $postit ? reset ($postit) : FALSE; } function postit_load_multiple($pids = array(), $conditions = array(), $reset = FALSE){ return entity_load('postit', $pids, $conditions, $reset); } function entity_load($entity_type, $ids = FALSE, $conditions = array(), $reset = FALSE) { if ($reset) { entity_get_controller($entity_type)->resetCache(); } return entity_get_controller($entity_type)->load($ids, $conditions); } Wednesday, August 24, 11
ready to cook! ✤ we also get a query API EntityFieldQuery ✤ conditions on properties and elds ✤ queries across entity types ✤ and we get hooks ✤ hook_entity_load() ✤ hook_entity_presave() ✤ hook_entity_insert() ✤ hook_entity_update() ✤ hook_entity_delete() ✤ hook_entity_prepare_view ✤ hook_entity_view() Wednesday, August 24, 11
Young module developer : Where is full CRUD, UI, Views integration, Tokens, Search, etc? Drupal Core: What? Am I supposed to do everything around here? Wednesday, August 24, 11
+ Entity Module (drupal.org/project/entity) ✤ Supports full CRUD ✤ Quickly provide new entity types ✤ Standardised way of working with entity data ✤ Integration into drupal ecosystem (Tokens, Views, Rules, Exportables, Search API, RestWS, VBO) ✤ Full Tests Wednesday, August 24, 11
so what are we cooking - and how? and why? Wednesday, August 24, 11
entities are a uniquely drupaly concept your stuff (your db table or something like that) + Field API + hooks in the drupal world Wednesday, August 24, 11
if your module / app is introducing data you should really be asking yourself why not via entities you get plugged in to the drupal world for (almost) zero cost and your data can remains as is (almost) Wednesday, August 24, 11
emerging patterns Wednesday, August 24, 11
Commerce ✤ Great example as there is also historical perspective ✤ D6 Ubercart did almost everything “outside” of Drupal ✤ D7 Commerce is a fully signed up member to the Drupal ecosystem Wednesday, August 24, 11
in order to add commerce capabilities we need to introduce a whole set of concepts (and their supporting data structures) Drupal Commerce de nes Customer Pro les Lines Items Orders Payment Transactions Products as entities Wednesday, August 24, 11
Drupal Commerce defines only as much as it needs in terms of fields attached to these entities - Application core concepts (e.g. sku for product) live in entity base table not via field More complex core data (e.g. price) gets added via a locked field Allows the user add extra fields where it makes sense Wednesday, August 24, 11
local action entity types Entity operational links Listing as a View Wednesday, August 24, 11
Contains Line Order Entity Item Entities Related to payment entities address eld eld looks familiar! Wednesday, August 24, 11
use entities to introduce new data types that can be user-extensible provide minimum conf required - easily customisable in install profiles or via custom modules ps: did I mention - you really, really, really need a good reason not to use entities when introducing new data (and data tables) to Drupal Wednesday, August 24, 11
Profile 2 ✤ Separates users from descriptions of users ✤ Uses different bundles to describe different aspects of the same user ✤ Use entities to provide pro le level type permissions Wednesday, August 24, 11
placed under Entity Module UI admin/structure for handling types per type con guration Wednesday, August 24, 11
use new entity relationships to extend the application provide configuration via entity types Wednesday, August 24, 11
Organic Groups ✤ Organic Groups uses Entities because via the Entity API it gets CRUD, Views, Rules integration etc for free ✤ Groups are still attached to nodes ✤ Automatically created via an indirect user action Wednesday, August 24, 11
Group Entity when you create a node as a Group Type this triggers the creation of the Group Entity separation of concerns opens up interesting possibilities and enables things that were not possible before like better internationalization support Wednesday, August 24, 11
Group Membership Entity content group Wednesday, August 24, 11
because relationships are entities we can add elds to them e.g. date eld indicating relationship expiration Wednesday, August 24, 11
use Entities to separate concerns - using the Field API as a way to exibly add access to con guration options - Site builder can decide how much con g to make available to Site Admins Wednesday, August 24, 11
Rooms ✤ Hotel booking application ✤ Introduces Bookable Units and Bookings as entities ✤ Relates entities to non entify-able data ✤ Uses entity types for default values settings as well as a source of common data across all entities instances Wednesday, August 24, 11
Bookable Unit Entity Wednesday, August 24, 11
Bookable Unit Availability Wednesday, August 24, 11
Entity Types de ne default property values Wednesday, August 24, 11
Rooms interact via entities Commerce Wednesday, August 24, 11
Kickstarting Development entities in a jar Wednesday, August 24, 11
Model Entities drupal.org/project/model Implementation of a generic Entity and Entity Administration interface that you can use to kickstart your own project. Wednesday, August 24, 11
experiment and learn from others doing it your way is great... but also need to study and share patterns for doing things Wednesday, August 24, 11
Summary ✤ Drupalize your data with entities ✤ Improves distinction between drupal the framework and drupal the CMS impoving app development ✤ Leverage the entity module ✤ Learn from examples Wednesday, August 24, 11
@ronald_istos Web App Development Travel / Semantic Web www.istos.it Solutions for hotels, villas, B&Bs drupalrooms.com w/ Bluespark Labs Drupal Trainer network drupalteachers.com w/ Brightlemon Wednesday, August 24, 11
What did you think? Locate this session on the DrupalCon London website: http://london2011.drupal.org/conference/schedule Click the “Take the survey” link THANK YOU! Wednesday, August 24, 11

Drupal Entities - Emerging Patterns of Usage

  • 1.
  • 2.
    Code & Coders Entities - Emerging Patterns of Usage Presented by Ronald Ashri (ronald_istos) Wednesday, August 24, 11
  • 3.
    @ronald_istos Web App Development Travel / Semantic Web www.istos.it Solutions for hotels, villas, B&Bs drupalrooms.com w/ Bluespark Labs Drupal Trainer network drupalteachers.com w/ Brightlemon Wednesday, August 24, 11
  • 4.
    Building with Entities ✤ How we got to entities ✤ What do they look like, what can we do, what’s missing ✤ When and how should we use them ✤ Learning from how they are used so far ✤ Questions / Next Steps Wednesday, August 24, 11
  • 5.
    slice up adrupal and you will find nodes Wednesday, August 24, 11
  • 6.
    drupalistas love makinglots of nodes and mixing them up in different ways ... much like pasta Wednesday, August 24, 11
  • 7.
    they love themso much they nearly turned everything into a node Wednesday, August 24, 11
  • 8.
    user pro les= drupal.org/project/content_pro le Wednesday, August 24, 11
  • 9.
  • 10.
  • 11.
    nodes come indifferent shapes but still tied to the same methods and db structure => need for a more generic core-based solution Wednesday, August 24, 11
  • 12.
    but the coredevelopment process is never simple Wednesday, August 24, 11
  • 13.
    Huge driver turnedout to be the Field API work - attaching elds to core “stuff” came rst and the need to streamline followed Wednesday, August 24, 11
  • 14.
    “loadable thingies, that can be optionally eldable” (http://drupal.org/node/460320) Wednesday, August 24, 11
  • 15.
  • 16.
    Entities in Drupal7 are the nodes we really wanted but didn’t know it yet The stuff / content that makes up our site nodes, users, taxonomy terms, comments, les User Node Taxonomy Term Comment Taxonomy File Vocabulary Wednesday, August 24, 11
  • 17.
    one day drupal will have a yeah... sure smallcore and it will all be OO Drupal Core Developers Summit 2040 Entities bring us closer to Drupal the framework No mention in UI - almost no mention in changelog Wednesday, August 24, 11
  • 18.
    CHANGELOG.TXT... “In addition, any other object type may register with Field API and allow custom data elds to be attached to itself.” object type = entity Wednesday, August 24, 11
  • 19.
    The relationships betweenEntities - the ways entities can interact with each other - de ne our Drupal application nodes can have comments users author nodes taxonomy terms are attached to nodes these relationships are implicit - perhaps they could be made explicit? Wednesday, August 24, 11
  • 20.
    how to cook- (or build entities) Wednesday, August 24, 11
  • 21.
    Your Table PostIt postit_id name property1 property2 property3 + elds (drupal worries about elds) Wednesday, August 24, 11
  • 22.
    you de nean entity via a hook_entity_info (big array!): function postit_entity_info(){ $postit_info['postit'] = array( 'label' => t('PostIt Note'), 'controller class' => 'PostItController', 'base table' => 'postit', 'uri callback' => 'postit_uri', 'fieldable' => TRUE, 'entity keys' => array( 'id' => 'pid', ), 'static cache' => TRUE, 'bundles' => array( 'postit'=> array( 'label' => 'PostIt', 'admin' => array( 'path' => 'admin/structure/postit/manage', 'access arguments' => array('administer postits'), ), ), ), 'view modes' => array( 'full' => array( 'label' => t('Full PostIt'), 'custom settings' => FALSE, ), ) ); return $postit_info; } Wednesday, August 24, 11
  • 23.
    function postit_entity_info(){ $postit_info['postit'] = array( 'label' => t('PostIt Note'), 'controller class' => 'PostItController', 'base table' => 'postit', 'uri callback' => 'postit_uri', 'fieldable' => TRUE, You can provide you own controller class - typically 'entity keys' => array( 'id' => 'pid', ), extending the default DrupalDefaultEntityController 'static cache' => TRUE, which worries about caching, querying, revisioning and 'bundles' => array( 'postit'=> array( attaching elds to entities 'label' => 'PostIt', 'admin' => array( 'path' => 'admin/structure/postit/manage', 'access arguments' => array('administer postits'), ), ), ), 'view modes' => array( 'full' => array( 'label' => t('Full PostIt'), 'custom settings' => FALSE, ), ) ); return $postit_info; } Wednesday, August 24, 11
  • 24.
    function postit_entity_info(){ $postit_info['postit'] = array( 'label' => t('PostIt Note'), 'controller class' => 'PostItController', 'base table' => 'postit', 'uri callback' => 'postit_uri', 'fieldable' => TRUE, 'entity keys' => array( 'id' => 'pid', ), 'static cache' => TRUE, base table = where our main entity data lives 'bundles' => array( uri callback = where to look up - view entities 'postit'=> array( 'label' => 'PostIt', eldable = are elds to be attached to our entity 'admin' => array( 'path' => 'admin/structure/postit/manage', 'access arguments' => array('administer postits'), ), ), ), 'view modes' => array( 'full' => array( 'label' => t('Full PostIt'), 'custom settings' => FALSE, ), ) ); return $postit_info; } Wednesday, August 24, 11
  • 25.
    function postit_entity_info(){ $postit_info['postit'] = array( 'label' => t('PostIt Note'), 'controller class' => 'PostItController', 'base table' => 'postit', 'uri callback' => 'postit_uri', 'fieldable' => TRUE, 'entity keys' => array( 'id' => 'pid', ), 'static cache' => TRUE, 'bundles' => array( 'postit'=> array( 'label' => 'PostIt', 'admin' => array( 'path' => 'admin/structure/postit/manage', 'access arguments' => array('administer postits'), ), ), ), 'view modes' => array( 'full' => array( 'label' => t('Full PostIt'), Bundle = Entity + Con guration + Fields 'custom settings' => FALSE, ), ) 1 entity (Node) can have many bundles (Article, Page) ); return $postit_info; } Wednesday, August 24, 11
  • 26.
    tell drupal howto load your entity function postit_load($pid = NULL, $reset = FALSE){ $pids = (isset ($pid) ? array($pid) : array()); $postit = postit_load_multiple($pids, $reset); return $postit ? reset ($postit) : FALSE; } function postit_load_multiple($pids = array(), $conditions = array(), $reset = FALSE){ return entity_load('postit', $pids, $conditions, $reset); } function entity_load($entity_type, $ids = FALSE, $conditions = array(), $reset = FALSE) { if ($reset) { entity_get_controller($entity_type)->resetCache(); } return entity_get_controller($entity_type)->load($ids, $conditions); } Wednesday, August 24, 11
  • 27.
    ready to cook! ✤ we also get a query API EntityFieldQuery ✤ conditions on properties and elds ✤ queries across entity types ✤ and we get hooks ✤ hook_entity_load() ✤ hook_entity_presave() ✤ hook_entity_insert() ✤ hook_entity_update() ✤ hook_entity_delete() ✤ hook_entity_prepare_view ✤ hook_entity_view() Wednesday, August 24, 11
  • 28.
    Young module developer: Where is full CRUD, UI, Views integration, Tokens, Search, etc? Drupal Core: What? Am I supposed to do everything around here? Wednesday, August 24, 11
  • 29.
    + Entity Module (drupal.org/project/entity) ✤ Supports full CRUD ✤ Quickly provide new entity types ✤ Standardised way of working with entity data ✤ Integration into drupal ecosystem (Tokens, Views, Rules, Exportables, Search API, RestWS, VBO) ✤ Full Tests Wednesday, August 24, 11
  • 30.
    so what arewe cooking - and how? and why? Wednesday, August 24, 11
  • 31.
    entities are auniquely drupaly concept your stuff (your db table or something like that) + Field API + hooks in the drupal world Wednesday, August 24, 11
  • 32.
    if your module/ app is introducing data you should really be asking yourself why not via entities you get plugged in to the drupal world for (almost) zero cost and your data can remains as is (almost) Wednesday, August 24, 11
  • 33.
  • 34.
    Commerce ✤ Great example as there is also historical perspective ✤ D6 Ubercart did almost everything “outside” of Drupal ✤ D7 Commerce is a fully signed up member to the Drupal ecosystem Wednesday, August 24, 11
  • 35.
    in order toadd commerce capabilities we need to introduce a whole set of concepts (and their supporting data structures) Drupal Commerce de nes Customer Pro les Lines Items Orders Payment Transactions Products as entities Wednesday, August 24, 11
  • 36.
    Drupal Commerce definesonly as much as it needs in terms of fields attached to these entities - Application core concepts (e.g. sku for product) live in entity base table not via field More complex core data (e.g. price) gets added via a locked field Allows the user add extra fields where it makes sense Wednesday, August 24, 11
  • 37.
    local action entity types Entity operational links Listing as a View Wednesday, August 24, 11
  • 38.
    Contains Line Order Entity Item Entities Related to payment entities address eld eld looks familiar! Wednesday, August 24, 11
  • 39.
    use entities tointroduce new data types that can be user-extensible provide minimum conf required - easily customisable in install profiles or via custom modules ps: did I mention - you really, really, really need a good reason not to use entities when introducing new data (and data tables) to Drupal Wednesday, August 24, 11
  • 40.
    Profile 2 ✤ Separates users from descriptions of users ✤ Uses different bundles to describe different aspects of the same user ✤ Use entities to provide pro le level type permissions Wednesday, August 24, 11
  • 41.
    placed under Entity Module UI admin/structure for handling types per type con guration Wednesday, August 24, 11
  • 42.
    use new entityrelationships to extend the application provide configuration via entity types Wednesday, August 24, 11
  • 43.
    Organic Groups ✤ Organic Groups uses Entities because via the Entity API it gets CRUD, Views, Rules integration etc for free ✤ Groups are still attached to nodes ✤ Automatically created via an indirect user action Wednesday, August 24, 11
  • 44.
    Group Entity when you create a node as a Group Type this triggers the creation of the Group Entity separation of concerns opens up interesting possibilities and enables things that were not possible before like better internationalization support Wednesday, August 24, 11
  • 45.
    Group Membership Entity content group Wednesday, August 24, 11
  • 46.
    because relationships areentities we can add elds to them e.g. date eld indicating relationship expiration Wednesday, August 24, 11
  • 47.
    use Entities toseparate concerns - using the Field API as a way to exibly add access to con guration options - Site builder can decide how much con g to make available to Site Admins Wednesday, August 24, 11
  • 48.
    Rooms ✤ Hotel booking application ✤ Introduces Bookable Units and Bookings as entities ✤ Relates entities to non entify-able data ✤ Uses entity types for default values settings as well as a source of common data across all entities instances Wednesday, August 24, 11
  • 49.
  • 50.
  • 51.
    Entity Types dene default property values Wednesday, August 24, 11
  • 52.
    Rooms interact via entities Commerce Wednesday, August 24, 11
  • 53.
    Kickstarting Development entities in a jar Wednesday, August 24, 11
  • 54.
    Model Entities drupal.org/project/model Implementation of a generic Entity and Entity Administration interface that you can use to kickstart your own project. Wednesday, August 24, 11
  • 55.
    experiment and learn from others doing it your way is great... but also need to study and share patterns for doing things Wednesday, August 24, 11
  • 56.
    Summary ✤ Drupalize your data with entities ✤ Improves distinction between drupal the framework and drupal the CMS impoving app development ✤ Leverage the entity module ✤ Learn from examples Wednesday, August 24, 11
  • 57.
    @ronald_istos Web App Development Travel / Semantic Web www.istos.it Solutions for hotels, villas, B&Bs drupalrooms.com w/ Bluespark Labs Drupal Trainer network drupalteachers.com w/ Brightlemon Wednesday, August 24, 11
  • 58.
    What did youthink? Locate this session on the DrupalCon London website: http://london2011.drupal.org/conference/schedule Click the “Take the survey” link THANK YOU! Wednesday, August 24, 11