{"id":4805,"date":"2026-10-07T19:23:39","date_gmt":"2026-10-07T17:23:39","guid":{"rendered":"https:\/\/sophie-matthieu.eu\/index.php\/2026\/10\/07\/le-formulaire-de-pre-inscription-de-lecole-saint-laud-avait-un-bug-de-calendrier\/"},"modified":"2026-10-07T19:45:02","modified_gmt":"2026-10-07T17:45:02","slug":"le-formulaire-de-pre-inscription-de-lecole-saint-laud-avait-un-bug-de-calendrier","status":"publish","type":"post","link":"https:\/\/sophie-matthieu.eu\/index.php\/2026\/10\/07\/le-formulaire-de-pre-inscription-de-lecole-saint-laud-avait-un-bug-de-calendrier\/","title":{"rendered":"Le formulaire de pr\u00e9-inscription de l&rsquo;\u00e9cole Saint-Laud avait un bug de calendrier"},"content":{"rendered":"<p>Sophie g\u00e8re le site internet de l&rsquo;\u00e9cole Saint-Laud \u00e0 Angers. Leur formulaire de pr\u00e9-inscription en ligne a un champ \u00ab Date de naissance \u00bb en <code>&lt;input type=\"date\"&gt;<\/code> HTML5 classique.<\/p>\n<p>En creusant un signalement de parent, j&rsquo;ai trouv\u00e9 la ligne responsable :<\/p>\n<pre><code>&lt;input type=\"date\" name=\"e&lt;?php echo $i; ?&gt;_date\"\n       min=\"2011-01-01\" max=\"2023-12-31\"&gt;<\/code><\/pre>\n<p>Une date maximale cod\u00e9e en dur \u00e0 2023. Le calendrier d&rsquo;un champ <code>date<\/code> s&rsquo;ouvre toujours sur sa borne haute : r\u00e9sultat, le s\u00e9lecteur s&rsquo;affichait bloqu\u00e9 en 2023, des ann\u00e9es apr\u00e8s que la borne ait cess\u00e9 d&rsquo;avoir un sens.<\/p>\n<p>Le correctif calcule la plage \u00e0 chaque chargement de page, au lieu de la figer :<\/p>\n<pre><code>min=\"&lt;?php echo (date('Y') - 12) . '-01-01'; ?&gt;\"\nmax=\"&lt;?php echo date('Y') . '-12-31'; ?&gt;\"<\/code><\/pre>\n<p>M\u00eame largeur de plage qu&rsquo;avant (treize ans), mais calcul\u00e9e dynamiquement : elle ne redeviendra plus jamais obsol\u00e8te.<\/p>\n<p>Au passage, j&rsquo;en ai profit\u00e9 pour deux corrections de confort sur mobile, qui n&rsquo;avaient jamais \u00e9t\u00e9 trait\u00e9es sur ce formulaire :<\/p>\n<ul>\n<li>aucun champ n&rsquo;avait de <code>font-size<\/code> explicite, ce qui fait zoomer automatiquement Safari iOS d\u00e8s qu&rsquo;on touche un champ sous les 16&nbsp;pixels ;<\/li>\n<li>la mise en page \u00e9tait en deux colonnes fixes, sans aucune r\u00e8gle <code>@media<\/code> dans toute la feuille de style : sur petit \u00e9cran, le champ date se retrouvait \u00e9cras\u00e9 sur la moiti\u00e9 de la largeur.<\/li>\n<\/ul>\n<p>Les deux sont corrig\u00e9s : 16&nbsp;px partout, et une colonne unique sous 600&nbsp;px de large. Test\u00e9 et confirm\u00e9 sur iPhone, Android et PC.<\/p>\n<p>Un point qui m\u00e9rite d&rsquo;\u00eatre not\u00e9 : comme ce champ reste un <code>&lt;input type=\"date\"&gt;<\/code> natif, et non un calendrier maison en JavaScript, c&rsquo;est le syst\u00e8me d&rsquo;exploitation du t\u00e9l\u00e9phone qui fournit le s\u00e9lecteur, pas le site. Sur iOS, Safari ouvre la roue de dates native d&rsquo;iOS&nbsp;; sur Android, Chrome ouvre la bo\u00eete de dialogue Material native du syst\u00e8me. Le site ne dessine rien lui-m\u00eame : il se contente de demander une date, et chaque OS r\u00e9pond avec l&rsquo;interface que ses utilisateurs connaissent d\u00e9j\u00e0. C&rsquo;est aussi pourquoi corriger le <code>font-size<\/code> et la mise en page suffisait : une fois le champ correctement dimensionn\u00e9, le calendrier natif de l&rsquo;un ou l&rsquo;autre OS s&rsquo;affiche sans aucun code suppl\u00e9mentaire \u00e0 \u00e9crire.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sophie g\u00e8re le site internet de l&rsquo;\u00e9cole Saint-Laud \u00e0 Angers. Leur formulaire de pr\u00e9-inscription en ligne a un champ \u00ab Date de naissance \u00bb en &lt;input type=\u00a0\u00bbdate\u00a0\u00bb&gt; HTML5 classique. En creusant un signalement de parent, j&rsquo;ai trouv\u00e9 la ligne responsable : &lt;input type=\u00a0\u00bbdate\u00a0\u00bb name=\u00a0\u00bbe&lt;?php echo $i; ?&gt;_date\u00a0\u00bb min=\u00a0\u00bb2011-01-01&Prime; max=\u00a0\u00bb2023-12-31&Prime;&gt; Une date maximale cod\u00e9e en dur [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27],"tags":[],"class_list":["post-4805","post","type-post","status-publish","format-standard","hentry","category-actualites-tech"],"_links":{"self":[{"href":"https:\/\/sophie-matthieu.eu\/index.php\/wp-json\/wp\/v2\/posts\/4805","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sophie-matthieu.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sophie-matthieu.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sophie-matthieu.eu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sophie-matthieu.eu\/index.php\/wp-json\/wp\/v2\/comments?post=4805"}],"version-history":[{"count":4,"href":"https:\/\/sophie-matthieu.eu\/index.php\/wp-json\/wp\/v2\/posts\/4805\/revisions"}],"predecessor-version":[{"id":4809,"href":"https:\/\/sophie-matthieu.eu\/index.php\/wp-json\/wp\/v2\/posts\/4805\/revisions\/4809"}],"wp:attachment":[{"href":"https:\/\/sophie-matthieu.eu\/index.php\/wp-json\/wp\/v2\/media?parent=4805"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sophie-matthieu.eu\/index.php\/wp-json\/wp\/v2\/categories?post=4805"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sophie-matthieu.eu\/index.php\/wp-json\/wp\/v2\/tags?post=4805"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}