Direkt zum Inhalt
Bild
1-opensenselabs-themes.png

So verwenden Sie CTool-Funktionen, die nicht in den Drupal-Kern verschoben wurden

AI-Translated
article publisher

Raman

Drupal

 „Chaos Tool Suite (CTools) ist in erster Linie eine Sammlung von APIs und Tools zur Verbesserung der Entwicklererfahrung.“ – Drupal.org

Die Chaos Tool Suite (CTools) ist ein von der Drupal-Community beigetragenes Projekt, das sich an Entwickler richtet. Im Wesentlichen handelt es sich um eine Reihe von Hilfsklassen, die erweitert werden können, um bestimmte Arbeitsabläufe zu vereinfachen und benutzerdefinierte Funktionen zu definieren. Viele beigesteuerte Module, darunter Pathauto, Panels und Page Manager, nutzen die von CTools bereitgestellte API.

Seit Drupal 8 wurde ein Großteil von CTools in den Core verschoben. Dazu gehören TempStore, Configuration Management Initiative (CMI), Config Entities, Plugins, AJAX und Modals sowie andere verschiedene Hilfsklassen. Kris Vanderwater, einer der Maintainer von Chaos Tool, beschrieb CTools als „ein Testfeld für das, was Drupal Core tun sollte“. 

Das Projekt wird noch immer verändert und es werden Tools entwickelt, die in Zukunft in den Core übernommen werden könnten. Werfen wir einen Blick auf die Funktionen von CTools, die derzeit in der Version 8.x-3.x verfügbar sind.

Wizard-API

Mehrstufige Formulare werden in der Regel verwendet, wenn wir eine Reihe von Eingaben benötigen, ohne den Benutzer zu überfordern. Sie können auch verwendet werden, um dynamische Formulareingaben zu erstellen, d. h. wenn die Formulareingaben eines Schritts anhand der im vorherigen Schritt bereitgestellten Informationen geändert werden können. Sie ermöglichen auch eine bessere Organisation von UI und Code. 

CTools bietet zwei abstrakte Klassen – FormWizardBase und EntityFormWizardBase, die erweitert werden können, um auf einfache Weise mehrstufige Formulare oder Assistenten zu erstellen. Erstere kann verwendet werden, um benutzerdefinierte einmalige Formulare zu erstellen, während letztere verwendet werden kann, um das Hinzufüge- oder Bearbeitungsformular für Config Entities zu verzaubern. 

Die einzelnen Schritte des Assistenten sind nichts anderes als Formulare. Genau wie jedes andere Formular in Drupal sind sie Klassen, die von der FormBase-Klasse erben. Daher können wir die einzelnen Schritte steuern, indem wir einfach die abstrakten Methoden – buildForm, validateForm und submitForm in den einzelnen Schritten oder Formularen implementieren.

Die Wizard-API stellt sicher, dass der temporäre Assistentenwert des form_state-Objekts immer verfügbar ist. Im Fall der EntityFormWizardBase enthält er einen Schlüssel mit dem gleichen Namen wie die Entitäts-ID.

Erstellen eines mehrstufigen Formulars mit der Wizard-API

Um ein mehrstufiges Formular mit der Wizard-API zu erstellen, müssen wir ein benutzerdefiniertes Modul erstellen und dann Formulare hinzufügen, ein Formular für jeden Schritt. In diesem Beispiel erstellen wir einen Assistenten für eine benutzerdefinierte Konfigurationsentität, indem wir EntityFormWizardBase erweitern. Drupal Console kann verwendet werden, um den Boilerplate-Code zu generieren, um Zeit und Mühe zu sparen.

  1. Navigieren Sie zum Stammverzeichnis Ihrer Drupal-Site

    $ cd /var/www/html/drupal8
     
  2. Generieren Sie Boilerplate-Code für das Modul mit Drupal Console (oder erstellen Sie die Dateien .info.yml und .module manuell) und beantworten Sie eine Reihe von Fragen, die vom Modulgenerator generiert werden.

    $ drupal generate:module
    Generieren von Boilerplate-Code für das benutzerdefinierte Modul
    Generieren von Boilerplate-Code für das benutzerdefinierte Modul
  3. Generieren Sie nun Boilerplate-Code für die benutzerdefinierte Konfigurationsentität und beantworten Sie eine Reihe von Fragen, die vom Entitätsgenerator generiert werden.

    $ drupal generate:entity:config
     
    Generieren von Boilerplate-Code für die benutzerdefinierte Konfigurationsentität
    Generieren von Boilerplate-Code für die benutzerdefinierte Konfigurationsentität
  4. Erstellen Sie nun Formulare zum Hinzufügen und Bearbeiten unserer benutzerdefinierten Konfigurationsentität, indem Sie die FormBase-Klasse erweitern und die Methoden getFormId, buildForm und submitForm implementieren. Optional können Sie die Methode validateForm implementieren, um benutzerdefinierte Validierungen zu definieren. Erstellen Sie ein Formular für jeden Schritt.

    Hier geschieht die eigentliche Magie. Der temporäre Assistentenwert des Formulars _state-Objekts wird verwendet, um die Zwischenwerte temporär zu speichern. Vergessen Sie im Fall von benutzerdefinierten einmaligen Formularen nicht, die Feldwerte mit der Methode setTemporaryValue im TempStore zu speichern. 
     public function getFormId() {
        return 'wizard_test_config_entity_first_form';
      }
    
      public function buildForm(array $form, FormStateInterface $form_state) {
        $config_entity = $form_state->getTemporaryValue('wizard')['custom_config_entity'];
        $form['first_value'] = [
          '#title' => $this->t('First'),
          '#description' => $this->t('Enter first value here'),
          '#type' => 'textfield',
          '#default_value' => $config_entity->getFirst() ?: '',
        ];
        return $form;
      }
    
      public function submitForm(array &$form, FormStateInterface $form_state) {
        $config_entity = $form_state->getTemporaryValue('wizard')['custom_config_entity'];
        $config_entity->set('first_value', $form_state->getValue('first_value'));
      }
  5. Erstellen Sie die Assistentenklasse, indem Sie die EntityFormWizardBase-Klasse erweitern und die folgenden Methoden implementieren.
      public function getWizardLabel() {
        return $this->t('Custom config entity wizard');
      }
    
      public function getMachineLabel() {
        return $this->t('custom_config_entity_wizard');
      }
    
      public function getEntityType() {
        return 'wizard_test_config_entity';
      }
    
      public function exists() {
        return '\Drupal\wizard_test\Entity\CustomConfigEntity::load';
      }
    
      public function getOperations($cached_values) {
        return [
          'label' => [
            'form' => 'Drupal\wizard_test\Form\CustomConfigEntityLabelForm',
            'title' => $this->t('Label and ID'),
          ],
          'first' => [
            'form' => 'Drupal\wizard_test\Form\FirstForm',
            'title' => $this->t('Step one'),
          ],
          'second' => [
            'form' => 'Drupal\wizard_test\Form\SecondForm',
            'title' => $this->t('Step two'),
          ],
        ];
      }
  6. Fügen Sie die Assistentenannotation in Ihrer benutzerdefinierten Entitätsklasse hinzu, in diesem Beispiel CustomConfigEntity.
     "wizard" = {
        "add" = "Drupal\wizard_test\Wizard\AddEntityWizard",
        "edit" = "Drupal\wizard_test\Wizard\EditEntityWizard"
      }
    
      links = {
        "canonical" = "/admin/structure/custom_config_entity/{custom_config_entity}",
        "edit-form" = "/admin/structure/custom_config_entity/{machine_name}/{step}",
        "delete-form" =   "/admin/structure/custom_config_entity/{custom_config_entity}/delete",
        "collection" = "/admin/structure/custom_config_entity"
      }
  7. Definieren Sie die Routen für den/die Assistenten. Denken Sie daran, _entity_wizard und tempstore_id unter den Standardwerten zu deklarieren.
    entity.custom_config_entity.add_form:
      path: '/admin/structure/custom_config_entity/add'
      defaults:
        _entity_wizard: 'custom_config_entity.add'
        _title: 'Add Custom config entity'
        tempstore_id: 'custom_config_entity.config_entity'
      options:
        _admin_route: TRUE
    
    entity.custom_config_entity.add_step_form:
      path: '/admin/structure/custom_config_entity/add/{machine_name}/{step}'
      defaults:
        _entity_wizard: 'custom_config_entity.add'
        _title: 'Add Custom config entity'
        tempstore_id: 'custom_config_entity.config_entity'
      options:
        _admin_route: TRUE
    
    entity.custom_config_entity.edit_form:
      path: '/admin/structure/custom_config_entity/{machine_name}/{step}'
      defaults:
        _entity_wizard: 'custom_config_entity.edit'
        _title: 'Edit Custom config entity'
        tempstore_id: 'custom_config_entity.config_entity'
      options:
        _admin_route: TRUE
  8. Aktivieren Sie das neu erstellte Modul.
    $ drush en wizard_test -y
     oder
    $ drupal module:install wizard_test

Besuchen Sie nun die Route Ihres Assistenten, um von dem benutzerdefinierten mehrstufigen Formular begrüßt zu werden.

Beispiel für ein mehrstufiges Formular für eine benutzerdefinierte Konfigurationsentität
 Beispiel für ein mehrstufiges Formular für eine benutzerdefinierte Konfigurationsentität
Beispiel für ein mehrstufiges Formular für eine benutzerdefinierte Konfigurationsentität
 Beispiel für einen Assistenten für benutzerdefinierte einmalige Formulare

Entitätsderivate

In Drupal 8 können Plugin-Derivate verwendet werden, um Annotationsobjekte zu durchlaufen. Dies ermöglicht es uns, eine foreach-Schleife zu verwenden, um alle Entitäten zu durchlaufen, einschließlich Blöcke, Kommentare, Nodes, Taxonomien usw. 

CTools bietet eine Hilfsklasse EntityDeriverBase, die diese Funktionalität implementiert. Dies kann besonders hilfreich sein, wenn man Headless mit Drupal arbeitet. Wir können ein Plugin erstellen, es zusammen mit der Services-API verwenden und CRUD-Operationen an Entitäten durchführen.

Implementieren Sie die Methode getDerivativeDefinitions(), um alle Entitätsderivate zurückzugeben, und fügen Sie den Verweis auf die Derivatklasse in der Service-Definitionsannotation hinzu. Weitere Implementierungsdetails finden Sie in diesem Repository.

Abrufen eines Artikel-Bundles im JSON-Format mithilfe von benutzerdefinierten Diensten
Abrufen eines Artikel-Bundles im JSON-Format mithilfe von benutzerdefinierten Diensten

CTool-Blöcke und Views-Module

Das Projekt enthält auch ein paar Module, die Verbesserungen an Core-Blöcken und -Ansichten bieten. Beachten Sie, dass diese als experimentell gekennzeichnet sind. Bevor Sie sie verwenden, aktivieren Sie diese Module mit einer der folgenden Methoden:

Verwenden der Benutzeroberfläche

Navigieren Sie zu Verwalten → Erweitern, wählen Sie die Chaos-Tools-Blöcke und -Ansichten-Module aus und klicken Sie auf „Installieren“.

Aktivieren von Chaos-Tools-Blöcken und -Ansichten über die Admin-Benutzeroberfläche
Aktivieren von Chaos-Tools-Blöcken und -Ansichten über die Admin-Benutzeroberfläche

Verwenden des Terminals

$ drush en ctools_block ctools_views -y
oder
$ drupal module:install ctools_block ctools_views

Um nun die von dem Chaos-Tools-Blöcke-Modul bereitgestellten Blöcke hinzuzufügen, führen Sie die folgenden Schritte aus:

  1. Navigieren Sie zu Verwalten → Struktur → Blocklayout und klicken Sie auf „Block platzieren“ in der Region, in der Sie den Block hinzufügen möchten.
     
  2. Wählen Sie den Entitätsansichtsblock aus, der von dem Chaos-Tools-Modul bereitgestellt wird.
     
    Blöcke, die von dem CTools-Blöcke-Modul bereitgestellt werden
    Blöcke, die von dem Chaos-Tools-Blöcke-Modul bereitgestellt werden
  3. Geben Sie einen geeigneten Blocktitel an, wählen Sie den Ansichtsmodus aus und wählen Sie die Sichtbarkeitsbedingungen aus, genau wie bei jedem anderen Block. Klicken Sie auf „Block speichern“, um die Änderungen anzuwenden.
     
    Beispiel für Chaos-Tool-Entitätsansichtsblöcke
    Beispiel für Chaos-Tool-Entitätsansichtsblöcke
    Das CTools-Projekt enthält viele nützliche Tools für Entwickler, um Arbeitsabläufe zu vereinfachen und die Wiederverwendbarkeit von Code zu fördern. Sie können sich auch den Quellcode anderer Module ansehen, darunter Page Manager, Panels und Pathauto, um den Anwendungsfall der von Chaos Tool Suite bereitgestellten Funktionen besser zu verstehen. 

    Es wird erwartet, dass weitere dieser Funktionen und Tools in Zukunft ihren Weg in den Drupal-Core finden werden. Eine gute Möglichkeit, alle Änderungen in der Codebasis zu verfolgen, ist das Verfolgen des Git-Repositorys dieses Zweigs.

Teilen Sie uns in den Kommentaren unten mit, wie wir Ihnen helfen können, oder senden Sie eine E-Mail an [email protected].

Abonnieren

Ready to start your digital transformation journey with us?

Verwandte Blogs

Zurück von der DrupalCon Atlanta 2025: Ein Meilenstein für OpenSense Labs

DrupalCon Atlanta 2025 OpenSense Labs

„Fit. Schnell. Für die Ewigkeit gebaut.“ Das war nicht nur ein Slogan, sondern die Denkweise, mit der wir zur DrupalCon…

Erklärbare KI-Tools: SHAPs Stärke in der KI

Explainable AI tools Explainable AI And SHAP OpenSense Labs

Wissen Sie, was erklärbare KI-Tools sind? Erklärbare KI-Tools sind Programme, die zeigen, wie eine KI ihre Entscheidungen…

KI-Chatbots: Präzision und Persönlichkeit in Perfektion

Creating AI Chatbot OpenSense Labs

In der Welt der künstlichen Intelligenz ist die Entwicklung eines KI-Chatbots, der nicht nur akkurate Informationen liefert…