Avant Ibexa 3, un moyen pratique d'injecter des variables dans les templates des vues de contenu était d'utiliser les ParameterProvider du eZCoreExtraBundle. Maintenant, avec Ibexa 3, il est possible de faire la même chose sans avoir besoin d'un bundle tiers.
Comme exemple, écrivons un VariableProvider qui charge tous les contenus d'un champ liste de relations du contenu affiché. (code pour PHP 7.4+)
<?php
declare(strict_types=1);
namespace App\Provider;
use ArrayObject;
use eZ\Publish\API\Repository\ContentService;
use eZ\Publish\Core\FieldType\RelationList;
use eZ\Publish\Core\MVC\Symfony\View\ContentView;
use eZ\Publish\Core\MVC\Symfony\View\View;
use eZ\Publish\SPI\MVC\View\VariableProvider;
class RelatedVariableProvider implements VariableProvider
{
private ContentService $contentService;
public function __construct(ContentService $contentService)
{
$this->contentService = $contentService;
}
public function getIdentifier(): string
{
// Utilisé dans la configuration
return 'related';
}
public function getTwigVariables(View $view, array $options = []): object
{
/** @var ContentView $view */
$content = $view->getContent();
/** @var RelationList\Value $value */
$value = $content->getFieldValue('media');
// La valeur de retour est typée object, donc on retourne un ArrayObject
return new ArrayObject(array_map(
fn (int $contentId) => $this->contentService->loadContent($contentId),
$value->destinationContentIds
));
}
}
Ajoutons la configuration de vue :
ezplatform:
system:
default:
content_view:
full:
article:
template: "@ezdesign/content/full/article.html.twig"
match:
Identifier\ContentType: article
params:
# L'appel au VariableProvider se fait par l'ExpressionLanguage
medias: '@=twig_variable_provider("related")'
Ok, mais comment faire si je voulais choisir l'identifiant du champ ? Malheureusement, au contraire des ParameterProvider, il n'est pas possible de passer des options directement (twig_variable_provider n'accepte qu'un seul argument : l'identifiant du provider). Mais, comme le VariableProvider est appelé au travers de l'ExpressionLanguage, nous pouvons appeler une méthode sur la valeur de retour du VariableProvider, avec n'importe quels arguments.
Changeons un peu notre VariableProvider :
<?php
declare(strict_types=1);
namespace App\Provider;
use eZ\Publish\API\Repository\ContentService;
use eZ\Publish\Core\FieldType\RelationList;
use eZ\Publish\Core\MVC\Symfony\View\ContentView;
use eZ\Publish\Core\MVC\Symfony\View\View;
use eZ\Publish\SPI\MVC\View\VariableProvider;
class RelatedVariableProvider implements VariableProvider
{
private ContentService $contentService;
public function __construct(ContentService $contentService)
{
$this->contentService = $contentService;
}
public function getIdentifier(): string
{
return 'related';
}
public function getTwigVariables(View $view, array $options = []): object
{
return $this;
}
public function load(View $view, string $fieldIdentifier): array
{
/** @var ContentView $view */
$content = $view->getContent();
/** @var RelationList\Value $value */
$value = $content->getFieldValue($fieldIdentifier);
return array_map(
fn(int $contentId) => $this->contentService->loadContent($contentId),
$value->destinationContentIds
);
}
}
La méthode getTwigVariables va simplement retourner le provider lui-même, ce qui permet ensuite d'appeler n'importe quelle méthode dans l'expression.
Changeons la configuration de vue en conséquence :
ezplatform:
system:
default:
content_view:
full:
article:
template: "@ezdesign/content/full/article.html.twig"
match: Identifier\ContentType: article
params:
medias: '@=twig_variable_provider("related").load(view, "media")'
Voyons à quoi ressemblerait notre exemple précédent en tant que ParameterProvider, et listons les différences :
<?php
declare(strict_types=1);
namespace App\Provider;
use eZ\Publish\API\Repository\ContentService;
use eZ\Publish\Core\FieldType\RelationList;
use eZ\Publish\Core\MVC\Symfony\View\ContentView;
use Lolautruche\EzCoreExtraBundle\View\ConfigurableView;
use Lolautruche\EzCoreExtraBundle\View\ViewParameterProviderInterface;
class RelatedParameterProvider implements ViewParameterProviderInterface
{
private ContentService $contentService;
public function __construct(ContentService $contentService)
{
$this->contentService = $contentService;
}
public function getViewParameters(ConfigurableView $view, array $options = [])
{
/** @var ContentView $view */
$content = $view->getContent();
/** @var RelationList\Value $value */
$value = $content->getFieldValue($options['field_identifier']);
return array_map(
fn(int $contentId) => $this->contentService->loadContent($contentId),
$value->destinationContentIds
);
}
}
La configuration de vue :
ezplatform:
system:
default:
content_view:
full:
article:
template: "@ezdesign/content/full/article.html.twig"
match: Identifier\ContentType: article
params:
medias:
provider: related
options:
field_identifier: media
Et la configuration du service (en supposant que l'autowiring et l'autoconfiguration sont activées):
services:
App\Provider\RelatedParameterProvider:
tags:
- { name: "ez_core_extra.view_parameter_provider", alias: "related" }
Pour migrer :
Pour célébrer la sortie de Dataflow 5 pour Symfony 7, voici un retour d'expérience sur ...
🎯 Nous relevons le défi de lancer un grand concours : Vous faire gagner un ...
Comment calculer dynamiquement des frais de port ? La documentation officielle qui explique comment créer ...
Comment créer un nouveau type d'attribut produit dans Ibexa Commerce ?
A la recherche d'un poste de travail temporaire ou permanent ? Vous recherchez un environnement ...
Après une découverte de surface d'Ibexa Commerce, entrons plus dans le détail pour comprendre son ...
Ibexa DXP propose un module pour gérer des produits pour la réalisation d'un site e-commerce. ...
Voici une présentation d'IbexaMailing, un module qui ajoute la gestion des newsletters à Ibexa. IbexaMailing est ...
C'est la dernière occasion de vous souhaitez le meilleur pour cette année 2024 et surtout ...
Pour célébrer la sortie de Dataflow 5 pour Symfony 7, voici un retour d'expérience sur ...
🎯 Nous relevons le défi de lancer un grand concours : Vous faire gagner un ...
Comment calculer dynamiquement des frais de port ? La documentation officielle qui explique comment créer ...
Comment créer un nouveau type d'attribut produit dans Ibexa Commerce ?
A la recherche d'un poste de travail temporaire ou permanent ? Vous recherchez un environnement ...
Après une découverte de surface d'Ibexa Commerce, entrons plus dans le détail pour comprendre son ...
Ibexa DXP propose un module pour gérer des produits pour la réalisation d'un site e-commerce. ...
Voici une présentation d'IbexaMailing, un module qui ajoute la gestion des newsletters à Ibexa. IbexaMailing est ...
C'est la dernière occasion de vous souhaitez le meilleur pour cette année 2024 et surtout ...