/dev/null 2>&1 &'; // stdout > /dev/null et & permettent de rendre la main à PHP // stderr > stdout pour cacher un message inutile return $command; } function makeObjectCLient() { // fenêtres $QuestionNouveauClient = new ZenityQuestion(ZenitySetup::$question_nouveau_client_text); $RechercheClient = new zenityEntry(ZenitySetup::$recherche_client_text); $ResultatsRechercheClient = new ZenityList(ZenitySetup::$resultats_recherche_client_text, []); $NouveauClient = new ZenityForms(ZenitySetup::$nouveau_client_text, ZenitySetup::$nouveau_client_entrees); $Client = new Clients; // est ce que le client est déjà dans la base? $client_inconnu = true; if(exec($QuestionNouveauClient->get()) == '0') // $? = 0 signifie oui, double égal == pour le transtypage { echo "choix: recherche d'une client\n"; $input = exec($RechercheClient->get()); if($input == '') { echo "debug: recherche annulée ou saisie vide\n"; return 0; } echo "debug: recherche effectuée\n"; $ResultatsRechercheClient->setListRows(rechercheClient($input, $Client), $Client->getTable()); // recherche silencieuse // sélection parmi les résultats $input = exec($ResultatsRechercheClient->get()); // renvoie l'ID de la table 'clients' $ResultatsRechercheClient->cleanCommand(); if($input == '') { echo "debug: client pas trouvé ou pas sélectionné\n"; return 0; } echo "debug: client sélectionné\n"; $Client->hydrate($Client->findById($input)); $client_inconnu = false; } else { echo "choix: nouveau client\n"; } // on n'a pas cherché OU on n'a pas trouvé if($client_inconnu) { $input = exec($NouveauClient->get()); if($input == '') { echo "debug: annulation lors de l'enregistrement d'un nouveau client\n"; return 0; } if(!$Client->hydrateFromForm($input)) { // messages d'erreur dans hydrateFromForm() return 0; } unset($input); $Client->create(); $Client->setID(); // sans paramètre, exécute un $this->db->lastInsertId() } return $Client; } // 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 makeLatexAndPdfDocuments(Clients $Client = null, Prestations $Presta = null, $PrestaDetails = null) //~ { //~ $latex = ''; //~ $year = ''; //~ $data = []; //~ $latex_path = Config::$latex_path; //~ $pdf_path = Config::$pdf_path; //~ // verso d'une enveloppe //~ $latex = makeLatex('enveloppe_verso'); // pas de données transmises, elles sont dans la classe Config //~ $file_name = 'enveloppe_verso.tex'; //~ makeFile($latex_path, $file_name, $latex); //~ latexToPdf($latex_path, $file_name, $pdf_path); //~ if($Client !== null) //~ { //~ $data = $Client->getAll(); //~ // recto d'une enveloppe //~ $latex_recto_path = $latex_path . 'enveloppes_recto/'; //~ $pdf_recto_path = $pdf_path . 'enveloppes_recto/'; //~ $data['code_postal_espaces'] = implode(' \ ', str_split($data['code_postal'])); // code postal avec 2 espaces entre chaque chiffre: 2 \ 9 \ 0 \ 0 \ 0 //~ $latex = makeLatex('enveloppe_recto', $data); // injection des variables //~ $file_name = $Client->getCodeClient() . '.tex'; //~ makeFolder($latex_recto_path); //~ makeFile($latex_recto_path, $file_name, $latex); //~ makeFolder($pdf_recto_path); //~ latexToPdf($latex_recto_path, $file_name, $pdf_recto_path); //~ // facture, devis, location //~ if($Presta !== null && $PrestaDetails !== null) //~ { //~ $type = $Presta->getTypePresta(); //~ $file_name = $type . '.tex'; //~ if($type === 'facture' || $type === 'devis' || $type === 'location') //~ { //~ $data = array_merge($data, $Presta->getAll()); //~ $Date = new Dates($Presta->getDate()); // entrée = timestamp (doit être un "int"!!) //~ $year = $Date->getYear(); //~ $latex_year_path = $latex_path . $year . '/'; // un sous-dossier par année //~ $pdf_year_path = $pdf_path . $year . '/'; //~ $data = array_merge($data, $PrestaDetails->getAll()); //~ $latex = makeLatex($type, $data, $Date); // injection des variables //~ $file_name = $Presta->getCodePresta() . '.tex'; //~ makeFolder($latex_year_path); //~ makeFile($latex_year_path, $file_name, $latex); //~ makeFolder($pdf_year_path); //~ latexToPdf($latex_year_path, $file_name, $pdf_year_path); //~ } //~ elseif($type === 'cesu' || $type === 'non_vendue') //~ {} // pas de document //~ else //~ { //~ echo "debug: erreur génération latex, type de prestation \n"; //~ return 0; //~ } //~ } //~ } //~ } //~ function makeLatex(string $type, 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/' . $type . '.php'); //~ // on retourne le buffer //~ // normallement le code PHP inséré avec include est nettoyé en quittant la fonction //~ return($latex); //~ }