L'implémentation d'un script pour une redirection

Bonjour tout le monde,

Je me permets de poster n’ayant pas trouvé de post commun à mon problème et ne trouvant pas la solution sur le wiki.

Voilà, je suis occupé à modifier un module déjà créé par un ancien étudiant, présent dans l’entreprise qui sert à pointer les heures sur différents postes.
Je suis bloqué actuellement, car je n’arrive pas à utiliser le script comme il faut.

Sur mon index, je demande à l’ouvrier (User général et chaque ouvrier est stocké dans la db avec son numéro de référence sur son badge.) qui n’a accès qu’à ce module, de scanner son badge et ça doit le conduire à la partie create, en récupérant l’objet ouvrier directement dans la page de création.

  • La partie de mon index :
 
print '<tr class="liste_titre">';
print '<H1>Veuillez scanner votre code-barre</H1>';
print '<input type="text" class="flat minwidth400" id="code_badge" name="code_badge" autofocus onchange="checkBarcode()">';
print '</tr>';

print "<script>
    function checkBarcode(){
    $barcode = document.getElementById('code_badge').value;
    // Vérifier que le code-barre est saisi et différent de ''
    if ($barcode != null && $barcode.trim() != '') {
        $sql = 'SELECT rowid FROM llx_pointages_ouvrier WHERE ref ='.$barcode;
        $resql = $db->query( $sql);
        $ouvrier_objet->fk_ouvrier = $db->fetch_object($resql);
        if($ouvrier_objet!=null){
            header ('pointage_card.php?action=create?fk_ouvrier='.$ouvrier_objet->fk_ouvrier );
        }
        else{
            alert ('Erreur lors de la verification de votre code-barre');
       }
    }
    else{
        alert('Code-barre non charger')
    }
}
</script>";

Dans create il peux choisir son numéro et ça complète avec ses information, mais je veux bloquer la possibilité de choix et obliger la personne qui a utilisé son badge.

  • La partie create :
print '<tr>';
	print '<td class="titlefieldcreate fieldrequired">Ouvrier</td>';
	print '<td>';
	print $form->selectForForms('Ouvrier:pointages/class/ouvrier.class.php:1:status=1','fk_ouvrier','0','string','','','','','','','');
	print '<input type="text" id="infoOuvrier" name="infoOuvrier" class="minwidth500" readonly>';
	print '</td>';
	print '</tr>';

Bonjour, je pense que c’est normal , tu mélange du js et du php , tu veux récupérer l’ouvrier concerné pendant le script, ce n’est pas possible. Je te conseille d’utiliser GETPOST( va voir un peu la phpdoc ) pour récuperer la zone de saisie , pour ça il te faudrait un input submit à coté, pour valider ( ce qui est logique sur un site de devoir valider la saisie) , une fois l’input fait , le form de dolibarr se contentera d’envoyer une requete getpost avec le namehtml que tu donne quand tu crée le form. Tu pourras toujours utiliser le js , mais après tout ça , pour lancer une alerte. Dis moi si tu n’a pas compris !

Merci pour la réponse,

J’ai essayé en attendant une réponse ceci :

print '<form method="POST" action="pointagesindex.php">';
    print '<tr>';
        print '<H1>Veuillez scanner votre code-barre</H1>';
        print '<td><input type="text" class="flat minwidth400" id="code_badge" name="code_badge" autofocus ></td>';
        print '<td><input type="submit" value="Envoyer" class="button"  ></td>';
    print '</tr>';
print '</form>';

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $barcode = $_POST['code_badge'];
    if (!empty($barcode)) {
        // Effectuer la requête SQL pour récupérer les informations de l'ouvrier correspondant au code-barre saisi
        $sql = "SELECT * FROM llx_pointages_ouvrier WHERE ref = '".$barcode."'";
        $resql = $db->query($sql);
        $ouvrier = $db->fetch_object($resql);

        if (!empty($ouvrier)) {
            // Rediriger vers la page pointage_card.php en transmettant l'ID de l'ouvrier en paramètre
            header('Location: pointage_card.php?action=create&fk_ouvrier='.$ouvrier->rowid);
            exit();
        } else {
            // Afficher un message d'erreur si aucun ouvrier n'a été trouvé pour le code-barre saisi
            echo '<p>Aucun ouvrier trouvé pour le code-barre saisi.</p>';
        }
    } else {
        // Afficher un message d'erreur si aucun code-barre n'a été saisi
        echo '<p>Veuillez saisir un code-barre.</p>';
    }
}

Mais il me signale que je ne peux changer le header et en fouillant, j’ai vu d’autres personnes avoir plus ou moins le même souci sauf que ma version de Dolibarr est différente (pas la même source d’erreur).

Warning : Cannot modify header information - headers already sent by (output started at /var/www/html/dolibarr/htdocs/core/menus/standard/eldy.lib.php:635) in /var/www/html/dolibarr/htdocs/custom/pointages/pointagesindex.php on line 312

Et j’avoue que j’aurais aimé pouvoir ne pas utiliser de bouton pour changer de page, demande du client… Il veut juste que ses employés passent devant l’ordinateur et scanne leurs codes ainsi que celui de l’ordre de fabrication pour valider leurs pointages…

Quand je parlais de bouton valider, c’est le input submit envoyer que tu as mis. Je te conseille d’utilser selectForForms avec le meme print '<td><input type="submit" value="Envoyer" class="button" ></td>';
Cela va envoyer directement une requete avec la valeur du selectForForms , que tu pourra récuperer avec GETPOST(‹ fk_ouvrier ›) .

J’ai essayé de l’ajouter juste en dessous du coup de mon input en modifiant la recherche par la référence, mais j’ai un fatal error, il me signale que la variable code_badge n’est pas défini et ne me permet pas d’envoyer ( bouton disparut) . J’ai sûrement du mal l’implémenter, si par hasard tu as la solution je suis preneur :-/

print '<form method="POST" action="pointagesindex.php">';
    print '<tr>';
        print '<H1>Veuillez scanner votre code-barre</H1>';
        print '<td><input type="text" class="flat minwidth400" id="code_badge" name="code_badge" autofocus ></td>';
        print $form->selectForForms('Ouvrier:pointages/class/ouvrier.class.php:1:ref='.code_badge,'fk_ouvrier','0','string','','','','','','','');
        print '<td><input type="submit" value="Envoyer" class="button"  ></td>';
    print '</tr>';
print '</form>';

Merci déjà pour l’aide apporté,
Netrox

Tu n’a pas bien compris l’utilisation du $form , en gros ça permet de créer un formulaire sans utiliser <form …> , et selectForForms sert à quoi? Car si tu veux recuperer ce qu’il y’a dans l’input text , il faut utiliser quelque chose déjà crée par $form qui permet de créer une zone de texte , et ensuite tu pourra récuperer le contenu de la saisie sans rien faire, juste avec un GETPOST, si tu veux envoie moi ton discord en message , on en parle là haut.

1 « J'aime »

je suis toujours là dessus, j’ai bien les différents messages qui s’affiche en fonction de la condition (vide ou mauvaise référence) mais je comprend pas comment régler mon header qui m’empêche de changer la page.
J’ai essaie de retirer la partie supplémentaire qui envoie la variable, mais même sans ça, je ne peux utiliser le header.

Bonjour,

Vous pouvez vous inspirer de ce morceau de code pour faire une redirection lorsque du contenu a déjà été envoyé et qu’on ne peut plus modifer les headers.

Merci pour votre réponse,

J’ai essayé l’implémentation de cette partie de code (modifier pour mes adresses bien sûr) mais le souci persiste.

Je pense avoir trouvé la raison, une fois que j’ai mis en commentaire la fonction llxheader() au début de ma page, je peux utiliser la fonction header comme il se doit. Il ne me reste plus qu’à comprendre comment fonctionne cette fonction pour l’adapter, voir la supprimer.

Si vous avez une solution à ça je suis preneur, sinon je retourne à mes recherches.

Merci encore de votre aide,
Bonne journée,
Netrox

Je n’ai pas trouvé le moyen de me passer de la fonction llxheader, du coup la redirection vers la page via le header est impossible étant donné qu’il est déjà envoyé. Je suis donc passé par l’utilisation d’un formulaire en hidden suivi d’un petit script permettant de rejoindre la page.

Voici mon exemple pour les personnes ayant le même souci :

echo '<form name="idOuvrier" id="idOuvrier" method="post" action="pointage_card.php?action=create">
                        <input type="hidden" name="libelle" id="libelle" value="'.$ouvrier->rowid.'"/>
                   </form> 
            <script type="text/javascript">
                document.idOuvrier.submit(); //on envoie le formulaire vers pointage_card.php 
            </script>';