Planète

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
admin
lun 16/10/2017 - 17:46

null

Corps

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

 

 

Catégories
Drupal
Tags
drupalcamp
Par LaboRouge

La dette technique d'un site sous Drupal 7 : état des lieux

J'aurais le plaisir de vous présenter ma conférence intitulé "La dette technique d'un site sous Drupal 7 : état des lieux" dans le cadre du Drupal Camp de Lannion le vendredi 22 septembre.

Retour d'expérience après 6 ans de développement sous Drupal 7.

Après chaque livraison de site, il arrive que l'on cumule ce que l'on appelle la "dette technique".

Par LaboRouge

La dette technique d'un site sous Drupal 7 : état des lieux

J'aurais le plaisir de vous présenter ma conférence intitulé "La dette technique d'un site sous Drupal 7 : état des lieux" dans le cadre du Drupal Camp de Lannion le vendredi 22 septembre.

Retour d'expérience après 6 ans de développement sous Drupal 7.

Après chaque livraison de site, il arrive que l'on cumule ce que l'on appelle la "dette technique".

Par kgaut
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
Mickael Zafiriou
Développeur Drupal depuis 2013.

DrupalCamp 2017 à Lannion

Et c'est r'parti pour un DrupalCamp. Après Nantes nous voici conviés, pour ce rendez-vous 2017, à Lannion.

 

Par Mixalis44
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.

Par Mixalis44
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
Mickael Zafiriou
Développeur Drupal depuis 2013.

Et c'est r'parti

Et c'est r'parti pour un DrupalCamp. Après Nantes nous voici conviés, pour ce rendez-vous 2017, à Lannion.

 

Par kgaut
Kevin Gautreau

Pushover - Envoyer des notifications push depuis Drupal 8

Pour d'autres raisons j'ai utilisé le service de Pushover, qui permet d'envoyer des notifications push vers son téléphone mobile. Dans le principe, vous installer l'application sur votre téléphone / tablette (android ou apple) et via une api vous pourrez envoyer une notifications vers un, ou l'ensemble de vos devices.

J'ai aussi créé un module pour intégrer le service et ainsi pouvoir envoyer une notification push depuis son site Drupal 8. Quelle utilité ? À vous de voir, je l'ai personnellement utilisé pour recevoir une notification push en cas de nouveau commentaire ou bien d'alerte critique sur le site.

Le module est sur Github : https://github.com/kgaut/drupal-pushover, on peut l'installer via composer :

# Ajout du dépot
composer config repositories.drupal-pushover vcs https://github.com/kgaut/drupal-pushover
# Téléchargement du module
composer require drupal/pushover

Une fois installé on le configure via le formulaire dans Configuration / Services Web / Pushover Configuration

pushover-drupal-configuration.jpg

Le code pour déclencher une notification est le suivant :

\Drupal::service('pushover.sender')->sendNotification($title, $message, $url = NULL, $url_title = NULL);

Un exemple d'intégration pour envoyer une notification lors d'un nouveau commentaire :

/**
 * Implements hook_HOOK_insert().
 *
 * Send Pushover notification on new comment.
 *
 * @param \Drupal\comment\Entity\Comment $comment
 */
function kgaut_comment_insert(\Drupal\comment\Entity\Comment $comment) {
  $node = $comment->getCommentedEntity();
  $author = $comment->getAuthorName();
  $title = t('Nouveau commentaire sur Kgaut.NET');
  $description = t('@name à posté un nouveau commentaire sur « @post_title »', [
    '@name' => $author,
    '@post_title' => $node->label(),
  ]);
  $url = $node->url('canonical',['absolute' => TRUE]);
  \Drupal::service('pushover.sender')->sendNotification($title, $description, $url, t('Voir le post'));
}

Et voila le résultat :

pushover-notification-small.png

Bon évidement, on doit aussi pouvoir trouver des usages utiles :)

Ça n'est pas du drupal, mais j'ai aussi ajouté une notification quand quelqu'un se connecte en ssh sur mon serveur, je partagerai peut-être le script en question un de ces 4 !

Mettre en place un processus de publication sur Drupal 8

Drupal 8 dispose dans son coeur depuis sa version 8.3 des modules expérimentaux Content Moderation et Workflows permettant de mettre en place un processus de publication évolué. Découvrons les grands principes de fonctionnement de ces deux modules, somme toute très proche au demeurant de Workbench Moderation sur Drupal 7. Pour qui a déjà utilisé cette solution, il ne sera pas dépaysé.

Par kgaut
Kevin Gautreau

Drupalcamp Lannion : le programme est annoncé !

La sélection des sujets est terminée, le programme des deux jours de conférence du drupalcamp à Lannion des 27-28 et 29 octobre est maintenant connu !

Au programme : du drupal 8, du cache, du templating, des tests, du composer, de la config, des bonnes pratiques...

Deux salles, deux ambiances : une salle plus dédiées pour les débutants et les sujets plus larges et une salle avec sujets « barbus ».

D'autres salles seront aussi disponible pour des BOF (petites discussions improvisées ou suites informelles de sessions).

Personnellement je donnerai une présentation sur comment gérer son site drupal 8 avec composer et git le samedi matin.

Pour rappel, le 3e jour sera dédié aux ateliers et sprints.

Merci à toutes les personnes qui nous ont proposé des sujets !

Pour rappel, l'accès aux conférence est libre et gratuit, mais l'association propose des « packs weekend » comprenant les repas du midi, le café, le traditionnel sac de goodies et l’accès aux soirées communautaires, proposé à un prix plus que raisonnable (15€ pour les trois jours). Je ne peux que vous encourager à soutenir l'association et prendre votre pack : https://lannion2017.drupalcamp.bzh/reservations

Enfin, toujours pour proposer un tarif aussi accessible, il reste des packs de sponsoring disponible : https://lannion2017.drupalcamp.bzh/sponsors/forfaits

Par Artusamak
Julien Dubois

Formation Drupal 8 : De Drupal 7 à Drupal 8 (Session novembre)

Formation Drupal 8 : De Drupal 7 à Drupal 8 (Session novembre)
admin
lun 02/10/2017 - 12:13

null

Corps

Drupal 8.4.0 approche à très grand pas, sa sortie est prévue dans les semaines qui viennent. Vous êtes toujours entrain de travailler sur des projets Drupal 7 et lorgnez sur Drupal 8 ?

Profitez de notre formation pour sauter le pas. Nous organisons une session du 27 au 29 novembre en inter entreprise à Paris.

Vous pourrez apprendre dans cette formation comment fonctionnent sous Drupal 8 vos habitudes et connaissances Drupal 7. Blocs, menus, champs, formateurs, formulaires, modules, outils, industrialisation, cache sont quelques uns des thèmes couverts au cours de ces 3 jours. La liste complète est à découvrir dans le programme détaillé.

Combien coûte cette formation ? De moins en moins selon le nombre de participants ! Le coût est partagé entre chacun. 3 à 6 personnes peuvent participer à chaque session. Le prix global est de 4 500 € HT, ce qui vous donne une formation de 1 500 à 750 € pour trois jours bien remplis d'informations, de réponses à vos questions et de super déjeuners car bien manger est primordial ! (Et puis nous sommes français quand même...).

Je sens que vous ne pouvez plus résister, correct ? Et bien dans ce cas, je vous invite à nous laisser un message pour que l'on vous réserve une place ou lève les doutes / questions que vous pourriez vous poser !

On vous attend !

Catégories
Drupal
Drupal 7
Drupal 8
Par kgaut
Kevin Gautreau

Drupal 8 - Accèder à $_GET et $_POST

Récupérer $_GET['test'] :

<span>$</span>test<span> </span><span>=</span><span> \Drupal</span><span>::</span><span>request()->query->get</span><span>(</span><span>'</span>test<span>'</span><span>);</span>

Récupérer $_POST['test'] :

<span>$</span>test<span> </span><span>=</span><span> \Drupal</span><span>::</span><span>request</span><span>()-></span><span>request</span><span>-></span><span>get</span><span>(</span><span>'</span>test<span>'</span><span>);</span>

Récupérer un tableau associatif avec toutes les variables $_GET :

<span>$variables_get = \Drupal::request()->query-></span>all<span>(</span><span>);</span>

Récupérer un tableau associatif avec toutes les variables $_POST :

<span>$variables_post</span><span> </span><span>=</span><span> \Drupal</span><span>::request()->request-></span>all<span>(</span><span>);</span>

 

Par kgaut
Kevin Gautreau

Drupal 8 - Les EntityQuery par l'exemple

Remplacement des Entity Field Query en drupal 7, les Entity Query permettent d'effectuer des requêtes sur nos types d'entités, (custom ou non) selon leurs propriétés ou leurs champs (fields).

Elles sont une bonne solution pour faire des queries même avancées, sans avoir à faire des jointures à en perdre la tête.

Un exemple simple

Récupération et chargement de l'ensemble des utilisateurs activés.

//On commence par donner le type d'entité que l'on souhaite « requêter »
$query = \Drupal::entityQuery('user'); 
//On ajoute une condition, ici « status = 1 » pour ne récupérer que les utilisateurs actifs
$query->condition('status', 1); 
//On lance la requête et récupère les ids des utilisateurs.
$users_ids = $query->execute(); 
//on charge les utilisateurs en question
$users = User::loadMultiple($users_ids);

Que peut-on peut requêter ?

Sous drupal 8, tout est entité (ou presque), on peut ainsi faire des requêtes sur :

  • Les noeuds
  • Les blocs
  • Les utilisateurs
  • Les menus
  • Les éléments de menus
  • Nos types d'entités custom
  • ...

Bref, beaucoup de chose !

La déclaration du type d'entité se fait lors de la génération de la requête :

Pour requêter les utilisateurs
$query = \Drupal::entityQuery('user');

Pour requêter les noeuds
$query = \Drupal::entityQuery('node');

Les conditions

$query->condition(champ_ou_propriété, valeur, opérateur);

Le champ sur lequel on fait une condition peut -être soit une propriété (nid, changed, created, title, name...) ou bien un champ « field » (field_tags, field_image...)

Par défaut l'opérateur est : = (égal)

$query->condition('uid', 1);

mais on peut évidement le spécifier :

$query->condition('uid', $user->id(), '');

On peut utiliser le IN, afin de, par exemple récupérer et charger tous les users en fonction d'un field "interest" qui fait référence à des termes de taxonomies :

$interests = [127, 128, 27];
$query = \Drupal::entityQuery('user');
$query->condition('field_interests', $interests, 'IN');
$profils_similaires = $query->execute();

$users = User::loadMultiple($profils_similaires);

Avec un "LIKE", afin de tester le même département :

$query->condition('field_adresse_zipcode', substr($code_postal, 0, 2).'%', 'LIKE');

Conditions multiples

Aussi on peut ajouter plusieurs conditions, ici je fais un test sur la date de naissance, qu'elle soit bien comprise entre $min_date & $max_date :

$query = \Drupal::entityQuery('user');
$query->condition('field_interests', $interests, 'IN');
$query->condition('field_birthday', $min_date->format('Y-m-d'), 'condition('field_birthday', $max_date->format('Y-m-d'), '>');
$profils_similaires = $query->execute();

$users = User::loadMultiple($profils_similaires);

Avec des conditions Or

On peut utiliser des conditions logiques « OR », ici je veux récuperer les utilisateurs qui ont les mêmes centres d'intérêts (field_interests) OU qui sont manuellement mis en avant (field_pinned)

$query = \Drupal::entityQuery('user');

$condition_or = $query->orConditionGroup();
$condition_or->condition('field_pinned',1);
$condition_or->condition('field_interests', $interests, 'IN');

$query->condition($condition_or);

$profils_similaires = $query->execute();

$users = User::loadMultiple($profils_similaires);

Avec des conditions OR et AND

On peut faire des conditions un peu plus balaises, avec ici donc : soit les utilisateurs mis en avant (field_pinned) OU (qui ont les même centres d'intérêts (field_interest) ET qui sont nés après $max_date ET avant $min_date :

$query = \Drupal::entityQuery('user');

$condition_or = $query->orConditionGroup();
$condition_or->condition('field_pinned',1);

$condition_and = $query->andConditionGroup();

$condition_and->condition('field_interests', $interests, 'IN');
$condition_and->condition('field_birthday', $min_date->format('Y-m-d'), 'condition('field_birthday', $max_date->format('Y-m-d'), '>');

$condition_or->condition($condition_and);

$query->condition($condition_or);

$profils_similaires = $query->execute();

$users = User::loadMultiple($profils_similaires);

Gestion de la pagination et du nombre de résultats

$query->range(0, 20);

Gestion du tri

$query->sort('created');

ou en précisant le sens :

$query->sort('field_birthday', 'ASC');

 

Par Artusamak
Julien Dubois

Driesnote – State of Drupal – Drupalcon Vienne 2017

Ce billet reprend des notes capturées sur le vif en écoutant la keynote de Dries de la Drupalcon Vienne 2017. Il est parfois difficile de faire des phrases complexes sur le vif. Veuillez m’en excuser !

Drupal progresse malgré la perception que l’on peut en avoir. Le projet est en bonne santé. Voici quelques chiffres qui illustrent cette tendance sur core et l’écosystème de la contrib : +22% issues fermées, +28% de contributeurs supplémentaires, +26% de sociétés impliquées. 45% des contributions à Drupal viennent d’Europe.

Rappel amical, les contribs peuvent aussi être faites hors code. 🙂

En 1 an, le nombre de projets stable a plus que doublé, passant de 600 à 1400 projets stables suite à l’incitation des mainteneurs à publier une version stable de leurs modules.

Quelques uns des modules les plus populaires ont atteint un état stable pour D8 : Panels, Commerce, Search API, CTools, Tokens, Pathauto. Mais il en manque encore : Backup & Migrate, OG, Rules, Feeds.

Concernant la montée de version de D7 à D8, il ne reste que 12 issues critiques pour avoir la migration de core terminée via Migrate. (Ce qui est toujours énorme…).

Release tous les 6 mois, super positifs. Modules expérimentaux avancent vers stable de release en release (media, layout discouvery, date time range, inline form errors)

Division du marché CMS et multiplication des solutions. Les technos hors Drupal majoritairement utilisées par les agences sont principalement JS (node, angular, react, vues.js)

Question : pour qui est drupal ?Ambitious digital experiences

De petit à grand site (blog, portfolio, brochure, community management, SMB site with integeration, omni channel website, multisite platform) => REACH

Drupal n’est plus pour les petits sites.

Drupal est maintenant pour le monde de l’entreprise ? Pas seulement (omnichannel website, multisite platform). C’est adapté mais il y a de la place pour les utilisateurs type petite boite (SMB site with integrations)

Drupal grandit et évolue.

Le constat est que l’administration de Drupal est vieillissante. Drupal est parfois difficile à utiliser, les mises à jour sont complexes et coûteuses. L’objectif est de changer cela.

Sur quoi se concentrer ?

1. De puissants outils de site building.

PEOPLE – Création du rôle du product owner + a UX designer Yoroy est core committer (premier non dev)

PROCESS – Commencement par le design & product management (besoin ? Chemin ok sur les priorités ?) / Initiatives non dév (media, layout, workflows) / Démo de layout et du start theme de Drupal. (Workspaces – Groupes de config / contenus à publier). Media in core (library browser)

TOOLS – Good UX is built with JS. Devs want modern JS

Reco 1 => Plus de découplé headless (API First)

Reco 2 => Rendre Drupal plus simple à utiliser / Augmenter les compétences d’experts JS pour Drupal (+ de compétences externes) / Dogfood web services APIs (utiliser nos API)

Reco 3 => Créer des nouvelles UIs pour prendre le pli et explorer des nouvelles voies de construire avec du JS

Tendance de fond pour créer des interfaces côté Client

2. Des mises à jour et de la maintenance plus simples.

Updates régulières (6 mois majeure, 1 mois mineure) / de +en + d’outils complexes (composer, git, extra libs)

Users want Auto updates. Complexe à implémenter mais c’est un challenge intéressant à relever qui en vaut la chandelle en le construisant en plusieurs étapes.

Cirage de pompes de CG

 

Par ftorregrosa
Florent Torregrosa

La configuration en Drupal 8 : plusieurs besoins et solutions

Remarques générales sur la configuration en Drupal 8

Drupal 8 possède une API dans son noyau permettant l'export et l'import de configuration, aussi appelée CMI pour Configuration Management Initiative. Ce que ne permettaient pas nativement les versions précédentes.

Dans les versions précédentes

En Drupal 6 et 7, la solution la plus largement répandue pour palier à ce manque est l'utilisation du module Features permettant d'exporter la configuration dans des fichiers.

Tags: 
Par admin

Proposez votre programme au drupalcamp Lannion

Depuis un peu plus d'une semaine, il est possible de proposer une présentation pour compléter le programme du drupalcamp Lannion.
N'hésitez plus et proposez votre sujet.

Que vous proposiez ou non une conférence, il est toujours temps de réserver votre pack week-end.

Nous vous attendons nombreux du 27 au 29 octobre prochain à Lannion.

En page d'accueil : 
Par kgaut
Kevin Gautreau

Drupal 8 - Définir l'item de menu actif en fonction du type de noeud

Sur ce site, j'ai trois types de contenu :

  • Article
  • Snippet
  • Réalisation

Pour chacun de ces trois types de contenu, j'ai une vue (View) de listing qui correspond (cf le menu ci-dessus).

Par défaut quand on est sur la vue de listing des snippets par exemple, on a bien l'élément de menu "Snippets" qui est marqué comme actif, par contre quand on va sur le détail d'un snippet, on perd cette information. Nous allons voir comment sélectionner le menu item qui doit être actif en fonction du type de contenu sur lequel on se trouve.

1ère étape : surcharger le service MenuActiveTrail

dans mon module « kgaut » je créé le fichier KgautMenuActiveTrail.php dans le dossier src/Menu avec le contenu suivant :

routeMatch->getParameter('node');

    if ($node instanceof NodeInterface) {
      $bundle = $node->bundle();
      switch ($bundle) {
        case 'article':
          //Ici je demande à recherche le menu item qui utilise la route correspondant à mon type de contenu
          $links = $this->menuLinkManager->loadLinksByRoute('view.front_articles.page', [], $menu_name);
          break;

        case 'snippet':
          $links = $this->menuLinkManager->loadLinksByRoute('view.front_snippets.page', [], $menu_name);
          break;

        case 'realisation':
          $links = $this->menuLinkManager->loadLinksByRoute('view.front_realisations.page', [], $menu_name);
          break;
      }

      if (isset($links) && $links) {
        $found = reset($links);
      }
    }
    return $found;
  }
}

 

C'est bien beau, mais maintenant il faut signaler à Drupal que l'on a surchargé un de ses services. Pour cela il faut créer le fichier src/MonModuleServiceProvider.php (attention c'est normé !) Dans mon cas j'ai donc créé le fichier KgautServiceProvider.php dans le dossier src de mon module kgaut (oui je suis très égocentrique).

En voici le contenu :

getDefinition('menu.active_trail')->setClass('Drupal\kgaut\Menu\KgautMenuActiveTrail');
  }

}

Un petit vidage de cache plus tard, et on est bon !

Pages