From 7d564efbccc4b361d2fa2db2902fb35882304aae Mon Sep 17 00:00:00 2001 From: polo Date: Tue, 20 Dec 2022 03:31:33 +0100 Subject: recherche de clients --- src/functions.php | 47 +++++++++++++++++------------------ src/main.php | 29 ++++++---------------- src/model/Clients.php | 32 +++++++++++++++++++++--- src/model/Model.php | 16 ++++++++---- src/view/Zenity.php | 62 +++++++++++++++++++++++++++++++++++++---------- src/view/zenity_setup.php | 2 +- 6 files changed, 120 insertions(+), 68 deletions(-) diff --git a/src/functions.php b/src/functions.php index 6ddbae0..82263bb 100644 --- a/src/functions.php +++ b/src/functions.php @@ -7,29 +7,27 @@ // commande pour lancer une application graphique en ouvrant un fichier function windowAppCommand(string $app, string $path = ''): string { - // attention, la syntaxe utilisée est la plus simple: "app fichier" - // ça fonctionne avec les logiciels choisis: gimp, scribus - // mais ça pourrait ne pas convenir - - $command = 'nohup ' . $app; // détache l'appli du script PHP - if($path !== '') - { - $command .= ' ' . $path; - } - $command .= ' > /dev/null 2>&1 &'; - // stdout > /dev/null et & permettent de rendre la main à PHP - // stderr > stdout pour cacher un message inutile - return $command; + // attention, la syntaxe utilisée est la plus simple: "app fichier" + // ça fonctionne avec les logiciels choisis: gimp, scribus + // mais ça pourrait ne pas convenir pour d'autres + + $command = 'nohup ' . $app; // détache l'appli du script PHP + if($path !== '') + { + $command .= ' ' . $path; + } + $command .= ' > /dev/null 2>&1 &'; + // stdout > /dev/null et & permettent de rendre la main à PHP + // stderr > stdout pour cacher un message inutile + return $command; } -function rechercheClient(string $saisie): array +function rechercheClient(string $input, Clients $Client): array { - $resultats = []; - - // recherche dans la BDD - - - return($resultats); + $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); } // NOTE 1: les objets sont passés aux fonctions par référence par défaut, toutefois ce n'est pas entièrement vrai @@ -37,15 +35,14 @@ function rechercheClient(string $saisie): array // 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 enregistrementNouveauClient(Clients $Client, ZenityForms $NouveauClient) +function enregistrementNouveauClient(string $name, Clients $Client): bool { - $entry = exec($NouveauClient->get()); - if($entry !== '') + if($name !== '') { - $tableau = explode('|', $entry); + $tableau = explode('|', $name); if(count($tableau) === 4) { - $Client->newRow($tableau); + $Client->newRow($tableau); // écriture dans la BDD return true; } else diff --git a/src/main.php b/src/main.php index eacd3b3..3c9c4aa 100755 --- a/src/main.php +++ b/src/main.php @@ -42,22 +42,6 @@ require('view/Zenity.php'); // commande système zenity require('view/zenity_setup.php'); // texte dans les fenêtres ET instanciation (un objet = une commande) require('Latex.php'); // générer le code LaTeX -/* SYNTAXE BDD */ -// chaînage de méthodes -//~ $Client->setPrenom_nom('Jean Némar')->setAdresse('10, rue des douves')->setCode_client('464653476')->setCommentaires('un peu chiant'); -//~ $Client->create(); - -// tableau en entrée -//~ $input = ['prenom_nom' => 'Eva Casquer', 'adresse' => "2, place d'Écosse", 'code_client' => '958465875', 'commentaires' => 'bonne vache à lait']; -//~ $Client->hydrate($input); -//~ $Client->create(); - -//~ $input = ['prenom_nom' => 'Eva Paparla', 'commentaires' => 'grosse nunuche']; -//~ $Client->hydrate($input); -//~ $Client->update(2); - -//~ $Client->delete(3); - // boucle principale $boucle = true; @@ -78,15 +62,18 @@ while($boucle) echo "debug: recherche souhaitée\n"; // niveau 3: saisie du nom du client - $client_saisie = exec($RechercheClient->get()); - if($client_saisie !== '') + $nom_client = exec($RechercheClient->get()); + if($nom_client !== '') { echo "debug: recherche effectuée\n"; - - $ResultatsRechercheClient->setEntries(rechercheClient($client_saisie)); // recherche silencieuse + $ResultatsRechercheClient->setListRows(rechercheClient($nom_client, $Client), $Client->getTable()); // recherche silencieuse + //~ var_dump($ResultatsRechercheClient->get()); die(); + unset($nom_client); // niveau 4: sélection parmi les résultats $choix_niv4 = exec($ResultatsRechercheClient->get()); + $ResultatsRechercheClient->cleanCommand(); + if($choix_niv4 !== '') { echo "debug: client sélectionné\n"; @@ -110,7 +97,7 @@ while($boucle) // niveau 2: on n'a pas cherché OU on n'a pas trouvé if(!$id_client_connu) { - $id_client_connu = enregistrementNouveauClient($Client, $NouveauClient); + $id_client_connu = enregistrementNouveauClient(exec($NouveauClient->get()), $Client); // fenêtre + écriture BDD } // niveau 2: type comptable d'enregistrement: devis, facture, cesu ou pas de prestation diff --git a/src/model/Clients.php b/src/model/Clients.php index 816cff3..92a4b31 100644 --- a/src/model/Clients.php +++ b/src/model/Clients.php @@ -46,10 +46,36 @@ class Clients extends Model } - public function newRow(array $entry) + public function newRow(array $input) { - $this->hydrate(['prenom_nom' => $entry[0], 'adresse' => $entry[1], 'code_client' => $entry[2], 'commentaires' => $entry[3]]); + $this->hydrate(['prenom_nom' => $input[0], 'adresse' => $input[1], 'code_client' => $input[2], 'commentaires' => $input[3]]); $this->create(); - $this->setIdFromLastInsertID(); + $this->setIdFromLastInsertID(); // dans ModelChildren, n'utilise pas Model::execQuery() + } + + public function findByKeywords(array $keywords, string $field): array + { + $result = []; + for($i = 0; $i < count($keywords); $i++) + { + // tableau à deux dimensions obtenu pour un mot clé + $query_result = $this->execQuery('SELECT * FROM ' . $this->table . ' WHERE ' . $field . ' LIKE "%' . $keywords[$i] . '%"')->fetchAll(); + foreach($query_result as $one_array) // pour chaque sous tableau + { + $already_exist = false; + for($j = 0; $j < count($result); $j++) // pour chaque tableau déjà enregistré dans le tableau $result + { + if($result[$j]['ID'] === $one_array['ID']) + { + $already_exist = true; + } + } + if(!$already_exist) + { + $result[] = $one_array; + } + } + } + return($result); } } diff --git a/src/model/Model.php b/src/model/Model.php index 9effbe7..8cbf056 100644 --- a/src/model/Model.php +++ b/src/model/Model.php @@ -12,6 +12,12 @@ class Model extends DB $this->db = parent::getInstance(); // connexion } + // getters + public function getTable(): string + { + return($this->table); + } + // setters (plusieurs en même temps) public function hydrate(array $data) // $data = tableau associatif en entrée: nom_du_champ => valeur { @@ -78,17 +84,17 @@ class Model extends DB // read SELECT - public function readAll() // obtenir une table + public function readAll(): array // obtenir une table { - $query = $this->execQuery('SELECT * FROM ' . $this->table . ';'); // fonctionne aussi sans le point virgule dans le SQL!! - return($query->fetchAll()); + return($this->execQuery('SELECT * FROM ' . $this->table)->fetchAll()); // fonctionne aussi sans le point virgule dans le SQL!! } + public function findById(int $id) // obtenir une entrée avec son ID { return($this->execQuery('SELECT * FROM ' . $this->table . ' WHERE id = ' . $id)->fetch()); } - public function find(array $criteria) // obtenir une entrée avec un tableau associatif 'champ' => 'valeur' + public function find(array $criteria): array // obtenir une entrée avec un tableau associatif 'champ' => 'valeur' { $fields = []; $values = []; @@ -134,7 +140,7 @@ class Model extends DB } - // fonction appelée une seule fois pour chaque table + // fonction appelée une seule fois au lancement du programme // le tableau nécessaire n'est pas copié en mémoire à l'instanciation (pas de fuite de mémoire), mais uniquement à l'appel de cette fonction statique, à la fin de la fonction la mémoire est libérée // DBStructure::${self::$tableStructure} permet de nommer une variable statique de classe static public function createTables() diff --git a/src/view/Zenity.php b/src/view/Zenity.php index 04c9221..1299d1c 100644 --- a/src/view/Zenity.php +++ b/src/view/Zenity.php @@ -9,7 +9,7 @@ abstract class ZenityCmd protected $command_type = ''; protected $rows = []; private $title = 'ORDIPOLO'; - private $text = ''; + protected $text = ''; protected $width = 300; protected $height = 200; // recalculée en fonction du contenu, vaut au minimum 150 @@ -31,35 +31,71 @@ abstract class ZenityCmd class ZenityList extends ZenityCmd { - public function __construct(string $text, array $rows) + private $columns = 1; // tableau simple ou multidimensionnel? + + public function __construct(string $text, array $rows = [], int $columns = 1) { $this->command_type = ' --list'; parent::__construct($text, $rows); + $this->columns = $columns; $this->height = 80 + count($this->rows) * 25; - $this->command .= ' --width=' . $this->width; $this->command .= ' --height=' . $this->height; $this->command .= ' --hide-header'; // ligne inutile, il y a déjà le --text - self::oneColumnZenityList($this->rows); + if($this->rows !== []) + { + $this->command .= ' --width=' . $this->width; + $this->fillZenityList(); + } } // cas ou $this->rows est renseignée après - public function setEntries(array $rows_set) + // la valeur de $columns n'est plus nécessairement celle apr défaut + public function setListRows(array $rows, string $table) { - $this->rows = $rows_set; + $this->rows = $rows; + $this->columns = count(StructTablesDB::$structureOfTables[$table]); + $this->width = 600; + $this->command .= ' --width=' . $this->width; + $this->fillZenityList(); } - // cas où on veut une seule colonne - private function oneColumnZenityList(array $rows) + // noter que la syntaxe de zentity --list est déroutante! + // le remplissage est horizontal et le nombre de colonne dépend du nombre d'occurence de --column="" + public function fillZenityList() { - $output = ' --column=""'; - foreach($rows as $entry) + $output = ''; + if($this->columns === 1) { - $output .= ' "' . $entry . '"'; // forme: ' "choix 1" "choix 2"' + $output .= ' --column=""'; + // remplissage vertical + foreach($this->rows as $one_row) + { + $output .= ' "' . $one_row . '"'; // forme: ' "choix 1" "choix 2"' + } + } + elseif($this->columns >= 2) // marche quelque soit le nombre de colonnes + { + for($i = 0; $i < $this->columns; $i++) + { + $output .= ' --column=""'; + } + // remplissage horizontal, un sous-tableau = une ligne + foreach($this->rows as $one_row) + { + foreach($one_row as $one_field) + { + $output .= ' "' . $one_field . '"'; + } + } } $this->command .= $output; } - // cas où on veut plusieurs colonnes, le remplissage est horizontal, oui c'est tordu! + public function cleanCommand() + { + $this->command = 'zenity'; + $this->__construct($this->text); + } } class ZenityQuestion extends ZenityCmd @@ -74,7 +110,7 @@ class ZenityQuestion extends ZenityCmd } } -// note: le formulaire renvoie une chaine avecdes pipes | entre les zones de texte (qui peuvent être vides) +// note: le formulaire renvoie une chaine avec des pipes | entre les zones de texte (qui peuvent être vides) // si on clique sur 'Annuler', renvoie une chaine vide class ZenityForms extends ZenityCmd { diff --git a/src/view/zenity_setup.php b/src/view/zenity_setup.php index 503ae71..042d1ab 100644 --- a/src/view/zenity_setup.php +++ b/src/view/zenity_setup.php @@ -30,7 +30,7 @@ $MenuEnregistrement = new ZenityList($menu_enregistrement_text, $menu_enregistre $MenuDocuments = new ZenityList($menu_documents_text, $menu_documents_entrees); $MenuCommunication = new ZenityList($menu_communication_text, $menu_communication_entrees); $RechercheClient = new zenityEntry($recherche_client_text); -$ResultatsRechercheClient = new zenityList($resultats_recherche_client_text, []); +$ResultatsRechercheClient = new ZenityList($resultats_recherche_client_text, [], 2); $NouveauClient = new ZenityForms($nouveau_client_text, $nouveau_client_entrees); $Calendrier = new ZenityCalendar($calendar_text); $FormulairePrestation = new ZenityForms($formulaire_text, $formulaire_entrees); -- cgit v1.2.3