Netzflut

Webdesign, Webentwicklung, Drupal & Zeuchs

Entities

Inhaltsverzeichniss

    Was sind Entities

    Entities sind "Dinge", die Information, die Daten mit denen wir in unserer Drupal Anwendung arbeiten. Ein Node, Taxonomy, User, Kommentar sind z.B. alles Entities. An Entities kann man Felder anhängen, d.h. man kan. an alles Felder anhängen. Z.b imagefields an Taxonomy Terms.

    Es ist nun also möglich eigene Datenstrukturen zu definieren, mit eigener Datenbanktabelle mit einem standardisierten weg Felder anzuhängen. Man muss also nicht mehr nodes in irgendwas ummurksen was sie eigentlich nicht sind (so wie in d6).

    Entitis sind also

    Ein Weg Daten zu beschreiben die für den eigenen Anwendungsfall einzigartig sind. Sie haben eine eigenen DB Tabelle. Gleichzeitig kann aber die Drupal Field PAPI genutzt werden um Felder anzuhängen und man kann so andere API Funktionen nutzen und z.B Views nutzen etc. Eine solide Methode ohne eigenes rumgefrickel (und genau deswegen benutzt man ja ein Framework).

    Eine Entity programmieren

    Einfache Entity mit einer ID(pid) und einem Feld(note).

    Schritt 1, Schema beschreiben

    Der Code folgende erzeugt die Datenbank Tabelle.

     
    function myetity_schema() {
        $schema['myetity'] = array (
          'description' => 'The main store for our entity',
          'fields' => array(
            'pid' => array(
              'description' => 'Primary key for our table of myetity notes',
              'type' => 'serial',
              'unsigned' => TRUE,
              'not null' => TRUE,
            ),
            'note' => array(
              'description' => 'The actual note',
              'type' => 'varchar',
              'length' => '255',
              'not null' => TRUE
            ),
          ),
          'primary key' => array('pid'),
        );
     
        return $schema;
      }

    Schritt 2, hook_entity_info()

    Tabelle festlegen, Name, Label etc.

    function myetity_entity_info(){
      $myetity_info['myetity'] = array(
        'label' => t('myetity Note'),
        'controller class' => 'MyEntityController',
        'base table' => 'myetity',
        'uri callback' => 'myetity_uri',
        'fieldable' => TRUE,
        'entity keys' => array(
          'id' => 'pid',
        ),
        'static cache' => TRUE,
        'bundles' => array(
          'myetity'=> array(
            'label' => 'My Entity',
            'admin' => array(
              'path' => 'admin/structure/myetity/manage',
              'access arguments' => array('administer myetity'),
            ),
          ),
        ),
        'view modes' => array(
          'full' => array(
            'label' => t('Full myetity'),
            'custom settings' =>  FALSE,
          ),
        )
      );
     
      return $myetity_info;
    }

    Wir legen eine Kontrollklasse fest, MyEntityController. Die Klasse ist eine Unterklasse von DrupalDefaultEntityController. Diese Kontrollklasse schreibt man am besten in ein separates File myentity.controller.inc

      class MyEntityController extends DrupalDefaultEntityController{
     
      /* we use that later*
      public function save($postit) {
        drupal_write_record('postit', $postit);
        field_attach_insert('postit', $postit);
        module_invoke_all('entity_insert', 'postit', $postit);
        return $postit;
      }
     
      }

    Nun müssen wir den uri callback myetity_uri definieren:

      function myetity_uri($myentity){
        return array(
          'path' => 'myentity/' . $myentity->id,
        );
      }

    Entity Laden

      function myetity_load($pid = NULL, $reset = FALSE){
        $pids = (isset ($pid) ? array($pid) : array());
        $myetity= myetity_load_multiple($pids, $reset);
        return $myetity ? reset ($myetity) : FALSE;
      }
     
      function myetity_load_multiple($pids = array(), $conditions = array(), $reset = FALSE){
        return entity_load('myetity', $pids, $conditions, $reset);
      }

    Entrity Menü, Rechte, Info, Felder ..

    function myetity_menu(){
      $items['admin/structure/myetity/manage'] = array(
        'title' => 'myetity Admin',
        'description' => 'Manage myetity structure',
        'page callback' => 'myetity_info',
        'access arguments' => array('administer myetity'),
      );
      $items['myetity/%myetity'] = array(
        'title callback' => 'myetity_page_title',
        'title arguments' => array(1),
        'page callback' => 'myetity_page_view',
        'page arguments' => array(1),
        'access arguments' => array('view myetity'),
        'type' => MENU_CALLBACK,
      );
      return $items;
    }
     
    function myetity_permission(){
        return array(
        'administer myetity' =>  array(
          'title' => t('Administer myetity'),
          'restrict access' => TRUE,
        ),
        'view myetity' => array(
          'title' => t('View myetity'),
        )
      );
    }
     
     
    function myetity_info() {
      return ('Welcome to the administration page for your myetity!');
    }
     
    function myentity_page_title($myetity){
      return $myetity->pid;
    }
     
    function myetity_page_view($myetity, $view_mode = 'full'){
      $myetity->content = array();
     
      // Build fields content.
      field_attach_prepare_view('myetity', array($myetity->pid => $myetity), $view_mode);
      entity_prepare_view('myetity', array($myetity->pid => $myetity));
      $myetity->content += field_attach_view('myetity', $myetity, $view_mode);
     
      return $myetity->content;
    }
     
     
    function myetity_field_extra_fields() {
      $return = array();
      $return['myetity']['myetity'] = array(
        'form' => array(
          'note' => array(
            'label' => t('Note'),
            'description' => t('myetity Note'),
          ),
        ),
      );
     
      return $return;
    }

    Bis jetzt gibt es ken wirkliches UI. Nächster Schritt.

    UI

      $items['myentity/add'] = array(
          'title' => 'Add myentity!',
          'page callback' => 'myentity_add',
          'access arguments' => array('create myentity'),
        );
     
      /* callback */  
      function myentity_add() {
        $myentity= (object) array (
          'pid' => '',
          'type' => 'myentity',
          'note' => '',
        );
     
        return drupal_get_form('myentity_add_form', $myentity);
      }
     
      function myentity_add_form($form, &$form_state, $myentity) {
        $form['note'] = array(
          '#type' => 'textfield',
          '#title' => t('Note'),
          '#required' => TRUE,
        );
     
        $form['submit'] = array(
          '#type' => 'submit',
          '#value' => t('Save'),
        );
     
        field_attach_form('myentity', $myentity, $form, $form_state);
     
        return $form;
      }
     
    /* validierung*/ 
     
    function myentity_add_form_validate($form, &$form_state) {
      $myentity_submisttion = (object) $form_state['values'];
      field_attach_form_validate('myentity', $myentity_submisttion, $form, $form_state);
    }
     
    function myentity_add_form_submit($form, &$form_state) {
      $myentity_submission = (object) $form_state['values'];
      field_attach_submit('myentity', $myentity_submission, $form, $form_state);
      $myentity= myentity_save($myentity_submission);
      $form_state['redirect'] = "myentity/$myentity->pid";
    }
     
    /* wir benutzen den myentity controller mit seiner save funktion */
    function myentity_save(&$postit) {
      return entity_get_controller('myentity')->save($myentity);
    }

    Delete, Edit Funktionalität fehlt.

    Entity Beispiele

    Im großartigen examples modul befindet sich ein Beispiel modul.
    http://drupal.org/project/examples

    http://drupal.org/project/field_collection

    API, Hilfe, Module

    http://drupal.org/project/entity
    http://drupal.org/project/eck
    http://drupal.org/project/model

    http://drupal.org/node/878784 | entity api handbuch

    Artikel

    http://www.istos.it/en/blog/drupal/drupal-entities-part-1-moving-beyond-nodes | 3 Teile
    http://www.trellon.com/content/blog/creating-own-entities-entity-api
    http://de.wetena.com/blog/2011/04/13/entities-in-drupal-7

    Videos/Präsentationen

    http://bxl2011.drupaldays.org/node/313 | entity api by fargo

    Sonstiges

    http://en.wikipedia.org/wiki/Entity-relationship_model

    Bücher

    Drupal 7 Module Development Buch

    Drupal: