Drupal 7 : supprimer le titre pour certains types de contenu
Drupal 7 : supprimer le titre pour certains types de contenuLaborouge
mar 14/08/2018 - 00:06
Drupal 7 : supprimer le titre pour certains types de contenuLaborouge
mar 14/08/2018 - 00:06
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
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.
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 ?
Placer le hook_unistall dans le fichier .install de votre module
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 :
/** * Création d'une traduction */ function mespronos_tweaks_update_8005() { $chaine = 'Forgotten password'; $traduction = 'Mot de passe oublié'; $storage = \Drupal::service('locale.storage'); $string = $storage->findString(['source' => $chaine]); if ($string === NULL) { $string = new \Drupal\locale\SourceString(); $string->setString($chaine); $string->setStorage($storage); $string->save(); } 'lid' => $string->lid, 'language' => 'fr', 'translation' => $traduction, ))->save(); }
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.
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
Audit de sécurité : 4 - Fichiers inutilesLaborouge
mer 01/08/2018 - 09:18
Dans le fichier MODULE.routing.yml on va utiliser le requirement « _custom_access »
module.ma_methode: path: 'mon-module/mon-chemin' defaults: _controller: '\Drupal\module\Controller\monController::maMethode' requirements: _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.
public function maMethodeAccess() { /** @var Request $request */ $request = \Drupal::request(); }
L'audit de sécurité a révélé une faille importante : l'énumération des paiements.
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.
L'audit de sécurité a révélé une faille importante : l'énumération des paiements.
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.
Audit de sécurité : 3 - Énumération des paiementsLaborouge
mar 31/07/2018 - 00:13
L'audit de sécurité a révélé une faille de type XSS Stored. C'est une faille majeure.
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()).
L'audit de sécurité a révélé une faille de type XSS Stored. C'est une faille majeure.
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()).
Audit de sécurité : 2 - XSS StoredLaborouge
sam 28/07/2018 - 07:40
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.
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.
Audit de sécurité : 1 - PrésentationLaborouge
lun 23/07/2018 - 09:40
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é.
J'ai pu consacrer du temps à faire avancer Entity share :
test de bugs signalés
merge de patchs
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.