« Drupal 9 » : différence entre les versions

De wikilivois
Aller à la navigationAller à la recherche
Ligne 161 : Ligne 161 :


[https://www.drupal.org/project/spambot Spambot] protège le formulaire d'inscription de l'utilisateur contre les spammeurs et les robots spammeurs en vérifiant les tentatives d'inscription par rapport à la base de données en ligne Stop Forum Spam ( www.stopforumspam.com ).
[https://www.drupal.org/project/spambot Spambot] protège le formulaire d'inscription de l'utilisateur contre les spammeurs et les robots spammeurs en vérifiant les tentatives d'inscription par rapport à la base de données en ligne Stop Forum Spam ( www.stopforumspam.com ).
'''Entity Print'''
* https://www.drupal.org/docs/contributed-modules/entity-print
Le module Entity Print peut imprimer n'importe quelle entité au format PDF. Ce guide contient des informations sur la configuration initiale et sur la manière de générer et de styliser des fichiers PDF.


==Gérer les droits avec Permission by Terms==
==Gérer les droits avec Permission by Terms==

Version du 10 avril 2023 à 07:50


Drupal est un logiciel qui permet aux individus comme aux communautés d'utilisateurs de publier facilement, de gérer et d'organiser un vaste éventail de contenus sur un site web.

Des dizaines de milliers de personnes et d'organisations utilisent Drupal pour propulser des sites de toutes tailles et fonctions. - http://drupalfr.org/

Cette page donne explications concrètes d'installation et configuration de Drupal 9. Il existe aussi une page Drupal 7.


Installation & Mise à jour

Installation

#composer create-project drupal/recommended-project:^9 my_site_name_dir
  • Pour choisir le répertoire d'installation

Change directories to my_site_name_dir and edit the composer.json file to suit your needs. For example, to change the sub-directory from 'web' to something else, the keys to modify are the 'extra' sub-keys 'web-root' (under 'drupal-scaffold') and 'installer-paths'.

  • Paramétrer les hôtes de confiance

https://www.drupal.org/docs/installing-drupal/trusted-host-settings

<licode file=site/default/settings.php>

$settings['trusted_host_patterns'] = [
   '^livois\.com$',
   '^.+\.livois\.com$',
];

</licode>

Le niveau d'isolement des transactions par défaut pour MySQL, MariaDB et les bases de données équivalentes est "REPEATABLE READ". Ce paramètre avec Drupal peut entraîner des blocages sur les tables, ce qui rend le site très lent ou ne répond pas du tout. Le niveau d'isolation de transaction recommandé pour les sites Drupal est 'READ COMMITTED'.

Avec gandi.net, les droits de l'utilisateur root ne sont pas suffisants. Il est nécessaire de changer le fichier de configuration. <licode file=/srv/data/etc/mysql/custom.cnf> [mysqld] transaction_isolation="READ-COMMITTED" </licode>

L'instance doit ensuite être redémarrée.

En se connectant à mysql, la commande suivante permet de s'assurer que la modification a été effectuée.

mysql> show variables WHERE Variable_name LIKE "%_isolation";
+-----------------------+----------------+
| Variable_name         | Value          |
+-----------------------+----------------+
| transaction_isolation | READ-COMMITTED |
| tx_isolation          | READ-COMMITTED |
+-----------------------+----------------+

Mise à jour

  • Vérifier la version de drupal
#cd htdocs/www/
#composer show drupal/core | grep versions
  • Mettre à jour à la dernière version
#composer update "drupal/core-*" --with-all-dependencies


En cas de problème ...

#drush cedit core.extension

Le message d'erreur indique la table à nettoyer (souvent config ou key).

Remarques

<licode file=composer.json> "provide": { "drupal/media": "*" }, </licode>

Site de développement (staging)

Les fonctionnalités de D9

La page utilisateur

Editer les champs pour vos utilisateurs:

<drupal>/admin/config/people/accounts/fields

Modifier le formulaire de création d'utilisateur:

<drupal>/admin/config/people/accounts/form-display

Paramétrer l'affichage des pages utilisateurs:

<drupal>/admin/config/people/accounts/display

Les formats de texte et éditeurs

  • Vérifier que le module CKEditor 5 est actif.
  • Aller dans Configuration > Formats de texte et éditeur pour activer pour Full HTML et Filtered HTML l'éditeur CKEditor 5.

Le forum

Le forum fait partie du core de D9. Il en sort pour D10.

  1. Activer le forum dans extensions.
  2. Créer les termes de taxonomie correspondant aux thématiques de forum désirées
  3. Dans Structure>Types de contenu>Forum topic, ajuster les droits en fonction du type d'utilisateur

Les articles (livres)

Je traduis "Book navigation" en "Chapitres" dans Configuration->Traduction de l'interface utilisateur.

Afficher le saint du jour

Nous utilisons ici une page de base et le fonctionnement de Drupal pour afficher le saint du jour.

Le widget du site Nominis nous donne le code à intégrer dans une page de base. <licode file="Saint du jour">

<script type="text/javascript" src="https://nominis.cef.fr/widgets/widget.php?id=widget_nominis&format=2"></script>

</licode>

Créer la vue bloc "Aujourd'hui"

 Title: Aujourd'hui
 Format: Liste non mise en forme
 Afficher:  Champs
 Champs: Content : Body
 Critères de filtrage: Content : Identifiant (ID) (= id_de_la_page)

Les modules externes

Améliorations ergonomiques & fonctionnelles

Rendre les URLs plus lisibles avec pathauto

Le module Pathauto génère automatiquement des alias d'URL/chemin pour différents types de contenu (nœuds, termes de taxonomie, utilisateurs) sans que l'utilisateur n'ait à spécifier manuellement l'alias de chemin. Cela vous permet d'avoir des alias d'URL comme /categorie/mon-titre-de-node au lieu de /node/123 . Les alias sont basés sur un système de "modèle" qui utilise des jetons que l'administrateur peut modifier. La page d'aide (<drupal>/admin/help/pathauto) explique comment configurer et générer les alias.

Exemples de règles:

article: article/[node:book:root:title]/[node:title]
forum: forum/[node:taxonomy_forums:entity]/[node:title]
nouvelle: nouvelle/[node:title]
utilisateur: user/[user:display-name]

La mise à jour des alias peut se faire dans admin/content, en sélection le contenu à mettre à jour et choisissant Mettre à jour l'alias d'URL dans le menu Action.


Ouvrir le menu dans une autre fenêtre


Sécuriser l'envoi de mail en paramétrant le serveur smtp


Spambot

Spambot protège le formulaire d'inscription de l'utilisateur contre les spammeurs et les robots spammeurs en vérifiant les tentatives d'inscription par rapport à la base de données en ligne Stop Forum Spam ( www.stopforumspam.com ).


Entity Print

Le module Entity Print peut imprimer n'importe quelle entité au format PDF. Ce guide contient des informations sur la configuration initiale et sur la manière de générer et de styliser des fichiers PDF.

Gérer les droits avec Permission by Terms

  • Installer le module Permission by Term
  • Dans Taxonomy, créer un vocabulaire "diffusion", ajouter 2 termes: publique & privée
    • Pour le terme publique autoriser les rôles utilisateur anonyme, utilisateur authentifié, administrateur
    • Pour le terme privée, autoriser les rôles utilisateur authentifié, adminstrateur
    • Rajouter le vocabulaire dans les structures concernées (exemple: albums photos, vidéos, articles, nouvelles)

Remarque pour le forum: Ce fonctionnement avec un terme supplémentaire (diffusion) pose un problème pour le forum. Les droits d'accès sont donc donnés pour chaque terme (donc chaque rubrique) du forum. Ainsi, l'actualité familiale n'est accessible que des utilisateurs authentifiés alors que la page incidents du site est ouverte à tous.


Créer une galerie d'albums photos

Installation du module

Modules:

  • Photo Albums (photo_albums)

The only configuration needed for this module is to add an encrytion key and method to your settings.php file. You can choose any encryption method supported by OpenSSL (see below for a list of supported methods - this list is subject to change).

To add these values to your settings.php file, add them as follows: <licode file=settings.php> $settings['two_way_hashing_key'] = '3F4428472B4B6EE0655368566D597133C43677397A576826452948404D635166'; $settings['two_way_hashing_method'] = 'aes-256-ctr'; </licode>

The values above are just examples, but you must make sure you match the key length to the method chosen, in this case aes-256-ctr expects 64 hexadecimal characters.

  • Colorbox
    • il faut télécharger la bibliothèque colorbox dans le répertoire web/libraries/colorbox (qu'il faut créer)
  • Crop
  • Pathauto
  • File field Paths
    • j'utilise ce module pour protéger l'accès aux photos, en les renommant avec un aléas
    • Editer Administration>>Structure>>Types de média>>Modifier>>Photo Album Image et modifier le nom du fichier en [media:mid]_[random:number].[file:ffp-extension-original]

Configurer les droits utilisateurs pour qu'ils aient accès au media image.

Améliorer le rendu de la vue photo-albums

La page d'albums affiche 4 photos de chaque album qui sont très particulières car très focalisées sur le centre. Cela fait même l'objet d'une remontée.

Pour changer cela, il faut modifier le style d'image: Photo Album Thumbnail (110x110). Il est configuré initialement en "Focal Point Crop 110x110". En le remplaçant par "Mise à l'échelle et recadrage 110×110", le rendu est beaucoup plus acceptable. Il faut réimporter les photos pour que cela fonctionne.

Améliorer l'affichage d'un album avec les grilles CSS

Le contenu d'un album n'affiche qu'une seule colonne. C'est problématique quand l'album a beaucoup de photos. La solution est de changer les grilles CSS.

J'utilise pour cela le module asset_injector. L'inspection du code m'indique que je peux changer l'attribut field--name-field-photos pour les albums photo. Je crée donc la grille avec une injection que j'appelle albumphoto:

<licode file=albumphoto> .field--name-field-photos { display: grid; grid-template-columns: repeat( auto-fill, minmax(150px, 1fr) ); } </licode>

Configurer colobox en mode diaporama

Admin>Configuration>Media>Colorbox settings

Choisir Options > Personnalisé et activer les paramètres de diaporama

Vue Photos Aléatoires


  1. Installer les bibliothèques requise
  2. Installer views_slideshow
  3. Activer les modules Views Slideshow & Views Slideshow Cycle
  4. Créer la vue "Photos Aléatoires"
Format: Diaporama, choisir l'effet dans paramètres
Afficher: Media / Maître
Champs: Media:Name ou Media:Entité rendue
Critères de filtrage:  Media : Published (= True) &  Media : Media type (= Photo Album Image)
Critères de tri: Global : Au hasard (asc)


Bug d'affichage pour les utilisateurs connectés:

Avec le thème Olivero, le block ne s'affiche pas quand l'utilisateur est authentifié. Il affiche le code html suivant:

 <span data-big-pipe-placeholder-id="callback=Drupal%5Cblock%5CBlockViewBuilder%3A%3AlazyBuilder&args%5B0%5D=views_block__photos_aleatoires_block_1&args%5B1%5D=full&args%5B2%5D&token=xxxxxx"></span>

Le problème a été rencontré par d'autres personnes ici

En regardant les messages d'erreurs de la console du navigateur, le problème a été corrigé en renommant le répertoire jquery.hoverIntent - dans libraries - en jquery.hover-intent.

Mieux comprendre le module & la gestion des albums dans Drupal 9

Il est probablement possible de gérer des abums sans le module photo_albums ou en créant un module plus simple.

Photo Albums manque de souplesse : la lecture de son code permet de l'adapter à ses besoins.

Aussi, voici une liste de tables existantes en lien avec les albums photos:

  • file_managed: filename, fid=n° de l'image
  • file_usage: fid, type=media
  • media: mid=fid, bundle=photo_album_image
  • media_field_data: information sur la photo mais pas de lien avec le n° d'album
  • node_field_photos: fait le lien entre la photo et l'album: entity_id=n° d'album, field_photos_target_id=n° de photo
  • node: id=n° d'album, type=album

A noter les nombreuses tables associées aux révisions.

Créer une page vidéos avec Video Embed Field

Installer Video Embed Field avec composer.

Créer un contenu Vidéo avec 4 champs:

  1. Body (le texte)
  2. Le tag Diffusion (public, privé) pour préciser les droits d'accès (cf taxonomie)
  3. Le champ Vidéo distante de type Video Embeded - pour les vidéos diffusées sur Youtube
  4. Le champ Vidéo à déposer de type Fichier. Ce champ peut être paramétré
    • en autorisant les extensions suivantes: mp3, mp4, ogg, avi, mpeg, vob
    • le répertoire dans sites/default/files où les vidéos seront déposées
    • le renommage des fichiers avec l'utilisation d'une option random pour qu'il ne soit pas facile à trouver, pour des raisons de sécurité d'accès
    • la taille maximale du fichier qui est de toutes les façons inférieure à la limite paramétrée par PHP

Il n'y a pas grand chose à préciser pour l'affichage du formulaire si ce n'est de proposer une liste de sélection pour le champ Diffusion.

Nous définissons deux affichages, en cachant les libellés:

  • Default pour afficher la vidéo - Liens|Body|Vidéo distante|Vidéo à déposer
  • Accroche pour afficher plus simplement sur une page "Vidéos" - Vidéo distante|Vidéo à déposer

Reste la vue Vidéos familiales à paramétrer et ) afficher dans le menu:

Title: Vidéos familiales
Format: Grid (4 colonnes) | Afficher Content: Accroche
Critères de filtrage: Content : Published (= Yes) | Content : Content type (= Vidéo)
Critères de tri: Content : Écrit le (desc)

Webtrees

Ce module fournit une intégration limitée du site Web de généalogie Webtrees avec Drupal. Il est conçu pour fournir une prise en charge de l'authentification unique, Drupal étant le frontal. Il se connecte et se déconnecte essentiellement des deux serveurs en même temps. Il crée un utilisateur correspondant sur l'autre site si nécessaire.

Essais de thèmes

Modifier le CSS avec asset injector

Olivero

DXPR

#composer require 'drupal/bootstrap5:^2.0'
#composer require 'drupal/dxpr_theme:^5.0'

Activer le module DXPR Theme Helper via l'interface Extension.


Les fichiers logo.png téléversés se retrouvent dans le répertoire sites/default/files ou sites/default/files/dxpr_theme/images/

MAYO

Installer via git

#cd themes/contrib/
#git clone --branch '8.x-1.x' https://git.drupalcode.org/project/mayo.git
#cd mayo

Puis appliquer la patch

#wget https://www.drupal.org/files/issues/2022-07-11/add_drupal_10_compatibility_fix_install_configs-1011656-3.patch
#git apply -v add_drupal_10_compatibility_fix_install_configs-1011656-3.patch

Cela ne semble pas tout à fait suffisant pour la version 9.5.2 de Drupal. Une page d'erreur s'affiche quand on cherche à paramétrer le thème.

Pour aller plus loin

Changer les dates de modification

Mettre à jour les champs timestamp des tables:

  • node_field_data
  • node_field_revision

Remplir un champ taxonomy en masse

Nous avons utilisé le module Permission by term pour la gestion des accès, avec la création d'une taxonomie "Diffusion".

  • Le terme diffusion publique donne accès du node qui le porte aux utilisateurs anonymes
  • Le terme diffusion privée donne accès du node qui le porte aux utilisateurs authentifiés

Le module Permission by Term autorise l'accès par défaut à tous à l'ensemble des node à moins d'activer l'option "Permission mode"

This mode makes nodes accessible (view and edit) only, if editors have been explicitly granted the permission to them. Users won't have access to nodes matching any of the following conditions:
 - nodes without any terms
 - nodes without any terms which grant them permission

Dans ce cas, il est indispensable que le terme diffusion privée soit associée à chaque node, sinon l'accès est refusé aux personnes authentifiées.

La méthode rapide mais dangereuse - mettre à jour la base de données L'information de diffusion se trouve dans deux tables qu'il faut remplir:

  • node_field_diffusion (champs: bundle => content type du node, deleted =>0, entity_id =>nid du node, revision_id=>vid du node, langcode=>fr, delta=>0, field_diffusion_target_id)
  • taxonomy_index (champs: nid=>nid du node, tid, status=>1, sticky=>0, created=>(timestamp de 10 chiffres))

Les champs node_field_diffusion.field_target_id et taxonomy_index.tid doivent être mis à 24 (valeur de taxonomy_term_data).

La requête suivante donne les nodes qui n'ont pas de termes de diffusion (privée ou publique):

SELECT nid FROM `node` WHERE `node`.`nid` NOT IN (SELECT `entity_id` FROM `node__field_diffusion`);

Avant de mettre à jour les tables node_field_diffusion et taxonomy_index, il faut les sauvegarder par prudence.

Les deux requêtes suivantes donnent les accès "privés" à l'ensemble des nodes de type 'book' pour lesquels ces accès n'étaient pas définis:

INSERT INTO `node__field_diffusion` (`bundle`, `deleted`, `entity_id`, `revision_id`, `langcode`, `delta`, `field_diffusion_target_id`) 
SELECT 'book', '0', `node`.`nid`, `node`.`vid`, 'fr', '0', '24'
FROM `node` 
WHERE node.type='book' AND `node`.`nid` NOT IN (SELECT `entity_id` FROM `node__field_diffusion`);
INSERT INTO `taxonomy_index` (`nid`, `tid`, `status`, `sticky`, `created`)
SELECT entity_id,'24', '1', '0', '1679841080'
FROM `node__field_diffusion` 
WHERE `field_diffusion_target_id`=24 AND `node__field_diffusion`.`entity_id` NOT IN (SELECT `nid` FROM `taxonomy_index` WHERE `tid`=24);


Pistes pour la méthode "module" Créer un module: https://www.actency.fr/blog/cms-drupal/413-initiation-au-developpement-de-module-custom-sur-drupal-8

Liste des nodes.nid à mettre à jour

Mise à jour de la table node_field_diffusion

Mise à jour de la table index

Office365

  1. Installer l'application
  2. Définir les droits
  3. Créer un compte azur & microsoft365 s'ils n'existent pas déjà
  4. Créer un lien entre le site et l'environnement Microsoft365
    1. Aller sur la page https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps
    2. + Nouvelle inscription
    3. Donner le nom de l'application - livois.com
    4. Choisir le type de compte pris en charge - Locataire unique
    5. Donner l'url de redirection Web: https://drupal9.livois.com/web/o365/callback
  5. Aller dans Certificats & Secrets dans le menu de gauche
    1. Créer un Nouveau Secret Client et noter l'ID et la clé
  6. Aller dans API autorisées dans le menu de gauche
    1. Cliquer sur ajouter une autorisation
    2. Cliquer sur Microsoft Graph, Autorisations déléguées
    3. Les autorisations email/offline_access/openid/profile/User.Read sont cochées par défaut
    4. Cliquer pour les activer
  7. Configurer sites/default/settings.php

<licode file=sites/default/settings.php> // Office 365 connector client ID. $settings['o365']['api_settings']['client_id'] = '<client id>'; // Office 365 connector client secret. $settings['o365']['api_settings']['client_secret'] = '<client secret>'; // Office 365 connector tenant ID = ID de l'annuaire (locataire). $settings['o365']['api_settings']['tenant_id'] = '<tenant id>'; // Office 365 connector redirect URL after login. $config['o365.api_settings']['redirect_login'] = 'https://www.example.com'; // Office 365 connector redirect callback URI. $config['o365.api_settings']['redirect_callback'] = 'https://www.example.com/o365/callback'; </licode>

SSO

Ce module permet d'utiliser le Single Sign In (SSO) d'Office 365 vers Drupal.

Ce module ajoute un bouton "Connexion via SSO" au formulaire de connexion par défaut. En cliquant sur ce lien, les utilisateurs seront redirigés vers votre fenêtre de connexion Office et renvoyés à Drupal lors de la connexion. Le module crée automatiquement un utilisateur (s'il n'est pas déjà présent) et effectue une connexion pour cet utilisateur.

Lorsque ce module est activé et que les utilisateurs sont connectés avec leurs informations d'identification Microsoft, d'autres modules peuvent envoyer des requêtes à l'API Microsoft Graph. Certains des sous-modules l'utilisent déjà.

SSO User

Le module Office 365 SSO User permet de synchroniser les données d'Office 365 vers Drupal lorsque l'utilisateur se connecte à votre site.

Sur la page, vous pouvez activer la synchronisation et ajouter un mappage de champ de l'API Graph à <Site Drupal>/admin/config/system/o365/settings/sso_user

Ce mapping n'a un intérêt qu'avec l'utilisation du module profile de Drupal.

Onedrive

Tester avec un utilisateur connecté en allant à la page /my-onedrive

Dans les logs Drupal, j'obtiens une erreur :

"Tenant does not have a SPO license.

L'authentification Onedrive ne fonctionnerait que pour les comptes entreprises ou mon application est mal configurée. Quelques pages pour aller plus loin:

Google API

Authentification Google

Module d'authentification:

Créer une "application web" google

  • Ouvrir la console Google API
  • Créer un projet dans le tableau de bord (ex: Google Photos Livois)
  • Aller dans l'écran de consentement OAuth
    • Nom de l'application = nom du site = livois.com
    • Adresse e-mail d'assistance utilisateur
    • Page d'accueil de l'application : la page d'accueil du site
    • Ajouter le nom de domaine autorisé: livois.com
    • Adresse e-mail du développeur
  • Créer les identifiants
    • Choisir ID Client OAuth
    • Type d'application: Web application
    • Nom du client: drupal9
    • Redirection: https://drupal9.livois.com/web/google_api_client/callback - le https est obligatoire
    • Cela donne un ID Client et une clé secrète qu'il faut ensuite utiliser lors de la configuration du module
  • Configurer Drupal : Configuration > Google Api Client Listing
    • Name = Nom du client : drupal9
    • Client ID
    • Client Secret

Google Photos

    • Activer l'API : Photos Library API
      • Services : Google OAuth2 API (pas de Photo^^)
      • Scopes : sélectionner l'ensemble
      • Is Access Type Offline : laisser coché
      • Cliquer ensuite sur "authenticate" dans le champ Operations



Copyright

© 2021-2023 Christophe de Livois

Tête de GNU Vous avez l'autorisation de copier, distribuer et/ou modifier ce document suivant les termes de la GNU Free Documentation License, Version 1.2 ou n'importe quelle version ultérieure publiée par la Free Software Foundation; sans section invariante, sans page de garde, sans entête et sans page finale. Pour plus d'informations consulter le site de l'APRIL.