/dev/null 2>&1 &'; // stdout > /dev/null et & permettent de rendre la main à PHP // stderr > stdout pour cacher un message inutile return $command; } // NOTE 1: en PHP les objets sont passés aux fonctions par référence par défaut, toutefois ce n'est pas entièrement vrai // NOTE 2: PHP n'a pas de pointeur mais des références, une référence est un alias qui ne contient pas l'objet lui-même // NOTE 3: la variable créée lors d'un "new" est elle-même une référence contenant un identifiant (= le pointeur?) // NOTE 4: l'objet est détruit lorsque la dernière référence est supprimée function rechercheClient(string $input, Clients $Client): array { $input_array = explode(' ', $input); // si plusieurs mot, on les recherche tous l'un après l'autre $result = $Client->findByKeywords($input_array, 'prenom_nom'); // on obtient un tableau à deux dimensions avec les entrées trouvées return($result); } function makeFolder(string $path) { if(!file_exists($path)) { mkdir($path); chmod($path, 0755); // droits en octal } } function makeLatexAndPdfDocument($documentType, Clients $Client = null, Prestations $Presta = null, $Details = null) // $Details peut être de type DevisFactures ou Locations { $latex = ''; $year = ''; $data = []; $file_name = $documentType . '.tex'; $latex_path = Config::$latex_path; $pdf_path = Config::$pdf_path; // tableau associatif avec des données des différents objets // note: la propriété 'commentaires' de $Presta écrase celle de $Client (pas grave, les clients n'ont pas besoin d'en avoir connaissance) // encore une fois, ce programme est destiné à un usage privé et hors ligne, sans déclaration CNIL if($Client == null) // verso d'une enveloppe { $latex = makeLatex($documentType); // pas de données transmises, elles sont dans la classe Config $file_name = 'enveloppe_verso'; } else { $data = $Client->getAll(); if($Presta == null) // recto d'une enveloppe { $latex_path .= 'enveloppes_recto/'; $pdf_path .= 'enveloppes_recto/'; $data['code_postal'] = implode(' \ ', str_split($data['code_postal'])); // code postal avec 2 espaces entre chaque chiffre: 2 \ 9 \ 0 \ 0 \ 0 $latex = makeLatex($documentType, $data); // injection des variables $file_name = $Client->getCodeClient() . '.tex'; } else // facture, devis, location { $data = array_merge($data, $Presta->getAll()); $Date = new Dates($Presta->getDate()); // entrée = timestamp (doit être un "int"!!) $year = $Date->getYear(); // créer un sous-dossier pour la nouvelle année $latex_path .= $year . '/'; $pdf_path .= $year . '/'; if($Details != null) { $data = array_merge($data, $Details->getAll()); } $latex = makeLatex($documentType, $data, $Date); // injection des variables $file_name = $Presta->getCodePresta() . '.tex'; } } // création des fichiers makeFolder($latex_path); makeFolder($pdf_path); file_put_contents($latex_path. $file_name, $latex); // écriture du fichier latexToPdf($latex_path, $file_name, $pdf_path); } function makeLatex(string $documentType, array $data = [], Dates $Date = null) { $date = ''; if($Date != null) { $date = $Date->getDate(); $date = preg_replace('#\D#', '/', $date); // date avec des slashs / parce que j'aime bien } // on obtient la variable $latex avec ob_get_clean() // le include() ici, c'est du génie ou c'est moche ou les deux? // un nouveau fichier php est inséré à chaque itération include('latex_templates/' . $documentType . '.php'); // on retourne le buffer // normallement le code PHP inséré avec include est nettoyé en quittant la fonction return($latex); } // compilation à partir d'un fichier .tex function latexToPdf(string $latexPath, string $fileName, string $pdfPath) { $outputDir = ''; if($pdfPath !== '') { $outputDir = '-output-directory=' . $pdfPath . ' '; } // compilation exec('pdflatex ' . $outputDir . $latexPath . $fileName); // nettoyage $basename = basename($fileName, '.tex'); unlink($pdfPath . $basename . '.aux'); unlink($pdfPath . $basename . '.log'); }