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