Probleme enregistrement fichier

Résolu
Eda - 2 avril 2024 à 10:15
BoBot Messages postés 2794 Date d'inscription mardi 4 juillet 2023 Statut Modérateur Dernière intervention 5 mai 2024 - 9 avril 2024 à 09:48

Bonjour, j'ai un problème avec mon code car je souhaiterai enregistrer ce que je mets dans mon éditeur de texte descriptif(line-control pris sur gitHub) dans un fichier .dosc (je ne sais pas si c'est le meilleur format car de base dans ma page il est en html) pour qu'il soit convertir donc en .docx et envoyer dans on repository local et sur ma bdd egalement local pour le moment. J'aimerai savoir si c'est possible et comment faire surtout, merci pour votre temps.

<?php
session_start(); // Initialise la session

include_once('base_header.php');

// Générer et stocker le jeton CSRF
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
?>
<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Formulaire</title>
    <link rel="stylesheet" href="../assets/styles.css">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
    <!-- Font Awesome CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">

    <!-- LineControl Editor CSS -->
    <link rel="stylesheet" href="../assets/editor.css">
</head>
<body>
    <h2>Formulaire</h2>

    <form action="../controllers/FormController.php" method="post" id="formulaire">
        <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">

        <label for="nom">Nom :</label>
        <input type="text" id="nom" name="nom" autocomplete="given-name" required>
        <br>

        <label>Prénom :</label>
        <input type="text" id="prenom" name="prenom" autocomplete="family-name" required>
        <br>

        <label>Email :</label>
        <input type="email" id="email" name="email" autocomplete="email" required>
        <br>

        <label>Priorité :</label><br>
        <div class="radio-group">
            <div>
                <input type="radio" id="normale" name="priorite" value="Normale">
                <label for="normale">Normale</label>
            </div>
            <div>
                <input type="radio" id="moderee" name="priorite" value="Moderee">
                <label for="moderee">Modérée</label>
            </div>
            <br>
            <div>
                <input type="radio" id="urgente" name="priorite" value="Urgente">
                <label for="urgente">Urgente</label>
            </div>
            <div>
                <input type="radio" id="critique" name="priorite" value="Critique">
                <label for="critique">Critique</label>
            </div>
        </div>

        <div id="infos_supplementaires">
            <div>
                <label>
                    Titre :
                    <select name="id_titre[]" required id="select-titres">
                        <option value="">-- Sélectionnez un titre --</option>
                    </select>
                </label><br>

                <label for="nom_note">Nom de la note :</label><br>
                <input type="text" name="nom_note[]" required><br>
                <div id="contenu-descriptif-affiche">
                    <label for="descriptif">Descriptif :</label><br>
                    <textarea id="descriptif_editor" name="contenu_descriptif" rows="5" cols="50"></textarea>
                    <input type="hidden" id="contenu_descriptif_html" name="contenu_descriptif_html">
                </div>
            </div>
        </div>

        <div id="nouveau_div"></div>

        <button type="button" onclick="ajouterNouveauDiv()">Ajouter des informations</button>
        <button type="submit" id="saveButton">Enregistrer</button>
    </form>

    <!-- Vos autres scripts -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <!-- Bootstrap JavaScript -->
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
    <!-- LineControl Editor JavaScript -->
    <script src="../assets/editor.js"></script>
    <script src="../assets/script.js"></script>
    <script>
        // Assurez-vous que jQuery est chargé avant d'exécuter ce script
        $(document).ready(function() {
            // Initialiser LineControl sur la zone de texte du descriptif
            var editor = $("#descriptif_editor").Editor();

            // Lorsque le formulaire est soumis
            $('#formulaire').submit(function() {
                // Récupérer le contenu de l'éditeur LineControl
                var contenuDescriptif = $(".Editor-editor").html();

                // Mettre à jour la valeur du champ de formulaire 'contenu_descriptif_html'
                $("#contenu_descriptif_html").val(contenuDescriptif);
            });
        });

        $(document).ready(function() {
            chargerOptionsTitres();
        });

        function chargerOptionsTitres() {
            $.ajax({
                url: '../models/recuperer_titres.php',
                type: 'GET',
                dataType: 'json',
                success: function(data) {
                    var select = $('#select-titres');
                    $.each(data, function(index, item) {
                        select.append($('<option>', {
                            value: item.id,
                            text: item.Nom
                        }));
                    });
                },
                error: function(xhr, status, error) {
                    console.error("Erreur lors de la récupération des titres :", error);
                }
            });
        }
    </script>
</body>
</html>

fichier form.php

<?php
require_once('../config/connexion.php');
require_once(__DIR__ . '/../../vendor/autoload.php');
use PhpOffice\PhpWord\PhpWord;
use PhpOffice\PhpWord\IOFactory;

// Définir la fonction pour nettoyer le contenu HTML
function cleanHTML($html) {
    // Créer un objet DOMDocument
    $dom = new DOMDocument();

    // Supprimer les avertissements et les erreurs générés par la bibliothèque DOMDocument
    libxml_use_internal_errors(true);

    // Charger le contenu HTML dans l'objet DOMDocument
    if (!empty($html)) {
        $dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
    }

    // Récupérer tous les éléments de type texte sans balises
    $cleaned_html = '';
    if ($dom !== null && $dom->getElementsByTagName('*') !== null) {
        foreach ($dom->getElementsByTagName('*') as $node) {
            if ($node instanceof DOMElement && $node->nodeType === XML_TEXT_NODE) {
                $cleaned_html .= $node->nodeValue;
            }
        }
    }

    // Supprimer les avertissements générés par libxml
    libxml_clear_errors();

    // Retourner le contenu HTML nettoyé
    return $cleaned_html;
}

// Démarrer la session avant tout contenu HTML ou sortie
session_start();

// Gestion des erreurs
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// Vérifier si le jeton CSRF est présent et correspond à celui dans la session
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['csrf_token']) && isset($_SESSION['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
    // Extraction des données du formulaire
    $nom = filter_input(INPUT_POST, 'nom', FILTER_SANITIZE_SPECIAL_CHARS);
    $prenom = filter_input(INPUT_POST, 'prenom', FILTER_SANITIZE_SPECIAL_CHARS);
    $email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
    $priorite = isset($_POST['priorite']) ? $_POST['priorite'] : null; // Priorité sélectionnée
    $id_titres = $_POST['id_titre']; // Récupérer les IDs des titres sélectionnés
    $noms_notes = $_POST['nom_note']; // Tableau des noms de notes
    $descriptif_html = $_POST['contenu_descriptif_html']; // Contenu HTML du descriptif

    // Nettoyer le contenu HTML
    $cleaned_descriptif_html = cleanHTML($descriptif_html);

    try {
        // Création d'une instance de PhpWord
        $phpWord = new PhpWord();

        // Création d'une section
        $section = $phpWord->addSection();

        // Ajout du contenu HTML nettoyé à la section
        if (!empty($cleaned_descriptif_html)) {
            \PhpOffice\PhpWord\Shared\Html::addHtml($section, $cleaned_descriptif_html, true, false);
        }

        // Enregistrement du fichier DOCX
        $timestamp = time(); // Timestamp actuel
        $nom_fichier_unique = 'mon_fichier_' . $timestamp . '.docx'; // Nom du fichier avec timestamp
        $chemin_fichier_docx = 'D:\wamp64\www\Formulaire\app\uploads\\' . $nom_fichier_unique; // Chemin complet

        $objWriter = IOFactory::createWriter($phpWord, 'Word2007');
        $objWriter->save($chemin_fichier_docx);

        // Préparation de la requête d'insertion
        $query = "INSERT INTO note (nom, prenom, email, priorite, id_titre, nom_note, descriptif) VALUES (:nom, :prenom, :email, :priorite, :id_titre, :nom_note, :descriptif)";
        $stmt = $pdo->prepare($query);

        // Insertion des données pour chaque paire titre-descriptif-nom de note
        for ($i = 0; $i < count($id_titres); $i++) {
            $id_titre = $id_titres[$i];
            $nom_note = $noms_notes[$i];

            $stmt->bindParam(':nom', $nom);
            $stmt->bindParam(':prenom', $prenom);
            $stmt->bindParam(':email', $email);
            $stmt->bindParam(':priorite', $priorite);
            $stmt->bindParam(':id_titre', $id_titre);
            $stmt->bindParam(':nom_note', $nom_note);
            $stmt->bindParam(':descriptif', $cleaned_descriptif_html);

            $stmt->execute();
        }

        // Redirection vers le formulaire avec un message de succès
        $_SESSION['message'] = "Les données ont été enregistrées avec succès.";
        header("Location: ../views/form.php");
        exit();
    } catch (PDOException $e) {
        echo "Erreur lors de l'enregistrement des données : " . $e->getMessage();
    }
} else {
    // Rejet de la soumission du formulaire en raison d'une violation CSRF
    echo "Soumission du formulaire invalide. Veuillez réessayer.";
}
?>

le fichier s'enregistre uniquement sur le repository local et ne contient rien comme si le descriptif ete vide alors que ce n'est pas le cas.

A voir également:

1 réponse

BoBot Messages postés 2794 Date d'inscription mardi 4 juillet 2023 Statut Modérateur Dernière intervention 5 mai 2024 185
9 avril 2024 à 09:48
Bonjour !
L'IA de Bobot est là pour vous aider !
Le problème peut venir de plusieurs sources mais je commencerais par vérifier le contenu de la variable `$cleaned_descriptif_html` avant de la sauvegarder dans le fichier Word.

En fait, tu fais appel à la fonction `cleanHTML` qui va supprimer toutes les balises HTML de ton contenu, et ne conserver que les nœuds texte. Donc si ton contenu HTML comporte des balises HTML (comme `

`, `

`, etc.), celles-ci vont être supprimées et il est possible que ton contenu se réduise à une chaîne vide, d'où la possibilité d'avoir un fichier Word vide.

Je te conseille donc de vérifier ce qui est fait dans la fonction `cleanHTML` pour être sûr que le contenu HTML n'est pas vidé de toute sa substance, tu peux par exemple essayer de commenter le passage par la fonction cleanHTML pour voir si le contenu s'écrit bien dans le fichier Word :

```php
// $cleaned_descriptif_html = cleanHTML($descriptif_html);
$cleaned_descriptif_html = $descriptif_html;
```

Si ton contenu s'écrit bien dans le Word avec cette modification, cela signifie que le souci provient bien de la fonction `cleanHTML` qui nettoie trop agressivement le contenu HTML.

Après cette étape d'investigation, tu pourras mieux cibler le problème pour trouver une solution adaptée.

Concernant l'enregistrement en base de données, je ne vois pas de code qui le réalise. Tu créés bien une requête d'insertion avec "INSERT INTO note (nom, prenom, email, priorite, id_titre, nom_note, descriptif) VALUES (:nom, :prenom, :email, :priorite, :id_titre, :nom_note, :descriptif)" mais celle-ci n'est exploitée que lors du parcours du tableau `$id_titres` ce qui me paraît étrange, s'agit-il d'une coquille ?

N'hésite pas à partager des informations supplémentaires pour que l'on puisse t'aider plus efficacement.

0