Planète Kgaut

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Surcharger la classe de l'entité User

Sous Drupal 8 il est possible de surcharger la classe du type d'entité « User » afin de par exemple ajouter nos propres getters et setters ou de modifier l'affichage par défaut d'un nom d'utilisateur.

Pour cela il faut informer drupal qu'on va changer la classe de base pour le type d'entité User. Cela se passe dans le .module via le hook HOOK_entity_type_alter :

function monmodule_entity_type_alter(array &$entity_types) {  $entity_types['user']->setClass(\Drupal\monmodule\Entity\User::class);}

Et il faut ensuite définir la classe en elle même :

# web/modules/custom/monmodule/src/Entity/User.phplastname->value . ' ' . $this->firstname->value;  }   public function setDomain($domain_id) {    $this->set('field_domain_access', [$domain_id]);    return $this;  } }

Rien de foufou ici, j'ai surchargé la méthode « label », ainsi par exemple dans la listes des membres du site sera affiché en lieu et place de leur nom d'utilisateur, leurs nom et prénom. Il y a aussi un setter pour définir le domain de l'utilisateur.

Maintenant d'est que l'on chargera un utilisateur il sera de cette classe, et non plus de la classe de base.

Ceci est évidement possible pour l'ensemble des types d'entités (Noeuds, terme de taxonomy...)

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Surcharger la page de liste des termes de taxonomie

La page par défaut de liste des termes de taxonomie de drupal 8 n'est pas très flexible. Elle peut facilement être substituée à une vue mais dans ce cas on perd le « drag'n'drop » dans le cas d'une arborescence.

Pour garder ce comportement, mais pouvoir quand même ajouter des colonnes, il est possible de surcharger le formulaire gérant cette page.

Cela se passe en 3 étapes :

1. Déclaration du service d'alteration de la route

# mon_module.services.ymlservices:  mon_module.route_subscriber:    class: Drupal\mon_module\Routing\VocabularyOverviewRouteProvider    tags:      - { name: event_subscriber }

2. Altération de la route

get('entity.taxonomy_vocabulary.overview_form');    // Make a change for default taxonomy overview form.    $route->setDefault('_form', VocabularyOverviewTerms::class);    // Re-add the collection to override the existing route.    $collection->add('entity.taxonomy_vocabulary.overview_form', $route);  } }

3. Surcharge du formulaire

Note : Ici je ne modifie le formulaire que pour un seul vocabulaire (etudiant_promos) et j'ajoute une colonne « Domain ».

id() !== 'etudiant_promos') {      return $form;    }    // On ajoute l'entête du tableau    $form['terms']['#header']['domain'] = $this->t('Domain');     // On parcours les ligne pour ajouter notre colonne    foreach ($form['terms'] as $key => &$termRow) {      if(strpos($key, 'tid:') === 0) {        /** @var \Drupal\taxonomy\Entity\Term $term */        $term = Term::load($termRow['term']['tid']['#value']);        /** @var \Drupal\domain\Entity\Domain $domain */        $domain = $term->get('domain')->referencedEntities()[0];        $termRow['domain'] = ['#markup' => $domain->label()];      }    }    return $form;  } }

 

 

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

 

Pages