FormRowDateInfSup.php 3.58 KB
Newer Older
1
2
3
<?php
namespace UnicaenApp\Form\View\Helper;

Laurent Lécluse's avatar
Divers    
Laurent Lécluse committed
4
use Laminas\Form\View\Helper\FormElement;
Bertrand Gauthier's avatar
Bertrand Gauthier committed
5
use Laminas\Form\View\Helper\FormRow;
6
use UnicaenApp\Form\Element\DateInfSup;
Bertrand Gauthier's avatar
Bertrand Gauthier committed
7
use Laminas\Form\ElementInterface;
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

/**
 * Aide de vue générant le code HTML **complet** de l'élément de formulaire composite "DateInfSup", c'est à dire :
 *   - le label global de l'élément composite ;
 *   - les champs de saisie des dates et leurs labels (délégué à l'aide de vue "FormDateInfSup") ;
 *   - les messages d'erreurs de validation.
 * 
 * Hérite de l'aide de vue "FormRow".
 *
 * @author Bertrand GAUTHIER <bertrand.gauthier@unicaen.fr>
 * @see \UnicaenApp\Form\Element\DateInfSup
 * @see FormDateInfSup
 * @see FormRow
 */
class FormRowDateInfSup extends FormRow
{
24
25
26
27
    /**
     * @var bool
     */
    protected $renderJs = true;
28

29
    /**
30
     * Utility form helper that renders a label (if it exists), an element and errors
31
     *
32
     * @param ElementInterface $element
33
     * @param null|string $labelPosition
34
35
     * @return string
     */
36
    public function render(ElementInterface $element, $labelPosition = null): string
37
    {
38
        if (!$element instanceof DateInfSup) {
Bertrand Gauthier's avatar
Bertrand Gauthier committed
39
            throw new \Laminas\Form\Exception\InvalidArgumentException("Cette aide de vue ne prend en charge que les élément de type 'DateInfSup'.");
40
41
        }
        
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
        $escapeHtmlHelper    = $this->getEscapeHtmlHelper();
        $elementHelper       = $this->getElementHelper();
        $elementErrorsHelper = $this->getElementErrorsHelper();

        $label           = $element->getLabel();
        $inputErrorClass = $this->getInputErrorClass();
        $elementErrors   = $elementErrorsHelper->render($element);

        // Does this element have errors ?
        if (!empty($elementErrors) && !empty($inputErrorClass)) {
            $classAttributes = ($element->hasAttribute('class') ? $element->getAttribute('class') . ' ' : '');
            $classAttributes = $classAttributes . $inputErrorClass;

            $element->setAttribute('class', $classAttributes);
        }

58
59
        $elementHelper->setRenderJs($this->getRenderJs());
        
60
61
62
63
        $elementString = $elementHelper->render($element);

        if (isset($label) && '' !== $label) {
            // Translate the label
64
65
            if (($translator = $this->getTranslator())) {
                $label = $translator->translate($label, $this->getTranslatorTextDomain());
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
            }

            $label = $escapeHtmlHelper($label);

            // DateInfSup elements have to be handled differently as the HTML standard does not allow nested
            // labels. The semantic way is to group them inside a fieldset
            $markup = sprintf(
                '<fieldset class="dateinfsup"><legend>%s</legend>%s</fieldset>',
                $label,
                $elementString);

            if ($this->renderErrors) {
                $markup .= $elementErrors;
            }
        } else {
            if ($this->renderErrors) {
                $markup = $elementString . $elementErrors;
            } else {
                $markup = $elementString;
            }
        }

        return $markup;
    }
    
    /**
92
     * {@inheritdoc}
93
     */
Laurent Lécluse's avatar
Divers    
Laurent Lécluse committed
94
    protected function getElementHelper(): FormElement
95
96
97
98
99
100
101
102
    {
        if (method_exists($this->view, 'plugin')) {
            $this->elementHelper = $this->view->plugin('formDateInfSup');
        }

        return parent::getElementHelper();
    }

103
104
105
106
107
108
109
110
111
112
113
    public function getRenderJs()
    {
        return $this->renderJs;
    }

    public function setRenderJs($renderJs = true)
    {
        $this->renderJs = $renderJs;
        return $this;
    }
}