FormViewHelper - FormControlGroup - Utilisation approfondie des ViewHelpers
Idéalement, répondre d'abord à l'Issue #1 afin de gérer les Fieldsets et, sans doute, rediriger tous ses sous-éléments vers le View Helper FormControlGroup. Actuellement, l'ensemble des (sous-)éléments d'un Fieldset sont ignorés aux yeux du FormControlGroup, l'utilisation de ViewHelpers comme décrit ci-dessous sera donc inefficace sur ces éléments.
Dans l'aide de vue FormControlGroup, il y a un bon début d'idée qui est de permettre l'utilisation de ViewHelpers tout en utilisant l'aide de vue $this->form($formulaireZend)
(cf. l'attribut $helpers
de FormControlGroup).
Malheureusement, rien ne semble réellement prévu pour "ajouter facilement" des ViewHelpers. En l'état actuel, pour se faire, il semblerait qu'il faille passer par tout un processus d'héritage du FormControlGroup puis du Form (etc) simplement pour ajouter un ou plusieurs ViewHelper(s). Pourquoi ne pas simplement passer par des éléments de config ?
Proposition d'ajout / modification
FormControlGroup
1. Dans le fichier- Ajouter un getter et un setter à l'attribut
$helpers
/**
* @return string[]
*/
public function getHelpers()
{
return $this->helpers;
}
/**
* @param string[] $helpers
*/
public function setHelpers($helpers)
{
$this->helpers = $helpers;
}
- EDIT : Modifications pour garder la priorité de l'attribut
$pluginClass
durender
/* DEBUT MODIFICATION */
public function render(ElementInterface $element, $pluginClass = null)
{
$this->normalizeElement($element);
$this->customFromOptions($element);
/* Bypass pour des éléments spécifiques */
$class = get_class($element);
if ($pluginClass === null && array_key_exists($class, $this->helpers)) {
$helper = $this->getView()->plugin($this->helpers[$class]);
return $helper($element);
}
if ($pluginClass === null) $pluginClass = 'formElement';
$inputGroup = [];
if ($this->getPrefix()) {
$inputGroup[] = $this->prefixHtml($element);
}
/* FIN MODIFICATION */
/* ... */
}
FormControlGroupFactory
2. Dans le fichier- Récupération des éléments de configuration permettant la complétion de ce tableau
$helpers
public function __invoke(ContainerInterface $container, $requestedName, $options = null)
{
$vh = new FormControlGroup();
$config = $container->get('config');
$configHelpers = [];
if (isset($config['unicaen-app']) && isset($config['unicaen-app']['form_view_helpers'])) $configHelpers = $config['unicaen-app']['form_view_helpers'];
$helpers = array_merge($vh->getHelpers(), $configHelpers);
$vh->setHelpers($helpers);
return $vh;
}
3. Dans un fichier de configuration
- Dans le fichier de configuration dédié à UnicaenApp, ajouter la clé 'form_view_helpers' contenant les associations 'key'=>'value' avec 'key' la classe de l'entité surlaquelle on souhaite appliquer un ViewHelper et 'value' la classe du ViewHelper correspondant ou bien la clé (ou alias) permettant de la récupérer dans la clé 'view_helpers' de la configuration générale.
return [
/*(...)*/
'unicaen-app' => [
/*(...)*/
'form_view_helpers' => [
Entity1::class => 'aliasEntity1',
Entity2::class => Entity1ViewHelper::class,
],
/*(...)*/
],
/*(...)*/
];
Note : Pourquoi ajouter une nouvelle clé 'form_view_helpers' plutôt qu'utiliser les ViewHelpers défini dans la clé 'view_helpers' ?
Lorsque l'on utilise l'aide de vue Form, via l'instruction $this->form($formulaire)
, on ne souhaite pas forcément utiliser toutes les aides de vue déclarées dans cette clé.
Cela permet donc de vraiment préciser quels ViewHelpers peuvent être utilisés dans l'aide de vue Form. Notons qu'il est possible d'utiliser, dans la clé 'form_view_helpers', les alias définis dans 'view_helpers' permettant donc de généraliser/abstraire l'utilisation d'un ViewHelper.
Notons aussi que l'ajout d'une nouvelle clé 'form_view_helpers' permettra la mise à jour d'UnicaenApp de façon transparente, sans risque de subir de nouveaux comportements non désirés (à moins, justement, d'utiliser cette nouvelle clé).