FORUM D’ENTRAIDE INFORMATIQUE (FEI)
Site d’assistance et de sécurité informatique

Entraide concernant le webmastering (administration de sites).
Règles du forum : Entraide concernant le webmastering (administration de sites). Pour se faire aider à choisir un hébergeur, le service le mieux adapté selon ses objectifs, se faire aider à la création d'un site (problèmes de programmation, d'organisation, résolution de bugs...).
Merci de lire et de respecter la charte générale du forum.
  • Avatar du membre
  • Avatar du membre
Avatar du membre
par Eda
#215221
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 .dosx (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.
Code : Tout sélectionner
<?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
Code : Tout sélectionner
<?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.
Avatar du membre
par Lomu
#215508
Bonjour,

Dans votre code actuel, vous avez une fonction JavaScript qui récupère le contenu de l'éditeur au moment de la soumission du formulaire, puis le stocke dans un champ de formulaire caché. Assurez-vous que ce processus fonctionne correctement et que le contenu est correctement stocké dans ce champ. Vous pourriez également envisager d'optimiser votre contenu pour le référencement en utilisant des balises HTML appropriées et en vous assurant que le contenu est pertinent et de haute qualité, ce qui pourrait potentiellement augmenter sa visibilité dans les résultats de recherche.
Game

J’ai toujours aimé essayer de nouveau[…]

Game

Ce site m’a impressionné par la quali[…]

Problème d'allumage

Bonjour à tous J'ai un souci avec mon pc de[…]

Game

Je cherchais un site de jeux en ligne qui combine […]