Upload
others
View
8
Download
0
Embed Size (px)
Citation preview
drupal
#drupal
Inhaltsverzeichnis
Über 1
Kapitel 1: Erste Schritte mit Drupal 2
Bemerkungen 2
Examples 2
Drupal mit Drush installieren 2
Installation von Drupal 8 mit Drupal Console 2
Drupal-Konzepte 3
Kapitel 2: Beispiel für die Drupal 8-Warteschlangen-API und die Stapel-API 6
Examples 6
Ein Beispielmodul zum besseren Verständnis der Warteschlangen-API und der Stapel-API in Dr 6
Kapitel 3: Das Ansichten-Modul 12
Einführung 12
Examples 12
Eine Ansicht, die über die Ansichten-Benutzeroberfläche angezeigt wird 12
Kapitel 4: Das Regelmodul 14
Einführung 14
Bemerkungen 14
Ressourcen 14
Examples 14
Eine benutzerdefinierte Regel, die mithilfe der Regelbenutzeroberfläche angezeigt wird 14
Eine benutzerdefinierte Regel, die im Regelexportformat angezeigt wird 15
Feldsammelelemente mit Regeln bearbeiten 16
Regelevent: 17
Regeln Bedingung: 17
Regeln Aktionen: 17
Show Time ... 18
Mehr Info 18
Kapitel 5: Drupal 8-Objekt-API 19
Einführung 19
Examples 19
Erstellen Sie ein Inhaltselement mit der Drupal Console 19
Schritt 1: Erzeugen Sie ein Modul 19
Schritt 2: Generieren Sie eine Inhaltsentität 19
Kapitel 6: Drupal Cache und Performace 20
Einführung 20
Examples 20
Aktivieren Sie die Drupal-Site und blockieren Sie den Cache 20
Kapitel 7: Drush 21
Bemerkungen 21
Was ist Drush? 21
Examples 21
Drush-Befehle 21
Drush-Status 21
Passwort für jeden Benutzer zurücksetzen 21
Generieren Sie eine einmalige Admin-Anmelde-URL 21
Die Caches löschen 22
Module aktivieren 22
Mainteneace 22
Konfiguration exportieren 23
Drush installieren 23
Manuelle globale Installation 23
Composer-globale Installation 24
Drush installieren 24
Manuelle Installation 24
Komponist 24
Kapitel 8: Feldformatierer 26
Einführung 26
Bemerkungen 26
Examples 27
Verschleierter Email-Formatierer 27
Kapitel 9: Modulentwicklung - Drupal 7 30
Bemerkungen 30
Examples 30
Grundmodul mit einer einfachen Seite 30
Basismodul, das einen benutzerdefinierten Block bereitstellt 30
Grundlegendes benutzerdefiniertes Formular zur Aufnahme in Seiten- oder Blockbeispiele. 31
Basismodul, das einen benutzerdefinierten Block bereitstellt 33
Grundlegendes benutzerdefiniertes Formular zur Aufnahme in Seiten- oder Blockbeispiele. 34
Beispieldatei custom_module.install zum Erstellen einer Datenbanktabelle 35
Kapitel 10: Themenentwicklung - Drupal 7 37
Examples 37
.Info-Dateien schreiben 37
Theme .info-Datei 38
Kapitel 11: Zweig 40
Einführung 40
Examples 40
Zweigfilter 40
Abhängigkeitsinjektion in Twig-Erweiterungen 41
Credits 44
Über
You can share this PDF with anyone you feel could benefit from it, downloaded the latest version from: drupal
It is an unofficial and free drupal ebook created for educational purposes. All the content is extracted from Stack Overflow Documentation, which is written by many hardworking individuals at Stack Overflow. It is neither affiliated with Stack Overflow nor official drupal.
The content is released under Creative Commons BY-SA, and the list of contributors to each chapter are provided in the credits section at the end of this book. Images may be copyright of their respective owners unless otherwise specified. All trademarks and registered trademarks are the property of their respective company owners.
Use the content presented in this book at your own risk; it is not guaranteed to be correct nor accurate, please send your feedback and corrections to [email protected]
https://riptutorial.com/de/home 1
Kapitel 1: Erste Schritte mit Drupal
Bemerkungen
Drupal ist ein Open-Source-Content-Management-System, das in PHP integriert ist. Drupal wurde entwickelt, um flexibel und leistungsstark zu sein, sodass Entwickler eine Vielzahl von Websites erstellen können, von Blogs und Websites im Broschürenstil bis hin zu komplexen E-Commerce-Plattformen. Durch seine Community-basierte modulare Architektur kann Drupal Tools zur Erweiterung der Kernfunktionen bereitstellen, um die Entwicklung großer und komplexer Projekte zu beschleunigen.
Derzeit gibt es zwei unterstützte Versionen von Drupal: 7 und 8. Drupal 8 basiert auf Komponenten des Symfony-Frameworks und vielen anderen Bibliotheken von Drittanbietern, um moderne Entwicklungsstrukturen bereitzustellen.
Examples
Drupal mit Drush installieren
drush dl drupal --drupal-project-rename=example cd example drush site-install standard --db-url='mysql://[db_user]:[db_pass]@localhost/[db_name]' --site-name=Example
Installation von Drupal 8 mit Drupal Console
Drupal-Konsole
Die neue CLI für Drupal. Ein Tool zum Generieren von Boilerplate-Code, zum Interagieren mit Drupal und zum Debuggen
Zunächst müssen wir die Drupal Console installieren.
Drupal Console wird nicht nur für diese Zeit benötigt, sondern für zukünftige Installationen.
# Run this in your terminal to get the latest project version: curl https://drupalconsole.com/installer -L -o drupal.phar # Or if you don't have curl: php -r "readfile('https://drupalconsole.com/installer');" > drupal.phar # Accessing from anywhere on your system: mv drupal.phar /usr/local/bin/drupal # Apply executable permissions on the downloaded file: chmod +x /usr/local/bin/drupal # Copy configuration files to user home directory: drupal init --override
https://riptutorial.com/de/home 2
# Check and validate system requirements drupal check
Sie können die drupal list , um alle verfügbaren Befehle drupal list .
Im nächsten Schritt laden wir den Drupal-Quellcode herunter
drupal site:new
Console fordert Sie auf, einen Ordner zum Herunterladen von Drupal auszuwählen. Im nächsten Schritt werden Sie aufgefordert, die Version von Drupal zum Herunterladen auszuwählen. Ich empfehle die letzte zu wählen.
Wenn Drupal heruntergeladen wird, müssen Sie es installieren.
drupal site:install
Nach wenigen einfachen Schritten ist Ihre Drupal-Site fertig.
Bei dieser Methode dauert eine Drupal-Neuinstallation zwischen 5 und 7 Minuten von der Befehlszeile.
Drupal-Konzepte
Versionen
Release Date
Ausführung Veröffentlichungsdatum
8.2.4 7. Dezember 2016
7,53 7. Dezember 2016
6,38 (nicht unterstützt) 24. Februar 2016
5.23 (nicht unterstützt) 11. August 2010
Entitätstypen
In früheren Drupal-Versionen wurde das Feldsystem nur für Inhaltstypen verwendet. Dank der Entity-API können wir anderen Dingen, beispielsweise Kommentaren, Felder hinzufügen. Feldfähige Entitäten machen Drupal äußerst flexibel. Ein Entitätstyp ist eine nützliche Abstraktion zum Gruppieren von Feldern. Nachfolgend sind die Entity-Typen im Drupal-Kern aufgeführt:
Knoten (Inhalt)•Bemerkungen•
https://riptutorial.com/de/home 3
Dateien•Taxonomie-Begriffe•Taxonomie-Vokabulare•Benutzer•
Sie können auch neue Arten von Entitätstypen erstellen, bei denen die oben genannten Optionen nicht Ihren Anforderungen entsprechen.
Bündel
Bundles sind eine Implementierung eines Entitätstyps, an den Felder angehängt werden können. Sie können Bundles als Subtypen eines Entitätstyps betrachten. Mit Inhaltsknoten (Entitätstyp) können Sie beispielsweise Bündel (Subtypen) wie Artikel, Blogbeiträge oder Produkte generieren. Nicht alle Entitätstypen verfügen jedoch über Pakete. Beispielsweise verfügen Benutzer nicht über separate Bundles (Untertypen). Für die Entitätstypen, die Bundles zulassen, können Sie beliebig viele Bundles (Subtypes) erstellen. Mit dem Feldsystem können Sie dann zu jedem Bundle unterschiedliche Felder hinzufügen. Beispiele sind ein Dateidownloadfeld auf Basis-Seiten und ein Untertitelfeld auf Artikeln.
Felder
Ein Feld ist ein wiederverwendbarer Inhalt. Technisch gesehen ist jedes Feld ein primitiver Datentyp mit benutzerdefinierten Validatoren und Widgets zum Bearbeiten und Formatieren der Anzeige. Weitere Informationen finden Sie in der Anleitung eines Entwicklers zur Verwendung der Drupal 7 Fields-API .
Bei Entitäten ist es wichtig zu wissen, dass zu jedem Bundle (oder Entitätstyp) Felder hinzugefügt werden können, um die Daten zu organisieren.
Angenommen, Sie erstellen einen Inhaltstyp mit einem unstrukturierten Textfeld und verwenden HTML, um Teile davon zu strukturieren, beispielsweise einen Zusammenfassungsabschnitt oder Preise. Dies würde es dann schwieriger machen, die Anzeige dieser Elemente zu steuern oder Verbindungen zwischen verschiedenen Arten von verwandten Inhalten herzustellen.
Hier ist die Verwendung von Feldern unerlässlich. Sie können ein zusammenfassendes Feld vom Typ Langtext sowie Preisfelder vom Typ Dezimal anlegen.
Entität
Eine Entität wäre eine Instanz eines bestimmten Entitätstyps, beispielsweise ein Kommentar, ein Taxonomiebegriff oder ein Benutzerprofil, oder ein Bündel, beispielsweise ein Blogbeitrag, ein Artikel oder ein Produkt.
Sie können entity_load verwenden , um eine beliebige Entität zu laden. Beachten Sie jedoch, dass der Kern keine Speicher- oder Löschfunktion bietet, aber dank des Entity-API- Moduls werden die fehlenden Teile hinzugefügt (entity_create (), entity_save (), entity_delete (), entity_view () und entity_access ()).
Dies in objektorientiertes Design / Programmierbegriffe setzen ...
https://riptutorial.com/de/home 4
Wenn Sie aus einem OOD / P-Hintergrund stammen und versuchen, die Schlüsselkonzepte besser zu verstehen, kann die folgende vorgeschlagene Zuordnung hilfreich sein (wenn auch nicht aus puristischer Sicht streng zutreffend): -
Ein Entitätstyp ist eine Basisklasse•Ein Bundle ist eine erweiterte Klasse•Ein Feld ist ein Klassenmitglied , eine Eigenschaft , eine Variable oder eine Feldinstanz (abhängig von Ihrer Namensgebung).
•
Eine Entität ist ein Objekt oder eine Instanz einer Basis- oder erweiterten Klasse•
Alle diese vier OOD / P-Konzepte zeichnen sich dadurch aus, dass sie serialisierbar sind (gespeichert werden - z. B. in einer Datenbank oder Datei). Die Serialisierung erfolgt über die Entity-API.
Erste Schritte mit Drupal online lesen: https://riptutorial.com/de/drupal/topic/1135/erste-schritte-mit-drupal
https://riptutorial.com/de/home 5
Kapitel 2: Beispiel für die Drupal 8-Warteschlangen-API und die Stapel-API
Examples
Ein Beispielmodul zum besseren Verständnis der Warteschlangen-API und der Stapel-API in Drupal 8
xml_import_example.info.yml
type: module name: XML import example package: Examples description: "This module helps understanding the Batch API and Queue API with an XML import example" core: 8.x
xml_import_example.permissions.yml
import content from xml: title: 'Import content from xml' description: 'With this permission user can import contents from a XML source' restrict access: TRUE
xml_import_example.routing.yml
# Get contents from the xml source xml_import_example.get_contents_from_xml: path: '/get-contents-from-xml' defaults: { _controller: '\Drupal\xml_import_example\Controller\ImportContentFromXML::getContentsFromXMLPage' } requirements: _permission: 'import content from xml' # Process all queue items with batch xml_import_example.process_all_queue_items_with_batch: path: '/process-all-queue-items' defaults: { _controller: '\Drupal\xml_import_example\Controller\ImportContentFromXML::processAllQueueItemsWithBatch' } requirements: _permission: 'import content from xml'
src / Controller / ImportContentFromXML.php
<?php /** * @file * Contains \Drupal\xml_import_example\Controller\ImportContentFromXML. */ namespace Drupal\xml_import_example\Controller;
https://riptutorial.com/de/home 6
use Symfony\Component\DependencyInjection\ContainerInterface; use Drupal\Core\Controller\ControllerBase; use Drupal\Core\Queue\QueueWorkerManager; use Drupal\Core\Queue\QueueFactory; /** * You can use this constant to set how many queued items * you want to be processed in one batch operation */ define("IMPORT_XML_BATCH_SIZE", 1); class ImportContentFromXML extends ControllerBase { /** * We add QueueFactory and QueueWorkerManager services with the Dependency Injection solution */ /** * @var QueueFactory */ protected $queueFactory; /** * @var QueueWorkerManager */ protected $queueManager; /** * {@inheritdoc} */ public function __construct(QueueFactory $queue_factory, QueueWorkerManager $queue_manager) { $this->queue_factory = $queue_factory; $this->queue_manager = $queue_manager; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container) { $queue_factory = $container->get('queue'); $queue_manager = $container->get('plugin.manager.queue_worker'); return new static($queue_factory, $queue_manager); } /** * Get XML from the API and convert it to */ protected function getContentsFromXML() { // Here you should get the XML content and convert it to an array of content arrays for example // I use now an example array of contents: $contents = array(); for ($i = 1; $i <= 20; $i++) { $contents[] = array( 'title' => 'Test title ' . $i, 'body' => 'Test body ' . $i,
https://riptutorial.com/de/home 7
); } // Return with the contents return $contents; } /** * Page where the xml source is preprocessed */ public function getContentsFromXMLPage() { // Get contents array $contents = $this->getContentsFromXML(); foreach ($contents as $content) { // Get the queue implementation for import_content_from_xml queue $queue = $this->queue_factory->get('import_content_from_xml'); // Create new queue item $item = new \stdClass(); $item->data = $content; $queue->createItem($item); } return array( '#type' => 'markup', '#markup' => $this->t('@count queue items are created.', array('@count' => count($contents))), ); } /** * Process all queue items with batch */ public function processAllQueueItemsWithBatch() { // Create batch which collects all the specified queue items and process them one after another $batch = array( 'title' => $this->t("Process all XML Import queues with batch"), 'operations' => array(), 'finished' => 'Drupal\xml_import_example\Controller\ImportContentFromXML::batchFinished', ); // Get the queue implementation for import_content_from_xml queue $queue_factory = \Drupal::service('queue'); $queue = $queue_factory->get('import_content_from_xml'); // Count number of the items in this queue, and create enough batch operations for($i = 0; $i < ceil($queue->numberOfItems() / IMPORT_XML_BATCH_SIZE); $i++) { // Create batch operations $batch['operations'][] = array('Drupal\xml_import_example\Controller\ImportContentFromXML::batchProcess', array()); } // Adds the batch sets batch_set($batch); // Process the batch and after redirect to the frontpage return batch_process('<front>'); }
https://riptutorial.com/de/home 8
/** * Common batch processing callback for all operations. */ public static function batchProcess(&$context) { // We can't use here the Dependency Injection solution // so we load the necessary services in the other way $queue_factory = \Drupal::service('queue'); $queue_manager = \Drupal::service('plugin.manager.queue_worker'); // Get the queue implementation for import_content_from_xml queue $queue = $queue_factory->get('import_content_from_xml'); // Get the queue worker $queue_worker = $queue_manager->createInstance('import_content_from_xml'); // Get the number of items $number_of_queue = ($queue->numberOfItems() < IMPORT_XML_BATCH_SIZE) ? $queue->numberOfItems() : IMPORT_XML_BATCH_SIZE; // Repeat $number_of_queue times for ($i = 0; $i < $number_of_queue; $i++) { // Get a queued item if ($item = $queue->claimItem()) { try { // Process it $queue_worker->processItem($item->data); // If everything was correct, delete the processed item from the queue $queue->deleteItem($item); } catch (SuspendQueueException $e) { // If there was an Exception trown because of an error // Releases the item that the worker could not process. // Another worker can come and process it $queue->releaseItem($item); break; } } } } /** * Batch finished callback. */ public static function batchFinished($success, $results, $operations) { if ($success) { drupal_set_message(t("The contents are successfully imported from the XML source.")); } else { $error_operation = reset($operations); drupal_set_message(t('An error occurred while processing @operation with arguments : @args', array('@operation' => $error_operation[0], '@args' => print_r($error_operation[0], TRUE)))); } } }
src / Plugin / QueueWorker / ImportContentFromXMLQueueBase.php
<?php
https://riptutorial.com/de/home 9
/** * @file * Contains Drupal\xml_import_example\Plugin\QueueWorker\ImportContentFromXMLQueueBase */ namespace Drupal\xml_import_example\Plugin\QueueWorker; use Drupal\Core\Plugin\ContainerFactoryPluginInterface; use Drupal\Core\Queue\QueueWorkerBase; use Drupal\Core\Queue\SuspendQueueException; use Symfony\Component\DependencyInjection\ContainerInterface; use Drupal\node\Entity\Node; /** * Provides base functionality for the Import Content From XML Queue Workers. */ abstract class ImportContentFromXMLQueueBase extends QueueWorkerBase implements ContainerFactoryPluginInterface { // Here we don't use the Dependency Injection, // but the create method and __construct method are necessary to implement /** * {@inheritdoc} */ public function __construct() {} /** * {@inheritdoc} */ public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { return new static(); } /** * {@inheritdoc} */ public function processItem($item) { // Get the content array $content = $item->data; // Create node from the array $this->createContent($content); } /** * Create content * * @return int */ protected function createContent($content) { // Create node object from the $content array $node = Node::create(array( 'type' => 'page', 'title' => $content['title'], 'body' => array( 'value' => $content['body'], 'format' => 'basic_html', ), ));
https://riptutorial.com/de/home 10
$node->save(); } }
src / Plugin / QueueWorker / ImportContentFromXMLQueue.php
<?php namespace Drupal\xml_import_example\Plugin\QueueWorker; /** * Create node object from the imported XML content * * @QueueWorker( * id = "import_content_from_xml", * title = @Translation("Import Content From XML"), * cron = {"time" = 60} * ) */ class ImportContentFromXMLQueue extends ImportContentFromXMLQueueBase {}
Das ist also das Arbeitsmodul, das Sie an Ihrem Standort testen können.
Wenn Sie die URL / get-contents-from-xml besuchen, werden 20 Warteschlangenelemente aus einem Inhaltsarray erstellt.
Die Datei src / Plugin / QueueWorker / ImportContentFromXMLQueue.php enthält diese Anmerkung: cron = {"time" = 60}
Wenn Sie also cron ausführen, werden die Warteschlangenelemente maximal 60 Sekunden lang verarbeitet. Sie können diese Zeit mit dieser Anmerkung erhöhen oder verringern.
Wenn Sie die Zeile cron = {"time" = 60} entfernen, können Sie nichts mit Ihren Warteschlangenelementen tun.
Wenn Sie alle Warteschlangenelemente in Ihrem Browser bearbeiten möchten, müssen Sie die folgende URL aufrufen: / process-all-queue-items
Es sammelt alle Ihre Warteschlangenelemente, erstellt daraus Stapelvorgänge und verarbeitet anschließend einen nach dem anderen.
Beispiel für die Drupal 8-Warteschlangen-API und die Stapel-API online lesen: https://riptutorial.com/de/drupal/topic/3786/beispiel-fur-die-drupal-8-warteschlangen-api-und-die-stapel-api
https://riptutorial.com/de/home 11
Kapitel 3: Das Ansichten-Modul
Einführung
Das Views- Modul ist eine Berichts-Engine, mit der Site-Builder alle Arten von Listen erstellen können. Diese Listen können entweder als Block oder als Seite formatiert werden.
Um eine Ansicht zu erstellen (zu entwerfen), müssen die gewünschten Spezifikationen wie Felder, Beziehungen, Filter, Sortierkriterien, Anzeigen usw. eingegeben werden.
Examples
Eine Ansicht, die über die Ansichten-Benutzeroberfläche angezeigt wird
https://riptutorial.com/de/home 12
Das Ansichten-Modul online lesen: https://riptutorial.com/de/drupal/topic/9553/das-ansichten-modul
https://riptutorial.com/de/home 13
Kapitel 4: Das Regelmodul
Einführung
Das Rules- Modul ist eine Engine, mit der Site-Administratoren Aktionen automatisieren können, die entweder programmgesteuert oder als Reaktion auf vorbestimmte Ereignisse ausgeführt werden.
Regeln können auf Regelereignisse reagieren, die auf einer Drupal-Site auftreten, z. B. wenn sich ein Benutzer anmeldet. Außerdem können benutzerdefinierte Folgeaktionen für Regelaktionen ausgeführt werden , z. B. das Weiterleiten auf eine bestimmte Seite, die bedingt ausgeführt werden müssen, wenn bestimmte Regelbedingungen erfüllt sind .
Bemerkungen
Ressourcen
Video-Tutorials : Johan Falk hat in den frühen 7 Tagen von Drupal einen tollen Job gemacht, indem er eine beeindruckende Reihe von Tutorials zum " Learn the Rules Framework " mit über 30 Videos und verwandten Blogposts erstellt hat, die auf nodeone.se gehostet nodeone.se (Lizenz = Attribution-Noncommercial) -Share Alike 3.0 ).
Die nodeone.se-Domäne hostet sie jedoch nicht mehr. Learn Rules ist ein Versuch, diese wertvollen Blogposts wiederherzustellen (mit verwandten Links zu den entsprechenden Videos).
•
Die Tiny Book of Rules ist ein (15 Seiten) kurbeln über die Rules - Modul.•
Examples
Eine benutzerdefinierte Regel, die mithilfe der Regelbenutzeroberfläche angezeigt wird
https://riptutorial.com/de/home 14
Eine benutzerdefinierte Regel, die im Regelexportformat angezeigt wird
Hier ein Beispiel für eine Regel im Regelexportformat :
{ "rules_display_userpoints_after_updating_content" : { "LABEL" : "Display userpoints after updating content", "PLUGIN" : "reaction rule", "OWNER" : "rules", "REQUIRES" : [ "userpoints_rules", "rules", "rules_conditional" ], "ON" : { "node_update" : [] }, "DO" : [
https://riptutorial.com/de/home 15
{ "userpoints_rules_get_current_points" : { "USING" : { "user" : [ "site:current-user" ], "tid" : "all" }, "PROVIDE" : { "loaded_points" : { "total_points" : "Number of points in all categories together" } } } }, { "drupal_message" : { "message" : "You now have [total-points:value] points" } }, { "CONDITIONAL" : [ { "IF" : { "NOT data_is" : { "data" : [ "total-points" ], "op" : "\u003C", "value" : "20" } }, "DO" : [ { "drupal_message" : { "message" : "You have sufficient points (you still have [total-points:value] ...)." } } ] }, { "ELSE" : [ { "drupal_message" : { "message" : "You DO NOT have sufficient points (you only have [total-points:value] ...)." } } ] } ] } ] } }
Es ruft als erste Regelaktion (nicht Regelbedingung!) Die aktuelle Anzahl von Benutzerpunkten eines Benutzers ab. Wenn der Betrag mindestens 20 beträgt, wird eine Nachricht angezeigt, die mit "Sie haben genügend Punkte ..." beginnen, ansonsten beginnt die Nachricht mit "Sie haben NICHT genügend Punkte ..."
Feldsammelelemente mit Regeln bearbeiten
Verarbeitung von Feld Sammlung Artikel mit Regeln ist Spaß, wirklich! Schauen Sie sich diese Regel an (im Exportformat für Regeln):
{ "rules_calculate_sum_of_prices_in_all_field_collection_items" : { "LABEL" : "Calculate sum of prices in all field collection items", "PLUGIN" : "reaction rule", "OWNER" : "rules", "REQUIRES" : [ "rules" ], "ON" : { "node_view--article" : { "bundle" : "article" } }, "IF" : [ { "entity_has_field" : { "entity" : [ "node" ], "field" : "field_article_details" } } ], "DO" : [ { "drupal_message" : { "message" : "\u003Cstrong\u003EDrupal calculator\u003C\/strong\u003E started ..." } }, { "variable_add" : { "USING" : { "type" : "decimal", "value" : "0" }, "PROVIDE" : { "variable_added" : { "total_price" : "Price total" } } } }, { "LOOP" : { "USING" : { "list" : [ "node:field-article-details" ] }, "ITEM" : { "article_details_item" : "Article details item" },
https://riptutorial.com/de/home 16
"DO" : [ { "data_calc" : { "USING" : { "input_1" : [ "total-price" ], "op" : "+", "input_2" : [ "article-details-item:field-price" ] }, "PROVIDE" : { "result" : { "calculation_result" : "Calculation result" } } } }, { "data_set" : { "data" : [ "total-price" ], "value" : [ "calculation-result" ] } }, { "drupal_message" : { "message" : "After adding a price of \u003Cstrong\u003E[article-details-item:field-price]\u003C\/strong\u003E for field collection item with id \u003Cstrong\u003E[article-details-item:item-id]\u003C\/strong\u003E, subtotal is \u003Cstrong\u003E[calculation-result:value]\u003C\/strong\u003E." } } ] } }, { "drupal_message" : { "message" : "The \u003Cstrong\u003ETotal price\u003C\/strong\u003E for all prices included as field collection items is \u003Cstrong\u003E[total-price:value]\u003C\/strong\u003E." } }, { "drupal_message" : { "message" : "\u003Cstrong\u003EDrupal calculator\u003C\/strong\u003E ended ..." } } ] } }
Weitere Details zu dieser Regel finden Sie unten ...
Regelevent:
Inhalt wird angezeigt (vom Typ "Artikel"), passen Sie den Computernamen des article für den Inhaltstyp an, oder passen Sie ein beliebiges anderes Regelereignis an.
Regeln Bedingung:
Entität hat ein Feld, während die Entität "Knoten" ist und der Computername meines field_article_details (passen Sie diesen Maschinennamen an, was passt, aber stellen Sie sicher, dass Sie das field_article_details selbst verwenden).
Regeln Aktionen:
Wach auf, hier wird der Zauber (Spaß?) Stattfinden ... Hier sind die Regelaktionen beteiligt:
Zeigen Sie eine Nachricht auf der Website mit der folgenden Nachricht:1.
Drupal-Rechner gestartet ...
Fügen Sie eine Variable hinzu , wobei es sich um eine Variable mit dem Namen total_price , dezimal (2 Stellen), Anfangswert 0.
2.
Fügen Sie eine Schleife hinzu , um jedes Element meines field_article_details (mit dem Maschinennamen field_article_details ) zu field_article_details und die
3.
https://riptutorial.com/de/home 17
field_article_details für jede Iteration auszuführen:
Berechnen Sie einen Wert , der die Summe aus total_price (in total_price Aktion 2 oben definiert) und article-details-item:field-price berechnet: total_price (Dies ist der Maschinenname des Felds in der Feldsammlung, der die Preise enthält, dezimal mit 2 Ziffern) ) und speichert das Ergebnis (Summe) in variablen calculation_result .
•
Legen Sie einen Datenwert fest , der einfach den in der Variable calculation_result gespeicherten Wert in meinen total_price (oben in total_price 2 definiert). Anmerkung: Nicht sicher (nicht getestet), aber möglicherweise kann diese calculation_result direkt durch total_price (in der vorherigen Aktion) ersetzt werden, sodass Sie diese Aktion nicht benötigen.
•
Zeigen Sie eine Nachricht auf der Website mit der folgenden Nachricht:
Nach dem Hinzufügen eines Preises von 3,40 für den Feldsammelartikel mit der ID 3 beträgt die Zwischensumme 15,00.
•
Zeigen Sie eine Nachricht auf der Website mit der folgenden Nachricht:4.
Der Gesamtpreis für alle als Feldsammelartikel enthaltenen Preise beträgt 26,23.
Zeigen Sie eine Nachricht auf der Website mit der folgenden Nachricht:5.
Drupal-Rechner beendet ...
Diese Regel ist offensichtlich eher ein Prototyp. Wenn Sie überzeugt sind, dass es ordnungsgemäß funktioniert, entfernen Sie einfach alle Regelaktionen mit Eine Nachricht auf der Website anzeigen . Somit bleiben nur die Punkte 2 und 3 (ohne den letzten Unterpunkt) als Regelaktionen übrig.
Show Time ...
Hier ist ein Beispiel meiner Testergebnisse, dh der angezeigten Drupal-Nachrichten:
Drupal calculator started ... After adding a price of 2.45 for field collection item with id 1, subtotal is 2.45. After adding a price of 9.15 for field collection item with id 2, subtotal is 11.60. After adding a price of 3.40 for field collection item with id 3, subtotal is 15.00. After adding a price of 1.23 for field collection item with id 4, subtotal is 16.23. The Total price for all prices included as field collection items is 26.23. Drupal calculator ended ...
Mehr Info
Wenn Sie mit Feldsammlungen nicht vertraut sind, versuchen Sie zunächst, die Antwort auf " diese Frage " zu finden.
Das Regelmodul online lesen: https://riptutorial.com/de/drupal/topic/8921/das-regelmodul
https://riptutorial.com/de/home 18
Kapitel 5: Drupal 8-Objekt-API
Einführung
Mit dem Entity System in Drupal 8 können Entwickler auf einfache Weise benutzerdefinierte Inhaltstypen erstellen und Datenbeziehungen modellieren. Die umfangreiche API unterstützt die Generierung von Formularen, Datenvalidierung, Konfiguration, Routing und viele andere Funktionen.
Examples
Erstellen Sie ein Inhaltselement mit der Drupal Console
Die Drupal-Konsole bietet ein Gerüst für das Drupal-Ökosystem und vereinfacht die Generierung einer Inhaltsentität.
In den meisten Fällen ist es einfacher, mit einer benutzerdefinierten Entität in einem benutzerdefinierten Modul zu arbeiten.
Schritt 1: Erzeugen Sie ein Modul
vendor/bin/drupal generate:module
Folgen Sie den Anweisungen und erstellen Sie Ihr benutzerdefiniertes Modul.
Schritt 2: Generieren Sie eine Inhaltsentität
vendor/bin/drupal generate:entity:content
Folgen Sie den Anweisungen in der Befehlszeile, und stellen Sie sicher, dass Sie das im vorherigen Schritt erstellte benutzerdefinierte Modul auswählen.
Drupal 8-Objekt-API online lesen: https://riptutorial.com/de/drupal/topic/10681/drupal-8-objekt-api
https://riptutorial.com/de/home 19
Kapitel 6: Drupal Cache und Performace
Einführung
Cache wurde für die Site oder das System verwendet, um die Inhaltsbereitstellung für die Endbenutzer schnell zu verbessern. Dieses Thema wurde erstellt, um den eingebauten Caching-Mechanismus von Drupal kennenzulernen und Informationen zur Verwendung dieses Mechanismus zu erhalten. Wir müssen die eingebaute Caching-Funktion von Drupal mit den externen Modulen wie Varnish, Memcache, Authcache, Dateicache usw. erkunden, die zur Verbesserung der Website-Performance verfügbar sind. In diesem Thema finden Sie die am besten geeigneten Beispiel- und Caching-Optionen für Ihre Site.
Examples
Aktivieren Sie die Drupal-Site und blockieren Sie den Cache
Drupal selbst bietet gute Caching-Optionen, um die Seitengeschwindigkeit zu erhöhen und Seiten schnell für Endbenutzer bereitzustellen. Caches werden verwendet, um die Leistung Ihrer Drupal-Site zu verbessern. Es hat jedoch auch den Nachteil, dass es manchmal zu "veralteten" Daten führen kann. Dies bedeutet, dass das System manchmal die alten Seiten aus dem Cache bereitstellt.
Wie kann ich die Drupal-Site aktivieren und den Cache für verschiedene Drupal-Versionen blockieren? Antworten finden Sie unten: Drupal 6:
Gehen Sie zu Verwalten -> Standortkonfiguration -> Leistung.1. Aktivieren Sie die Cache-Optionen2. Aktivieren Sie die Aggregation der JS / CSS-Dateien und speichern Sie sie.3.
Drupal 7:
Gehen Sie zu Verwalten -> Konfigurieren -> Entwicklung -> Leistung.1. Aktivieren Sie die Cache-Optionen2. Aktivieren Sie die Aggregation der JS / CSS-Dateien und speichern Sie sie.3.
Drupal Cache und Performace online lesen: https://riptutorial.com/de/drupal/topic/10082/drupal-cache-und-performace
https://riptutorial.com/de/home 20
Kapitel 7: Drush
Bemerkungen
Was ist Drush?
Drush ist eine Befehlszeilenschnittstelle für Drupal-Sites. Es ermöglicht die Befehlszeilenverwaltung von Drupal-Sites.
Examples
Drush-Befehle
Drush-Status
drush status
Dadurch erhalten Sie einen Überblick über Ihre Drupal-Site. Version, URI, Datenbankpfad, Dateipfad, Standarddesign usw. Wenn Sie diesen Befehl verwenden und diese Informationen nicht anzeigen, befinden Sie sich in einem falschen Ordner, und Drush weiß nicht, auf welche Drupal-Site Sie sich beziehen.
Passwort für jeden Benutzer zurücksetzen
drush upwd admin --password="newpassword"
Dabei ist "admin" ein vorhandener Benutzername und "newpassword" das gewünschte Passwort.
Generieren Sie eine einmalige Admin-Anmelde-URL
drush uli
Erzeugt eine URL, über die Sie sich im Admin-Bereich anmelden können. Die URL hat ein einmaliges Verwendungstoken. Das Ergebnis sollte so aussehen:
http://example.com/user/reset/1/1469178712/MEn1QOXo3YGKAUHCknFQF0rEPJ_itkS-a6I8LJwaNYs/login
Manchmal ist der Hostname oder die IP-Adresse nicht auflösbar und das Ergebnis ist eine Warnung wie die folgende:
https://riptutorial.com/de/home 21
default does not appear to be a resolvable hostname or IP, not starting browser. [warning] You may need to use the --uri option in your command or site alias to indicate the correct URL of this site. http://default/user/reset/1/1469178629/-zFS_0u8is2N2uCKuLUdGBpJ3cZzV9am5_irsbtVAOs/login
Die Lösung verwendet den Parameter "--url" wie im folgenden Beispiel:
drush uli --uri="http://example.com/"
Die Caches löschen
drush cache-rebuild
Stellt den Cache für Drupal 8 wieder her. Für Drupal 7 können Sie verwenden
drush cache-clear
Diese Befehle sind auch mit kürzer verfügbar
drush cr
oder
drush cc // optionally pass all to clear all the caches
Module aktivieren
drush pm-enable mymodule
Aktivieren Sie "mymodule" wie das Aktivieren eines Moduls in der Administrationsoberfläche
Diese Befehle sind auch mit kürzer verfügbar
drush en mymodule // optionally pass the -y option to avoid the interactive question
Mainteneace
Um den Wartungsmodus mit Drush zu aktivieren, können Sie diesen Befehl verwenden:
drush vset maintenance_mode 1 // pass 0 to disable the maintenance
Denken Sie daran, die Caches zu löschen, nachdem Sie den Wartungsmodus aktiviert / deaktiviert haben.
https://riptutorial.com/de/home 22
Konfiguration exportieren
In Drupal 7 und niedriger wird Ihre Konfiguration wahrscheinlich mit dem Funktionsmodul gespeichert. Verwenden Sie diesen Befehl, um eine Funktion mit Änderungen aus den Datenbanken zu aktualisieren:
drush features-update [feature-name] // e.g. drush features-update content_type_news
Sie können auch diese Abkürzung verwenden:
drush fu [feature-name]
Drupal 8 mit "Konfigurationsverwaltung". Verwenden Sie diesen Befehl, um Ihre Konfiguration mit Drush zu exportieren
drush config-export // optionally add -y to not have to verify it
Sie können auch den Kurzbefehl verwenden
drush cex -y
Drush installieren
Manuelle globale Installation
Für OS X und Linux:
Rufen Sie Terminal, Bash oder Ihre normale Shell auf.1.
Geben Sie Folgendes in Terminal / Bash ein:
# Download latest stable release using the code below or browse to github.com/drush-ops/drush/releases. php -r "readfile('http://files.drush.org/drush.phar');" > drush # Or use our upcoming release: php -r "readfile('http://files.drush.org/drush-unstable.phar');" > drush # Test your install. php drush core-status # Make `drush` executable as a command from anywhere. Destination can be anywhere on $PATH. chmod +x drush sudo mv drush /usr/local/bin # Optional. Enrich the bash startup file with completion and aliases. drush init
2.
Für Windows:
https://riptutorial.com/de/home 23
Laden Sie Drush von GitHub herunter.1. Extrahieren Sie die komprimierte Datei in das gewünschte Laufwerk, z.
C:\
2.
Installieren Sie Drush, definieren Sie den extrahierten Ordnerpfad in der Umgebungspfadvariablen, die auch Apache, PHP and MySQL .
C:\xampp\apache\bin;C:\xampp\mysql\bin;C:\xampp\php;C:\drush;
3.
Stellen Sie sicher, dass Drush funktioniert:
drush status
4.
Composer-globale Installation
Installieren Sie Composer global .1. Fügen Sie dem Systempfad das bin Verzeichnis von Composer hinzu, indem Sie den export PATH="$HOME/.composer/vendor/bin:$PATH" in Ihr ~ / .bash_profile (OS X) oder ~ / .bashrc (Linux) einfügen.
2.
Drush installieren:
composer global require drush/drush
3.
Stellen Sie sicher, dass Drush funktioniert:
drush status
4.
Weitere Details zu Drush Docs
Drush installieren
Manuelle Installation
Geben Sie die folgenden Befehle in Terminal ein.
php -r "readfile('http://files.drush.org/drush.phar');" > drush chmod +x drush sudo mv drush /usr/local/bin drush init # Add alias in bash startup file.
Komponist
Vorausgesetzt, Composer ist installiert.
composer global require drush/drush:dev-master
https://riptutorial.com/de/home 24
Drush online lesen: https://riptutorial.com/de/drupal/topic/2062/drush
https://riptutorial.com/de/home 25
Kapitel 8: Feldformatierer
Einführung
Ein Feldformatierer gibt an, wie ein Feld in Drupal-Vorlagen dargestellt wird. Das von jedem Feld verwendete Formatierungsprogramm kann auf der Registerkarte Anzeige verwalten konfiguriert werden, die dem von Ihnen konfigurierten Entitätstyp zugeordnet ist.
Felder können je nach angezeigtem Anzeigemodus unterschiedliche Formatierungen haben. So können Sie steuern, wie ein Feld in verschiedenen Teilen Ihrer Website dargestellt wird.
Bemerkungen
Bei der Implementierung eines Field Formatter sind einige Dinge zu beachten.
Die Implementierung Ihres Formatierers muss sich in Ihrem Modul im Ordner src/Plugin/Field/FieldFormatter . Die Anmerkungen sind auch wichtig, da sie Ihr Modul identifizieren und auf welche Feldtypen es anwendbar ist.
In diesem Beispiel gilt dieses Formatierungsprogramm nur für Felder des Typs email . Sie können Ihren Formatierer bei Bedarf auf eine Reihe von Feldern anwenden. Wenn Ihr Formatierungsprogramm aus irgendeinem Grund auf E-Mail- und Datumsfelder anwendbar wäre:
field_type = { "email", "date", }
Bei der ersten Implementierung von Feldformatierern mit Einstellungen bestand eine Gefahr darin, dass die Einstellungen nicht gespeichert wurden, wenn sie geändert wurden. Es gibt keine explizite Speichermethode. Die Lösung besteht darin, die Methode defaultSettings() zu implementieren und die defaultSettings() anzugeben, aus denen sich Ihr Konfigurationsformular zusammensetzt. Vergessen Sie auch nicht, den #default_value in der settingsForm Methode #default_value .
Wenn Sie eine bestimmte TWIG Vorlage für Ihre Formatter haben wollen ist es so einfach wie eine Konfiguration #theme Taste , während das Array in der Render Aufbau viewElements Methode dann in Ihrer .module Datei implementieren hook_theme
function obfuscator_field_formatter_theme() { return [ 'obfuscator_field_formatter' => [ 'variables' => array('title' => NULL, 'url' => NULL), 'template' => 'obfuscator-field-formatter' ], ]; }
https://riptutorial.com/de/home 26
Erstellen Sie dann den templates im Stammverzeichnis Ihres Moduls und erstellen Sie eine Datei mit dem Namen obfuscator-field-formatter.twig.html in der Sie das gewünschte Markup ausgeben. In diesem Beispiel stehen die Variablen #title und #url zur Verfügung.
Examples
Verschleierter Email-Formatierer
In unserem Beispiel erstellen wir ein benutzerdefiniertes Formatierungsprogramm für E-Mail-Adressen, das es uns ermöglicht, verschleierte E-Mail-Adressen anzuzeigen, um diese unangenehmen Spammer zu täuschen.
Das Formatierungsprogramm verfügt über einige Konfigurationsoptionen, mit denen wir steuern können, wie die E-Mail-Adresse verschleiert wird:
Entfernen Sie @ und. und sie durch ein Leerzeichen ersetzen,•Ersetzen Sie @ durch at und. durch punkt,•
Bitte beachten Sie, dass dies nur ein akademisches Beispiel ist, um zu zeigen, wie Feldformatierer angezeigt und konfiguriert werden. Dies ist offensichtlich nicht sehr nützlich für das eigentliche Spam-Schutz.
In diesem Beispiel wird davon ausgegangen, dass Sie ein Modul mit dem Namen obfuscator_field_formatter ordnungsgemäß konfiguriert und aktiviert haben.
namespace Drupal\obfuscator_field_formatter\Plugin\Field\FieldFormatter; use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\Field\FieldItemInterface; use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Field\FormatterBase; use Drupal\Core\Form\FormStateInterface; /** * Plugin implementation of the 'example_field_formatter' formatter. * * @FieldFormatter( * id = "email_obfuscator_field_formatter", * label = @Translation("Obfuscated Email"), * field_types = { * "email" * } * ) */ class ObfuscatorFieldFormatter extends FormatterBase { private $options = []; public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings) { parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings); $this->options = [ 'remove_chars' => $this->t('Remove @ and . and replace them with a space'),
https://riptutorial.com/de/home 27
'replace_chars' => $this->t('Replace @ by at and . by dot'), ]; } public static function defaultSettings() { return [ 'obfuscator_formatter_type' => '', ] + parent::defaultSettings(); } public function settingsForm(array $form, FormStateInterface $form_state) { return [ 'obfuscator_formatter_type' => [ '#type' => 'select', '#title' => $this->t('Obfuscation Type'), '#options' => $this->options, '#default_value' => $this->getSetting('obfuscator_formatter_type'), ] ] + parent::settingsForm($form, $form_state); } public function settingsSummary() { $summary = parent::settingsSummary(); $type = $this->getSetting('obfuscator_formatter_type'); if(!is_null($type) && !empty($type)) { $summary[] = $this->t('Obfuscation: @value', ['@value' => $this->options[$type]]); } return $summary; } public function viewElements(FieldItemListInterface $items, $langcode) { $elements = []; foreach ($items as $delta => $item) { $elements[$delta] = [ '#type' => 'inline_template', '#template' => '{{ value|nl2br }}', '#context' => ['value' => $this->viewValue($item)], ]; } return $elements; } protected function viewValue(FieldItemInterface $item) { $obfuscated = $item->value; $type = $this->getSetting('obfuscator_formatter_type'); switch($type) { case 'remove_chars': { $obfuscated = str_ireplace(['@', '.'], ' ', $item->value); break; } case 'replace_chars': { $obfuscated = str_ireplace(['@', '.'], [' AT ', ' DOT '], $item->value); break; } }
https://riptutorial.com/de/home 28
return $obfuscated; } }
Feldformatierer online lesen: https://riptutorial.com/de/drupal/topic/8792/feldformatierer
https://riptutorial.com/de/home 29
Kapitel 9: Modulentwicklung - Drupal 7
Bemerkungen
Beispiele für Entwickler- Module sollten idealerweise als Referenz für die Modulentwicklung verwendet werden. Es enthält Erklärungen zu allen wichtigen APIs sowie eine gut dokumentierte Verwendung. Anfänger können die Entwicklung von Modulen verstehen.
Examples
Grundmodul mit einer einfachen Seite
really_neat.info
name = Really Neat Module description = Provides a really neat page for your site core = 7.x
really_neat.module
<?php /** * @file * Hook implementation and shared functions for the Really Neat Module. */ /** * Implements hook_menu(). */ function really_neat_menu() { $items = array(); $items ['really/neat'] = array( 'title' => 'A Really Neat Page', 'page_callback' => 'really_neat_page', 'access_callback' => TRUE, //Anyone can access. // Or replace with array([name-of-permission]), ), return $items; } /** * Page callback: Displays something really neat */ function really_neat_page() { return "Really Neat!" }
Basismodul, das einen benutzerdefinierten Block bereitstellt
https://riptutorial.com/de/home 30
custom_module.info
name = Custom Module description = Creates a block containing a custom output. core = 7.x
custom_module.module
/** * Initiates hook_block_info. * * Registers the block with Drupal. */ function custom_module_block_info() { $blocks = array(); //Registers the machine name of the block. $blocks['custom_block'] = array( //Sets the human readable, administration name. 'info' => t('My Custom Block'), //Tells Drupal not to cache this block. //Used if there is dynamic content. 'cache' => DRUPAL_NO_CACHE, ); return $blocks; } /** * Initiates hook_block_view(). * * Sets the block title and content callback. */ function custom_module_block_view($delta = '') { $block = array(); switch ($delta) { //Must be the machine name defined in the hook_block_info. case 'custom_block': //The blocks title. $block['subject'] = 'My custom block'; //The string or function that will provide the content of the block. $block['content'] = custom_module_block_content(); break; } return $block; } /** * Returns the content of the custom block. */ function custom_module_block_content() { $content = "This function only returns a string, but could do anything." return $content; }
Grundlegendes benutzerdefiniertes Formular zur Aufnahme in Seiten- oder Blockbeispiele.
https://riptutorial.com/de/home 31
Einfache Formular-, Validierungs- und Übermittlungsfunktionen zum Erstellen einer Funktion "Mailing-Liste". Dies kann dann entweder auf die Grundseite oder auf grundlegende Blockbeispiele angewendet werden.
Angenommen, Sie haben in der Drupal-Datenbank eine Tabelle mit dem Namen "mailing_list" mit den Feldern Vorname, Nachname und E-Mail-Adresse erstellt.
Zusätzliche Informationen zur Formular-API und zusätzliche Feldoptionen: https://api.drupal.org/api/drupal/developer!topics!forms_api_reference.html/7.x/
function custom_module_form($form, &$form_state) { $form['first_name'] = array ( '#type' => 'textfield', '#title' => 'First Name', '#required' => TRUE, ); $form['last_name'] = array ( '#type' => 'textfield', '#title' => 'Last Name', '#required' => TRUE, ); $form['email'] = array ( '#type' => 'textfield', '#title' => 'First Name', '#required' => TRUE, ); return $form; } function custom_module_form_validate($form, &$form_state) { if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { form_set_error('email', t('Please provide a valid email address.')); } } function custom_module_form_submit($form, &$form_state) { //Useful function for just getting the submitted form values form_state_values_clean($form_state); //Save time later by assigning the form values to variables. $first_name = $form_state['values']['first_name']; $last_name = $form_state['values']['last_name']; $email = $form_state['values']['email']; //Insert the submitted data to the mailing_list database table. db_insert('mailing_list') ->fields(array( 'first name' => $first_name, 'last name' => $last_name, 'email' => $email, )) ->execute(); //Set a thank you message. drupal_set_message('Thank you for subscribing to our mailing list!'); //drupal_goto() could be used here to redirect to another page or omitted to reload the same page. //If used, drupal_goto() must come AFTER drupal_set_message() for the message to be
https://riptutorial.com/de/home 32
displayed on the new page. }
Basismodul, das einen benutzerdefinierten Block bereitstellt
custom_module.info
name = Custom Module description = Creates a block containing a custom output. core = 7.x
custom_module.module
/** * Initiates hook_block_info. * * Registers the block with Drupal. */ function custom_module_block_info() { $blocks = array(); //Registers the machine name of the block. $blocks['custom_block'] = array( //Sets the human readable, administration name. 'info' => t('Titania Price Widget'), //Tells Drupal not to cache this block. //Used if there is dynamic content. 'cache' => DRUPAL_NO_CACHE, ); return $blocks; } /** * Initiates hook_block_view(). * * Sets the block title and content callback. */ function custom_module_block_view($delta = '') { $block = array(); switch ($delta) { //Must be the machine name defined in the hook_block_info. case 'custom_block': //The blocks title. $block['subject'] = 'My custom block'; //The string or function that will provide the content of the block. $block['content'] = custom_module_block_content(); break; } return $block; } /** * Returns the content of the custom block. */ function custom_module_block_content() { $content = "This function only returns a string, but could do anything."
https://riptutorial.com/de/home 33
return $content; }
Grundlegendes benutzerdefiniertes Formular zur Aufnahme in Seiten- oder Blockbeispiele.
Einfache Formular-, Validierungs- und Übermittlungsfunktionen zum Erstellen einer Funktion "Mailing-Liste". Dies kann dann entweder auf die Grundseite oder auf grundlegende Blockbeispiele angewendet werden.
Angenommen, Sie haben in der Drupal-Datenbank eine Tabelle mit dem Namen "mailing_list" mit den Feldern Vorname, Nachname und E-Mail-Adresse erstellt.
Zusätzliche Informationen zur Formular-API und zusätzliche Feldoptionen: https://api.drupal.org/api/drupal/developer!topics!forms_api_reference.html/7.x/
function custom_module_form($form, &$form_state) { $form['first_name'] = array ( '#type' => 'textfield', '#title' => 'First Name', '#required' => TRUE, ); $form['last_name'] = array ( '#type' => 'textfield', '#title' => 'Last Name', '#required' => TRUE, ); $form['email'] = array ( '#type' => 'textfield', '#title' => 'First Name', '#required' => TRUE, ); return $form; } function custom_module_form_validate($form, &$form_state) { if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { form_set_error('email', t('Please provide a valid email address.')); } } function custom_module_form_submit($form, &$form_state) { //Useful function for just getting the submitted form values form_state_values_clean($form_state); //Save time later by assigning the form values to variables. $first_name = $form_state['values']['first_name']; $last_name = $form_state['values']['last_name']; $email = $form_state['values']['email']; //Insert the submitted data to the mailing_list database table. db_insert('mailing_list') ->fields(array( 'first name' => $first_name, 'last name' => $last_name, 'email' => $email,
https://riptutorial.com/de/home 34
)) ->execute(); //Set a thank you message. drupal_set_message('Thank you for subscribing to our mailing list!'); //drupal_goto() could be used here to redirect to another page or omitted to reload the same page. //If used, drupal_goto() must come AFTER drupal_set_message() for the message to be displayed on the new page. }
Beispieldatei custom_module.install zum Erstellen einer Datenbanktabelle
Kann in Verbindung mit dem benutzerdefinierten Formularbeispiel verwendet werden , um eine Tabelle in der Drupal-Datenbank für eine Mailinglistenfunktion zu erstellen.
Dieses Beispiel durch die Schaffung der Tabelle direkt in meiner Entwicklung Datenbank hergestellt wurde, erstellt dann die Daten für hook_schema () mit dem Schema - Modul .
Dies ermöglicht die automatische Tabellenerstellung während der Modulinstallation an Staging- und Produktionsstandorten.
custom_module.install
/** * Installs the database schema. */ function custom_module_install() { drupal_install_schema('mailing_list'); } /** * Uninstalls the database schema. */ function custom_module_uninstall() { drupal_uninstall_schema('mailing_list'); } /** * Creates the tables using the schema API. */ function custom_module_schema() { $schema['mailing_list'] = array( 'description' => 'TODO: please describe this table!', 'fields' => array( 'first name' => array( 'description' => 'TODO: please describe this field!', 'type' => 'int', 'not null' => TRUE, ), 'last name' => array( 'description' => 'TODO: please describe this field!', 'type' => 'int', 'not null' => TRUE, ), 'email' => array( 'description' => 'TODO: please describe this field!',
https://riptutorial.com/de/home 35
'type' => 'int', 'not null' => TRUE, ), ), ); }
Modulentwicklung - Drupal 7 online lesen: https://riptutorial.com/de/drupal/topic/2456/modulentwicklung---drupal-7
https://riptutorial.com/de/home 36
Kapitel 10: Themenentwicklung - Drupal 7
Examples
.Info-Dateien schreiben
Die .info-Datei ist eine statische Textdatei zum Definieren und Konfigurieren eines Designs. Jede Zeile in der .info-Datei ist ein Schlüssel-Wert-Paar mit dem Schlüssel links und dem Wert rechts mit einem "Gleichheitszeichen" zwischen ihnen (z. B. name = mein_theme ).
Semikolons werden verwendet, um eine Zeile auszukommentieren. Einige Schlüssel verwenden eine spezielle Syntax mit eckigen Klammern, um eine Liste der zugehörigen Werte zu erstellen, die als "Array" bezeichnet werden. Wenn Sie mit Arrays nicht vertraut sind, werfen Sie einen Blick auf die Standard-.info-Dateien, die mit Drupal geliefert werden, und lesen Sie die Erklärungen der folgenden Beispiele. Obwohl die Dateierweiterung .info nicht direkt von einer Anwendung geöffnet wird, können Sie TextEdit auf einem Mac oder Notepad auf einem Windows-Computer verwenden, um die Änderungen anzuzeigen, zu bearbeiten und zu speichern.
Anforderungen an den Themennamen
Der Name sollte mit einem Buchstaben beginnen, kann Zahlen und Unterstriche enthalten, jedoch keine Bindestriche, Leerzeichen oder Satzzeichen. Der Name wird von Drupal bei der Erstellung verschiedener Funktionen in PHP verwendet und hat daher die gleichen Einschränkungen.
Wählen Sie keine Namen, die bereits von installierten Modulen verwendet werden , da alle installierten Komponenten eindeutige Namen haben müssen.
Eine der bewährten Methoden ist die Verwendung von Präfixen bei der Benennung des benutzerdefinierten Designs einer Site, um eindeutige Namen für Designs zu gewährleisten. Eine Site namens example.com kann Themennamen wie ex_themename verwenden.
Da die .info-Datei zwischengespeichert wird, müssen Sie den Cache löschen, bevor Änderungen auf Ihrer Site angezeigt werden.
Die .info-Datei kann auch angeben, auf welche Designeinstellungen über die Drupal-Administrationsoberfläche zugegriffen werden soll, wie Sie bald sehen werden.
Codierung
Die Datei muss als UTF-8 ohne Byte Order Mark (BOM) gespeichert werden.
Inhalt
Drupal versteht die unten aufgeführten Schlüssel. Drupal verwendet Standardwerte für die optionalen Schlüssel, die nicht in der .info-Datei vorhanden sind. Siehe die Beispiele für Kernthemen.
https://riptutorial.com/de/home 37
Name erforderlich•Beschreibung empfohlen•Bildschirmfoto•Version entmutigt•Kern erforderlich•Motor•Grundthema•Regionen•Eigenschaften•Themen Einstellungen•Stylesheets•Skripte•php•
Theme .info-Datei
name = MyCompany Theme description = A Bootstrap Sub-theme. core = 7.x base theme = bootstrap ;;;;;;;;;;;;;;;;;;;;; ;; Regions ;;;;;;;;;;;;;;;;;;;;; regions[navigation] = 'Navigation' regions[header] = 'Top Bar' regions[highlighted] = 'Highlighted' regions[help] = 'Help' regions[content] = 'Content' regions[sidebar_first] = 'Primary' regions[sidebar_second] = 'Secondary' regions[footer] = 'Footer' regions[page_top] = 'Page top' regions[page_bottom] = 'Page bottom' ;;;;;;;;;;;;;;;;;;;;; ;; MyCompany Custom Regions ;;;;;;;;;;;;;;;;;;;;; regions[footer_menu_left] = 'Footer menu left' regions[footer_menu_right] = 'Footer menu right' ;;;;;;;;;;;;;;;;;;;;; ;; CSS ;; these css files will be included on every page ;;;;;;;;;;;;;;;;;;;;; stylesheets[all][] = css/bootstrap.min.css stylesheets[all][] = css/MyCompany.css ;;;;;;;;;;;;;;;;;;;;; ;; JS ;; this JS file will be included on every page ;;;;;;;;;;;;;;;;;;;;; scripts[] = js/MyCompany.min.js
https://riptutorial.com/de/home 38
Themenentwicklung - Drupal 7 online lesen: https://riptutorial.com/de/drupal/topic/2715/themenentwicklung---drupal-7
https://riptutorial.com/de/home 39
Kapitel 11: Zweig
Einführung
Twig ist die Vorlagen-Engine, die Teil von Drupal 8 ist. In Drupal 8 haben Twig-Dateien die Erweiterung .html.twig und werden in jedem Aspekt des Drupal-Themings verwendet. Entitäten, Felder und Ansichten können alle mit .html.twig Dateien gerendert werden.
In diesem Thema besteht das Ziel darin, ein Kochbuch zur Zusammenarbeit mit Twig im Rahmen von Drupal zu haben. Wenn Sie mehr über die Syntax oder die verfügbaren Funktionen erfahren möchten, lesen Sie die Dokumentation .
Examples
Zweigfilter
Im Gegensatz zu Drupal 7 können Sie in Ihren Vorlagen keine regulären PHP-Funktionen aufrufen. In Drupal 8 können Sie Filter und Funktionen erstellen.
Sie sollten einen Filter verwenden, wenn: Sie die Daten konvertieren möchten, die Sie anzeigen möchten. Stellen Sie sich vor, Sie haben einen Titel, den Sie immer in Großbuchstaben verwenden möchten. Zum Beispiel hat Zweig der capitalize Filter standardmäßig , dass Sie einen beliebigen Text in seine entsprechenden Großbuchstaben umwandeln können.
In diesem Beispiel erstellen wir einen Filter, mit dem wir einen String mischen können. Das Erstellen von Filtern und Funktionen entspricht genau dem von Twig .
Der Hauptunterschied zwischen regulären Twig und Drupal 8 Twig besteht darin, dass Sie in Drupal 8 eine Service-Definition der Klasse erstellen müssen, die Sie erstellen, und die Klasse auch zu einem Namespace gehören muss, da sie sonst nicht als Twig-Filter in der Drupal-Umgebung registriert wird .
In diesem Beispiel wird davon twig_shuffle_extension dass Sie über ein Modul namens " twig_shuffle_extension " twig_shuffle_extension .
Dies ist die grundlegende twig_shuffle_extension.services.yml
services: twig_shuffle_extension.twig_extension: class: Drupal\twig_shuffle_extension\TwigExtension\TwigShuffleExtension tags: - { name: twig.extension }
Der tags Schlüssel ist ebenfalls zwingend erforderlich und gibt Drupal an, was diese Klasse tun soll (dh sie als Twig-Erweiterung registrieren).
Und jetzt den Quellcode, der in den Pfad eingefügt werden muss, der im class der Service-
https://riptutorial.com/de/home 40
Definition definiert ist.
// Don't forget the namespace! namespace Drupal\twig_shuffle_extension\TwigExtension; use Twig_Extension; use Twig_SimpleFilter; class TwigShuffleExtension extends Twig_Extension { /** * This is the same name we used on the services.yml file */ public function getName() { return 'twig_shuffle_extension.twig_extension'; } // Basic definition of the filter. You can have multiple filters of course. // Just make sure to create a more generic class name ;) public function getFilters() { return [ new Twig_SimpleFilter('shuffle', [$this, 'shuffleFilter']), ]; } // The actual implementation of the filter. public function shuffleFilter($context) { if(is_string($context)) { $context = str_shuffle($context); } return $context; } }
Löschen Sie Ihre Caches. Wenn nun alles nach Plan läuft, können Sie den Filter in Ihren Vorlagen verwenden.
{{ "shuffle me!" | shuffle }}
Abhängigkeitsinjektion in Twig-Erweiterungen
Dieses Beispiel zeigt Ihnen, wie Sie mit Dependency Inject andere Dienste nutzen können, die in der Drupal-Umgebung registriert sind.
Stellen Sie sich vor, Sie haben eine SVG-Bilddatei, die die Farben in Abhängigkeit von einigen zufälligen CSS / Javascript-Elementen in Ihrem Projekt ändert. Um die SVG-Datei mit CSS ansprechen zu können, muss die SVG-Datei tatsächlich im DOM vorhanden sein. Sie erstellen also eine Basis-SVG-Datei ohne Farben und legen diese in Ihrem Designordner ab.
Natürlich könnten Sie einfach den Inhalt der Datei in die Twig-Vorlage einfügen, aber das wäre nicht nett. Sie können eine Twig-Erweiterung erstellen, aber Sie möchten Ihren Designpfad nicht im Quellcode der Erweiterung fest codieren.
Das bedeutet, dass wir den Pfad dynamisch erhalten müssen. Sie haben zwei Möglichkeiten:
https://riptutorial.com/de/home 41
Verwenden Sie das Äquivalent zu einer globalen Variablen, indem Sie \Drupal::theme()->getActiveTheme()->getPath();
1.
ThemeManager Sie den ThemeManager (angegeben durch \Drupal::theme() ) in Ihre Erweiterungsklasse ein
2.
In diesem Beispiel nehmen wir das zweite Beispiel, weil es für jeden Dienst weit verbreitet sein kann (Sie importieren die Anfrage oder die Datenbankverbindung, wenn Sie möchten).
Dies setzt voraus, dass Sie über ein Modul namens twig_svg_extension und eine twig_svg_extension.services.yml Datei twig_svg_extension.services.yml :
services: twig_svg_extension.twig_extension: class: Drupal\twig_svg_extension\TwigExtension\TwigSvgExtension arguments: ['@theme.manager'] tags: - { name: twig.extension }
Bitte nicht den arguments , der Drupal den Dienst mitteilt.
namespace Drupal\twig_svg_Extension\TwigExtension; use Drupal\Core\Theme\ThemeManager; use Twig_Extension; use Twig_SimpleFilter; class TwigSvgExtension extends Twig_Extension { private $theme; // Dependency injection at work! public function __construct(ThemeManager $theme) { $this->theme = $theme; } public function getFilters() { return [ 'svg' =>new Twig_SimpleFilter('svg', [$this, 'svgFilter']), ]; } public function getName() { return 'twig_svg_extension.twig_extension'; } public function svgFilter(string $filepath) { $realpath = realpath($this->theme->getActiveTheme()->getPath().DIRECTORY_SEPARATOR.$filepath); $pathinfo = pathinfo($realpath); if($realpath !== false && strtolower($pathinfo['extension']) === 'svg') { return file_get_contents($realpath); } return '"'.$filepath.'" does not exist or is not an SVG'; } }
https://riptutorial.com/de/home 42
Beachten Sie den Konstruktor, der die Abhängigkeit enthält, die wir in der Servicekonfiguration svgFilter , sowie den svgFilter , der den aktuell aktiven Themenpfad svgFilter .
$filepath sollte ein relativer Pfad zum Themes-Ordner sein. Die Erweiterung konvertiert den Dateipfad in den Inhalt der Datei, auf die sie verweist.
Zweig online lesen: https://riptutorial.com/de/drupal/topic/8804/zweig
https://riptutorial.com/de/home 43
Credits
S. No
Kapitel Contributors
1Erste Schritte mit Drupal
acrosman, Adrian Cid Almaguer, chx, Community, dobeerman, Jimmy Ko, Karl Buys, kiamlaluno, Mika A., Morsok, pal4life, Pierre Buyle, Sidney Gijzen
2
Beispiel für die Drupal 8-Warteschlangen-API und die Stapel-API
David Czinege
3Das Ansichten-Modul
Pierre.Vriens
4 Das Regelmodul Pierre.Vriens
5 Drupal 8-Objekt-API Bernard Nandwa
6Drupal Cache und Performace
Anurag
7 DrushAdrian Cid Almaguer, darc1n, Jimmy Ko, lastYorsh, L-four, Mark Conroy, Morsok, pbonnefoi, Rishi Kulshreshtha, Sjoerd van der Vis, Wade Burelbach
8 Feldformatierer Ricardo Velhote
9Modulentwicklung - Drupal 7
Ajit S, doublejosh, Hermann Döppes, Jimmy Ko, Jimmyb_1991, Morsok, Pierre Buyle
10Themenentwicklung - Drupal 7
Adrian Cid Almaguer, Sam Thompson
11 Zweig Ricardo Velhote
https://riptutorial.com/de/home 44