{"id":221,"date":"2021-04-22T15:13:02","date_gmt":"2021-04-22T15:13:02","guid":{"rendered":"https:\/\/www.dafap.fr\/blog\/?p=221"},"modified":"2023-09-21T15:58:36","modified_gmt":"2023-09-21T15:58:36","slug":"zendformelementtime","status":"publish","type":"post","link":"https:\/\/www.dafap.fr\/blog\/zendframework2\/zendformelementtime","title":{"rendered":"Zend\\Form\\Element\\Time"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Pr\u00e9sentation de l'\u00e9l\u00e9ment<\/h2>\n\n\n\n<p><span class=\"has-inline-color has-blue-color\">(publi\u00e9 le 03\/03\/2015)<\/span><\/p>\n\n\n\n<p><em>Zend\\Form\\Element\\Time<\/em> permet de cr\u00e9er gr\u00e2ce \u00e0&nbsp;l'aide de vue&nbsp;<em>Zend\\Form\\View\\Helper\\FormTime<\/em> une balise &lt;input type=\"<em>time\"&gt;<\/em>&nbsp; en HTML5. Cet \u00e9l\u00e9ment ajoute les filtres et validateurs conformes aux sp\u00e9cifications HTML5 de ce type.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Utilisation<\/h2>\n\n\n\n<p>L'exemple de la documentation de ZF2 ne fonctionne pas. En effet, il faut rendre compatible les formats des donn\u00e9es avec le pas sp\u00e9cifi\u00e9 dans l'attribut <em>step<\/em>. En particulier, si <em>step = 60<\/em>, le contr\u00f4le de saisie dans un navigateur ne pr\u00e9sentera que les heures et les minutes. Aussi, il faut que le format indiqu\u00e9 soit <em>'H:i'<\/em> et que les attributs <em>min<\/em> et <em>max<\/em> soient aussi de m\u00eame format.<\/p>\n\n\n\n<p>Voici donc quelques exemples qui doivent fonctionner :<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pour step=60<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use Zend\\Form\\Form;\n\n$form = new Form('my-form');\n$form-&gt;add(array(\n     'type' =&gt; 'Zend\\Form\\Element\\Time',\n     'name' =&gt; 'time',\n     'options' =&gt; array(\n             'label' =&gt; 'Time',\n             'format' =&gt; 'H:i'\n     ),\n     'attributes' =&gt; array(\n             'min' =&gt; '00:00',\n             'max' =&gt; '23:59',\n             'step' =&gt; '60', \/\/ pas de 1 minute ; on ne voit pas les secondes.\n     )\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Pour step=30<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use Zend\\Form\\Form;\n\n$form = new Form('my-form');\n$form-&gt;add(array(\n     'type' =&gt; 'Zend\\Form\\Element\\Time',\n     'name' =&gt; 'time',\n     'options' =&gt; array(\n             'label' =&gt; 'Time',\n             'format' =&gt; 'H:i:s'\n     ),\n     'attributes' =&gt; array(\n             'min' =&gt; '00:00:00',\n             'max' =&gt; '23:59:00',\n             'step' =&gt; '30', \/\/ pas de 30 secondes ; on voit les secondes\n     )\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Probl\u00e8me avec cet \u00e9l\u00e9ment<\/h2>\n\n\n\n<p><span class=\"has-inline-color has-blue-color\">(ajout du 22\/04\/2021)<\/span><\/p>\n\n\n\n<p>Le comportement des navigateurs sur cet \u00e9l\u00e9ment <code>&lt;input type=\"time\"&gt;<\/code> varie d'un navigateur \u00e0 un autre.  Ainsi, un temps de <code>00:01:00<\/code> sera re\u00e7u correctement sous Firefox ou Safari mais pas sous Chrome, Edge ou Opera qui re\u00e7oivent <code>00:01<\/code> en POST.<\/p>\n\n\n\n<p>Aussi, dans ce cas, le validateur de l'\u00e9l\u00e9ment <code>Zend\\Form\\Element\\Time<\/code> renvoie une erreur du type <code>INVALID_DATE<\/code> avec le message <code>The input does not appear to be a valid date<\/code> ou, en fran\u00e7ais, <code>L'entr\u00e9e ne semble pas \u00eatre une date valide<\/code>. Il convient donc de v\u00e9rifier le contenu du POST avant de le soumettre au validateur.<\/p>\n\n\n\n<p>A noter que ce probl\u00e8me ne se produit que lorsque le nombre de secondes est <code>00<\/code>. Il n'y a pas de probl\u00e8me lorsque le nombre de secondes n'est pas nul.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Correction du probl\u00e8me<\/h2>\n\n\n\n<p>On pourra surcharger la m\u00e9thode <code>setData()<\/code> du formulaire de la fa\u00e7on suivante :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/**\n * Correction du format du temps renvoy\u00e9 par certains navigateurs sans les\n * secondes lorsque la partie secondes est 00 \n * pour un &lt;input type='time' name='temps'>\n *\n * {@inheritdoc}\n * @see \\Zend\\Form\\Form::setData()\n *\/\npublic function setData($data)\n{\n    if (is_array($data) &amp;&amp; array_key_exists('temps', $data) {\n        $temps = $data['temps'];\n        if (is_string($temps) &amp;&amp;\n            ! (\\DateTime::createFromFormat('H:i:s', $temps) instanceof \\DateTime)) {\n            $dt = \\DateTime::createFromFormat('H:i', $temps);\n            if ($dt instanceof \\DateTime) {\n                $data['temps'] = $dt->format('H:i:s');\n            }\n        }\n    }\n    return parent::setData($data);\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Pr\u00e9sentation de l&rsquo;\u00e9l\u00e9ment (publi\u00e9 le 03\/03\/2015) Zend\\Form\\Element\\Time permet de cr\u00e9er gr\u00e2ce \u00e0&nbsp;l&rsquo;aide de vue&nbsp;Zend\\Form\\View\\Helper\\FormTime une balise &lt;input type=\u00a0\u00bbtime\u00a0\u00bb&gt;&nbsp; en HTML5. Cet \u00e9l\u00e9ment ajoute les filtres et validateurs conformes aux sp\u00e9cifications HTML5 de ce type. Utilisation L&rsquo;exemple de la documentation de ZF2 ne fonctionne pas. En effet, il faut rendre compatible les formats des donn\u00e9es avec [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15],"tags":[35,34,36,33,23],"class_list":["post-221","post","type-post","status-publish","format-standard","hentry","category-zendframework2","tag-element","tag-form","tag-time","tag-zend","tag-zf2"],"_links":{"self":[{"href":"https:\/\/www.dafap.fr\/blog\/wp-json\/wp\/v2\/posts\/221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dafap.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dafap.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dafap.fr\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dafap.fr\/blog\/wp-json\/wp\/v2\/comments?post=221"}],"version-history":[{"count":15,"href":"https:\/\/www.dafap.fr\/blog\/wp-json\/wp\/v2\/posts\/221\/revisions"}],"predecessor-version":[{"id":590,"href":"https:\/\/www.dafap.fr\/blog\/wp-json\/wp\/v2\/posts\/221\/revisions\/590"}],"wp:attachment":[{"href":"https:\/\/www.dafap.fr\/blog\/wp-json\/wp\/v2\/media?parent=221"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dafap.fr\/blog\/wp-json\/wp\/v2\/categories?post=221"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dafap.fr\/blog\/wp-json\/wp\/v2\/tags?post=221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}