Planète

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

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

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

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

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

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 LaboRouge

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 LaboRouge

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

Audit de sécurité : 1 - PrésentationLaborouge
lun 23/07/2018 - 09:40

nébuleuse informatique sur fond bleu
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.

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
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
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: 

Pages