Um Lazy buillder zu demonstrieren, bauen wir eine Schaltfläche, mit der das Symbol der Withslist auf Entitäten angezeigt werden kann.
Um dies zu tun, verwenden wir den Feldformatierer integer, (vorausgesetzt, das zu formatierende Integer stellt die Kennung einer Entität dar).
Wir beginnen mit einer Implementierung des Feldformatierers :
<?php
namespace Drupal\habeuk_wishlist\Plugin\Field\FieldFormatter;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\FormatterBase;
/**
* Plugin implementation of the 'string' formatter.
*
* @FieldFormatter(
* id = "habeuk_wishlist_entity",
* label = @Translation("Wishlist entity"),
* field_types = {
* "integer",
* }
* )
*/
class EntityWishlist extends FormatterBase {
/**
*
* {@inheritdoc}
*/
public function viewElements(FieldItemListInterface $items, $langcode) {
$elements[] = [
'#theme' => 'habeuk_wishlist_entity',
"#value" => Null,
"#entity_type" => NULL,
"#status" => NULL
];
return $elements;
}
}
Anschließend ändern wir die Methode viewElements so, dass sie mithilfe von lazybuilder erstellt wird:
/**
*
* {@inheritdoc}
*/
public function viewElements(FieldItemListInterface $items, $langcode) {
$elements[] = [
'#lazy_builder' => [
'habeuk_wishlist.manager:buildWishlist',
[
'value' => 'myvalue',
'entity_type' => "myEntity",
'status' => 'is not create'
]
],
'#create_placeholder' => TRUE
];
return $elements;
}
Dies bedeutet, dass Sie den Dienst: habeuk_wishlist.manager erstellen und die buildWishlist-Methode hinzufügen.
<?php
declare(strict_types = 1);
namespace Drupal\habeuk_wishlist\Services;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Security\TrustedCallbackInterface;
/**
*
* @todo Add class description.
*/
final class Manager implements ManagerInterface, TrustedCallbackInterface {
/**
* Constructs a Manager object.
*
* @param EntityTypeManagerInterface $entityTypeManager
*/
public function __construct(private readonly EntityTypeManagerInterface $entityTypeManager) {
//
}
/**
*
* {@inheritdoc}
*/
public function buildWishlist($value, $entity_type, $status): array {
return [
'#theme' => 'habeuk_wishlist_entity',
"#value" => Null,
"#entity_type" => NULL,
"#status" => NULL,
'#cache' => [
'contexts' => [
'user'
]
]
];
}
public static function trustedCallbacks() {
return [
'buildWishlist'
];
}
}
und schon funktioniert unser Lazy-Builder.
Um den Prozess besser zu verstehen, können Sie die folgenden Artikel lesen:
Ressourcen :
- Drupal 9: Verwendung von Lazy Builders
- Drupal 10: Mit einem Lazy Builder einen dynamischen Button erstellen
Nützlich für das folgende Tutorial :
- https://www.drupal.org/docs/drupal-apis/render-api/cacheability-of-render-arrays