
Benutzerdefinierte Aktionen im Views Bulk Operations Modul in Drupal
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.
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
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
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
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
Diese Operation fügt jedem Hinzufügen/Bearbeiten-Formular für Artikel ein neues Feld hinzu.
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
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.