bulk screen image

Actions personnalisées dans le module Views Bulk Operations dans Drupal

Le module Views Bulk Operations est utilisé pour effectuer des opérations en masse sur des résultats dans des tableaux ou d'autres éléments créés avec Views. Dans cet exemple, je vais vous montrer comment ajouter votre propre action qui changera l'état (Workflows) des entrées sélectionnées.

vbo13

L'action est effectuée sur toutes les entrées sélectionnées et mise en œuvre automatiquement dans des files d'attente par lots afin de ne pas surcharger le système et de ne pas "crasher" la page lorsque le processus prend trop de temps. Si vous savez ce que vous faites et que vous avez des raisons pour cela, vous pouvez désactiver l'option de mise en file d'attente dans la configuration du champ.

Installation et configuration de VBO

Le module Views Bulk Operations peut être installé en téléchargeant et en décompressant le package dans le répertoire modules/contrib ou en utilisant la commande composer, qui téléchargera la dernière version stable du module.

composer require drupal/views_bulk_operations

Après l'installation, le module n'a pas besoin d'être configuré de quelque manière que ce soit, vous devez simplement ajouter le champ approprié à la page (ou au bloc) créée par le module Views.

  • Ajouter une nouvelle vue de contenu qui crée la page.
  • Définir le format d'affichage sur Tableau. Ce n'est pas nécessaire, les cases à cocher sur le tableau semblent simplement plus naturelles
  • Ajouter le champ de titre
  • Ajouter le champ des opérations en masse de Views

vbo3

Configuration d'action pour un champ VBO

Dans la configuration du champ, vous pouvez indiquer quelles actions de masse peuvent être réalisées sur les résultats. Il existe plus d'une douzaine d'actions prédéfinies, telles que :

  • suppression des entrées
  • publication
  • mise en avant

vbo4

La liste ci-dessus est compatible lorsque la vue affiche du contenu. Si vous ajoutez la vue qui affiche les utilisateurs, vous remarquerez que la liste a des actions différentes.

Ajouter sa propre action à VBO

Le but est d'ajouter vos propres actions sur les entrées (Contenu) qui changeront l'état (Workflows) des entrées sélectionnées.

Les états des entrées ne sont pas disponibles immédiatement après l'installation de Drupal. Pour ce faire, vous devez activer deux modules supplémentaires directement dans Drupal, vous n'avez pas besoin de télécharger autre chose.

Allez à la page des modules - admin/modules

Activez les modules : Workflows et Content moderation

vbo7

Configuration des Workflows

Pour les besoins de cet article, j'utiliserai les états définis automatiquement pour le type Éditorial, qui est disponible immédiatement après l'activation du module Content moderation.

Vous devez simplement activer un type de transition d'état donné pour les types de contenu sélectionnés.

  • Sur la page admin/config/workflow/workflows, modifiez le type Éditorial
  • Définissez le type de contenu Article

vbo9

Cette opération ajoutera un nouveau champ à chaque formulaire d'ajout/édition d'article.

vbo10

Pour la vue où se trouve le champ VBO, ajoutez

  • un champ affichant l'état d'une entrée donnée - Contenu : État de modération
  • un filtre qui limitera l'affichage des entrées du type Article

Si un filtre restrictif limitant les entrées aux seules publiées Contenu : Publié (= Oui) est ajouté, alors enlevez-le. Il bloquera l'affichage des entrées qui ont un état, par exemple, Brouillon ou Archivé, qui ne sont pas publiées par définition.

Code de votre propre action

Créez votre propre module et activez-le. Dans mon cas, le module s'appelle d_workflows

Dans le répertoire du module, créez une structure de répertoiressrc/Plugin/Action

Créez-y un nouveau fichier de classe pour l'action de changer l'état de l'entrée en Publié.

Nom de fichier : PublishNodeAction.php

/**
 * Modération de contenu : publier le nœud.
 *
 * @Action(
 *   id = "d_workflows_publish_node_action",
 *   label = @Translation("Publier le nœud (moderation_state)"),
 *   type = "node",
 *   confirm = TRUE
 * )
 */

class PublishNodeAction extends ViewsBulkOperationsActionBase {

L'annotation de classe est importante ici.

Vous définissez un id pour l'action – cela peut être n'importe quelle valeur unique. Il est utile d'inclure dans son nom le nom du module et ce que fait l'action donnée.

Label est la valeur qui apparaîtra dans la configuration du champ VBO

Type est le type d'entité pour lequel la nouvelle action sera disponible. Dans ce cas, il s'agit de node, mais cela peut être, par exemple, user, taxonomy_term, ou tout autre.

Cette classe hérite de ViewsBulkOperationsActionBase

Elle nécessite la déclaration de deux méthodes :

  • execute() - ce qui doit être exécuté pour chaque enregistrement
  • access() - qui peut effectuer l'action

Exemple de code pour la méthode execute()

/**
 * {@inheritdoc}
 */
public function execute(ContentEntityInterface $entity = NULL) {
  if (!$state = $entity->get('moderation_state')->getString()) {
    return $this->t(':title  - impossible de changer l'état',
      [
        ':title' => $entity->getTitle(),
      ]
    );
  }

  switch ($state) {
    case 'archived':
    case 'draft':
      $entity->set('moderation_state', 'published');
      $entity->save();
      break;
  }

  return $this->t(':title état changé en :state',
    [
      ':title' => $entity->getTitle(),
      ':state' => $entity->get('moderation_state')->getString(),
    ]
  );
}

La première condition vérifie si l'entité donnée a l'option de réglage de l'état activée.

Dans ce cas, il ne s'agit que de Article. Lorsque l'action est initiée sur des entrées sans états activés (vide $entity->get('moderation_state')->getString()), elle sera interrompue et une information à propos de cela sera affichée.

La condition peut être facilement étendue par exemple en vérifiant le type de contenu pour l'entité

$entity->bundle()

Plus loin dans le code, le statut actuel de l'entrée est vérifié et si la condition est remplie, le code change son statut en Publié.

$entity->set('moderation_state', 'published');

Exemple de code pour la méthode 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;
  }

Dans cette simple condition, il est vérifié si vous opérez sur des objets de type Node et si l'utilisateur exécutant l'action a l'autorisation de les éditer et de les mettre à jour. Sinon, le code retournera FALSE et l'action ne sera pas exécutée.

Le fichier entier PublishNodeAction.php ressemble à ceci :

<?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;

/**
 * Modération de contenu : publier le nœud.
 *
 * @Action(
 *   id = "d_workflows_publish_node_action",
 *   label = @Translation("Publier le nœud (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  - impossible de changer l'état',
        [
          ':title' => $entity->getTitle(),
        ]
      );
    }

    switch ($state) {
      case 'archived':
      case 'draft':
        $entity->set('moderation_state', 'published');
        $entity->save();
        break;
    }

    return $this->t(':title état changé en :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;
  }
}

Une nouvelle action sera disponible dans l'édition du champ VBO

vbo14

Résumé

Les développeurs Drupal expérimentés Drupal ainsi que les consultants Drupal s'assurent que l'ajout de nouvelles actions à Views Bulk Operations est simple et se résume à créer une classe supplémentaire avec deux méthodes. Basé sur cet exemple simple, vous pouvez créer des actions en masse plus complexes sur des entités de différents types.

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