Durée non correspondant a l'enregistrement

Bonjour à tous,

Je me permets de créer un sujet car je n’ai pas trouvé de réponse à ma question. J’ai récupéré un module qui avait été ajouté au code de Dolibarr sans fichier card ou autre documentation. J’ai donc décidé de le refaire en utilisant le module de création intégré à Dolibarr. Cependant, je n’arrive pas à comprendre pourquoi mes heures ne sont pas enregistrées correctement, je pense que j’ai mal compris comment utiliser la fonction select_duration. Si quelqu’un a des explications sur ce point, je suis preneur.

Je joins également quelques captures d’écran pour mieux illustrer mon problème.

Merci d’avance pour votre aide.

P.S.: Version 14.0.4 de Dolibarr sur une installation dans un serveur interne a l’entreprise.

Bonjour,

Est-ce que select_duration génére un « POST » avec duree-hour et duree-min ?

Bonjour,

Je vous remercie pour votre réponse.

Effectivement, je parviens à obtenir une réponse de la part du serveur et j’ai constaté que j’avais toujours une différence de 42 minutes exactement dans mon enregistrement en base de données. Cependant, je remarque que les minutes ne s’affichent pas dans Dolibarr, seules les heures sont visibles.

Netrox.

Bonjour,

Petite remarque : vous utilisez directement la variable $_POST, ce n’est pas une bonne pratique avec Dolibarr. Il faut utiliser la fonction GETPOST fournie par Dolibarr qui va filtrer les injections de valeurs malveillantes.

Bonjour, malgré le fait que se soit une sélection dans une liste, il y a un risque d’injection ?
P.S. : Je viens de le faire quand même pour être sûr du coup.

Je me pose la question car le PHP n’est pas mon langage de prédilection à la base :sweat_smile:

Bonjour,

Oui vous avez raison, mais ma question été plus est-ce que les élément du formulaire sont bien dans le POST, mais coté Dolibarr on les récupéres avec GETPOST, ce qui normalement le cas avec le module builder ou les extrafields

Bonjour,

En toute logique, toutes les données ont bien été transmises en post car la création de l’objet est complète dans la base de données. Il y a seulement un décalage de 42 minutes supplémentaires à chaque fois. Pourtant, j’utilise les fonctions de Dolibarr pour récupérer le temps et je n’arrive pas à afficher les minutes récupérées dans le select_duration présent sur chaque ligne.

Est-ce que votre passe bien les bon paramétres ?

notamment typehour

||/**|
|---|---|
|| *  Function to show a form to select a duration on a page|
|| *|
|| * @param string $prefix Prefix for input fields|
|| * @param int $iSecond Default preselected duration (number of seconds or '')|
|| * @param int $disabled Disable the combo box|
|| * @param string $typehour If 'select' then input hour and input min is a combo,|
|| *                         If 'text' input hour is in text and input min is a text,|
|| *                         If 'textselect' input hour is in text and input min is a combo|
|| * @param integer $minunderhours If 1, show minutes selection under the hours|
|| * @param int $nooutput Do not output html string but return it|
|| * @return    string                        HTML component|
|| */|
||public function select_duration($prefix, $iSecond = '', $disabled = 0, $typehour = 'select', $minunderhours = 0, $nooutput = 0)|

lorsque je change le $typehour, je vois bien les changement pour la manière de sélection de l’heure et si je change le préfix, je dois les changer également dans le GETPOST.

En gros j’ai bien l’impression que les paramètres sont effectif.

Bonjour @Netrox ,

Essayez de changer le type du colonne « dureePrestation » vers Integer (Afin de sauvgarder la valeur en seconds) :

image

Puis dans le code de modification passer le contenu du colonne « dureePrestation » au deuxième paramètre. Ex. :

print $form->select_duration('duree-', $valeur_dureePrestation); // $valeur_dureePrestation in seconds.

Enfin, dans le code de récupération pour modification, essayez cette méthode:

if(GETPOSTISSET("modif")) {

    $dureehour = (int) GETPOST('duree-hour', 'int');
    $dureemin = (int) GETPOST('duree-min', 'int');

    $duree = ($dureehour * 3600) + ($dureemin * 60);

    $prestation->dureePrestation = $duree; // dureePrestation : Type Integer (seconds)
}

Bien cordialement

1 « J'aime »

Vous pouvez ici remplacer GETPOST par GETPOSTINT

if(GETPOSTISSET("modif")) {

    $dureehour = GETPOSTINT('duree-hour');
    $dureemin = GETPOSTINT('duree-min');

    $duree = ($dureehour * 3600) + ($dureemin * 60);

    $prestation->dureePrestation = $duree; // dureePrestation : Type Integer (seconds)
}
1 « J'aime »

Merci beaucoup, cette version est bien meilleure pour la récupération du temps dans ma base de données. Maintenant, je suis capable de calculer correctement la durée pour mon calendrier. Cependant, le temps ne s’affiche toujours pas dans ma sélection de durée, et le calcul est étrange. Je vais devoir regarder cela de plus près.

J’ai également effectué vos changements. Merci aussi à vous

1 « J'aime »