Fermer

juin 3, 2024

Comment créer des plugins d’arguments de vues personnalisées dans Drupal

Comment créer des plugins d’arguments de vues personnalisées dans Drupal


Introduction

Drupal Views dispose d’une fonctionnalité robuste pour filtrer le contenu en fonction de n’importe quel champ à l’aide de filtres contextuels. Les filtres contextuels sont livrés avec différents types de filtres, tels que Content ID à partir d’une URL, un paramètre de requête, une valeur brute à partir d’une URL, etc. De plus, vous pouvez créer des types de filtres personnalisés si ceux existants ne répondent pas parfaitement à vos besoins.

Scénario: Dans la plupart des sites Web, il est courant d’afficher les URL dans un format propre, tel que « /blog/skys-limit-indias-growing-aviation-industry », plutôt que d’utiliser des formats génériques comme « node/34 ». Pour obtenir des URL propres dans Drupal, le module Pathauto est pratique pour configurer et générer des URL.

Considérons un scénario dans lequel nous travaillons avec un CMS Headless. Lors de la récupération des détails d’un nœud depuis le front-end, nous pouvons facilement transmettre l’ID du nœud (NID) pour récupérer les données d’une vue. Cependant, le frontal utilise souvent à la place l’alias d’URL propre du nœud. Dans de tels cas, nous devons récupérer les détails du nœud en utilisant l’alias.

« Par exemple, si l’URL de notre API est structurée comme suit : {base_url}/api/v1/read/blog-detail

où notre chemin d’accès à la page d’affichage est ‘/api/v1/read/blog-detail‘, nous devons transmettre l’alias dans la vue pour récupérer les détails du nœud.

Pour y parvenir, j’ai créé un plugin d’argument de vues nommé ‘ID d’entité par alias‘ et a appelé le chemin comme suit :

{base_url}/api/v1/read/blog-detail?alias=/blog/skys-limit-indias-growing-aviation-industry

nouveau plugin

nouveau type de plugin créé par code

Hypothèses:

  • Vous devez avoir une bonne compréhension des vues Drupal, en particulier avec les filtres contextuels.
  • Vous devez être familiarisé avec la création de modules personnalisés dans Drupal.
  • Vous devez comprendre les annotations et savoir comment écrire des plugins dans Drupal.

Étape 1 : Créer un nouveau module personnalisé

Créez un module personnalisé nommé « app_rest_api » ou utilisez tout autre module personnalisé existant.

Étape 2 : Créer un nouveau plugin

Maintenant, nous devons créer un nouveau type de plugin, @ViewsArgumentDefault. Pour ce faire, nous allons créer un fichier nommé EntityIdByAlias.php dans le répertoire suivant :

app_rest_api/src/Plugin/views/argument_default/EntityIdByAlias.php

Nous pouvons utiliser l’annotation ci-dessous pour générer le plugin viewsArgumentDefault

/**
* Default argument plugin to fetch Entity ID by Alias from the URL.
*
* @ViewsArgumentDefault(
* id = "entityid_by_alias",
* title = @Translation("Entity ID by Alias")
* )
*/

Le code final ressemble donc à ceci :

<?php

namespace Drupal\app_rest_api\Plugin\views\argument_default;

use Drupal\Core\Cache\Cache;
use Drupal\Core\Cache\CacheableDependencyInterface;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\views\Plugin\views\argument_default\ArgumentDefaultPluginBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\RequestStack;

/**
 * Default argument plugin to fetch Entity ID by Alias from the URL.
 *
 * @ViewsArgumentDefault(
 *   id = "entityid_by_alias",
 *   title = @Translation("Entity ID by Alias")
 * )
 */
class EntityIdByAlias extends ArgumentDefaultPluginBase implements CacheableDependencyInterface {

  /**
   * The request stack.
   *
   * @var \Symfony\Component\HttpFoundation\RequestStack
   */
  protected $requestStack;

  /**
   * Constructs a Raw object.
   *
   * @param array $configuration
   *   A configuration array containing information about the plugin instance.
   * @param string $plugin_id
   *   The plugin_id for the plugin instance.
   * @param mixed $plugin_definition
   *   The plugin implementation definition.
   * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
   *   The request stack.
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition, RequestStack $request_stack, RestApiService $aliasResolver) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    $this->requestStack = $request_stack;
    $this->AliasResolver = $aliasResolver;
  }

/**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->get('request_stack'),
      $container->get('demoapp_rest_api.alias_manager')
    );
  }

 /**
 * {@inheritdoc}
 */
  protected function defineOptions() {
    $options = parent::defineOptions();
    return $options;
  }

  /**
   * {@inheritdoc}
   */
  public function getArgument() {
    // Get the alias from the URL.
    $alias = $this->requestStack->getCurrentRequest()->query->get('alias');
    // Get Nid from the URL.
    $nid = $this->AliasResolver->getNidByAlias($alias);
    
    if (!empty($nid)) {
      return $nid;
    }
    return FALSE;
  }

  /**
   * Resolves a URL alias to a node ID.
   *
   * @param string $alias
   *   The URL alias to resolve.
   *
   * @return int|null
   *   The node ID corresponding to the alias, or NULL if not found.
   */
  public function getNidByAlias($alias) {
    $path = \Drupal::service('path.alias_manager')->getPathByAlias($alias);
    if (preg_match('/^\/node\/(\d+)$/', $path, $matches)) {
      return (int) $matches[1];
    }
    return NULL;
  }

  /**
   * {@inheritdoc}
   */
  public function getCacheMaxAge() {
    return Cache::PERMANENT;
  }

  /**
  * {@inheritdoc}
  */
  public function getCacheContexts() {
    return ['url', 'url.query_args'];
  }
}

N’oubliez pas de vider le cache après avoir écrit un nouveau plugin.

Ici, nous avons créé un getArgument fonction qui accepte l’argument actuel de l’URL, qui dans notre cas est l’alias, et le convertit en ID de nœud correspondant (NID).

Vous devez ajouter votre logique pour convertir l’alias en NID dans le getNidByAlias fonction.

Étape 3 : implémentez-le dans la vue

Ouvrez la vue et accédez au filtre contextuel dans les paramètres avancés de la barre latérale droite. Ajoutez un nouveau type de filtre, tel que l’ID du nœud. Configurez l’ID et choisissez « Fournir la valeur par défaut ». Sélectionnez le type de plugin nouvellement créé, qui dans notre cas est « Entity ID by Alias ​​».

filtre contextuel du blog

nouveau plugin

Nouveau type de plugin pour convertir la valeur d’alias en identifiant

Conclusion:

Nous pouvons créer différents types d’arguments dans le filtre contextuel pour filtrer les données en fonction de l’argument reçu. Une fois que nous avons ajouté notre logique, nous pouvons convertir cet argument en toute autre forme d’identifiant requis par le filtre contextuel. Cette approche peut résoudre de nombreux scénarios dans lesquels nous rencontrons des difficultés lors du filtrage des données. De plus, cela peut faciliter la construction d’une logique basée sur l’argument reçu, nous permettant ainsi de produire le résultat souhaité.

VOUS TROUVEZ CECI UTILE ? PARTAGEZ-LE






Source link