Planète

Par Christophe MOLLET
Christophe Mollet

Drupal 8

Drupal 8 vient d'être enfin dévoilé. Découvrez toutes les nouveautés de cette nouvelle version.

Par LaboRouge
Adhérent

Supprimer le titre pour certain type de contenu

Il peut être utile dans certains cas de supprimer l'affichage du titre sur des types de contenu.

Mais pour quelles raisons aurais-je besoin de faire ça ?

Dans Drupal, l'affichage du titre du contenu se fait en dehors du "node". C'est-à-dire que le titre sera forcément à un niveau supérieur par rapport au contenu et donc complètement détaché de celui-ci. Si l'on décortique les fichiers de template d'un thème, nous devrions trouver ce bout de code dans un fichier nommé page.tpl.php.


Drupal 7


Theme

Par liber_t
Ines WALLON

Astuce pour optimiser Composer dans vos containers Docker

Lorsque vous lancé Composer celui ci va télécharger la liste des packages au format JSON pour les stocker dans un dossier de cache.

Quand vous lancé votre container celui ci est vide, donc vous perdez 30s à chaque fois que vous le lancer.

L'idée ici est d'aller chercher votre dossier de cache local pour le monter sous forme de volume

Par Artusamak
Julien Dubois

Drupal 8 : déclarer un champ extrafield calculé (computed field)

Drupal 8 : déclarer un champ extrafield calculé (computed field)
admin
lun 13/08/2018 - 07:25

Lorsque vous devez insérer un champ sur une entité mais que cette donnée est calculée et n'est pas saisie par l'utilisateur, vous avez le réflexe de penser à un extra field.

Corps

Lorsque vous devez insérer un champ sur une entité mais que cette donnée est calculée et n'est pas saisie par l'utilisateur, vous avez le réflexe de penser à un extra field. C'est un bon début mais pour appliquer un formateur de champ, vous serez limités car cela n'est pas possible ! Fort heureusement, une solution a été introduite dans Drupal 8, il s'agit des computed fields.

Comment cela fonctionne-t-il ?

Au lieu d'utiliser le hook_entity_extra_field_info(), vous allez cette fois déclarer un hook_entity_bundle_field_info() et allez déclarer un base field auquel vous direz qu'il est calculé et indiquerez la classe qui fournie ses données. Avec du code c'est plus simple :

/**
* Implements hook_entity_bundle_field_info().
*/
function hc_core_entity_bundle_field_info(\Drupal\Core\Entity\EntityTypeInterface $entity_type, $bundle, array $base_field_definitions) {
  $fields = [];
  if ($entity_type->id() == 'node') {
    if ($bundle == 'blog') {
      $fields['blog_related_posts'] = BaseFieldDefinition::create('entity_reference')
        ->setLabel(t('Related posts'))
        ->setComputed(TRUE)
        ->setClass('\Drupal\hc_core\BlogRelatedPostsComputed')
        ->setDisplayConfigurable('view', TRUE);
    }
  }
  return $fields;
}

Avec ce code, si vous videz les caches, vous verrez apparaître dans la gestion de l'affichage de votre entité ce nouveau champ auquel vous pourrez appliquer les formateurs pertinents. Cela dépendra du type de données que vous aurez sélectionné sur lequel il se basera.

Jetons maintenant un œil à la classe qui fournit les données sources du champ.

Pour faire les choses simplement, je vous conseille d'étendre la classe de liste du type de données de votre champ (dans mon exemple je m'appuierai sur EntityReferenceFieldItemList) et nous utiliserons le trait dédié aux champs calculés (computed fields). La classe retourne les NIDs des nœuds qui partagent les mêmes catégories que le nœud actuellement consulté.

<?php

namespace Drupal\hc_core;

use Drupal\Core\Field\EntityReferenceFieldItemList;
use Drupal\Core\TypedData\ComputedItemListTrait;

class BlogRelatedPostsComputed extends EntityReferenceFieldItemList {
  use ComputedItemListTrait;

  /**
   * Computed related blog posts.
   */
  protected function computeValue() {
    $delta = 0;

    // It's a bit tricky, authors are not UIDs but NIDs because we are looking
    // for humans and humans are nodes, not users.
    $blog_categories = $this->getParent()->getValue()->get('field_category')->getValue();
    $blog_nid = $this->getParent()->getValue()->id();

    if (count($blog_categories) > 0) {
      foreach ($blog_categories as $category) {
        $category_ids[] = $category['target_id'];
      }

      $q = \Drupal::entityQuery('node')
        ->condition('type', 'blog', '=')
        ->condition('field_category', $category_ids, 'IN')
        ->condition('status', NODE_PUBLISHED, '=')
        ->condition('nid', $blog_nid, '<>')
        ->range(0, 5)
        ->sort('created', 'DESC')
        ->execute();
      if ($q) {
        foreach ($q as $rev => $r) {
          $this->list[$delta] = $this->createItem($delta, $r);
          $delta++;
        }
      }
    }
  }
}

Grâce au trait, on se concentre uniquement sur la récupération des valeurs qui nous intéressent et on utilise $this->createItem() pour remplir la collection de valeurs de $this->list.

Vous pourrez ajouter à cela quelques tags pour optimiser le rendu de vos données et vous voilà prêts à exploiter la puissance des champs calculés et rendus grâce à des formateurs de champs ! Plutôt simple, non ?

Catégories
Développement
Drupal
Drupal 8
Tags
formateur
champ
computed field
Par Kgaut
Kevin Gautreau

Drupal 8 - Créer la traduction d'une chaine de caractère dans le code

Dans un processus de déploiement, il est utile de gérer les traductions de chaînes de caractères dans le code, afin de pouvoir les déployer plus facilement.

Exemple avec cette fonction d'update à adapter en fonction de vos besoins :

  1. /**
  2.  * Création d'une traduction
  3.  */
  4. function mespronos_tweaks_update_8005() {
  5. $chaine = 'Forgotten password';
  6. $traduction = 'Mot de passe oublié';
  7. $storage = \Drupal::service('locale.storage');
  8. $string = $storage->findString(['source' => $chaine]);
  9. if ($string === NULL) {
  10. $string = new \Drupal\locale\SourceString();
  11. $string->setString($chaine);
  12. $string->setStorage($storage);
  13. $string->save();
  14. }
  15.  
  16. $translation = $storage->createTranslation(array(
  17. 'lid' => $string->lid,
  18. 'language' => 'fr',
  19. 'translation' => $traduction,
  20. ))->save();
  21. }

Pour un exemple réel, il sera plus pratique de passer par un tableau associatif (à deux dimensions si l'on veut importer plusieurs langues) qui sera parcouru par un ou deux foreach.

Par liber_t
Ines WALLON

Mise en place d'une architecture Docker + Drupal 8

Sa y est, j'ai enfin franchi le cap. j'ai migré tout mon site sur une architecture full Docker en dev, test et prod.

Je vais vous expliquer dans cet article, comment j'ai réussi à mettre tout ça en place

Par Kgaut
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 LaboRouge
Adhérent

Audit de sécurité : 3 - Énumération des paiements

L'audit de sécurité a révélé une faille importante : l'énumération des paiements.

L'application de base

L'utilisateur procède à une commande sur notre site. Nous lui proposons un règlement par CB et le redirigeons vers la plateforme de paiement en ligne. Une fois le paiement effectué, un contenu (node) est créé afin de récupérer les données relatives à la commande et l'utilisateur est redirigé vers une page de notre site lui indiquant le bon déroulement de l'opération. Cette page comporte deux informations sensibles : l'email de l'utilisateur et le numéro de commande.


Sécurité


Drupal 7

Par LaboRouge
Adhérent

Audit de sécurité : 2 - XSS Stored

L'audit de sécurité a révélé une faille de type XSS Stored. C'est une faille majeure.

L'application de base

Nous avons développé un formulaire maison via le Form API de Drupal 7.

Ce formulaire comporte une étape de validation (hook_form_validate()) et une étape d'envoi (hook_form_submit()).


Sécurité


Drupal 7

Par LaboRouge
Adhérent

Audit de sécurité : 1 - Présentation

Lors de la livraison en production d'un de nos sites, notre client nous a fait savoir son intention de réaliser un "audit de sécurité" sur notre travail ainsi que notre hébergement.

Je me suis réjoui de cette initiative. Cela veut dire que notre client a conscience des risques liés au développement d'un site web. Et j'y ai vu une belle opportunité de remettre en question mon travail, notre travail.


Sécurité


Drupal 7

Par flocondetoile
Adhérent

Faire une requête SQL sur plusieurs tables avec Drupal 8

Drupal 8 fournit une API, avec EntityQuery, qui simplifie de manière significative l'écriture de requêtes SQL pour récupérer et lister un ensemble de contenus. Ainsi il est très facile de récupérer une liste de contenus selon des critères et des conditions complexes, sans avoir besoin de connaître précisément les tables et leur syntaxe pour chaque champ associé à une entité. Mais nous pouvons avoir besoin de recourir à des requêtes plus complexes nécessitant d'associer des données issues de plusieurs tables.

Par ftorregrosa
Adhérent
Florent Torregrosa

Résumé des Drupal Dev Days 2018

Du 2 au 6 juillet ont eu lieu les Drupal Dev Days de 2018. Cette année, ils avaient lieu à Lisbonne où 404 participants ont pu se retrouver pour assister à des keynotes, sessions, bofs et sprinter.

Voici un résumé des sessions auxquelles j'ai assisté et des sujets sur lesquels j'ai sprinté.

Sprints

Entity share

J'ai pu consacrer du temps à faire avancer Entity share :

  • test de bugs signalés

  • merge de patchs

Tags: 
Par ftorregrosa
Adhérent
Florent Torregrosa

Mise à jour du plugin Composer drupal-l10n

Dans un article précédent Télécharger des traductions Drupal avec Composer, j'avais présenté une extension Composer pour télécharger des traductions Drupal.

Désormais cette extension est dans le groupe Github drupal-composer https://github.com/drupal-composer/drupal-l10n.

Tags: 
Par ftorregrosa
Adhérent
Florent Torregrosa

Réorganisation de mes images Docker et mise en place builds automatisés

Hier, j'ai réorganisé mes images Docker. Cet article va résumer les changements et expliquer pourquoi de telles modifications.

C'est un commentaire d'Ines Wallon à propos du fait que le hub Docker peut être paramètré pour construire les images Docker automatiquement qui a déclenché cette réorganisation.

Tags: 
Par LaboRouge
Adhérent

Les Rencontres Interactives #18 : La dette technique

J'aurais le plaisir de vous présenter ma conférence intitulé "La dette technique : état des lieux" dans le cadre des Rencontres Interactives de Caen le 6 juin prochain.

Aprés avoir traité le sujet de la dette technique sous Drupal 7 au Drupal Camp de Lannion, je voulais approfondir ce sujet sur un aspect moins "technique" et plus "gestion de projet".

Cette conférence est donc le fruit de cette réflexion.

Par flocondetoile
Adhérent

Basculer de Google Maps vers Leaflet et OpenStreetMap avec Geolocation sur Drupal 8

Le 2 mai 2018 Google a annoncé un changement de politique majeure concernant l'utilisation de ses services en ligne, et dont notamment son célèbre service de cartographie GoogleMaps et toutes ses API associées, pour embarquer ou générer des informations géolocalisées. Ce changement de politique rend désormais payant un service auparavant disponible gratuitement dans certaines limites de quota. Il est donc temps de cesser d'utiliser ces solutions, par habitude ou par facilité, et d'aller voir ce qui se fait très bien aussi ailleurs. Regardons comment sur Drupal 8 nous pouvons basculer sur une solution open source basée sur Leaflet et OpenStreetMap.

Par flocondetoile
Adhérent

Alerte de sécurité critique - Drupal core PSA-2018-003

L'équipe de sécurité de Drupal vient de publier ce jour, lundi 23 avril 2018, un bulletin d'alerte (Drupal 7 and 8 core critical release on April 25th, 2018 PSA-2018-003) annonçant la publication prochaine d'une mise à jour de sécurité critique. Cette mise à jour de sécurité sera publiée et diffusée le mercredi 25 avril entre 16h00 et 18h00 UTC (soit entre 18h et 20h heure française). Soit après-demain. Les 2 versions en cours de Drupal (Drupal 7 et Drupal 8) sont concernées par cette annonce.

Pages