- mar. 2 avr. 2024 14:07
#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
fichier form.php<?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>
Code : Tout sélectionner
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.<?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.";
}
?>