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 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 ».


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é.
juin 3, 2024
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 type de plugin créé par code
Hypothèses:
É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 ».
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
Partager :
Articles similaires