Planète

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Views - Récupérer un formulaire exposé

Pour un besoin spécifique, il fallait que je récupère un formulaire exposé de views pour l'afficher ailleurs.

Il fallait en fait qu'à un endroit j'affiche les filtres exposés et à un autre le tri exposé.

J'ai donc créé un bloc, qui récupère ce formulaire, masque un champ.

Voici donc comment récupérer un formulaire exposé :

  1. $view_name = 'ma_vue';
  2. $view_display = 'page';
  3.  
  4. $view = \Drupal\views\Views::getView($view_name);
  5. $view->initHandlers();
  6. $view->setDisplay($view_display);
  7. $form_state = new \Drupal\Core\Form\FormState();
  8. $form_state->setFormState([
  9. 'view' => $view,
  10. 'display' => $view->display_handler->display,
  11. 'exposed_form_plugin' => $view->display_handler->getPlugin('exposed_form'),
  12. 'method' => 'get',
  13. 'rerender' => TRUE,
  14. 'no_redirect' => FALSE,
  15. 'always_process' => TRUE,
  16. ]);
  17.  
  18. // Ici j'ajoute une info pour connaitre le contexte si le formulaire est altéré
  19. // afin de distiguer cette instance de formulaire de la « normale ».
  20. $form_state->addBuildInfo('exposed_block', TRUE);
  21.  
  22. $form = \Drupal::formBuilder()->buildForm('Drupal\views\Form\ViewsExposedForm', $form_state);
  23.  
  24. // Je masque le champs qui ne m'intéresse pas
  25. $form['sort_by']['#access'] = FALSE;

Dans le cadre d'un HOOK_form_alter je peux récupérer l'information "exposed_block" de la façon suivante :

<span class="re0">$form_state</span><span class="sy0">-></span><span class="me1">getBuildInfo</span><span class="br0">(</span><span class="br0">)</span><span class="br0">[</span><span class="st_h">'exposed_block'</span><span class="br0">]</span>

 

 

Par Artusamak
Julien Dubois

Les nouveautés de Drupal 8.4.0

Les nouveautés de Drupal 8.4.0

DuaelFr
jeu 16/11/2017 - 10:53

Toujours dans les temps, la nouvelle version mineure de Drupal, 8.4.0, est disponible depuis le 4 octobre 2017. Pour la première fois depuis deux ans, cette mise à jour contient des éléments qui pourront casser la rétrocompatibilité de certains sites. Comme pour la sortie des précédentes versions mineures de Drupal, et notamment la mise à jour vers Drupal 8.3.0, cet article vous dévoilera les détails des changements apportés ces six derniers mois.

Attention à la rétro-compatibilité !

La technologie progresse et l'équipe de maintenance du cœur doit faire des choix pour concentrer les efforts de la communauté sur des tâches à valeur ajoutée pour l'avenir. Parfois, il s'agit simplement de faire des arbitrages entre des fonctionnalités fondamentales pour l'avenir et la compatibilité avec des choix ou projets passés. Pour la première fois depuis la sortie de Drupal 8, cette version mineure introduit des changements qui pourraient poser des problèmes de compatibilité avec certains projets existants. Il est donc demandé à toutes les personnes en charge de la maintenance d'un site Drupal 8 d'être extrêmement vigilantes lors du passage à la 8.4.

Arrêt du support de Internet Explorer 9 et 10

Depuis avril 2017 Microsoft a arrêté le support de Internet Explorer 9 et 10. Ces vielles versions ont longtemps été la plaie des intégrateurs et, pour un outil comme Drupal, leur support représentait un coût assez important alors que le nombre d'utilisateurs concernés ne cessait de baisser. Officiellement, à partir de la 8.4.0, ces versions ne sont donc plus supportées. Cela signifie que les sites continueront de fonctionner comme précédemment mais qu'aucun effort supplémentaire ne sera alloué à cette compatibilité à l'avenir. Les hacks en place pour faire fonctionner certaines choses pour ces versions seront progressivement retirés à partir de Drupal 8.5.

Mise à jour majeure de Symfony et jQuery

Que vous soyez plutôt back ou front, pas de répit avec cette nouvelle version ! Symfony passe à la version 3.2.8+ (au lieu de 2.8+) et jQuery à la version 3.2.1 (au lieu de 2.2.4). Bien que ces deux versions aient une forte compatibilité descendante, si certaines de vos fonctionnalités s'appuient sur des fonctions dépréciées, elles cesseront probablement de fonctionner lors de la mise à jour. Cela a été le cas pour nous sur le menu déroulant d'un projet, par exemple. 

En cas de besoin, vous pouvez consulter le rapport de changement de la mise à jour de Symfony dans le cœur ou le guide de mise à jour de jQuery.

Rupture de compatibilité avec Drush

Du fait des divers changements dans les dépendances et dans la façon dont le cœur gère quelques services, Drush 8.1.14 et inférieur n'est pas compatible avec Drupal 8.4.0 et supérieurs. Si votre Drush est installé localement au projet (il devrait), un simple composer update devrait résoudre le problème. Dans le cas contraire, référez vous à la documentation officielle.

Attention, indépendamment de l'évolution du cœur de Drupal, Drush évolue également vers une nouvelle version majeure, Drush 9. Cette dernière est une réécriture complète de Drush et apporte son lot de nouveautés très intéressantes (on en parlera dans un autre article). Cependant, si vous avez des commandes drush personnalisées, des alias de sites ou des scripts qui utilisent cet outil de façon intensive, prenez votre temps pour monter de version car vous aurez un peu de travail pour adapter votre usage.

Ça bouge chez les expérimentaux !

Si vous avez suivi un peu nos articles concernant les nouveautés de Drupal 8, vous saurez déjà que les versions mineures sont l'occasion d'introduire de nouvelles fonctionnalités sous la forme de modules expérimentaux. Pour la version 8.4, nul nouveau module expérimental mais de nombreux changements.

Les modules Datetime Range, Inline Form Errors, Layout Discovery, Media et Workflows, sont désormais considérés comme stables et plus expérimentaux.

Media, n'est qu'un support pour les modules contribués et ne propose aucune fonctionnalité de lui même. Il est caché dans l'interface de gestion des modules pour éviter les confusions mais sera automatiquement activé en cas de besoin. Si vous utilisiez le module contribué Media Entity avec la précédente version de Drupal, sa version 2.0 contient un chemin de migration obligatoire pour transiter vers le module du cœur.

Workflows, en passant en version stable, a procédé à quelques derniers changements de fond. Selon votre usage du module (surtout si vous l'utilisez autrement qu'avec Content Moderation), vous devriez consulter le rapport de changement associé pour adapter votre code au nouveau fonctionnement. Si vous utilisez Content Moderation, qui a lui aussi subi son lot d'évolutions, vous devriez jeter un œil à son chemin de mise à jour non officiel qui vous permettra de continuer à vous en servir sans altérer vos données.

Migrate, Migrate Drupal et Migrate Drupal UI continuent leur progression vers le support complet d'un chemin de migration de Drupal 6 ou 7 vers Drupal 8. Par exemple, les champs date et node_reference de Drupal 6 pourront désormais être migrés vers Drupal.

Field Layout, dont nous avons détaillé le fonctionnement lors de la précédente mise à jour, a vu quelques corrections de bug mais pas de changement fondamental. Malgré son intérêt fonctionnel, il ne lui reste plus que quelques mois de période probatoire avant d'être éjecté du cœur pour retourner dans le mode des modules contribués.

Settings Tray et Place Blocks continuent leur progression. Le premier s'offre une version beta et pourrait donc accéder à la stabilité à la prochaine version mineure. Le second, lui, va progressivement disparaître pour être absorbé dans le module Block du cœur lors du passage à la 8.5 si tout se déroule comme prévu.

Évolutions de l'interface

Suite à des tests d'utilisabilité auprès d'un large panel d'utilisateurs finaux, il est apparu que le bouton déroulant était trop déroutant. La décision a donc été prise de revenir à un bouton simple doublé d'une case à cocher pour gérer la publication. Dans le cas de l'utilisation du module Workflows, la case à cocher est remplacée par le widget de gestion des états.

Évolution des boutons de publication de contenu entre Drupal 8.3 et 8.4.

Autre amélioration plus mineure : le choix du fuseau horaire dans le compte utilisateur se fait désormais via un menu déroulant groupé par continent et classé par ordre alphabétique (au lieu du classement par décalage horaire qui était utilisé auparavant).

Amélioration des performances

Afin d'adresser des problèmes de tables de cache grossissant jusqu'à atteindre plusieurs Gigas sur certains projets, une option a été ajoutée pour pouvoir poser une limite, par entrepôt de cache, au nombre d'enregistrements pouvant coexister. Cette limite, fixée par défaut à 5000 entrées, peut être ajustée en fonction des besoins du projet très facilement. Par exemple :

$settings['database_cache_max_rows']['bins']['cache_config'] = 500;

De plus, le temps maximal durant lequel un formulaire est conservé dans le cache avant d'avoir été soumis est désormais également configurable. Par défaut, cette durée est de 6 heures mais sur la plupart des sites, une durée bien plus courte est largement suffisante.

Enfin, parmi les autres améliorations, une réécriture du système de gestion des messages de statut permet une économie d'environ 10% de performances sur les pages qui ne contiennent aucun message.

 

Si vous voulez en savoir plus, vous pouvez lire le résumé complet des modifications apportées par la version 8.4.0 de Drupal sur le site officiel de Drupal.

 

 

Photo de couverture © Dominic Alves, retouchée par Happyculture.

Par GoZ
Fabien CLEMENT

Récupérer le nom de la table d'un champ

Récupérer le nom de la table d'un champ

Avec Drupal 8, non seulement nous avons de nouveau un champ propre à chaque type d'entité, mais en plus dans le cas où le nom du champ dépasse un certain nombre de caractères, son nom de table est composé d'un hash.

Dans le cas où l'on aurait besoin d'accéder directement à cette table, voici un morceau de code qui permet de retrouver dynamiquement le nom de la table.

GoZ
mar 14/11/2017 - 11:10

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Views - Changer le titre d'une vue en fonction du nombre de résultats

Utile dans le cadre d'une vue affichant des résultats d'une recherche via Search API :

  1. function MONMODULE_views_post_render(\Drupal\views\ViewExecutable $view) {
  2. if($view->storage->id() === 'NOM_MACHINE_VUE' && $view->current_display === 'NOM_MACHINE_AFFICHAGE') {
  3. $view->setTitle($view->getTitle() . ' (' . count($view->result) . ')');
  4. }
  5. }

 

Par flocondetoile
Adhérent

Modifier la position des méta données sur le formulaire de saisie d'un contenu avec Drupal 8

Les méta données liées à un contenu (paramètres de menu, options de publications, paramètres des chemins d'urls, etc.) sont par défaut affichées, dans les formulaires d'ajout et d'édition, dans un panneau latéral. Ceci a l'avantage de donner une visibilité immédiate sur ces options tout en rédigeant son contenu. Mais il est des cas d'usages où la position latérale de ces informations nuisent à l'ergonomie générale, car réduisant l'espace disponible pour les formulaires de saisie des contenus. Ceci peut être le cas notamment, si vous utilisez le module Field Group pour structurer et regrouper les informations à saisir. Nulle besoin ici d'un expert Drupal. Découvrons comment nous pouvons rendre la position de ces métadonnées paramétrables en fonction des besoins et de l'ergonomie générale du projet Drupal 8.

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 Kgaut
Adhérent
Kevin Gautreau

Drupal - afficher en live le contenu du watchdog avec drush

Parfois on se retrouve avec un gros White Screen Of Death sur son site, et impossible de se connecter.

Dans ce cas là il est pratique de pouvoir afficher en live le contenu du watchdog, c'est possible avec Drush et la commande watchdog-show :

drush @alias watchdog-show --tail --full --count=50

--tail affichera les nouvelles entrées du watchdog en direct

--full pour afficher le détail des erreurs

--count=50 permettra d'afficher les 50 lignes les plus récentes du watchdog.

2017-10-31-16-13-09-Screenshot-01.jpg

(Deux fois dans la journée que je recherche cette commande, au moins je saurai maintenant ou la retrouver...)

Par flocondetoile
Adhérent

Modifier de la configuration directement sur un site Drupal 8 en production

La gestion de la configuration native à Drupal 8 permet de très facilement passer des modifications ou des ajouts de la configuration depuis une instance de site (un environnement de développement par exemple) vers une autre instance de site (l'environnement de production). Ces exports et imports de la configuration d'un site sont réalisés d'un seul tenant : c'est à dire que c'est toute la configuration d'un site qui est mise à jour. Mais il existe des cas valides où certaines configurations peuvent et doivent être modifiées directement en production. Découvrons comment gérer ces cas particuliers avec le module Configuration split.

Par flocondetoile
Adhérent

DrupalCamp Lannion 27-29 octobre 2017

Le DrupalCamp se tiendra très prochainement, dans moins d'une semaine, les 27, 28 et 29 octobre 2017. C'est une occasion unique, pour qui travaille avec Drupal, de venir rencontrer ses pairs, d'échanger et de discuter, mais aussi de venir écouter quelques conférences pour le moins alléchantes. Et ce n'est pas parce qu'il se tient au bout du monde, à Lannion, que c'est une raison de ne pas venir. Bien au contraire, partez à l'aventure, explorez les tréfonds de l'inconnu, découvrez la magnifique Bretagne et Drupal n'aura plus aucun secret pour vous. Alors je vous y vois ?

Par ftorregrosa
Adhérent
Florent Torregrosa

Retours sur la DrupalCon Vienna 2017

J'ai pu assister à la Drupalcon Vienna 2017. Voici mes retours par rapport aux sessions et Bof auxquelles j'ai pu assister ou co-présentées.

Cette année, la Drupalcon a accueillie 1670 participants.

Une note sur les salles de bofs, elles étaient très bien pour les discussions (des chaises en cercles), mais pas de table, ni de vidéoprojecteur, donc pour les présentations c'étaient un peu compliquées.

Tags: 
Par flocondetoile
Adhérent

Filtrer des contenus par année avec Views sur Drupal 8

Il n'est pas rare de devoir proposer de filtrer certains contenus en fonction de dates, et notamment en fonction de l'année. Comment filtrer des contenus depuis une vue selon les années basées sur un champ date ? Nous disposons d'une solution immédiate en utilisant les modules Search API couplé à Facets. Mais si on ne dispose pas de ces deux modules pour d'autres raisons, cela peut être dommage de les installer juste pour cela. On peut arriver à nos fins assez rapidement avec une option native à Views, les arguments contextuels. Découvrons en quelques images comment y arriver.

Par Artusamak
Julien Dubois

Rendez-vous au Drupalcamp Lannion à la fin du mois

Rendez-vous au Drupalcamp Lannion à la fin du mois

Artusamak
lun 16/10/2017 - 17:46

Nous tentons de ne jamais manquer une occasion de soutenir la communauté Drupal française, c'est toujours un moment de plaisir et de partage. C'est également un bon prétexte pour nous retrouver au sein de l'équipe et de voyager un peu. Alors si vous aimez ou êtes curieux de Drupal et serez du côté de Lannion du 27 au 29 octobre 2017, venez nous retrouver. L'événement est gratuit pour y participer et vous pourrez profiter d'un super repas pour 15 € si vous réservez dès maintenant.

N'attendez plus !

Logo du DCLannion

 

 

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Formulaire - « ajouter un élément » et « supprimer un élément »

Voici comment dans un formulaire custom D8, avoir un ensemble de champ "multiples" dans un formulaire de config par exemple.

drupal8-formulaire-add-more.jpg

Dans mon exemple je n'ai que le champ « titre », mais c'est simplement pour alléger le snippet.

Le code en question :

config('monmodule.homepage');
    $pomoted_items = $config->get('promoted', []);
    $number_promoted = $form_state->getValue('number_promoted', count($pomoted_items));
    $removed = $form_state->getValue('removed_promoted', []);

    $form['number_promoted'] = [
      '#type' => 'value',
      '#value' => $number_promoted,
    ];
    $form['removed'] = [
      '#type' => 'value',
      '#value' => $removed,
    ];
    $form['promoted'] = [
      '#type' => 'fieldset',
      '#title' => t("À la une"),
      '#tree' => TRUE,
    ];
    for ($i = 1; $i  'fieldset',
        '#title' => t("À la une #@i", ['@i' => $i]),
      ];
      $form['promoted'][$i]['title'] = [
        '#type' => 'textfield',
        '#title' => $this->t("Titre"),
        '#default_value' => $item['title'],
      ];
      $form['promoted'][$i]['remove_' . $i] = array(
        '#type' => 'submit',
        '#value' => t("Supprimer l'élément #@i", ['@i' => $i]),
        '#submit' => array('::removeItem'),
        '#attributes' => [
          'class' => ['button--danger'],
          'data-toRemove' => $i,
        ]
      );
    }
    $form['promoted']['add_item'] = array(
      '#type' => 'submit',
      '#value' => t('Ajouter un autre élément'),
      '#submit' => array('::addPromotedItem'),
    );

    return parent::buildForm($form, $form_state);
  }

  public function addPromotedItem(array &$form, FormStateInterface $form_state) {
    $form_state->setValue('number_promoted', $form_state->getValue('number_promoted') + 1);
    $form_state->setRebuild();
  }

  public function removeItem(array &$form, FormStateInterface $form_state) {
    $removed = $form_state->getValue('removed_promoted', []);
    $removed[] = $form_state->getTriggeringElement()['#attributes']['data-toRemove'];
    $form_state->setValue('removed_promoted', $removed);
    $form_state->setRebuild();
  }

  public function submitForm(array &$form, FormStateInterface $form_state) {
    parent::submitForm($form, $form_state);
    $parsed = [];
    $promoted = $form_state->getValue('promoted');
    foreach ($promoted as $promoted_item) {
      if(is_array($promoted_item)) {
        $parsed[] = $promoted_item;
      }
    }
    $this->config('monmodule.homepage')->set('promoted', $parsed)->save();
  }
}

 

 
Par Mixalis44
Adhérent
Mickael Zafiriou
Développeur Drupal depuis 2013.

Promotion des autres blogs Drupaliste

Pour mon premier billet de blog, je vais faire la promotion des blogs de développeurs Drupal. 
Ces blogs m'ont inspirés et m'ont dépannés dans certains projets professionnels.

Par Mixalis44
Adhérent
Mickael Zafiriou
Développeur Drupal depuis 2013.

Les thèmes avec Twig

Présentation du fonctionnement des thèmes customs que Drupal
8 met à disposition.

De la déclaration en php en passant par le template Twig, du
rendu à la surcharge, cet article essaiera d'aborder
la majeure partie des points concernant les thèmes.

Pages