7984 sujets

Développement web côté serveur, CMS

Bonjour.

J'ai développé un intranet en PHP qui était au départ destiné à être utilisé sur des Mac avec n'importe quel navigateur. Puis mon client m'a demandé de pouvoir l'utiliser sur iPhone. Hors, selon les navigateurs de ces différentes plateformes, le format de date généré par les champs input[type="date"] est variable. J'utilisais donc une petite routine qui test le $_SERVER['HTTP_USER_AGENT'] pour identifier le navigateur et traiter correctement le retour des dates de mes formulaires.


function tactile()
{
	return strstr($_SERVER['HTTP_USER_AGENT'], 'iPhone') OR strstr($_SERVER['HTTP_USER_AGENT'], 'iPad') OR strstr($_SERVER['HTTP_USER_AGENT'], 'iPod') OR strstr($_SERVER['HTTP_USER_AGENT'], 'android') OR strstr($_SERVER['HTTP_USER_AGENT'], 'sony') OR strstr($_SERVER['HTTP_USER_AGENT'], 'symbian') OR strstr($_SERVER['HTTP_USER_AGENT'], 'nokia') OR strstr($_SERVER['HTTP_USER_AGENT'], 'samsung') OR strstr($_SERVER['HTTP_USER_AGENT'], 'mobile') OR strstr($_SERVER['HTTP_USER_AGENT'], 'windows');
}


Maintenant, mon client veut pouvoir utiliser l'intranet sur son iPad pro et ça déglingue ma technique car son navigateur renvoie la même réponse que Safari sous OSX lorsque j'interroge le $_SERVER['HTTP_USER_AGENT'] :

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.1 Safari/605.1.15 Smiley fache

Seulement le format de date renvoyé ne correspond pas à celui de Safari sous OSX... Smiley fache Smiley fache

Du coup je ne sais plus comment faire pour identifier le navigateur utilisé et en déduire comment interpréter correctement les dates retournées par les formulaires. Peut-être même que je m'y prend mal depuis le début...
Quelqu'un aurait une idée pour résoudre ça ?

Merci d'avance
Salut

Alors oui il est impossible de changer le format de input type date, mais tu peux toujours changer le style pour pouvoir le lire correctement avec un peu de css et de js

<input type="date" data-date="" data-date-format="DD MMMM YYYY" value="2015-08-09">

http://jsfiddle.net/g7mvaosL/
Modifié par JENCAL (14 Oct 2019 - 16:11)
Merci pour ta réponse, mais mon problème ne se situe pas au niveau de l'affichage du champ input type date. C'est plutôt au niveau du retour de la valeur saisie dans un champ input type date à la validation du formulaire. En gros, si je veux basiquement enregistrer la date dans une bdd mysql, je dois surveiller le format dans lequel elle parvient au script qui va exécuter la requête SQL insert ou update. Et c'est là que ça coince puisque ce format dépend du navigateur et ma routine qui interroge le $_SERVER['HTTP_USER_AGENT'] ne permet pas de distinguer Safari sous OSX de Safari sous iPadOS.
Est-ce que c'est plus clair ?...
Dans ce cas pas de problème Smiley smile
Il suffit de modifier son format.
ex :
//on part du principe que les dates sont des strings.
 $timestampENG = "13-10-2013";
 $timestampFR = "25-05-2010";
 
$newDateENG = date("m-d-Y", strtotime($timestampENG));
//l'echo te donne bien 10-13-2013;


$newDateFR = date("d-m-Y", strtotime($timestampFR));
//l'echo te donne bien 25-05-2010

Modifié par JENCAL (14 Oct 2019 - 16:42)
Bonjour,

il semble possible de tester si l'user agent est bien un ipad :
https://stackoverflow.com/questions/2676897/detect-ipad-in-php

Maintenant ce que tu fais n'est absolument pas une bonne idée (comme 95% de ce qui repose sur les users agent Smiley cligne ) car comme actuellement tu vas avoir des soucis chaque fois que tu vas tomber sur un user agent inconnu. Sans compter qu'a mon avis la langue du navigateur a forcément aussi un rôle a jouer dans le fonctionnement de ce genre de chose.

Honnêtement pour ce genre d'input je ne sais pas si il existe des manière robustes de faire ça mais le plus solide reste encore d'utiliser un input text classique à la place pour s'assurer d'avoir la bonne valeur en retour.
Modifié par bacasable (14 Oct 2019 - 18:22)
Merci pour vos réponses à tous les deux.
C'est clair que l'usage du user agent est bancal, je m'appuyait dessus au départ faute de meilleure idée parce que le cahier des charges limitait le développement à l'environnement Apple.
La solution de l'imbrication de date() et strtotime() l'air de fonctionner, merci JENCAL.
Une petite remarque quand même sur ta suggestion d'utiliser un input text plutôt qu'un input date, bacasable : en faisant comme ça je perdrait l'ergonomie, bien agréable tout de même, des interfaces de sélection d'une date sur écran tactile. Ce serait dommage. La solution de JENCAL a l'air tout à fait robuste : bonne solution.
Correction : pour que la solution du strtotime() fonctionne à coup sûr, il faut s'assurer que la date fournie en paramètre utilise des "-" comme séparateurs et non des "/". Pour cela, il suffit de passer par une str_replace() :


$date = str_replace('/', '-', $date);
$d = date("d/m/Y", strtotime($date));

Modifié par louisss (16 Oct 2019 - 17:56)
Meilleure solution