summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2022-12-20 03:31:33 +0100
committerpolo <ordipolo@gmx.fr>2022-12-20 03:31:33 +0100
commit7d564efbccc4b361d2fa2db2902fb35882304aae (patch)
treeefc28d94a1387f918c84201318880d74a52adf84
parentdedbe2f5cee33431c1299c7f0dbef4e247dc2447 (diff)
downloadAppliGestionPHP-7d564efbccc4b361d2fa2db2902fb35882304aae.zip
recherche de clients
-rw-r--r--src/functions.php47
-rwxr-xr-xsrc/main.php29
-rw-r--r--src/model/Clients.php32
-rw-r--r--src/model/Model.php16
-rw-r--r--src/view/Zenity.php62
-rw-r--r--src/view/zenity_setup.php2
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 @@
7// commande pour lancer une application graphique en ouvrant un fichier 7// commande pour lancer une application graphique en ouvrant un fichier
8function windowAppCommand(string $app, string $path = ''): string 8function windowAppCommand(string $app, string $path = ''): string
9{ 9{
10 // attention, la syntaxe utilisée est la plus simple: "app fichier" 10 // attention, la syntaxe utilisée est la plus simple: "app fichier"
11 // ça fonctionne avec les logiciels choisis: gimp, scribus 11 // ça fonctionne avec les logiciels choisis: gimp, scribus
12 // mais ça pourrait ne pas convenir 12 // mais ça pourrait ne pas convenir pour d'autres
13 13
14 $command = 'nohup ' . $app; // détache l'appli du script PHP 14 $command = 'nohup ' . $app; // détache l'appli du script PHP
15 if($path !== '') 15 if($path !== '')
16 { 16 {
17 $command .= ' ' . $path; 17 $command .= ' ' . $path;
18 } 18 }
19 $command .= ' > /dev/null 2>&1 &'; 19 $command .= ' > /dev/null 2>&1 &';
20 // stdout > /dev/null et & permettent de rendre la main à PHP 20 // stdout > /dev/null et & permettent de rendre la main à PHP
21 // stderr > stdout pour cacher un message inutile 21 // stderr > stdout pour cacher un message inutile
22 return $command; 22 return $command;
23} 23}
24 24
25function rechercheClient(string $saisie): array 25function rechercheClient(string $input, Clients $Client): array
26{ 26{
27 $resultats = []; 27 $input_array = explode(' ', $input); // si plusieurs mot, on les recherche tous l'un après l'autre
28 28
29 // recherche dans la BDD 29 $result = $Client->findByKeywords($input_array, 'prenom_nom'); // on obtient un tableau à deux dimensions avec les entrées trouvées
30 30 return($result);
31
32 return($resultats);
33} 31}
34 32
35// NOTE 1: les objets sont passés aux fonctions par référence par défaut, toutefois ce n'est pas entièrement vrai 33// 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
37// NOTE 3: la variable créée lors d'un "new" est elle-même une référence contenant un identifiant (= le pointeur?) 35// NOTE 3: la variable créée lors d'un "new" est elle-même une référence contenant un identifiant (= le pointeur?)
38// NOTE 4: l'objet est détruit lorsque la dernière référence est supprimée 36// NOTE 4: l'objet est détruit lorsque la dernière référence est supprimée
39 37
40function enregistrementNouveauClient(Clients $Client, ZenityForms $NouveauClient) 38function enregistrementNouveauClient(string $name, Clients $Client): bool
41{ 39{
42 $entry = exec($NouveauClient->get()); 40 if($name !== '')
43 if($entry !== '')
44 { 41 {
45 $tableau = explode('|', $entry); 42 $tableau = explode('|', $name);
46 if(count($tableau) === 4) 43 if(count($tableau) === 4)
47 { 44 {
48 $Client->newRow($tableau); 45 $Client->newRow($tableau); // écriture dans la BDD
49 return true; 46 return true;
50 } 47 }
51 else 48 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
42require('view/zenity_setup.php'); // texte dans les fenêtres ET instanciation (un objet = une commande) 42require('view/zenity_setup.php'); // texte dans les fenêtres ET instanciation (un objet = une commande)
43require('Latex.php'); // générer le code LaTeX 43require('Latex.php'); // générer le code LaTeX
44 44
45/* SYNTAXE BDD */
46// chaînage de méthodes
47//~ $Client->setPrenom_nom('Jean Némar')->setAdresse('10, rue des douves')->setCode_client('464653476')->setCommentaires('un peu chiant');
48//~ $Client->create();
49
50// tableau en entrée
51//~ $input = ['prenom_nom' => 'Eva Casquer', 'adresse' => "2, place d'Écosse", 'code_client' => '958465875', 'commentaires' => 'bonne vache à lait'];
52//~ $Client->hydrate($input);
53//~ $Client->create();
54
55//~ $input = ['prenom_nom' => 'Eva Paparla', 'commentaires' => 'grosse nunuche'];
56//~ $Client->hydrate($input);
57//~ $Client->update(2);
58
59//~ $Client->delete(3);
60
61 45
62// boucle principale 46// boucle principale
63$boucle = true; 47$boucle = true;
@@ -78,15 +62,18 @@ while($boucle)
78 echo "debug: recherche souhaitée\n"; 62 echo "debug: recherche souhaitée\n";
79 63
80 // niveau 3: saisie du nom du client 64 // niveau 3: saisie du nom du client
81 $client_saisie = exec($RechercheClient->get()); 65 $nom_client = exec($RechercheClient->get());
82 if($client_saisie !== '') 66 if($nom_client !== '')
83 { 67 {
84 echo "debug: recherche effectuée\n"; 68 echo "debug: recherche effectuée\n";
85 69 $ResultatsRechercheClient->setListRows(rechercheClient($nom_client, $Client), $Client->getTable()); // recherche silencieuse
86 $ResultatsRechercheClient->setEntries(rechercheClient($client_saisie)); // recherche silencieuse 70 //~ var_dump($ResultatsRechercheClient->get()); die();
71 unset($nom_client);
87 72
88 // niveau 4: sélection parmi les résultats 73 // niveau 4: sélection parmi les résultats
89 $choix_niv4 = exec($ResultatsRechercheClient->get()); 74 $choix_niv4 = exec($ResultatsRechercheClient->get());
75 $ResultatsRechercheClient->cleanCommand();
76
90 if($choix_niv4 !== '') 77 if($choix_niv4 !== '')
91 { 78 {
92 echo "debug: client sélectionné\n"; 79 echo "debug: client sélectionné\n";
@@ -110,7 +97,7 @@ while($boucle)
110 // niveau 2: on n'a pas cherché OU on n'a pas trouvé 97 // niveau 2: on n'a pas cherché OU on n'a pas trouvé
111 if(!$id_client_connu) 98 if(!$id_client_connu)
112 { 99 {
113 $id_client_connu = enregistrementNouveauClient($Client, $NouveauClient); 100 $id_client_connu = enregistrementNouveauClient(exec($NouveauClient->get()), $Client); // fenêtre + écriture BDD
114 } 101 }
115 102
116 // niveau 2: type comptable d'enregistrement: devis, facture, cesu ou pas de prestation 103 // 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
46 } 46 }
47 47
48 48
49 public function newRow(array $entry) 49 public function newRow(array $input)
50 { 50 {
51 $this->hydrate(['prenom_nom' => $entry[0], 'adresse' => $entry[1], 'code_client' => $entry[2], 'commentaires' => $entry[3]]); 51 $this->hydrate(['prenom_nom' => $input[0], 'adresse' => $input[1], 'code_client' => $input[2], 'commentaires' => $input[3]]);
52 $this->create(); 52 $this->create();
53 $this->setIdFromLastInsertID(); 53 $this->setIdFromLastInsertID(); // dans ModelChildren, n'utilise pas Model::execQuery()
54 }
55
56 public function findByKeywords(array $keywords, string $field): array
57 {
58 $result = [];
59 for($i = 0; $i < count($keywords); $i++)
60 {
61 // tableau à deux dimensions obtenu pour un mot clé
62 $query_result = $this->execQuery('SELECT * FROM ' . $this->table . ' WHERE ' . $field . ' LIKE "%' . $keywords[$i] . '%"')->fetchAll();
63 foreach($query_result as $one_array) // pour chaque sous tableau
64 {
65 $already_exist = false;
66 for($j = 0; $j < count($result); $j++) // pour chaque tableau déjà enregistré dans le tableau $result
67 {
68 if($result[$j]['ID'] === $one_array['ID'])
69 {
70 $already_exist = true;
71 }
72 }
73 if(!$already_exist)
74 {
75 $result[] = $one_array;
76 }
77 }
78 }
79 return($result);
54 } 80 }
55} 81}
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
12 $this->db = parent::getInstance(); // connexion 12 $this->db = parent::getInstance(); // connexion
13 } 13 }
14 14
15 // getters
16 public function getTable(): string
17 {
18 return($this->table);
19 }
20
15 // setters (plusieurs en même temps) 21 // setters (plusieurs en même temps)
16 public function hydrate(array $data) // $data = tableau associatif en entrée: nom_du_champ => valeur 22 public function hydrate(array $data) // $data = tableau associatif en entrée: nom_du_champ => valeur
17 { 23 {
@@ -78,17 +84,17 @@ class Model extends DB
78 84
79 85
80 // read SELECT 86 // read SELECT
81 public function readAll() // obtenir une table 87 public function readAll(): array // obtenir une table
82 { 88 {
83 $query = $this->execQuery('SELECT * FROM ' . $this->table . ';'); // fonctionne aussi sans le point virgule dans le SQL!! 89 return($this->execQuery('SELECT * FROM ' . $this->table)->fetchAll()); // fonctionne aussi sans le point virgule dans le SQL!!
84 return($query->fetchAll());
85 } 90 }
91
86 public function findById(int $id) // obtenir une entrée avec son ID 92 public function findById(int $id) // obtenir une entrée avec son ID
87 { 93 {
88 return($this->execQuery('SELECT * FROM ' . $this->table . ' WHERE id = ' . $id)->fetch()); 94 return($this->execQuery('SELECT * FROM ' . $this->table . ' WHERE id = ' . $id)->fetch());
89 } 95 }
90 96
91 public function find(array $criteria) // obtenir une entrée avec un tableau associatif 'champ' => 'valeur' 97 public function find(array $criteria): array // obtenir une entrée avec un tableau associatif 'champ' => 'valeur'
92 { 98 {
93 $fields = []; 99 $fields = [];
94 $values = []; 100 $values = [];
@@ -134,7 +140,7 @@ class Model extends DB
134 } 140 }
135 141
136 142
137 // fonction appelée une seule fois pour chaque table 143 // fonction appelée une seule fois au lancement du programme
138 // 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 144 // 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
139 // DBStructure::${self::$tableStructure} permet de nommer une variable statique de classe 145 // DBStructure::${self::$tableStructure} permet de nommer une variable statique de classe
140 static public function createTables() 146 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
9 protected $command_type = ''; 9 protected $command_type = '';
10 protected $rows = []; 10 protected $rows = [];
11 private $title = 'ORDIPOLO'; 11 private $title = 'ORDIPOLO';
12 private $text = ''; 12 protected $text = '';
13 protected $width = 300; 13 protected $width = 300;
14 protected $height = 200; // recalculée en fonction du contenu, vaut au minimum 150 14 protected $height = 200; // recalculée en fonction du contenu, vaut au minimum 150
15 15
@@ -31,35 +31,71 @@ abstract class ZenityCmd
31 31
32class ZenityList extends ZenityCmd 32class ZenityList extends ZenityCmd
33{ 33{
34 public function __construct(string $text, array $rows) 34 private $columns = 1; // tableau simple ou multidimensionnel?
35
36 public function __construct(string $text, array $rows = [], int $columns = 1)
35 { 37 {
36 $this->command_type = ' --list'; 38 $this->command_type = ' --list';
37 parent::__construct($text, $rows); 39 parent::__construct($text, $rows);
40 $this->columns = $columns;
38 $this->height = 80 + count($this->rows) * 25; 41 $this->height = 80 + count($this->rows) * 25;
39 $this->command .= ' --width=' . $this->width;
40 $this->command .= ' --height=' . $this->height; 42 $this->command .= ' --height=' . $this->height;
41 $this->command .= ' --hide-header'; // ligne inutile, il y a déjà le --text 43 $this->command .= ' --hide-header'; // ligne inutile, il y a déjà le --text
42 self::oneColumnZenityList($this->rows); 44 if($this->rows !== [])
45 {
46 $this->command .= ' --width=' . $this->width;
47 $this->fillZenityList();
48 }
43 } 49 }
44 50
45 // cas ou $this->rows est renseignée après 51 // cas ou $this->rows est renseignée après
46 public function setEntries(array $rows_set) 52 // la valeur de $columns n'est plus nécessairement celle apr défaut
53 public function setListRows(array $rows, string $table)
47 { 54 {
48 $this->rows = $rows_set; 55 $this->rows = $rows;
56 $this->columns = count(StructTablesDB::$structureOfTables[$table]);
57 $this->width = 600;
58 $this->command .= ' --width=' . $this->width;
59 $this->fillZenityList();
49 } 60 }
50 61
51 // cas où on veut une seule colonne 62 // noter que la syntaxe de zentity --list est déroutante!
52 private function oneColumnZenityList(array $rows) 63 // le remplissage est horizontal et le nombre de colonne dépend du nombre d'occurence de --column=""
64 public function fillZenityList()
53 { 65 {
54 $output = ' --column=""'; 66 $output = '';
55 foreach($rows as $entry) 67 if($this->columns === 1)
56 { 68 {
57 $output .= ' "' . $entry . '"'; // forme: ' "choix 1" "choix 2"' 69 $output .= ' --column=""';
70 // remplissage vertical
71 foreach($this->rows as $one_row)
72 {
73 $output .= ' "' . $one_row . '"'; // forme: ' "choix 1" "choix 2"'
74 }
75 }
76 elseif($this->columns >= 2) // marche quelque soit le nombre de colonnes
77 {
78 for($i = 0; $i < $this->columns; $i++)
79 {
80 $output .= ' --column=""';
81 }
82 // remplissage horizontal, un sous-tableau = une ligne
83 foreach($this->rows as $one_row)
84 {
85 foreach($one_row as $one_field)
86 {
87 $output .= ' "' . $one_field . '"';
88 }
89 }
58 } 90 }
59 $this->command .= $output; 91 $this->command .= $output;
60 } 92 }
61 93
62 // cas où on veut plusieurs colonnes, le remplissage est horizontal, oui c'est tordu! 94 public function cleanCommand()
95 {
96 $this->command = 'zenity';
97 $this->__construct($this->text);
98 }
63} 99}
64 100
65class ZenityQuestion extends ZenityCmd 101class ZenityQuestion extends ZenityCmd
@@ -74,7 +110,7 @@ class ZenityQuestion extends ZenityCmd
74 } 110 }
75} 111}
76 112
77// note: le formulaire renvoie une chaine avecdes pipes | entre les zones de texte (qui peuvent être vides) 113// note: le formulaire renvoie une chaine avec des pipes | entre les zones de texte (qui peuvent être vides)
78// si on clique sur 'Annuler', renvoie une chaine vide 114// si on clique sur 'Annuler', renvoie une chaine vide
79class ZenityForms extends ZenityCmd 115class ZenityForms extends ZenityCmd
80{ 116{
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
30$MenuDocuments = new ZenityList($menu_documents_text, $menu_documents_entrees); 30$MenuDocuments = new ZenityList($menu_documents_text, $menu_documents_entrees);
31$MenuCommunication = new ZenityList($menu_communication_text, $menu_communication_entrees); 31$MenuCommunication = new ZenityList($menu_communication_text, $menu_communication_entrees);
32$RechercheClient = new zenityEntry($recherche_client_text); 32$RechercheClient = new zenityEntry($recherche_client_text);
33$ResultatsRechercheClient = new zenityList($resultats_recherche_client_text, []); 33$ResultatsRechercheClient = new ZenityList($resultats_recherche_client_text, [], 2);
34$NouveauClient = new ZenityForms($nouveau_client_text, $nouveau_client_entrees); 34$NouveauClient = new ZenityForms($nouveau_client_text, $nouveau_client_entrees);
35$Calendrier = new ZenityCalendar($calendar_text); 35$Calendrier = new ZenityCalendar($calendar_text);
36$FormulairePrestation = new ZenityForms($formulaire_text, $formulaire_entrees); 36$FormulairePrestation = new ZenityForms($formulaire_text, $formulaire_entrees);