Planète Kgaut

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Ajouter une restriction par ip sur une route

Dans le fichier MODULE.routing.yml on va utiliser le requirement « _custom_access »

  1. module.ma_methode:
  2.   path: 'mon-module/mon-chemin'
  3.   defaults:
  4.   _controller: '\Drupal\module\Controller\monController::maMethode'
  5.   requirements:
  6.   _custom_access: '\Drupal\module\Controller\monController::maMethodeAccess'

Que l'on va implémenter dans notre contrôleur, ici monController.php :

à noter : les ip autorisées sont stockées en configuration via un formulaire de config, les ip sont séparées par une virgule, d'où le explode.

  1. public function maMethodeAccess() {
  2. /** @var Request $request */
  3. $request = \Drupal::request();
  4. $ipAutorisees = explode(',', \Drupal::config('module.methode')->get('allowed_ips'));
  5. return AccessResult::allowedIf(\in_array($request->server->get('REMOTE_ADDR'), $ipAutorisees));
  6. }

 

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Entité - Champ de base Fichier (File)

Voici comment créer un champ « fichier » au sein d'un type d'entité custom dans drupal 8 :

  1. $fields['programme_pdf'] = BaseFieldDefinition::create('file')
  2. ->setLabel(t('Programme PDF'))
  3. ->setSetting('file_directory', 'formations/programme') // dossier d'upload
  4. ->setSetting('max_filesize', '10MB') // taille max du fichier
  5. ->setSetting('file_extensions', 'pdf') // extensions autorisées, à séparer par un espace
  6. ->setSetting('description_field', FALSE) // si on veut activer un champ « description »
  7. ->setDisplayOptions('form', [
  8. 'label' => 'hidden',
  9. 'type' => 'file_generic',
  10. 'weight' => 4,
  11. ])
  12. ->setDisplayConfigurable('form', TRUE)
  13. ->setDisplayConfigurable('view', TRUE);

 

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Entitée & Views - Créer une relations inverse

Prenons deux types d'entités custom : « Bière » et « Brasserie » avec une relation 1-n entre les deux dans le sens :

  • Une bière provient d'une et d'une seule brasserie
  • Une brasserie peut proposer N bières

 Ainsi :

drupal-views-relations.png

En drupalisme, on aurait une propriété « entity_reference » au niveau de notre bière qui fera référence à la brasserie.

Dans views, si on fait un listing des bières, pas de soucis pour accéder au contenu de la brasserie depuis la bière, par contre l'inverse n'est pas possible.

Depuis un listing de brasserie, il n'est pas possible d’accéder aux bières de la brasserie.

Pour cela il faut utiliser la classe en charge de views_data, définie dans l'annotation de notre type d'entité brasserie :

drupal-entitee-annotation.png

Et voila le contenu de ce fichier

  1.  
  2. namespace Drupal\mon_module\Entity\ViewsData;
  3.  
  4. use Drupal\views\EntityViewsData;
  5.  
  6. class BrasserieViewsData extends EntityViewsData {
  7.  
  8. /**
  9.   * {@inheritdoc}
  10.   */
  11. public function getViewsData() {
  12. $data = parent::getViewsData();
  13. $data['brasserie']['bieres'] = [
  14. 'title' => t('Bieres'),
  15. 'help' => t('Lie la brasserie aux bières produites'),
  16. 'relationship' => [
  17. 'group' => t('bieres'), // Affiché en information dans la partie « relationship » de views
  18. 'label' => t('Actions de formation'), // Affiché en information dans la partie « relationship » de views
  19. 'base' => 'biere', // Table de base de l'entitée cible
  20. 'field table' => 'biere', // Table contenant le champ de l'entitée cible sur lequel on fera la jointure
  21. 'base field' => 'brasserie',// Champ de l'entité cible Champ sur lequel on fera la jointure
  22. 'relationship field' => 'brasserie_id', // Champ de l'entité source sur lequel on fera la jointure
  23. 'id' => 'standard',
  24. ],
  25. ];
  26. return $data;
  27. }
  28. }

Et voila le travail !

views-relationship.png

Par Kgaut
Adhérent
Kevin Gautreau

Drupal - PSA-2018-001 - Patch de sécurité déployé le 28/03/2018

Il vient d'être annoncé par l'équipe gérant la sécurité du CMS drupal qu'un gros correctif de sécurité pour drupal 7 et drupal 8 sera déployé mercredi 28/03/2018 entre 19h et 20h30 (heures Françaises).

On ne sait pas encore où se situe la faille. On sait seulement qu'elle semble (très) importante et qu'il est recommandé d'appliquer le patch immédiatement.

La dernière fois qu'un cas similaire s'est présenté, une fois le correctif disponible, les sites non patchés ont été très rapidement piratés. En effet : une fois que l'on a accès au patch, il est facile de trouver la faille corrigée et ainsi de l'exploiter sur des sites non protégés.

Si vous êtes développeur ou si vous gérez vos propres sites drupal, prévoyez une permanence mercredi soir pour vous occuper de ça.

Si vous avez un site drupal qui est géré par un tiers, assurez-vous qu'il soit au courant et qu'il s'en occupera au plus tôt.

Encore une fois, les versions 7 et 8 de drupal sont concernées.

Plus d'informations : https://www.drupal.org/psa-2018-001

 

 

Par Kgaut
Adhérent
Kevin Gautreau

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

Voici comment créer un Menu item (élément de menu) avec des paramètres GET.

Pour cela on utilise le fichier MON_MODULE.links.menu.yml (à noter que cela marchera aussi dans les fichiers MON_MODULE.links.action.yml et MON_MODULE.links.task.yml)

  1. formations.element:
  2.   title: 'Mon titre de menu'
  3.   weight : 2
  4.   route_name: view.front_formations.page
  5.   menu_name: menu-formation
  6.   options:
  7.   query:
  8.   label: 'prise-de-vue'
  9.   cat: 2

Ici l'url aura comme « query string » : ?label=prise-de-vue&cat=2

Pour rappel la clé menu_name attend le nom du menu dans lequel on veut placer l'élément de menu que l'on vient de définir.

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Entité - Champ de base « Nombre Décimal »

Le type nombre décimal peut-être pratique pour stocker tout nombre à virgule (un prix par exemple).

Voici comment attacher une propriété « nombre décimal » à un type d'entité personnalisé.

  1. $fields['prix'] = BaseFieldDefinition::create('decimal')
  2. ->setLabel(t('Prix'))
  3. ->setSetting('unsigned', TRUE)
  4. ->setSetting('scale', 2)
  5. ->setSetting('min', 0)
  6. ->setSetting('suffix', '€ TTC')
  7. ->setRequired(TRUE)
  8. ->setDisplayOptions('form', array(
  9. 'type' => 'number',
  10. 'weight' => 5,
  11. ))
  12. ->setDisplayConfigurable('form', TRUE)
  13. ->setDisplayConfigurable('view', TRUE);

 

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Générer un lien de « flagging » dans le code

Voici comment générer un lien pour « flaguer » une entité avec drupal 8 et le module flag :

  1. $type_entite_a_flaguer = 'user';
  2. $id_entitee_a_flaguer = $user->id();
  3. $id_du_flag = 'follow_user';
  4.  
  5. $f = \Drupal::service('flag.link_builder');
  6. $link = $f->build($type_entite_a_flaguer, $id_entitee_a_flaguer, $id_du_flag);

vous pourrez alors utiliser le lien dans un template en faisant par exemple :

  1. {{- link -}}

 

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Afficher un webform où l'on veut via le code

Pour récupérer et retourner un webform où l'on veut via le code (que ce soit dans un bloc, un controller...) on peut utiliser les lignes suivantes :

  1. // Ici, « contact » est le nom machine de mon webform
  2. $webform = \Drupal::entityTypeManager()->getStorage('webform')->load('contact');
  3. return $webform->getSubmissionForm();

 

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Domain Access - récupérer le domaine courant

Voici comment récupérer le domaine actif quand on utilise le module Domain Access pour Drupal 8 :

  1. $current_domain = \Drupal::service('domain.negotiator')->getActiveDomain();

Pour récupérer le domaine par défaut :

  1. $default_domain = \Drupal::service('domain.negotiator')->loadDefaultDomain();

 

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Entité - Champ de base « link » (lien / URL)

Pour créer un champ de base de type lien, dans la définition de votre entité :

  1. $fields['mon_lien'] = BaseFieldDefinition::create('link')
  2. ->setLabel(t('Path'))
  3. // valeurs possible : LinkItemInterface::LINK_EXTERNAL ou LinkItemInterface::LINK_GENERIC
  4. ->setSetting('link_type', LinkItemInterface::LINK_GENERIC)
  5. //Activer ou non le titre
  6. ->setSetting('title', DRUPAL_DISABLED)
  7. ->setDisplayOptions('form', [
  8. 'type' => 'link_default',
  9. 'weight' => 0,
  10. ])
  11. ->setDisplayConfigurable('form', TRUE);

 

Pages