Paragraphs

Le module paragraphs par l'exemple,
ou la rédaction de contenu sous stéroides

Présentation

Oliver Pierre / opi

Freelance Drupal - olivierpierre.net

Fabrice Scoyer

Freelance Drupal - www.flocondetoile.fr

Logo Flocon de toile

Introduction

  • drupal.org/project/paragraphs
  • C'est quoi paragraphs / a quoi ca sert ?
  • Pourquoi cette conférence ? ce module nous semble trop méconnu et sous utilisé

La génèse sur #drupal-fr

(13:27:41) opi> J'ai presque envie de proposer une conférence 
           sur le module *paragraphs*, en mode retour d'xp,
           exemple de ce qu'on peut faire de foufou avec paragraph ; 
           ca tenterai quelqu'un de la faire avec moi ? 
           (en mode a l'arrache, cela va sans dire)
(13:30:33) flocondetoile> opi: partant
(13:32:15) opi> cool

Avantages de paragraphs

  • Réutilisation de composants
  • Composition riche de pages complexes
  • Atomic design !!! Boom
  • Support des révisions / multilinguisme

Conception modulaire

Inconvénients

Y en pas !

Ou un tout petit peu ;-)

  • Les champs d'un paragraph mixent contenus et configuration
  • Multiplication des champs et des tables dans la bdd (penser aux configurations communes)
  • UI/UX peut être confuseIt's UGLY
  • On ne peut pas connaître à l'avance quels paragraphes sont disponibles sur un contenu (SEO, Page listing, etc.)

Soigner le backoffice !

## Usages de paragraphes - Adieu le body fourre-tout - Composition d'un contenu riche - Composition de pages avec des agencements complexes et maîtrisés - Donner accès aux éditeurs à des agencements de page d'atterrissage / immersives (composition modulaire)

Article / Page immersive

Un exemple de page fait avec un seul type de paragraphe

## Paragraphs vs Panel / Display Suite - Panel / display suite : approche Site builder. Nécessité de droits avancés pour configurer des pages - Paragraphs : on peut déléguer au rédacteur toute la mise en page, tout en conservant la maîtrise du rendu et du comportement responsive

Un grand pouvoir implique de grandes responsabilités

Maître Gims

Un grand pouvoir implique...

...de grandes responsabilités

## Types de paragraphes possibles
## Éléments de base - texte - titre - separateur - images - bouton / lien - chapeau, citation
## Éléments plus avancés - container / grille - texte + image + styles - entity reference - accordéon / onglets - block reference, vers des blocs statiques - views reference, pour listing automatiques de certains contenus - fichiers attachés ou ressources
## Éléments plus avancés - pictogrammes / images + texte - video (locale/embarquée) - diaporama / gallerie d'image - chiffres défilants / barres de progression - constructeur de requête / rendu - iframe - etc.
## Exemples réels *Attention, démo*

Titre

Texte

Media

Image

Liens avancés

Liens avancés

Section Image + Texte

Texte + image en arrière-plan

Texte + image à droite

Texte + image droite / gauche

Conteneur

Conteneur
+ Texte / Image au-dessus

Liste à puces avec pictos

Liste à puces avec pictos

Séparateur

Vidéo

Vidéo (avec conteneur)

Chiffres défilants / barres de progression

Chiffres défilants / barres de progression

Block reference

Accordéon / Onglets

Accordéon

Onglets

Galerie d'images

Ecrire son propre paragraph

  • Beaucoup de clics
  • Un zeste de code
  • Magic CSS : Magic

Du site building

Un zeste de code (image arrière-plan)


function MON_MODULE_preprocess_paragraph(&$variables) {
  // Overlay / background.
  $variables['overlay_color'] = FALSE;
  if ($paragraph->hasField('field_paragraph_overlay')) {
    if ($overlay_color = $paragraph->field_paragraph_overlay->value) {
      $variables['overlay_color'] = ['#plain_text' => $overlay_color];
    }
  }
}
          

{% block paragraph %}
  <div{{ attributes.addClass(classes) }}>
    {% block content %}
     ...
        {% if overlay_color %}
          <div class="paragraph-overlay"
            style="background-color: {{ overlay_color }};"></div>
        {% endif %}
     ...
    {% endblock %}
  </div>
{% endblock paragraph %}
          

Magic CSS


.paragraph-overlay {
  position: absolute;
  height: 100%; width: 100%;
  top: 0; z-index: 1;
}

.window-width .paragraph-overlay {
  width: 100vw;
  left: 50%; right: 50%;
  margin-left: -50vw; margin-right: -50vw;
}
          

ajout de classes - D7


function MON_MODULE_entity_view($entity, $type, $view_mode, $langcode) {
  if ($type == 'paragraphs_item' 
      && $entity->bundle == 'my_paragraph_bundle') {
    // Ajout d'une classe custom
    $entity->content['#classes_array'][] = 'my-custom-class';
  }
}
          

ajout de classes - D8


function MON_MODULE_preprocess_paragraph(&$variables) {
  // Image position.
  $variables['paragraph_attributes'] = new Attribute();
  if ($paragraph->hasField('field_image_position')) {
    if ($image_position = $paragraph->field_image_position->value) {
      $variables['paragraph_attributes']->addClass($image_position);
    }
  }
}
          

{% block paragraph %}
  <div{{ attributes.addClass(classes) }}>
    {% block paragraph_wrapper %}
      <div{{ paragrah_attributes.addClass('paragraph-wrapper') }}>
         ...
      </div>
    {% endblock %}
  </div>
{% endblock paragraph %}
          
## Modules contribués pour étendre paragraphs - [paragraphs_summary](https://www.drupal.org/project/paragraphs_summary) (D7) / [*sandbox*](https://www.drupal.org/sandbox/mtaltavull/2830717) (D8) - [paragraphs_collection](https://www.drupal.org/project/paragraphs_collection) (D8 experimental) - [classy_paragraphs](https://www.drupal.org/project/classy_paragraphs) (D7/D8) - [bootstrap_paragraphs](https://www.drupal.org/project/bootstrap_paragraphs) (D8) - [slick_paragraphs](https://www.drupal.org/project/slick_paragraphs) (D8) - Et beaucoup de modules proposant des bundles préconfigurés
## Paragraphs summary - [dgo.to/paragraphs_summary](https://www.drupal.org/project/paragraphs_summary) (D7) - [sandbox/mtaltavull/2830717](https://www.drupal.org/sandbox/mtaltavull/2830717) (D8) ![](images/paragraphs_summary.png)
## Paragraphs collection [dgo.to/paragraphs_collection](https://www.drupal.org/project/paragraphs_collection) (D8 experimental) - Grids - Sliders - Style selection (a set of predefined styles) - Background - Lock editing - Visibility per language
## Classy paragraphs [dgo.to/classy_paragraphs](https://www.drupal.org/project/classy_paragraphs) (D7/D8) - Nouveau champ *class list* - Classes definies par `hook_classy_paragraphs_list_options` - Classe ajoutée par `classy_paragraphs_preprocess_entity`
## Bootstrap paragraphs [dgo.to/bootstrap_paragraphs](https://www.drupal.org/project/bootstrap_paragraphs) (D8) - Accordion - Carousel - Columns - Drupal Block - Modal - Tabs - View
## Le futur de Paragraphs - Séparer le contenu de la configuration - Librairie réutilisable de paragraphes - UX améliorée - Suivez [Paragraphs Collection](https://www.drupal.org/project/paragraphs_collection) Source : https://www.md-systems.ch/en/blog/md-systems/2017/09/20/the-evolution-of-paragraphs