diff options
| author | polo <ordipolo@gmx.fr> | 2022-12-20 03:31:33 +0100 |
|---|---|---|
| committer | polo <ordipolo@gmx.fr> | 2022-12-20 03:31:33 +0100 |
| commit | 7d564efbccc4b361d2fa2db2902fb35882304aae (patch) | |
| tree | efc28d94a1387f918c84201318880d74a52adf84 /src | |
| parent | dedbe2f5cee33431c1299c7f0dbef4e247dc2447 (diff) | |
| download | AppliGestionPHP-7d564efbccc4b361d2fa2db2902fb35882304aae.tar.gz AppliGestionPHP-7d564efbccc4b361d2fa2db2902fb35882304aae.tar.bz2 AppliGestionPHP-7d564efbccc4b361d2fa2db2902fb35882304aae.zip | |
recherche de clients
Diffstat (limited to 'src')
| -rw-r--r-- | src/functions.php | 47 | ||||
| -rwxr-xr-x | src/main.php | 29 | ||||
| -rw-r--r-- | src/model/Clients.php | 32 | ||||
| -rw-r--r-- | src/model/Model.php | 16 | ||||
| -rw-r--r-- | src/view/Zenity.php | 62 | ||||
| -rw-r--r-- | 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 @@ | |||
| 7 | // commande pour lancer une application graphique en ouvrant un fichier | 7 | // commande pour lancer une application graphique en ouvrant un fichier |
| 8 | function windowAppCommand(string $app, string $path = ''): string | 8 | function 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 | ||
| 25 | function rechercheClient(string $saisie): array | 25 | function 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 | ||
| 40 | function enregistrementNouveauClient(Clients $Client, ZenityForms $NouveauClient) | 38 | function 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 | |||
| 42 | require('view/zenity_setup.php'); // texte dans les fenêtres ET instanciation (un objet = une commande) | 42 | require('view/zenity_setup.php'); // texte dans les fenêtres ET instanciation (un objet = une commande) |
| 43 | require('Latex.php'); // générer le code LaTeX | 43 | require('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 | ||
| 32 | class ZenityList extends ZenityCmd | 32 | class 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 | ||
| 65 | class ZenityQuestion extends ZenityCmd | 101 | class 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 |
| 79 | class ZenityForms extends ZenityCmd | 115 | class 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); |
