bulk screen image

Benutzerdefinierte Aktionen im Views Bulk Operations Modul in Drupal

html

Das Modul Views Bulk Operations wird verwendet, um Massenoperationen auf Ergebnisse in Tabellen oder anderen mit Views erstellten Elementen durchzuführen. In diesem Beispiel zeige ich Ihnen, wie Sie eine eigene Aktion hinzufügen, die den Status (Workflows) der ausgewählten Einträge ändert.

vbo13

Die Aktion wird auf alle ausgewählten Einträge angewendet und automatisch in Batch-Queues ausgeführt, um das System nicht zu überlasten und die Seite nicht "abzustürzen", wenn der Vorgang zu lange dauert. Wenn Sie wissen, was Sie tun, und dafür Gründe haben, können Sie die Queue-Option in der Feldkonfiguration deaktivieren.

VBO-Installation und Konfiguration

Das Views Bulk Operations-Modul kann installiert werden, indem das Paket im Verzeichnis modules/contrib heruntergeladen und entpackt oder der Composer-Befehl verwendet wird, der die neueste stabile Version des Moduls herunterlädt.

composer require drupal/views_bulk_operations

Nach der Installation muss das Modul nicht weiter konfiguriert werden, Sie fügen einfach das entsprechende Feld zur Seite (oder dem Block) hinzu, die vom Views-Modul erstellt wurde.

  • Fügen Sie eine neue Inhaltsansicht hinzu, die die Seite erstellt.
  • Setzen Sie das Anzeigeformat auf Tabelle. Es ist nicht erforderlich, die Kontrollkästchen auf der Tabelle sehen einfach natürlicher aus
  • Fügen Sie das Titelfeld hinzu
  • Fügen Sie das Views-Bulk-Operations-Feld hinzu

vbo3

Aktionskonfiguration für ein VBO-Feld

In der Feldkonfiguration können Sie markieren, welche Massenaktionen auf die Ergebnisse angewendet werden können. Es gibt über ein Dutzend vorgefertigter Aktionen, wie zum Beispiel:

  • Einträge löschen
  • Veröffentlichen
  • Fixieren

vbo4

Die obige Liste ist kompatibel, wenn die Ansicht Inhalte anzeigt. Wenn Sie die Ansicht hinzufügen, die Benutzer anzeigt, werden Sie feststellen, dass die Liste andere Aktionen enthält.

Eigene Aktion zu VBO hinzufügen

Das Ziel ist es, eigene Aktionen auf Einträge (Inhalte) hinzuzufügen, die den Status (Workflows) der ausgewählten Einträge ändern.

Eintragszustände sind nicht sofort nach der Installation von Drupal verfügbar. Dafür müssen Sie zwei zusätzliche Module aktivieren, die direkt in Drupal enthalten sind, es ist kein zusätzlicher Download erforderlich.

Gehen Sie zu der Seite mit den Modulen - admin/modules

Aktivieren Sie die Module: Workflows und Content moderation

vbo7

Workflows-Konfiguration

Für die Zwecke dieses Beitrags werde ich automatisch definierte Zustände für den Redaktionstyp verwenden, die sofort nach dem Aktivieren des Moduls für die Inhaltsmoderation verfügbar sind.

Sie müssen lediglich einen bestimmten Typ von Statusübergängen für die ausgewählten Inhaltstypen aktivieren.

  • Bearbeiten Sie auf der Seite admin/config/workflow/workflows den redaktionellen Typ
  • Setzen Sie den Inhaltstyp Artikel

vbo9

Diese Operation fügt jedem Hinzufügen/Bearbeiten-Formular für Artikel ein neues Feld hinzu.

vbo10

Fügen Sie der Ansicht, in der sich das VBO-Feld befindet, hinzu

  • ein Feld, das den Status eines bestimmten Eintrags anzeigt - Inhalt: Moderationszustand
  • einen Filter, der die Anzeige von Einträgen des Typs Artikel begrenzt

Wenn ein Filter hinzugefügt wird, der Einträge auf nur veröffentlichte einschränkt Inhalt: Veröffentlicht (= Ja), entfernen Sie ihn. Er wird die Anzeige von Einträgen blockieren, die zum Beispiel den Status Entwurf oder Archiviert haben, die definitionsgemäß nicht veröffentlicht werden.

Eigener Aktionscode

Erstellen Sie Ihr eigenes Modul und aktivieren Sie es. In meinem Fall lautet der Modulname d_workflows

Erstellen Sie im Modulverzeichnis eine Verzeichnisstruktursrc/Plugin/Action

Erstellen Sie darin eine neue Klassendatei für die Aktion, um den Status des Eintrags in Veröffentlicht zu ändern.

Dateiname: PublishNodeAction.php

/**
 * Inhaltsmoderation veröffentlicht Knoten.
 *
 * @Action(
 *   id = "d_workflows_publish_node_action",
 *   label = @Translation("Knoten veröffentlichen (moderation_state)"),
 *   type = "node",
 *   confirm = TRUE
 * )
 */

class PublishNodeAction extends ViewsBulkOperationsActionBase {

Die Klassenannotation ist hier wichtig.

Sie legen darin eine id für die Aktion fest – dies kann ein beliebiger eindeutiger Wert sein. Es ist sinnvoll, in ihrem Namen den Namen des Moduls und die durchgeführte Aktion zu integrieren.

Label ist der Wert, der in der VBO-Feldkonfiguration angezeigt wird

Type ist der Entitätstyp, für den die neue Aktion verfügbar sein wird. In diesem Fall ist es node, aber es kann zum Beispiel user, taxonomy_term oder ein anderer sein.

Diese Klasse erbt von ViewsBulkOperationsActionBase

Es erfordert die Deklaration von zwei Methoden:

  • execute() - was für jeden Datensatz ausgeführt werden soll
  • access() - wer die Aktion ausführen kann

Beispiel eines Codes für die Methode execute()

/**
 * {@inheritdoc}
 */
public function execute(ContentEntityInterface $entity = NULL) {
  if (!$state = $entity->get('moderation_state')->getString()) {
    return $this->t(':title  - kann Status nicht ändern',
      [
        ':title' => $entity->getTitle(),
      ]
    );
  }

  switch ($state) {
    case 'archiviert':
    case 'entwurf':
      $entity->set('moderation_state', 'veröffentlicht');
      $entity->save();
      break;
  }

  return $this->t(':title Status geändert zu :state',
    [
      ':title' => $entity->getTitle(),
      ':state' => $entity->get('moderation_state')->getString(),
    ]
  );
}

Die erste Bedingung überprüft, ob die gegebene Entität die Option zur Statusfestlegung aktiviert hat.

In diesem Fall ist es nur Artikel. Wenn die Aktion auf Einträgen initiiert wird, bei denen keine Zustände aktiviert sind (leeres $entity->get('moderation_state')->getString()), wird sie unterbrochen und eine entsprechende Information angezeigt.

Die Bedingung kann leicht erweitert werden, z. B. indem der Inhaltstyp für die Entität überprüft wird

$entity->bundle()

Weiter unten im Code wird der aktuelle Status des Eintrags überprüft und wenn die Bedingung erfüllt ist, ändert der Code seinen Status in veröffentlicht.

$entity->set('moderation_state', 'veröffentlicht');

Beispiel eines Codes für die Methode access()

  /**
   * {@inheritdoc}
   */
  public function access($object, AccountInterface $account = NULL, $return_as_object = FALSE) {
    if ($object instanceof Node) {
      $can_update = $object->access('update', $account, TRUE);
      $can_edit = $object->access('edit', $account, TRUE);

      return $can_edit->andIf($can_update)->isAllowed();
    }

    return FALSE;
  }

In dieser einfachen Bedingung wird überprüft, ob Sie an Node-Objekten arbeiten und ob der Benutzer, der die Aktion ausführt, die Berechtigung hat, sie zu bearbeiten und zu aktualisieren. Andernfalls gibt der Code FALSE zurück und die Aktion wird nicht ausgeführt.

Die gesamte Datei PublishNodeAction.php sieht folgendermaßen aus:

<?php

namespace Drupal\d_workflows\Plugin\Action;

use Drupal\node\Entity\Node;
use Drupal\views_bulk_operations\Action\ViewsBulkOperationsActionBase;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\Entity\ContentEntityInterface;

/**
 * Inhaltsmoderation veröffentlicht Knoten.
 *
 * @Action(
 *   id = "d_workflows_publish_node_action",
 *   label = @Translation("Knoten veröffentlichen (moderation_state)"),
 *   type = "node",
 *   confirm = TRUE
 * )
 */

class PublishNodeAction extends ViewsBulkOperationsActionBase {

  use StringTranslationTrait;

  /**
   * {@inheritdoc}
   */
  public function execute(ContentEntityInterface $entity = NULL) {
    if (!$state = $entity->get('moderation_state')->getString()) {
      return $this->t(':title  - kann Status nicht ändern',
        [
          ':title' => $entity->getTitle(),
        ]
      );
    }

    switch ($state) {
      case 'archiviert':
      case 'entwurf':
        $entity->set('moderation_state', 'veröffentlicht');
        $entity->save();
        break;
    }

    return $this->t(':title Status geändert zu :state',
      [
        ':title' => $entity->getTitle(),
        ':state' => $entity->get('moderation_state')->getString(),
      ]
    );
  }

  /**
   * {@inheritdoc}
   */
  public function access($object, AccountInterface $account = NULL, $return_as_object = FALSE) {
    if ($object instanceof Node) {
      $can_update = $object->access('update', $account, TRUE);
      $can_edit = $object->access('edit', $account, TRUE);

      return $can_edit->andIf($can_update)->isAllowed();
    }

    return FALSE;
  }
}

Eine neue Aktion wird in der VBO-Feldbearbeitung verfügbar sein

vbo14

Zusammenfassung

Erfahrene Drupal-Entwickler sowie Drupal-Berater stellen sicher, dass das Hinzufügen neuer Aktionen zu Views Bulk Operations einfach ist und auf die Erstellung einer zusätzlichen Klasse mit zwei Methoden reduziert wird. Basierend auf diesem einfachen Beispiel können Sie komplexere Massenaktionen für Entitäten verschiedener Typen erstellen.

As part of Drupal support, we maintain existing websites and expand them with new functionalities