Entity Formatter

"Template driven formatting"

Walter Jenner, Web Entwickler bei Form & Code.

Überblick

  • Theming vereinfachen
  • Für Felder die an Entities hängen
  • Output im Template definieren

Beispiel

<?php
  // Create the entity formatter object.
  $page = new PageNodeFormatter($node);
?>

<article class="page">
 
    <?php
      // Print a summary of the body trimmed to 250 chars.
      print $page->getBody()->summary(250);
    ?>

    <?php
      // Print all images in "field_images" using the "thumbnail" image style. 
      foreach ($page->getImages() as $image) {
        print $image->setImageStyle('thumbnail')->img();
      }
    ?>

</article>

node--page.tpl.php

Output im Template definieren

  • Umgehen der Display settings
  • Einstellungsmöglichkeiten decken nie alle Fälle ab
  • Per Code ist alles einfach

Display Settings

Module für Formatierungslogik

(mit Entity Formatter nicht mehr nötig :)

Beispiel: Image Link Formatter

Einstellungsmöglichkeiten

decken nie alle Fälle ab!

LESSON LEARNED

Entity Formatter

Die Highlights

IDE Code Completion

EntityFormatter Klassen werden speziell per Drush generiert und stellen Methoden für jedes Feld zur Verfügung.

Klassen generieren mit Drush

drush efm node --bundles=page,article --module=entity_formatter_custom

Es werden Klassen generiert für:

  • Entities vom Type "Node"
  • nur für die Bundles "Page" und "Article".
  • Und alles kommt in das Modul "entity_formatter_custom"
PageNodeFormatter.php - {BundleName}{EntityType}Formatter.php

Feld-WErte Auslesen

// Text (text, text_long und text_summary)
$page->getBody()->text();
$page->getBody()->summary();

// Image
$page->getImages()->img();
$page->getImages()->src();

// Generell (auch für noch nicht unterstützte Felder)
$page->getGeofield()->value();

Für jedes Feld eine get-Methode mit dem Feldnamen (ohne field_ prefix).
field_images > getImages()
field_foobar > getFoobar()

Unterstützte Feldtypen
Alle Core Felder + Entity Reference, Link, Date, Addressfield

Single / Multi Value

// Standardmäßig wird auf den ersten Wert zugegriffen.
$page->getImages()->img();

// Es kann gezielt auf einen bestimmten Wert zugegriffen werden.
$page->getImages()->setDelta(2)->img();

// Oder über alle Werte geloopt werden
foreach ($page->getImages() as $image) {
  $image->img();
}

field_images ist ein Multivalue Feld.

MEHRSPRACHIGKEIT

$page->setLanguage('en');

Standardmäßig wird die aktuelle Content Language verwendet.

 

Kann aber gezielt eingestellt werden.

Eigene Formatter Klassen verwenden

/**
 * Allows modules to use custom formatter classes for specific field-types.
 * Custom classes should subclass EfFieldFormatter or a subclass of it.
 *
 * NOTE: You need to re-generate your classes, after you implemented this hook.
 *
 * To use specific classes for individual fields, you can consider manually
 * modifying the generated EfEntityFormatter class because existent methods are
 * not overwritten the next time the class is generated.
 */

function hook_entity_formatter_field_type_mapping_alter(&$field_type_mapping) {
  // Use "EfBetterLinkFieldFormatter" class for fields of type "link_field".
  $field_type_mapping['link_field'] = 'EfBetterLinkFieldFormatter';
}

DEMO-Time!

Fragen?​

 

  1. Responsive Images
  2. Field Collections
  3. Wünsche?

Links

Made with Slides.com