Drupal - Utiliser le Lazy Builder pour charger un élément de manière asynchrone

Dans Drupal Le lazybuilder permet permet de charger une partie d'une page (bloc, sous-partie, champ...) de manière asynchrone ce qui permet d'optimiser le chargement de la page ou de nous abstraire de certaines problématiques posées par le cache.

Voici comment la mettre en oeuvre : 

Déclaration du placehoder : 

Un renderable array, qui sera subsitiué par le contenu de notre lazy builder : 

$variables['content']['field_coupons'] = [
  '#create_placeholder' => TRUE,
  '#lazy_builder' => [
    'mon_module.coupon.lazy_builder:renderCoupon', [$coupon->id(), $node->id(), $node->language()->getId()],
  ],
];

Je déclare donc une zone qui sera remplacée par ce que me retourne la méthode renderCoupon du service : mon_module.coupon.lazy_builder.

Déclaration du service

mon_module.services.yml

services:
  mon_module.coupon.lazy_builder:
    class: Drupal\mon_module\LazyBuilder\CouponLazyBuilder
    tags:
      - { name: lazy_builder }

l'implémentation du service

mon_module/src/LazyBuilder/CouponLazyBuilder.php

<?php

namespace Drupal\clearblue\LazyBuilder;

use Drupal\clearblue\Entity\Node;
use Drupal\Core\Security\TrustedCallbackInterface;

/**
 * Class LastViewedContentLazyBuilder
 * To render the last viewed content using Lazy Builder.
 *
 * @package Drupal\your_custom_module
 */
class CouponLazyBuilder implements TrustedCallbackInterface {

  /**
   * {@inheritdoc}
   */
  public static function trustedCallbacks(): array {
    return ['renderCoupon']; // je déclare ici explicitement les méthodes autorisées à être appelées en ajax
  }

  public function renderCoupon($couponId, $nodeId, $langcode): array {
    $node = Node::load($nodeId);
    
    // Ici je retourne l'affichage du champ d'un noeud, mais on peut évidement faire ce que l'on veut.
    $renderableArray = \Drupal::entityTypeManager()->getViewBuilder('node')->viewField($node->get('field_coupons'), [
      'type' => 'entity_reference_entity_view',
      'label' => 'hidden',
      'settings' => [
        'view_mode' => 'default',
        'link' => 'true',
      ],
    ]);

    $renderableArray['#cache']['tags'] = [
      'node:' . $nodeId,
      'langcode:' . $langcode,
      'coupons:' . $couponId,
    ];
    
    return $renderableArray;

  }

}

 

 

 

 

Ajouter un commentaire

Ne sera pas publié
CAPTCHA
Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...