Fermer

décembre 22, 2023

Plugin Actions dans Drupal 10

Plugin Actions dans Drupal 10


Présentation du plugin d’action

Le module Actions est un module central de Drupal qui permet aux créateurs de sites et aux développeurs de créer des flux de travail automatisés en définissant des actions et des déclencheurs. Dans Drupal, les actions font référence à un ensemble de tâches ou d’opérations pouvant être effectuées sur un site. Par exemple, une action peut consister à envoyer un e-mail, à publier du contenu ou à mettre à jour un enregistrement de base de données.

Plugin d’actions personnalisées

Ici, une action Drupal est une fonctionnalité qui effectue une action spécifique lors de son exécution. Par exemple, Archive Node ou Make Content Sticky.

Les actions utilisent la classe d’annotation Drupal\Core\Annotation\Actionet étendre Drupal\Core\Action\ActionBase ou Drupal\Core\Action\ConfigurableActionBase (si l’action est configurable.)
La définition du plugin d’action est définie dans l’annotation du plugin. Il dispose de 3 clés requises :

/**
* Provides an Archive Node Action.
*
* @Action(
*   id = "ttn_archive_node",
*   label = @Translation("Archive Node"),
*   type = "node",
*   category = @Translation("Custom")
* )
*/

id – ID du plugin d’action
label – Nom du plugin d’action
type – Type d’entité auquel appartient le plugin d’action
catégorie – (facultatif) Catégorie du plugin d’action

Action du nœud d’archivage

Il s’agit d’une action simple qui ne nécessite aucune configuration. Lorsqu’il est exécuté, il change l’alias du nœud en /archive//. Il définit également le titre pour qu’il ait le mot « Archive » devant celui-ci. Enfin, il désactive les drapeaux persistants et promus.

<?php

namespace Drupal\ttn\Plugin\Action;

use Drupal\Core\Action\ActionBase;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\pathauto\PathautoState;

/**
 * Provides an Archive Node Action.
 *
 * @Action(
 *   id = "ttn_archive_node",
 *   label = @Translation("Archive Node"),
 *   type = "node",
 *   category = @Translation("Custom")
 * )
 */
class ArchiveNode extends ActionBase implements ContainerFactoryPluginInterface {

  /**
   * The Messenger service.
   *
   * @var \Drupal\Core\Messenger\MessengerInterface
   */
  protected $messenger;

  /**
   * Logger service.
   *
   * @var \Drupal\Core\Logger\LoggerChannelFactoryInterface
   */
  protected $logger;

  /**
   * The path alias manager.
   *
   * @var \Drupal\path_alias\AliasManagerInterface
   */
  protected $aliasManager;

  /**
   * Language manager for retrieving the default Langcode.
   *
   * @var \Drupal\Core\Language\LanguageManagerInterface
   */
  protected $languageManager;

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    $instance = new static($configuration, $plugin_id, $plugin_definition);
    $instance->logger = $container->get('logger.factory')->get('ttn');
    $instance->messenger = $container->get('messenger');
    $instance->aliasManager = $container->get('path_alias.manager');
    $instance->languageManager = $container->get('language_manager');
    return $instance;
  }

  /**
   * {@inheritdoc}
   */
  public function access($node, AccountInterface $account = NULL, $return_as_object = FALSE) {
    /** @var \Drupal\node\NodeInterface $node */
    $access = $node->access('update', $account, TRUE)
      ->andIf($node->title->access('edit', $account, TRUE));
    return $return_as_object ? $access : $access->isAllowed();
  }

   /**
   * {@inheritdoc}
   */
  public function execute($node = NULL) {

    /** @var \Drupal\node\NodeInterface $node */

    $language = $this->languageManager->getCurrentLanguage()->getId();

    $old_alias = $this->aliasManager->getAliasByPath('/node/' . $node->id(), $language);

    $title = $node->getTitle();
    $date = $node->created->value;
    $year = date('Y', $date);
    $new_title = $this->t('[Archive] | @title', ['@title' => $title]);
    $node->setTitle($new_title);
    $node->setSticky(FALSE);
    $node->setPromoted(FALSE);

    $new_alias="/archive/" . $year . $old_alias;
    $node->set("path", [
      'alias' => $new_alias,
      'langcode' => $language,
      'pathauto' => PathautoState::SKIP,
    ]);
    $node->save();
    $message = $this->t('Node with NID : @id Archived.', ['@id' => $node->id()]);
    $this->logger->notice($message);
    $this->messenger->addMessage($message);
  }

}

Pour obtenir Action Plugin Discoverable, vous devez ajouter system.action..yml, qui est placé dans configurer/installer.

La structure du .yml le fichier est présenté ci-dessous :

langcode: en
status: true
id: ttn_archive_node
label: 'Archive Node'
type: node
plugin: ttn_archive_node

Le plugin d’action créé peut être consulté sur le /admin/page de contenu.

Module d’activation existant des actions personnalisées

Qui est placé dans config/install. Créez le fichier .install et utilisez hook_update_N().

<?php 
// Install config. 
function ttn_update_9501(&$sandbox){ 
  $config_installer = \Drupal::service('config.installer'); 
  $config_installer->installDefaultConfig('module', 'ttn');
}

Run update.php


Conclusion

Dans le module Actions, vous pouvez créer un workflow personnalisé déclenché par un événement spécifique. Le module Actions fournit une interface conviviale pour définir et gérer les actions. Par exemple, lorsqu’un utilisateur soumet un formulaire sur votre site Web, vous pouvez déclencher une action pour envoyer une notification par e-mail à l’administrateur du site.

VOUS TROUVEZ CECI UTILE ? PARTAGEZ-LE






Source link

décembre 22, 2023