Drupal Entities

18

Click here to load reader

description

Präsentation beim Drupal Meetup Stuttgart 3.11.2011

Transcript of Drupal Entities

Page 1: Drupal Entities

Drupal 7:von Objektenzu EntitiesDrupal Meetup Stuttgart 3.11.2011 - bb

Page 2: Drupal Entities

Drupal 6: Objekte mit proprietären APIs

Objekte sind z.B. - Nodes- Terms- User- Blocks- Files Felder -> CCK ! (nur für Nodes)

Page 3: Drupal Entities

Drupal 6: Objekte mit proprietären APIs

Beispiele: node_load($param = array(), $revision = NULL, $reset = NULL)

user_save($account, $array = array(), $category = 'account')

file_delete($path)

taxonomy_get_term_by_name($name)

Page 4: Drupal Entities

Drupal 6: Objekte mit proprietären APIs

Beispiele: node_load($param = array(), $revision = NULL, $reset = NULL)

user_save($account, $array = array(), $category = 'account')

file_delete($path)

taxonomy_get_term_by_name($name)

Problem:

- uneinheitliche Behandlung durch spezifische APIs- Felder nur über contributed modules (CCK, Content Profile, ...)

Page 5: Drupal Entities

Ziel: Vereinheitlichung - Objekt & CRUD-API

Ein Objekt kann

- erzeugt werden (Create)

- gelesen werden (Read)

- verändert werden (Update)

- gelöscht werden (Delete)

Page 6: Drupal Entities

Ziel: Vereinheitlichung - Objekt & Field-API

Zu JEDEM Objekt können beliebige Felder angelegt werden - Text- Zahlen- Links- Referenzen- Dateien- ... Auch diese können gelesen, verändert, gelöscht werden.

Page 7: Drupal Entities

Drupal 7: Voilá, Entities !

Konzepte: - Entity Types - Entity Bundles - Entity Properties - Fields

& Entity API / Field API

Beispiele: - node, user, vocabulary - page, article, blog - author, created, status - field_xyz

Page 8: Drupal Entities

Codevergleich Drupal 6 <-> Drupal 7Drupal 6 (Database API + Node API)

$query = "SELECT nid FROM {node}

WHERE (type = 'article' AND status = '1')

ORDER BY created DESC";

$result = db_query($query);

while ($nid = db_result($result)) {

$articles[] = node_load($res);

}

Drupal 7 (Entity API):

$query = new EntityFieldQuery();$result = $query->entityCondition ('entity_type', 'node') ->entityCondition ('bundle'), 'article') ->propertyCondition ('status', '1'); ->propertyOrderBy ('created', 'DESC'); ->execute();

$articles = entity_load ('node', array_keys($result['node']);

Page 9: Drupal Entities

Abstraktionsebene: Entity Controller

Drupal 6:

Drupal 7: Modul

API

Daten

Modul

API

Daten

Entity Controller

Page 10: Drupal Entities

Entity Controller

Bsp: Drupal Variablen als Entitiesclass VariableController extends DrupalDefaultEntityController {}

function variable_load($variable_id = NULL, $reset = FALSE) { $variable_ids = (isset($variable_id) ? array($variable_id) : array()); $variable = variable_load_multiple($variable_ids, $reset); return $variable ? reset($variable) : FALSE;}

function variable_load_multiple($variable_ids = array(), $conditions = array(), $reset = FALSE) { return entity_load('variable', $variable_ids, $conditions, $reset);}

function variable_uri($variable) { return array( 'path' => 'variable/' . $variable->name, );}

function variables_field_extra_fields() { $fields = array(); $fields['variable']['value'] = array( 'form' => array( 'name' => array( 'label' => t('value'), 'description' => t('Variable Value'), ), ), ); return $fields;}

/** * Implements hook_entity_info() */

function variables_entity_info() {

$info['variable'] = array(

'label' => t('Drupal Variable'),

'controller class' => 'VariableController',

'base table' => 'variable',

'uri callback' => 'variable_uri',

'fieldable' => FALSE,

'entity keys' => array('id' => 'name'),

'static cache' => TRUE,

'bundles' => array(

'variable' => array('label' => 'Variable'),

),

'view modes' => array(

'full' => array('label' => t('Full'),

'custom settings' => FALSE),

)

);

return $info;

}

Page 11: Drupal Entities

Bsp: Drupal Variablen als Entities/** * Implements hook_menu() */

function mymodule_menu() {

$items['variable/%variable'] = array( 'title callback' => 'variable_page_title', 'title arguments' => array(1), 'page callback' => 'variable_page_view', 'page arguments' => array(1), 'type' => MENU_CALLBACK, 'access callback' => TRUE, );

$items['variablelist'] = array( 'title' => 'List of Variables', 'page callback' => 'variable_list', 'type' => MENU_CALLBACK, 'access callback' => TRUE, );

return $items;

}

function variable_page_title($variable) { return 'Variable: ' . $variable->name;}

function variable_page_view($variable) { return '&lt;' . $variable->value . '&gt;';}

Custom Module

function variable_list() { $query = new EntityFieldQuery(); $result = $query->entityCondition ('entity_type', 'variable') ->propertyOrderBy('name','DESC') ->execute(); $variables = entity_load('variable', array_keys($result['variable']));

$output = '';

foreach($variables as $var){ $output .= l($var->name,'variable/' . $var->name) . '<br />'; } return $output;}

Page 12: Drupal Entities

Ausgabe des Variablen-Beispiels/variablelist: /variable/user_picture_dimensions:

Page 13: Drupal Entities

Drupal 7: Vieles ist schon da, aber...

Beispiele aus dem D7 Core API:function node_load($nid = NULL, $vid = NULL, $reset = FALSE) { $nids = (isset($nid) ? array($nid) : array()); $conditions = (isset($vid) ? array('vid' => $vid) : array()); $node = node_load_multiple($nids, $conditions, $reset); return $node ? reset($node) : FALSE;}

function node_load_multiple($nids = array(), $conditions = array(), $reset = FALSE) { return entity_load('node', $nids, $conditions, $reset);}

Page 14: Drupal Entities

Drupal 7: Vieles ist schon da, aber...

Beispiele aus dem D7 Core API:function node_load($nid = NULL, $vid = NULL, $reset = FALSE) { $nids = (isset($nid) ? array($nid) : array()); $conditions = (isset($vid) ? array('vid' => $vid) : array()); $node = node_load_multiple($nids, $conditions, $reset); return $node ? reset($node) : FALSE;}

function node_load_multiple($nids = array(), $conditions = array(), $reset = FALSE) { return entity_load('node', $nids, $conditions, $reset);}

function taxonomy_get_term_by_name($name) { return taxonomy_term_load_multiple(array(), array('name' => trim($name)));}

function taxonomy_term_load_multiple($tids = array(), $conditions = array()) { return entity_load('taxonomy_term', $tids, $conditions);}

Page 15: Drupal Entities

Drupal 7: Vieles ist schon da, aber...

Vieles ist noch unvollständig:

- Remember CRUD? Im Core gibt es nur das "R" !- Es gibt noch kein User Interface zu Entities- Integration z.B. in Views, Panels, Rules, Features, Pathauto, Display Suite, ...

Manches ist nur vorläufig:function taxonomy_get_term_by_name($name) { return taxonomy_term_load_multiple(array(), array('name' => trim($name)));}

function taxonomy_term_load_multiple($tids = array(), $conditions = array()) { return entity_load('taxonomy_term', $tids, $conditions);}

Die Verwendung von $conditions ist deprecated, und wird in D8 wahrscheinlich wieder verschwinden!

Page 16: Drupal Entities

Abhilfe: Contributed Modules

Entity API - Ergänzt das Core API, z.B. mit vollständigem CRUDhttp://drupal.org/project/entity File Entity - Macht Files fieldablehttp://drupal.org/project/file_entity Entity Construction Kit (ECK) - User Interface zur Verwaltung von Entitieshttp://drupal.org/project/eck Entity Reference - Referenzen auf Entities, ähnlich node / user referencehttp://drupal.org/project/entityreference Manches wird mit D8 im Core landen, anderes in der Versenkung verschwinden - schwer zu beurteilen!

Page 17: Drupal Entities

Demo: ECK, Views, DB

- Erzeugen von Entity Types, Bundles, Entities - Listen in Views - Repräsentation in der Datenbank

Page 18: Drupal Entities

Fragen / Diskussion

Zum Weiterlesen: http://www.davetech.com/blog/introduction_drupal_7_entities_and_fieldshttp://www.istos.it/category/blog-tags/drupal-entitieshttp://de.wetena.com/blog/2011/04/13/entities-in-drupal-7http://www.slideshare.net/alexshr/entity-api

Diese Folien als PDF: http://www.slideshare.net/drubb/drupal-entities