Planète

Par kgaut
Kevin Gautreau

Drupal 8 - Entité - Champ de base « link » (lien / URL)

Pour créer un champ de base de type lien, dans la définition de votre entité :

  1. $fields['mon_lien'] = BaseFieldDefinition::create('link')
  2. ->setLabel(t('Path'))
  3. // valeurs possible : LinkItemInterface::LINK_EXTERNAL ou LinkItemInterface::LINK_GENERIC
  4. ->setSetting('link_type', LinkItemInterface::LINK_GENERIC)
  5. //Activer ou non le titre
  6. ->setSetting('title', DRUPAL_DISABLED)
  7. ->setDisplayOptions('form', [
  8. 'type' => 'link_default',
  9. 'weight' => 0,
  10. ])
  11. ->setDisplayConfigurable('form', TRUE);

 

Par admin

Assemblée générale ordinaire

Comme tous les ans, le moment de l'AG est venu.

Nous vous donnons rendez-vous le jeudi 8 février prochain à 19h, à la maison des associations, Paris III (comme les années précédentes).

Après la présentation du rapport moral et du rapport financier de l'année, nous passerons à l'élection du nouveau bureau.
Vous souhaitez participer d'avantage ? Contactez nous avant l'AG.

N'oubliez pas que vous devez être à jour de votre cotisation pour prendre part au vote.

A jeudi !

https://www.meetup.com/fr-FR/drupal-france-francophonie/events/247382647/

En page d'accueil : 

Rendre inaccessible des pages non traduites avec Drupal 8

Il n'est pas rare lors de la réalisation d'un projet Drupal 8 multilingue, que les traductions des pages ne soient au rendez-vous lors de la mise en production. Autant la gestion du multilinguisme avec Drupal 8 est devenue réellement aisée à mettre en place, il y a désormais une différence fondamentale avec Drupal 7 : il est impossible de désactiver une langue. Soit on installe une langue, soit on la supprime. Cette modification est assumée, et volontaire, ceci afin de ne pas générer une complexité inutile pour une gain discutable.

Par kgaut
Kevin Gautreau

Drupal 8 & Search API - effectuer une requête dans le code

Avec Drupal et Drupal 8 encore plus la recherche passe la plupart du temps par Search API, une interface qui se branche devant plusieurs moteur de base de données (SolR, ElasticSearch, Database...)

Le plus souvent on va faire nos pages de résultats de recherche à l'aide de Views (et du module Search views pour Drupal 7). Mais dans certains cas on va vouloir avoir plus la main sur la recherche et donc aller interroger Search API directement dans le code.

Initialisation de la requête

Chargement de l'index (ici, le nom machine est « contenu »)

  1. // Chargement de l'index « contenu »
  2. $query = Index::load('contenu')->query();

Définition de la requête recherchée

Terme sur lesquels vont être effectués la requête.

  1. // On lancer la recherche sur « hello world »
  2. $query->keys("hello world");

Mode de la requête

  1. // Les différentes possibilités sont
  2. // - « direct » => Requête directe
  3. // - « terms » => Multiple words
  4. // - « phrase » => Single phrase
  5. $parse_mode = \Drupal::service('plugin.manager.search_api.parse_mode')->createInstance('direct');
  6.  
  7. // Optionnellement, on peut choisir un opérateur spécifique (OR ou AND)
  8. $parse_mode->setConjunction('OR');
  9.  
  10. // Affectation du mode de la requête
  11. $query->setParseMode($parse_mode);

Définitions des champs sur lesquels rechercher

Évidement c'est optionnel, par défaut la recherche se fera sur l'ensemble des champs « fulltext » contenus dans l'index.

  1. // Recherche uniquement sur le champ « body »
  2. $query->setFulltextFields(['body']);
  3.  
  4. // Recherche uniquement sur les champs « body » et « title »
  5. $query->setFulltextFields(['body', 'title']);

Ajout de conditions supplémentaires

L'objet retourné par Index::load('contenu')->query(); est une query classique drupal, sur laquelle on peut effectuer les traitement classique que l'on peut faire sur n'importe quelle Query drupal8.

À noter ici que le nom des champs doit être celui que l'on renseigne dans l'index, ils peuvent être différents des noms des champs définis dans nos types de contenu.

Quelques exemples en vrac :

Condition sur un champ boolean

  1. // le champ private doit être « TRUE »
  2. $query->addCondition('private', TRUE);

Condition sur un champ « varchar »

  1. // on veut que le contenu retourné soit un article ou un snippet
  2. $query->addCondition('type', ['article', 'snippet'], 'IN');

Condition sur un champ date

À noter le format de date à utiliser : "Y-m-d\TH:i:s\Z"

  1. $btf = \DateTime::createFromFormat('d/m/Y', '21/10/2015');
  2. $date_formatted = $btf->format("Y-m-d\TH:i:s\Z")
  3.  
  4. // Date de création de l'article > date définie
  5. $query->addCondition('created', $date_formatted, '>');
  6.  
  7. // Et l'inverse
  8. $query->addCondition('created', $date_to, ');

Pagination

Gestion de la pagination identique à une requête classique

  1. // Récupération des 20 premiers résultats.
  2. $query->range(0, 20);

Exécution de la requête et récupération des résultats

  1. $results_set = $query->execute();
  2.  
  3. //Nombre de résultats retournés
  4. $nb_results = $results_set->getResultCount()
  5.  
  6. // Récupération des entités
  7. foreach ($results_set->getResultItems() as $item) {
  8. $resultat = $item->getOriginalObject()->getValue();
  9. }

Sources

Pas trouvé grand chose sur le sujet à part cette page dans la documentation sur drupal.org : https://www.drupal.org/docs/8/modules/search-api/developer-documentatio…

Si vous avez d'autres liens pouvant aider, je suis preneur.

Par kgaut
Kevin Gautreau

Drupal - Création d'une table dans une base secondaire

Voici comment créer une table dans une base de donnée autre que celle par défaut.

Code à mettre dans votre MODULE.install

Le principe : création d'un « HOOK_schema fake » et utilisation des HOOK_install et HOOK_uninstall pour créer / supprimer cette table en sélectionnant la bonne base.

Le code est pour drupal 8 mais il peut facilement être adapté pour drupal 7.

  1.  
  2. use \Drupal\Core\Database\Database;
  3.  
  4. function MODULE_schema_autre_db() {
  5. $schema['users'] = [
  6. 'description' => 'Members informations',
  7. 'fields' => [],
  8. 'primary key' => ['id'],
  9. ];
  10.  
  11. $schema['users']['fields']['id'] = [
  12. 'description' => 'ID',
  13. 'type' => 'serial',
  14. 'not null' => TRUE,
  15. 'unsigned' => TRUE,
  16. ];
  17.  
  18. $schema['users']['fields']['uid'] = [
  19. 'description' => 'Drupal ID',
  20. 'type' => 'int',
  21. 'not null' => TRUE,
  22. 'unsigned' => TRUE,
  23. ];
  24.  
  25. $schema['users']['fields']['mail'] = [
  26. 'type' => 'varchar',
  27. 'length' => 255,
  28. ];
  29. return $schema;
  30. }
  31.  
  32.  
  33. function MODULE_install() {
  34. Database::setActiveConnection('NOM_DB');
  35. $schema = MODULE_schema_autre_db();
  36. foreach ($schema as $name => $table) {
  37. Database::getConnection()->schema()->createTable($name, $table);
  38. }
  39. Database::setActiveConnection();
  40. }
  41.  
  42. function MODULE_uninstall() {
  43. Database::setActiveConnection('NOM_DB');
  44. $schema = MODULE_schema_autre_db();
  45. foreach ($schema as $name => $table) {
  46. Database::getConnection()->schema()->dropTable($name);
  47. }
  48. Database::setActiveConnection();
  49. }

 

 

Par liber_t
Ines WALLON

Supprimer le theme hook suggestion sur certains champs

Quand on fait de l'intégration de thème sur Drupal 8, il est indispensable d'activer de debug Twig, le souci, c'est que parfois, on voudrait désactiver les suggestions pour par exemple, tester une condition.

exemple:

Par liber_t
Ines WALLON

Comment afficher des champs si une checkbox est coché ?

Il peut être intéressant d'afficher des champs supplémentaires si une checkbox est coché dans un formulaire.

Pour ce faire nous allons créer un type checkbox, un type container et en exemple un type url ainsi qu'un textfield :

Par liber_t
Ines WALLON

Automatiser la création d'un site Drupal sur sa machine de dev à l'aide d'Ansible

Il peut être intéréssant de pouvoir créer à la voler des sites Drupal sur sa machine de dev.

Cet article n'a pas pour vocation de vous faire un cours sur Ansible mais de vous montrer un example de ce que j'ai fait pour me faciliter la vie.

https://gitlab.famillewallon.com/ansible-playbook/drupal-site-install

Tout d'abord voici l'arborescence de mon playbook

Par liber_t
Ines WALLON

Automatiser le deploiement de drupal avec gitlab

Prérequis à mettre en place sur votre serveur

1) Avoir drush d'installé sur le serveur de production

2) Créer une clef ssh pour l'utilisateur apache et la rajouter sur votre serveur gitlab

3) Editer le virtualhost de drupal

Par admin

Idée cadeau pour Noël !

C'est bientôt Noël et la littérature traitant de Drupal en Français est encore trop rare, alors pourquoi ne pas soutenir l'initiative de Frédéric Simonet en mettant sous le sapin son livre "WordPress, Joomla, Drupal : Comprendre avant de s'engager" ?

Formateur depuis 2007 dans le domaine de la gestion de de contenu, Frédéric a écrit cet ouvrage qui permet de se faire une idée assez juste des forces et faiblesses des 3 CMS open source qui tiennent le haut du pavé en nombre de plateformes déployées.

Après une présentation générale des 3 outils, la première partie propose analyse systématique et détaillée de leurs performances sur des critères tels que l'édition des contenus, l'optimisation du référencement ou encore la sécurité. Elle se poursuit par un comparatif des coûts d'intégrations, basé sur un découpage très intéressant et précis en micro-tâches nécessaires à la mise en place d'un site web.

La seconde partie, la plus conséquente, décrit en détail les micro-tâches en question et vous permettra de réaliser un premier site après avoir décrit comment s'organise un projet web. Cette partie est très détaillée et prend le parti d'être didactique, mais ne fera pas du lecteur un expert dans les 3 technologies (on regrettera, par exemple, l'absence du module Pahtauto sur Drupal).

La lecture de "WordPress, Joomla, Drupal : Comprendre avant de s'engager" vous donnera une excellente vision des capacités des 3 outils. Attention cependant, en ce qui concerne Drupal, c'est la version 7 qui est détaillée dans la partie pratique et tout ce qui y est dit n'est plus toujours vrai dans Drupal 8 (plus besoin d'installer un module Wysiwyg, par exemple). Il semble également dommage d'être resté essentiellement sur des considérations techniques et fonctionnelles, et de ne pas avoir comparé d'avantage les écosystèmes (contributeurs, intégrateurs) qui font vivre ces logiciels open source.

Ces réserves n'enlèvent rien à la qualité d'un comparatif qui convient parfaitement à un lecteur qui souhaite choisir le bon outil pour créer lui-même son site.

Le trouver sur Amazon

Tags : 
Par liber_t
Ines WALLON

Comment afficher des champs si une checkbox est coché ?

Il peut être intéressant d'afficher des champs supplémentaires si une checkbox est coché dans un formulaire.

Pour ce faire nous allons créer un type checkbox, un type container et en exemple un type url ainsi qu'un textfield :

Par liber_t
Ines WALLON

Automatiser la création d'un site Drupal sur sa machine de dev à l'aide d'Ansible

Il peut être intéréssant de pouvoir créer à la voler des sites Drupal sur sa machine de dev.

Cet article n'a pas pour vocation de vous faire un cours sur Ansible mais de vous montrer un example de ce que j'ai fait pour me faciliter la vie.

https://gitlab.famillewallon.com/ansible-playbook/drupal-site-install

Tout d'abord voici l'arborescence de mon playbook

Appliquer un taux de TVA à un produit avec Drupal commerce 2

Drupal commerce 2 permet désormais nativement de gérer les différentes taxes et TVA à appliquer sur une boutique en ligne, quelque soit son pays et leurs règles respectives en cette matière. La plupart des modules contribués permettant de gérer ces éléments sur Commerce 1.x ne sont donc plus nécessaires. Découvrons comment utiliser le concept des Resolver de Drupal commerce 2.x pour définir le taux de TVA à appliquer sur différents produits.

Par kgaut
Kevin Gautreau

Drupal 8 - Rediriger l'accès aux pages d'un type de contenu en particulier

Ça vient à contresens du paradigme des noeuds, mais parfois on souhaite que les pages de détail d'un noeud d'un type de contenu en particulier ne soient pas accessible.

Avec quelques adaptation, ceci peut aussi fonctionner pour les pages de terme de taxonomie.

Voici comment faire :

1ère étape, déclarer un services dans mon_module.services.yml

  1. services:
  2.   mon_module.node_cp_redirect:
  3.   class: Drupal\mon_module\EventSubscriber\NodeCPRedirect
  4.   tags:
  5.   - { name: event_subscriber }

2ème étape, créer l'event subscriber: src/EventSubscriber/NodeCPRedirect.php dans le dossier de mon module.

Ici je vais chercher à rediriger tous les noeuds de type « communiques_de_presse » vers la vue « view.front_communiques_de_presse.page », mais cela peut-être évidement n'importe quelle route.

  1.  
  2. namespace Drupal\mon_module\EventSubscriber;
  3.  
  4. use Drupal\Core\Url;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\HttpFoundation\RedirectResponse;
  7. use Symfony\Component\HttpKernel\Event\GetResponseEvent;
  8. use Symfony\Component\HttpKernel\KernelEvents;
  9.  
  10. class NodeCPRedirect implements EventSubscriberInterface {
  11.  
  12. public static function getSubscribedEvents() {
  13. return [KernelEvents::REQUEST => [['redirectionCommuniquesPresse']]];
  14. }
  15.  
  16. /**
  17.   * Redirection des contenus de type communique_de_presse vers la vue de listing.
  18.   */
  19. public function redirectionCommuniquesPresse(GetResponseEvent $event) {
  20. $request = $event->getRequest();
  21.  
  22. if ($request->attributes->get('_route') !== 'entity.node.canonical') {
  23. return;
  24. }
  25. if ($request->attributes->get('node')->getType() !== 'communique_de_presse') {
  26. return;
  27. }
  28. $response = new RedirectResponse(Url::fromRoute('view.front_communiques_de_presse.page')->toString(), 301);
  29. $event->setResponse($response);
  30. }
  31.  
  32. }

 

Par kgaut
Kevin Gautreau

Drupal 8 - PHPMyAdmin - corriger l'erreur « Syntax error near '`value`»

Parfois on a pas le choix et l'on est obligé de passer par PHPMyAdmin pour récupérer un export de base de données.

Avec un dump de Drupal 8, lors de l'import, on peut tomber sur l'erreur suivante :

Requête SQL :

CREATE TABLE IF NOT EXISTS `key_value` ( `collection` varchar(128) CHARACTER SET ascii NOT NULL DEFAULT '' COMMENT 'A named collection of key and value pairs.' `value` longblob NOT NULL COMMENT 'The value.', PRIMARY KEY (`collection`,`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Generic key-value storage table. See the state system for'

MySQL a répondu: Documentation

#1064 - Erreur de syntaxe près de '`value` longblob NOT NULL COMMENT 'The value.',
  PRIMARY KEY (`collection`,`nam' à la ligne 3

C'est visiblement du à un bug dans une certaine version de PHPMyAdmin.

Il est possible de corriger cette erreur en modifiant manuellement le dump en deux étapes.

La première, remplacez le bloc suivant :

  1. CREATE TABLE IF NOT EXISTS `key_value` (
  2. `collection` varchar(128) CHARACTER SET ascii NOT NULL DEFAULT '' COMMENT 'A named collection of key and value pairs.'
  3. `value` longblob NOT NULL COMMENT 'The value.',
  4. PRIMARY KEY (`collection`,`name`)
  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Generic key-value storage table. See the state system for';

par

  1. CREATE TABLE IF NOT EXISTS `key_value` (
  2. `collection` varchar(128) CHARACTER SET ascii NOT NULL DEFAULT '' COMMENT 'A named collection of key and value pairs.',
  3. `name` varchar(128) CHARACTER SET ascii NOT NULL DEFAULT '' COMMENT 'The key of the key-value pair. As key is a SQL reserved keyword, name was chosen instead.',
  4. `value` longblob NOT NULL COMMENT 'The value.',
  5. PRIMARY KEY (`collection`,`name`)
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Generic key-value storage table. See the state system for';

Seconde étape, supprimez le bloc suivant :

  1. ALTER TABLE `key_value`
  2. ADD `name` varchar(128) CHARACTER SET ascii NOT NULL DEFAULT '' COMMENT 'The key of the key-value pair. As KEY is a SQL reserved keyword, name was chosen instead.';

Une fois cela fait, vous pourrez alors importer le dump sans soucis.

Plus d'informations sur ce problème en anglais : https://www.drupal.org/node/2496331

Pages