Planète Kgaut

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - créer des suggestions de templates pour des types d'entités personnalisés

Voici comment ajouter des suggestions de template à un type d'entité personnalisé en fonction du mode d'affichage (view_mode).

Ici mon module s’appelle « mon_module » et mon type d'entité personnalisé « resource » :

function monmodule_theme_suggestions_resource(array $variables) {  $suggestions = [];  $sanitized_view_mode = str_replace('.', '_', $variables['elements']['#view_mode']);  $suggestions[] = $variables['theme_hook_original'] . '__' . $sanitized_view_mode;  return $suggestions;}

Ainsi, si j'ai un mode d'affichage « teaser » je pourrais utiliser un template resource--teaser.html.twig à la place de celui par défaut : resource.html.twig

Vous pouvez évidement ajouter autant de suggestions de template que nécessaire, en fonction d'autres paramètres.

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Menu - Ajouter une classe à un élément de menu

Voici comment ajouter une classe css à un élément de menu défini dans un module.

mon_module.links.menu.yml

main.abonnez:  title: 'Abonnez-vous'  route_name: entity.node.canonical  route_parameters: { node: 6 }  menu_name: main  weight: 4  options:    attributes:      class:        - 'arrow'

la clé class étant un tableau, il est évidement possible d'ajouter autant de classes css que l'on veut.

Voir aussi :  Drupal 8 - Menu - Ajouter un élément de menu avec des paramètres GET

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Type d'entité personnalisé - supprimer un « basefield »

Voici comment supprimer le basefield « mon_champ_a_suppr » de mon type d'entité personnalisé « mon_type_entite ».

/** * Delete basefield mon_type_entite.mon_champ_a_suppr */function monmodule_update_8020() {  $update_manager = Drupal::service('entity.definition_update_manager');  $definition = $update_manager->getFieldStorageDefinition('mon_champ_a_suppr', 'mon_type_entite');  $update_manager->uninstallFieldStorageDefinition($definition);  return t('mon_type_entite : mon_champ_a_suppr was uninstalled');}

Lancez les mises à jours de base de données de drupal (drush updb par exemple) et hop, votre champ sera supprimé de votre base de données, évidement si votre type d'entité avait des enregistrements, les données concernants le champ supprimé seront perdues.

Certains diront qu'il est possible d'utiliser la commande drush entup, mais le mécanisme n'est plus présent depuis drupal 8.7. (mais si vraiment vous en avez besoin, vous pouvez regarder du côté du module Devel Entity Updates, à n'installer qu'en connaissance de cause !

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Ajouter un champ « alias d'url » (path) à un type d'entité personnalisé

Pour un type d'entité personnalisé, les alias peuvent se gérer à l'aide de motifs via le module pathauto.

Mais à l'instar des nœuds, parfois nous voulons pouvoir avoir la main sur l'alias directement.

Pour cela on peut ajouter un computed field à notre type d'entité afin de laisser la main au créateur du contenu de décider de l'alias.

Dans la méthode baseFieldDefinitions de notre type d'entité :

$fields['path'] = BaseFieldDefinition::create('path')  ->setLabel(t('URL alias'))  ->setDisplayConfigurable('form', TRUE)  ->setComputed(TRUE);

Ensuite il faut aller configurer l'affichage du formulaire afin d'ajouter ce champ :

Path Drupal 8

 

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Créer une page d'administration « overview » avec tous les sous-menus

Sur un site drupal 8, j'ai pour habitude de créer un élément de menu spécifique dans la barre d'administration qui comprend toutes les parties un peu métier du site.

La plupart du temps cette route renvoie vers une méthode « dashboard » d'un AdminController qui au mieux affiche quelques informations.

Voici comment transformer cette route, en listes des sous-menus, à la manière de la page « Configuration ».

Dans mon_module.routing.yml :

mon_module.admin.dashboard:  path: '/admin/mon_module/dashboard'  defaults:    _controller: '\Drupal\system\Controller\SystemController::overview'    link_id: 'mon_module.admin.dashboard'    _title: 'dashboard'  requirements:    _permission: 'access mon_module dashboard'

et voila le résultat :

Dashboard Overview

Pour information, voici comment ajouter cette route à la barre d'administration (dans mon cas en première place) :

dans le fichier mon_module.links.menu.yml :

mon_module.admin.dashboard:  title: 'Mon Module'  route_name: mon_module.admin.dashboard  description: 'Mon Module dashboard'  parent: system.admin  weight: -20

 

Par Kgaut
Adhérent
Kevin Gautreau

Premier regard sur Claro, le futur thème d'administration de drupal 8 et 9

Le thème d'administration de drupal 8 est seven, comme son nom l'indique il date de la version 7 de drupal, en 2011. Il a reçu un petit coup de brosse lors de la sortie de drupal 8 améliorant entres autre les aspects « responsives » du thème.

Un nouveau thème d'administration « Claro » devrait faire son apparition dans la version 8.8 de drupal (prévue pour le 4 décembre 2019). Ce thème sera en mode « expérimental », désactivé par défaut, et il sera mentionné, qu'il est là à des fins de tests uniquement.

Mais on peut dès maintenant tester ce thème sur des version antérieures de drupal 8 et remonter les soucis que l'on rencontre.

Rien de bien révolutionnaire, un thème plus aéré, un peu plus clair, une augmentation des contrastes pour l'accessibilité. Une amélioration du rendu sur petits écrans.

 

Écran de rédaction de contenu :

En responsive :

C'est un bon début ! Le thème est un peu trop lumineux pour mes yeux fragiles de développeurs qui préfère les thèmes sombres.

J'ai pour habitude d'utiliser le thème adminimal pour l'administration, on verra ce que donne l'évolution de Claro.

Pour installer claro via composer :

composer require drupal/claro

Pour suivre la liste des taches pour stabiliser claro afin qu'il arrive dans le core de drupal : https://www.drupal.org/project/drupal/issues/3066007

La page du thème sur drupal.org : https://www.drupal.org/project/claro

 

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 et composer, résoudre le problème « Package type "drupal-console-library" is not supported »

Sur des projets j'ai depuis quelques jours, lors d'un composer install, l'erreur suivante arrive :

Package type "drupal-console-library" is not supported

Pas encore eu le temps de creuser la cause, mais une solution que j'ai trouvé est d'ajouter la gestion des « drupal-console-library » dans la section installer-paths de mon fichier composer.json en ajoutant la ligne suivante :

  1. "vendor/drupal/{$name}": ["type:drupal-console-library"],

Voici la section en entier :

  1. "installer-paths": {
  2. "web/core": ["type:drupal-core"],
  3. "vendor/drupal/{$name}": ["type:drupal-console-library"],
  4. "web/libraries/{$name}": ["type:drupal-library"],
  5. "web/modules/_contrib/{$name}": ["type:drupal-module"],
  6. "web/profiles/_contrib/{$name}": ["type:drupal-profile"],
  7. "web/themes/_contrib/{$name}": ["type:drupal-theme"],
  8. "drush/_contrib/{$name}": ["type:drupal-drush"]
  9. }

Si quelqu'un a une idée de la raison, je suis preneur !

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Rediriger sur le listing des noeuds après la création d'un contenu

Sur une commande expresse de Vincent, voici comment modifier les formulaires de création / modification de nœud pour être redirigé sur la page de listing des nœuds plutôt que sur le nœud en lui même lors de la création ou de la modification d'un contenu.

1 - Altération du type d'entité

  1. # mon_module.module
  2. function mon_module_entity_type_alter(array &$entity_types) {
  3. $entity_types['node']->setFormClass('default', Drupal\mon_module\Entity\Form\CustomNodeForm::class);
  4. $entity_types['node']->setFormClass('edit', Drupal\mon_module\Entity\Form\CustomNodeForm::class);
  5. }

2 - Classe du formulaire

  1. # web/modules/mon_module/src/Entity/Form/CustomNodeForm.php
  2.  
  3. namespace Drupal\mon_module\Entity\Form;
  4.  
  5. use Drupal\Core\Form\FormStateInterface;
  6. use Drupal\node\NodeForm;
  7.  
  8. class CustomNodeForm extends NodeForm {
  9.  
  10. public function save(array $form, FormStateInterface $form_state) {
  11. parent::save($form, $form_state);
  12. $form_state->setRedirect('view.content.page_1');
  13. }
  14.  
  15. }

 

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - ajouter du css ou du javascript à un module

Voici comment attacher une librairie javascript ou un fichier css à un module custom dans drupal 8.

Dans les extraits de code ci-dessous, le nom machine du module sera « shoutbox ».

Déclaration de la librairie

  1. #shoutbox.libraries.yml
  2.  
  3. # nom de la librairie
  4. shoutbox :
  5.   js:
  6. # chemin vers le fichier relatif au module
  7.   js/shoutbox.js: {}
  8.   css:
  9.   theme :
  10. # chemin vers le fichier relatif au module
  11.   css/administration.css : {}

Voici comment attacher cette librairies dans un bloc, un preprocess de template ou un controller

  1. // suivant l'endroit ooù l'on attache la librairie, cela peut être $build, $variables...
  2. // la partie avant le slash définie le nom du module qui défini la librairie
  3. // la partie après le slash est le nom de la librairie choisie dans le fichier shoutbox.libraries.yml
  4.  
  5. $variables['#attached']['library'][] = 'shoutbox/shoutbox';

 

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Surcharger la classe de contrôle d'accès d'un type d'entité

Sous drupal 8, les types d'entités, comme les noeuds, viennent avec leur classe pour gérer le contrôle d'accès (création / modification / visualisation / suppression).

Il est possible de surcharger ces classes pour personnaliser plus finement ce contrôle.

Nous allons ici surcharger le contrôle d'accès pour un type d'entité « shoutbox », mais c'est le même principe pour les nodes.

  1. # mon_module.module
  2. function mon_module_entity_type_alter(array &$entity_types) {
  3. $entity_types['shoutbox']->setHandlerClass('access', \Drupal\mon_module\Entity\AccessControlHandler\CustomShoutboxAccessControlHandler::class);
  4. // Note : si on avait voulu surcharger le controle d'accès aux noeuds :
  5. // $entity_types['node']->setHandlerClass('access', \Drupal\mon_module\Entity\AccessControlHandler\CustomNodeAccessControlHandler::class);
  6. }

La classe en elle même, qui étant la classe de contrôle d'accès de base (définie dans l'annotation de notre type d'entité)

  1. # mon_module/src/Entity/AccessControlHandler/CustomShoutboxAccessControlHandler.php
  2.  
  3. namespace Drupal\mon_module\Entity\AccessControlHandler;
  4.  
  5. use Drupal\Core\Access\AccessResult;
  6. use Drupal\Core\Entity\EntityInterface;
  7. use Drupal\Core\Session\AccountInterface;
  8. use Drupal\shoutbox\Entity\AccessControlHandler\ShoutboxAccessControlHandler;
  9. use Drupal\shoutbox\Entity\Shoutbox;
  10. use Drupal\user\Entity\User;
  11.  
  12. class CustomShoutboxAccessControlHandler extends ShoutboxAccessControlHandler {
  13.  
  14. protected function checkAccess(EntityInterface $entity, $operation, AccountInterface $account) {
  15. /** @var Shoutbox $entity */
  16. if($operation === 'view' && $this->testPerso()) {
  17. if (!$entity->isPublished()) {
  18. return AccessResult::allowedIfHasPermission($account, 'administer shoutbox');
  19. }
  20. if ($this->autreTest()) {
  21. return AccessResult::allowed();
  22. }
  23. return AccessResult::forbidden('Shoutbox privée');
  24. }
  25. return parent::checkAccess($entity, $operation, $account);
  26. }
  27.  
  28. }

Ici je ne fais un contrôle d'accès que sur l'opération « view » pour la visualisation, je délègue tout le reste à la classe mère.

Pages