Skip to content

GitLab

  • Menu
Projects Groups Snippets
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
  • Sign in
  • A app
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
    • Locked Files
  • Issues 5
    • Issues 5
    • List
    • Boards
    • Service Desk
    • Milestones
    • Iterations
    • Requirements
  • Merge requests 0
    • Merge requests 0
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
    • Test Cases
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Monitor
    • Monitor
    • Incidents
  • Packages & Registries
    • Packages & Registries
    • Container Registry
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Code review
    • Insights
    • Issue
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • lib
  • unicaen
  • app
  • Issues
  • #3

Closed
Open
Created Jul 23, 2019 by Florentin L'Homme@florentin.lhomme

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

1. Dans le fichier FormControlGroup

  • 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 du render
/* 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 */
    /* ... */
}

2. Dans le fichier FormControlGroupFactory

  • 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é).

Edited Jul 24, 2019 by Florentin L'Homme
Assignee
Assign to
Time tracking