D7 icon passing the baton to D8 icon

Portierung eines Drupal 7 Moduls auf Drupal 8 am Beispiel von Cookies

Seit der Premiere von Drupal 8 ist bereits einige Zeit vergangen. Neue Projekte und Module werden ständig veröffentlicht, und die Anzahl der Projekte, die mit Version 8.x kompatibel sind, nimmt auf drupal.org stetig zu. Leider sind diese Versionen oft noch instabil und voller verschiedener Fehler. Stand heute liegt die Anzahl der zusätzlichen Module für Drupal 8 bei etwa 2.250, verglichen mit 12.400 Modulen für Drupal 7. Es ist sofort ersichtlich, dass die Bandbreite an fertigen Lösungen bei der neuen Generation weitaus geringer ist als bei der alten. Dennoch, obwohl es in Fällen von fortschrittlichen Projekten wenig sinnvoll sein könnte, diese von Grund auf zu schreiben, können wir bei kleineren Add-ons versuchen, das gesamte Modul oder seine interessanten Funktionen auf Version 8.x zu portieren. Als  Drupal-Agentur, müssen wir solche Drupal-Entwicklung ziemlich oft durchführen. In diesem Leitfaden werden wir ein von uns verwendetes Modul für den Einsatz mit Drupal 8 portieren, das den Cookie-Hinweis auf unserer Website anzeigt.

v. 7.x Strukturabbild

So sieht die Dateistruktur von Version 7.x aus. Das Modul ist recht einfach, da es eine benutzerdefinierte CSS-Datei, ein JavaScript, zwei Vorlagen, eine eingebettete .inc-Datei und die Standard-.info- und Moduldateien enthält.
Damit das Skript von Drupal 8 erkannt wird, benötigen wir eine .info.yml-Datei. Beginnen wir mit dieser. In D8 ist dies die einzige Datei, die erforderlich ist, damit das Modul vom System gesehen werden kann.

1. Info-Dateien:

Drupal 7

cookiec.info

name = CookieC
description = Dieses Modul zielt darauf ab, die Webseite mit der neuen EU-Cookie-Regulierung konform zu machen
core = 7.x

 

Drupal 8

cookiec.info.yml

name: CookieC
type: module
core: 8.x
version: 8.x-1.0
description: Dieses Modul zielt darauf ab, die Webseite mit der neuen EU-Cookie-Regulierung konform zu machen
configure: cookiec.settings


Die Dateien sind ziemlich ähnlich – wie Sie sehen können, der Hauptunterschied hier ist das Dateiformat. Da Drupal 8 YML-Dateien verwendet, muss die Datei eine .info.yml-Erweiterung haben. Darüber hinaus müssen wir auch hinzufügen type: weil Skins eine ähnliche Syntax verwenden, in unserem Fall wird dies sein type: module. Zusätzlich können wir in dieser Datei ‘configure:’ hinzufügen – ein Routing-Hook zur Konfigurationsseite. Wir werden jedoch das Routing im nächsten Teil besprechen. Es sei erwähnt, dass – genau wie in Python – Einrückungen im Code entscheidend sind. Nachdem der Cache geleert wurde, sollte das Modul bereits in der Liste sichtbar sein.

CookieC in der Liste sichtbar

2. .module-Datei und Hooks


Sehen wir uns nun einmal an, was in einer D7-.module-Datei zu finden ist. Unser Modul verwendet die folgenden Hooks/Funktionen:

  • hook_menu – verwendet zur Definition der /cookiec-Seite, die unsere Cookie-Richtlinie anzeigt,
  • hook_init – verwendet zur Initiierung unserer Funktionalität, einschließlich der Funktion zum Laden unserer benutzerdefinierten CSS- und JS-Dateien,
  • hook_permission – Berechtigung zur Verwaltung unseres Moduls,
  • hook_theme – Vorlagendefinitionen.

In D8 wurden hook_menu, hook_permission und hook_init abgeschafft.
Die Aufgaben von hook_menu werden nun von „module_name.routing.yml“ abgedeckt, und anstelle von hook_init werden wir EventSubscriber verwenden.
 

3. Hook_menu-Migration

Drupal 7

Hook_menu, das in der .module-Datei enthalten ist

<?php
/**
 * Implementiert hook_menu().
 */
function cookiec_menu() {
 $items['cookiec'] = array(
  //'title' => '',
  'description' => 'Cookie-Richtlinien-Seite.',
  'page callback' => 'cookiec_policy_page',
  'access arguments' => array('access content'),
  'file' => 'cookiec.page.inc',
 );
 return $items;
}

 

Drupal 8

Inhalt der cookiec.routing.yml-Datei:

cookiec.render_cookiec:
  path: '/cookiec'
  defaults:
    _controller: '\Drupal\cookiec\Controller\Cookiec::renderPage'
    _title: ''
  requirements:
    _permission: 'access content'


Die *.routing.yml-Datei enthält den Namen des Routings – cookiec.render_cookiec.
Pfad: URL-Adresse, die es uns ermöglicht, auf eine gegebene Funktionalität zuzugreifen; wie in D7 können wir auch dynamische Pfade verwenden, wie zum Beispiel: path: 'example/{user}', in diesem Fall wird es nicht benötigt, da unser Modul nur eine statische Seite anzeigt.
Standards: _controller: '\Drupal\cookiec\Controller\Cookiec::renderPage‘ bei /cookiec wird der Inhalt angezeigt, der von der Klasse Cookiec mit der Methode renderPage() zurückgegeben wird. Wir werden dies im Detail besprechen, während wir die statische Seite /cookiec erstellen.
Anforderungen: Wir werden Zugriffsberechtigungen in _permission: access content hinzufügen.
Wir sollten alle Klassen und Methoden, die unseren Routings zugeordnet sind, gleichzeitig erstellen, um Fehleranzeigen zu vermeiden.
Wir werden ein einfaches „Hello World“-Beispiel erstellen. Beginnen wir mit dem Erstellen einer Cookiec.php-Datei in /src/Controller:

namespace Drupal\cookiec\Controller;

use Drupal\Core\Controller\ControllerBase;

class Cookiec extends ControllerBase {

 function renderPage(){

  return array(
   '#title' => '',
   '#markup' => 'Hallo Welt!',
  );
 }
}


Nach dem Leeren des Caches und dem Aufrufen von /cookies sollten wir eine Seite mit der Meldung „Hallo Welt“ erhalten.
 

4. Migration hook_permissions


Um unsere eigenen Berechtigungen zu erstellen, werden wir eine module.permission.yml-Datei erstellen, ähnlich wie bei anderen .yml-Dateien:

administer cookiec:
 title: 'cookiec-Administrationsnachrichtenmodul verwalten'
 description: 'Administrationsaufgaben für cookiec durchführen'


Wir fügen auch das Folgende zu unserem Routing hinzu:

requirements:
 _permission: 'administer cookiec'


Die Formular-Klasse zu verwenden ist in diesem Fall eine nützliche Lösung.

cookiec.settings:
 path: '/admin/config/content/cookiec-settings'
 defaults:
  _form: '\Drupal\cookiec\Forms\CookiecSettingsForm'
  _title: 'cookiec-Konfiguration'
 requirements:
  _permission: 'administer cookiec'


Der Name des cookiec.settings-Routings wird in der info.yml-Datei platziert (configure: cookiec.settings), dank dessen uns die Modulkonfigurationsschaltfläche zu diesem Formular weiterleitet.
 

5. Hook_init-Migration


Hook_init, das in D7 jedes Mal gestartet wurde, wenn die Seite geladen wurde, wurde in D8 entfernt. Um eine ähnliche Funktionalität zu erhalten, werden wir Events verwenden, genauer gesagt EventSubscriber.
Um einen EventSubscriber in Drupal 8 zu erstellen, benötigen wir einen Service. Wir erstellen den Service wie andere .yml-Dateien:
Fügen Sie das folgende zu cookiec.service.yml hinzu:

services:
 cookiec_event_subscriber:
  class: Drupal\cookiec\EventSubscriber\CookiecSubscriber
  tags:
   – {name: event_subscriber}


Damit unser Service ein Event Subscriber wird, müssen wir eine Klasse erstellen, die das Interface – EventSubscriberInterface implementiert. Damit es korrekt funktioniert, werden wir drei Methoden erstellen:
in src/EventSubscriber/CookiecSubscriber.php

/**
 * @file Drupal\coociec\EventSubscriber\PopupMessageSubscriber
 */
namespace Drupal\cookiec\EventSubscriber;

use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;


/**
 * Class PopupMessageSubscriber
 * @package Drupal\cookiec\EventSubscriber
 */
class CookiecSubscriber implements EventSubscriberInterface {

protected $config;
 /**
  * CookiecSubscriber constructor.
  */
 public function __construct() {
  $this->config = \Drupal::configFactory()->get('cookiec.settings');
 }

 public function showCookiecMessage(FilterResponseEvent $event) {
  // Berechtigungen überprüfen, um Nachricht anzuzeigen.
  $response = $event->getResponse();

  if (!$response instanceof AttachmentsInterface) {
   return;
  }
 }

 /**
  * {@inheritdoc}
  */
 public static function getSubscribedEvents() {
  $events[KernelEvents::RESPONSE][] = array('showCookiecMessage', 20);

  return $events;
 }
}


Laden Sie die Modul-Einstellungen in unseren Konstruktor, die später an das JavaScript übergeben werden.
Damit unser Event funktioniert, müssen wir die getSubscribedEvents()-Methode hinzufügen, den Namen der Methode (showCookiecMessage) einfügen, die aufgerufen wird, und das Gewicht (20). Wir können das Gewicht verwenden, um die Reihenfolge der Ereignisse festzulegen.

 public static function getSubscribedEvents() {
  $events[KernelEvents::RESPONSE][] = array('showCookiecMessage', 20);

  return $events;
 }

6. Hinzufügen von JS- und CSS-Dateien

Der nächste Schritt wird sein, unsere JS- und CSS-Dateien zu übertragen – in unserem Fall werden sie fast ohne signifikante Änderungen bleiben. Stattdessen werden wir uns darauf konzentrieren, sie beim Ausführen unseres Codes zu laden.
Wenn wir externe JS- oder CSS-Dateien zu unserem Modul hinzufügen wollen, können wir eine Datei namens module.libraries.yml erstellen, in unserem Fall wird dies cookiec.libraries.yml sein

cookiec_library:
 version: 1.x
 css:
  theme:
   css/cookiec.css: {}
 js:
  js/cookiec.js: {preprocess: false}


Wir haben hier cookiec.css und cookiec.js-Dateien hinzugefügt. Wenn wir die vorhandenen Bibliotheken laden müssten, könnten wir sie mit Abhängigkeiten hinzufügen, zum Beispiel:

 dependencies:
  – core/jquery

 
Um unsere Bibliotheken jetzt zu laden, können wir zum Beispiel hook_preprocess_HOOK verwenden. In diesem Fall müssen wir zu unseren Variablen Folgendes hinzufügen:

$variables['#attached']['library'][] = 'cookiec/cookiec_library';


In unseren Beispielen fügen wir unsere Dateien direkt beim Laden des Events hinzu. Wir werden die folgenden Methoden verwenden, um dies zu erreichen:

  $response = $event->getResponse();
  $attachments = $response->getAttachments();
  $attachments['library'][] = 'cookiec/cookiec_library';
  $response->setAttachments($attachments);


Unser Modul erledigt den Großteil seiner Magie auf der Client-Seite. Um richtig zu funktionieren, erfordert unser Skript das Senden mehrerer Parameter. Einstellungen wie Höhe, Breite, der angezeigte Text oder die Position werden an das drupalSettings-Array in JS gesendet.

  $variables = array(
   'popup_enabled' => $config->get('popup_enabled'),
   'popup_agreed_enabled' => $config->get('popup_agreed_enabled'),
   'popup_hide_agreed' => $config->get('popup_hide_agreed'),
   'popup_height' => $config->get('popup_height'),
   'popup_width' => $config->get('popup_width'),
   'popup_delay' => $config->get('popup_delay')*1000,
   'popup_link' => $config->get($language."_link"),
   'popup_position' => $config->get('popup_position'),
   'popup_language' => $language,
   'popup_html_info' => $html_info,
   'popup_html_agreed' =>$html_agreed,
  );


Die Werte der Variablen werden aus den Moduleinstellungen – Configs – übernommen. Wir werden dies gleich besprechen.
So senden wir unsere PHP-Variablen an JS.

  $attachments['drupalSettings']['cookiec'] = $variables;


$html_info und $html_agreed speichern HTML-Code, der durch das Parsen von TWIG-Vorlagen und die Variablen erhalten wird:

  $variables = array(
   'title' => 'title',
   'message' => $config->get($language."_popup_info"),
  );

  $twig = \Drupal::service('twig');
  $template = $twig->loadTemplate(drupal_get_path('module', 'cookiec') . '/templates/cookiec_info.html.twig');
  $html_info = $template->render($variables);


  $variables = array(
   'title' => 'title',
   'message' => $config->get($language."_popup_info"),
   'more' => 't(mehr)',
   'hide' => 't(verstecken)',
  );
  $twig = \Drupal::service('twig');
  $template = $twig->loadTemplate(drupal_get_path('module', 'cookiec') . '/templates/cookiec_agreed.html.twig');
  $html_agreed = $template->render($variables);


Wir werden TWIG gleich besprechen.


 
Die gesamte Datei mit EventSubscriber sieht so aus:

<?php

/**
 * @file Drupal\coociec\EventSubscriber\PopupMessageSubscriber
 */
namespace Drupal\cookiec\EventSubscriber;

use Drupal\Core\Language\LanguageManager;
use Drupal\Core\Render\AttachmentsInterface;
use Drupal\Core\Render\Element;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;


/**
 * Class PopupMessageSubscriber
 * @package Drupal\popup_message\EventSubscriber
 */
class CookiecSubscriber implements EventSubscriberInterface {

 /**
  * @var \Drupal\Core\Config\ImmutableConfig
  */
 protected $config;

 /**
  * PopupMessageSubscriber constructor.
  */
 public function __construct() {
  $this->config = \Drupal::configFactory()->get('cookiec.settings');
 }

 /**
  * @param \Symfony\Component\HttpKernel\Event\FilterResponseEvent $event
  */
 public function showCookiecMessage(FilterResponseEvent $event) {
  // Berechtigungen überprüfen, um Nachricht anzuzeigen.
  $response = $event->getResponse();

  if (!$response instanceof AttachmentsInterface) {
   return;
  }
  // Überprüfen, ob das Modul Popup aktiviert hat
  $config = $this->config;
  $language = \Drupal::languageManager()->getCurrentLanguage()->getId();

  $variables = array(
   'title' => 'title',
   'message' => $config->get($language."_popup_info"),
  );

  $twig = \Drupal::service('twig');
  $template = $twig->loadTemplate(drupal_get_path('module', 'cookiec') . '/templates/cookiec_info.html.twig');
  $html_info = $template->render($variables);


  $variables = array(
   'title' => 'title',
   'message' => $config->get($language."_popup_info"),
   'more' => 'mehr',
   'hide' => 'verstecken',
  );
  $twig = \Drupal::service('twig');
  $template = $twig->loadTemplate(drupal_get_path('module', 'cookiec') . '/templates/cookiec_agreed.html.twig');
  $html_agreed = $template->render($variables);

  $variables = array(
   'popup_enabled' => $config->get('popup_enabled'),
   'popup_agreed_enabled' => $config->get('popup_agreed_enabled'),
   'popup_hide_agreed' => $config->get('popup_hide_agreed'),
   'popup_height' => $config->get('popup_height'),
   'popup_width' => $config->get('popup_width'),
   'popup_delay' => $config->get('popup_delay')*1000,
   'popup_link' => $config->get($language."_link"),
   'popup_position' => $config->get('popup_position'),
   'popup_language' => $language,
   'popup_html_info' => $html_info,
   'popup_html_agreed' =>$html_agreed,
  );

  $attachments = $response->getAttachments();
  $attachments['library'][] = 'cookiec/cookiec_library';
  $attachments['drupalSettings']['cookiec'] = $variables;
  $response->setAttachments($attachments);
 }

 /**
  * {@inheritdoc}
  */
 public static function getSubscribedEvents() {
  $events[KernelEvents::RESPONSE][] = array('showCookiecMessage', 20);

  return $events;
 }
}

7. Konfigurationen

Eine weitere große Veränderung in Drupal 8 ist die Verwendung von Konfigurationsdateien. Dies sind ebenfalls YML-Dateien, deren Ziel es ist, die Synchronisation von Einstellungen, Variablen und anderen in der Datenbank gespeicherten Daten zwischen Umgebungen zu erleichtern.
Sie können mehr zu diesem Thema hier lesen: https://www.drupal.org/docs/8/configuration-management/managing-your-sites-configuration
Die mit D8 kompatible Version unseres Moduls verwendet Konfigurationen, um die Einstellungen unseres Fensters zu speichern und die Standardeinstellungen während der Installation zu laden. Nachdem die Konfigurationsdatei im config/install-Ordner platziert wurde, wird sie beim Modul installieren automatisch geladen, sodass wir hook_install nicht mehr verwenden werden.
Unsere config/install/cookiec.settings.yml-Datei

popup_enabled: 1
popup_agreed_enabled: 1
popup_hide_agreed: 1
popup_width: 100%
popup_delay: '1'
popup_height: '100'
en_popup_title: 'Cookie-Richtlinie'
en_popup_info: 'Diese Website verwendet Cookies. Indem Sie auf dieser Website verweilen, stimmen Sie unserer <a href="/cookiec">Cookie-Richtlinie</a> zu'
en_popup_agreed: 'Ich stimme zu'
en_popup_p_private: " <p>Diese Website sammelt automatisch keine Informationen, mit Ausnahme der Informationen, die in Cookies enthalten sind.</p>"
pl_popup_title: 'Polityka cookie'
pl_popup_info: 'Powiadomienie o plikach cookie. Ta strona korzysta z plików cookie. Pozostając na tej stronie, wyrażasz zgodę na korzystanie z plików cookie. <a href="/cookiec">Dowiedz się więcej'
pl_popup_agreed: 'Zgadzam się'
pl_popup_p_private: "  <p>Serwis nie zbiera w sposób automatyczny żadnych informacji, z wyjątkiem informacji zawartych w plikach cookies.</p>\r\n  <p>Pliki cookies (tzw. „ciasteczka”) </p>"
en_popup_link: /cookiec
pl_popup_link: /cookiec


Wenn Sie die Daten im Code der Website laden müssen, verwenden Sie den Service configFactory() mit der get-Methode und geben Sie den Namen der Konfiguration an.

   $this->config = \Drupal::configFactory()->get('cookiec.settings');


Dieser Code wurde im Konstruktor der CookiecSubscriber-Klasse verwendet, was uns schnellen und einfachen Zugriff auf alle Einstellungen des Moduls gibt.
Wir werden sie dem $variables-Array zuweisen

...
 'popup_hide_agreed' => $config->get('popup_hide_agreed'),
 'popup_height' => $config->get('popup_height'),
 'popup_width' => $config->get('popup_width'),
...
 

8. TWIG-Vorlagen

Einer der bedeutendsten Änderungen nach dem Wechsel von D7 zu D8 ist die Tatsache, dass D8 auf PHP-Vorlagen zugunsten von TWIG (http://twig.sensiolabs.org/) verzichtet hat. Dies ist ein ziemlich umfangreiches Thema für sich, daher werden wir wahrscheinlich einen separaten Artikel nur darüber schreiben. Der Hauptpunkt für uns ist jetzt, dass wir keine PHP-Funktionen mehr verwenden können und die Logik auf einfache Schleifen und Bedingungen beschränkt ist.
Unser Drupal 7 Modul hat zwei Vorlagen:
cookiec-agreed.tpl.php
cookiec-info.tpl.php

​
<?php
/**
 * @file
 * This is a template file for a pop-up informing a user that he has already
 * agreed to cookies.
 *
 * When overriding this template, it is important to note that jQuery will use
 * the following classes to assign actions to buttons:
 *
 * hide-popup-button – destroy the pop-up
 * find-more-button – link to an information page
 *
 * Variables available:
 * – $message: Contains the text that will be display within the pop-up
 */
?>

<div>
 <div class ="popup-content agreed">
  <div id="popup-text">
   <?php print $message ?>
  </div>
  <div id="popup-buttons">
   <button type="button" class="hide-popup-button"><?php print t("Verstecke diese Nachricht"); ?> </button>
   <button type="button" class="find-more-button" ><?php print t("Mehr Informationen über Cookies"); ?></button>
  </div>
 </div>
</div>

​


Wir beginnen damit, die Namen zu ändern, indem wir die Erweiterung durch xxx.html.twig ersetzen.
PHP-Tags werden in .twig-Dateien nicht geparst, daher müssen wir alle Funktionen und Kommentare in das TWIG-Format anpassen.

Kommentare:

Wenn wir alte Kommentare erhalten oder neue hinzufügen wollen, müssen wir die PHP-Tags mit {# .... #} ersetzen.

<#
/**
 * @file
 * This is a template file for a pop-up informing a user that he has already
 * agreed to cookies.
 *
 * When overriding this template, it is important to note that jQuery will use
 * the following classes to assign actions to buttons:
 *
 *
 * Variables available:
 * message Contains the text that will be display within the pop-up
 * hide – destroy the pop-up
 * more – link to an information page
 */
#>


Ausgabe der Variablenwerte

Wir können die Variable ausgeben, indem wir unsere Variable in Klammern wie folgt setzen: {{ variable }}. Unser Modul hat drei Variablen:
message, hide, more – sie enthalten übersetzte Zeichenfolgen. Das Hinzufügen von {{ message | raw }} führt dazu, dass das HTML in seiner reinen Form gerendert wird, ohne dass etwa < und > ersetzt werden.

​
<div>
 <div class ="popup-content agreed">
  <div id="popup-text">
   {{ message | raw}}
  </div>
  <div id="popup-buttons">
   <button type="button" class="hide-popup-button"> {{ hide }} </button>
   <button type="button" class="find-more-button" > {{ more }} </button>
  </div>
 </div>
</div>

​

Logik in TWIG

Unser Beispiel ist ziemlich einfach; allerdings erlaubt uns TWIG, einfache Logik zu verwenden. Logikoperationen werden zwischen {% %} Tags eingeschlossen.
Wir können Tags, Variablenfilter und Funktionen verwenden.
Hier einige Beispiele:

Beispiel-Tags:

For each-Schleife:

  {% for user in users %}
    <liamp;gt;{{ user.username|e }}</li>
  {% endfor %}


IF-Bedingung:

{% if online == false %}
  <p>Unsere Website befindet sich im Wartungsmodus. Bitte, kommen Sie später zurück.</p>
{% endif %}


Variablenoperationen:

{% set foo = 'bar' %}

Beispielfilter:

Filter verwenden wir, indem wir | in {{}}-Klammern mit unserer Variablen hinzufügen.

Trim – entfernt Leerzeichen oder gegebene Zeichenfolgen.

{{ ' I like Twig. '|trim }}
{# Ausgabe ohne vordere Leerzeichen oder
Zeilenumbrüche, die Ausgabe ist 'I like Twig.' #}

{{ ' I like Twig.'|trim('.') }}
{# Ausgabe: ' I like Twig' #}


Datum – Datumsformatierung

{{ "now"|date("m/d/Y") }}
{{ post.published_at|date("m/d/Y", "Europe/Paris") }}

Funktionen:

random() Funktion

{{ random(['apfel', 'orange', 'citrus']) }} {# Beispielausgabe: orange #}
{{ random('ABC') }}             {# Beispielausgabe: C #}
{{ random() }}               {# Beispielausgabe: 15386094 (funktioniert wie die native PHP mt_rand Funktion) #}
{{ random(5) }}               {# Beispielausgabe: 3 #}


Drupal hat auch eine sehr nützliche Methode AddClass, die es ermöglicht, einem HTML-Element CSS-Klassen hinzuzufügen.

{%
 set classes = [
  'rot',
  'grün',
 ]
%}
<div{{ attributes.addClass(classes) }}></div>


Dies sind nur einige Beispiele und Anwendungsfälle, für mehr können Sie die TWIG-Dokumentation unter http://twig.sensiolabs.org/documentation lesen.
Darüber hinaus wird empfohlen, sich auch mit der Arbeit mit DRUPAL 8 und TWIG zu befassen, indem Sie die folgenden Inhalte lesen:
https://www.drupal.org/node/1903374 – Debugging zusammengefügter Twig-Vorlagen
https://www.drupal.org/docs/8/theming/twig/working-with-twig-templates – Arbeiten mit Twig-Vorlagen
https://www.drupal.org/docs/8/theming/twig/twig-template-naming-conventions – Twig-Vorlagen-Benennungskonventionen

Daten an TWIG senden

Wie Sie sehen können, bietet TWIG großartige Möglichkeiten. Um jedoch sicherzustellen, dass unsere Variablen in TWIG sichtbar sind, müssen wir sie dorthin bringen.
In unserem Beispiel müssen wir den Inhalt des geparsten TWIGs in der Variablen speichern und an das JS-Array senden. Das können wir folgendermaßen tun:
Zuerst sammeln wir die Variablen, die in unserem TWIG verwendet werden sollen:
 

$variables = array(
   'title' => 'title',
   'message' => $config->get($language."_popup_info"),
   'more' => 'mehr',
   'hide' => 'verstecken',
  );


Template parsen:

  $twig = \Drupal::service('twig');
  $template = $twig->loadTemplate(drupal_get_path('module', 'cookiec') . '/templates/cookiec_agreed.html.twig');
  $html_agreed = $template->render($variables);


Allerdings werden Sie diese Methode selten verwenden, wenn Sie mit Drupal 8 arbeiten. Am häufigsten werden Sie andere Methoden verwenden, wie z.B. das Überschreiben der Standardvorlagen mit Twig Template Benennungskonventionen.
Blöcke:
1. block--module--delta.html.twig
2. block--module.html.twig
3. block.html.twig
Knoten:
1. node--nodeid--viewmode.html.twig
2. node--nodeid.html.twig
3. node--type--viewmode.html.twig
4. node--type.html.twig
5. node--viewmode.html.twig
6. node.html.twig
usw.
Dann legen wir die benutzerdefinierten Vorlagen in unserem Thema/templates-Ordner ab.
Es gibt auch eine fortschrittlichere Methode, um dasselbe zu tun – direkt Dateien zu den Modulen hinzuzufügen, indem hook_theme verwendet wird,

/**
 * Implementiert hook_theme().
 */
function cookiec_theme() {
 return array(
  'cookiec_agreed' => array(
   'template' => 'cookiec_agreed',
   'variables' => array(
    'title' => NULL,
    'body' => NULL,
    'read_more' => NULL,
   ),
  ),
  'cookiec_info' => array(
   'template' => 'cookiec_info',
   'variables' => array(
    'title' => NULL,
    'body' => NULL,
    'read_more' => NULL,
   ),
  ),
 );
}


Um solch ein TWIG zu verwenden, muss unser Block oder unsere Seite ein Array mit dem #theme-Schlüssel und den in hook_theme() definierten Variablen zurückgeben.
Im Folgenden finden Sie ein Beispiel für einen Block, der ein benutzerdefiniertes TWIG verwendet

namespace Drupal\hello_world\Plugin\Block;

use Drupal\Core\Block\BlockBase;

/**
 * Bereitstellung eines 'Hello'-Blocks
 *
 * @Block(
 *  id = "hello_block",
 *  admin_label = @Translation("Hello block"),
 * )
 */
class HelloBlock extends BlockBase {
 /**
  * {@inheritdoc}
  */
 public function build() {

 $variables = array(
   'title' => 'title',
   'body' => 'body',
   'read_more' => 'mehr',
  );

  return array(
   '#theme' => 'cookiec_info',
   '#variables' => $variables,
  );
 }
}

Zusammenfassung

Alle Funktionalitäten wurden portiert und sind nun voll kompatibel mit Drupal 8.x. Das Modul funktioniert einwandfrei und wird von uns in mehreren Projekten verwendet.
Sie können das Projekt von GitHub herunterladen:
https://github.com/droptica/cookiec/
Hinterlassen Sie unten einen Kommentar, wenn Sie Fragen oder Probleme haben.
Zusammenfassend: Die Änderungen zwischen D7 und D8 sind bedeutend, und dies ist nur ein kleiner Teil des umfangreichen Angebots an Innovationen und neuen Möglichkeiten, die unser neues CMS bietet. Wenn Sie Ihr Wissen über D8 und andere Werkzeuge zur Erstellung von Web-Anwendungen erweitern möchten, geben Sie uns auf  Facebook ein Like, wo wir unsere Tutorials, Guides und verschiedene interessante Inhalte aus der Branche teilen. Sie können auch am Drupal Day und dem Drupal Camp teilnehmen! Neue Inhalte werden bald auch auf unserem Blog veröffentlicht!
 

Großes D8 Logo

3. Best practices for software development teams