Ceci est une ancienne révision du document !
Docu-Pro
Contexte
Etablissement
Une grande surface spécialisée dans différents secteurs (notion de Monde).
Développement
Il s'agit de créer un gestionnaire de documentation adapté à une entreprise, qui permettra aux salariés de gérer/créer puis consulter/rechercher dans une documentation partagée.
Outils
- Développement sous Eclipse.
- Utilisation de doctrine, DAO, JsUtils.
- Utilisation du framework CodeIgniter.
Langages
- PHP
- MySQL
- jquery
Fonctionnalité : Recherche quelconque
• Définition de la fonctionnalité :
La fonctionnalité « rechercher » permettra donc à un membre de saisir une valeur puis de choisir le type de recherche. Recherche de type document, theme, utilisateur, groupe, domaine, monde ou bien de tout type.
• Contenu
1/ La valeur recherchée et le choix du type seront récupérés en paramètre dans une fonction :
function SearchBar ($valeurRecherchée, $type=utilisateur)
La fonction sera appelée via le click d’un bouton représentant une image de loupe, logo habituellement associé à la recherche et/ou via un keyPress de la touche Entrée.
2/ Ensuite ces valeurs seront retransmises vers une deuxième fonction : cette dernière contiendra donc plusieurs requêtes SQL selon le type du style :
SELECT id, tnom FROM utilisateur WHERE nom like '%valeurrecherhée%'
3/ Enfin, il faudra afficher pour chaque résultat un lien permettant à l’utilisateur d’afficher le contenu d’un monde par exemple, ou le contenu d’un document. Il sera donc appelé au click, une troisième fonction qui contiendra l’id de l’élement cliqué ainsi que son type!
Exemples : si on clique sur le monde informatique ayant pour id=2, cette troisième fonction récupère donc l’integer 2 et le type=monde et exécute une requête du style :
If (type==monde){ SELECT * FROM domaines WHERE idmonde =2 ; }
Controleur
→ Un seul contrôleur « CRecherche ».
Voici les fonctions :
Nom | Description |
---|---|
index() | Charge les vues |
_construct() | Charge la librairie pour les sessions |
search() | Récupère la valeur recherchée ainsi que les cases cochées par l'utilisateur puis retourne ces informations vers resultatSearch() |
resultatSearch() | Effectue les requêtes SQL selon les cases cochées et la valeur recherchée. Tout type de résultat est géré (valeur recherchée nulle, aucun résultat après la recherche,etc) |
loadViewExecSearch() | Fonction exécutée au click d'un résultat : si on clique sur un monde, cette fonction se chargera d'afficher les domaines contenus dans ce dernier. Si on clique sur un domaine, sera alors affichés les thèmes présents dans ce domaine, etc |
Vues
Nom | Description |
---|---|
vHeader | Affichage de l’en tête de la page |
vMenu | Affichage du menu à gauche |
vRecherche | Affichage de la zone de saisie pour la recherche, les cases a cochées et une zone consacrées aux résultats |
vResultatRecherche | Affichage des résultats dans la zone prévue dans la vue vRecherche |
vExecSearch | Affichage des informations concernant l'élément cliqué toujours dans la zone prévue dans la vue vRecherche |
v_footer | Affichage du pied-de-page |
Base de donnée
! Remarque :
- il faut supprimer les ORM pour les models Utilisateur, Partie et Version.
- Des modifications sont nécessaires sur la base de donnés : dans la table partie, il faut rajouter un champ document_id, qui est donc en relation avec la table document. Pensez à ajouter ce dernier champ au model Partie sur eclipse !
- Dans la fonction loadViewExecSearch, le click sur un utilisateur n'a pas encore été traité. Des modifications de la base de données sont nécessaires pour cela.
Code
Fonction search()
public function search(){ // on récupere la valeur recherchée $searched=$_POST['searchBar']; // stock l'array des casés cochées en session (le temps d'une requête) $caseChecked=$_POST['Recherche']; $this->session->set_flashdata('caseChecked', $caseChecked); // get avec la valeur recherchée par l'utilisateur vers resultatSearch $this->jsutils->get("CRecherche/resultatSearch/".$searched,"#SearchResultContainer"); echo $this->jsutils->compile(); }
Fonction resultatSearch()
public function resultatSearch($searched){ $caseChecked=$this->session->flashdata('caseChecked'); $searched=urldecode($searched); if ($searched=='undefined') { $src=ressource_url('sad.png'); echo "<div class='NoResult'> <img src='".$src."'/> <h1 class='recherche'>Aucune valeur saisie !</h1> </div>"; }else{ $documents=array(); $groupes=array(); $domaines=array(); $utilisateurs=array(); $themes=array(); $mondes=array(); $tablesNeeded=array(); foreach($caseChecked as $valeur) { if ($valeur=="tout"){ $documents=DAO\getAll("document","o.titre LIKE '%".$searched."%'"); $groupes=DAO\getAll("groupe","o.libelle LIKE '%".$searched."%'"); $domaines=DAO\getAll("domaine","o.libelle LIKE '%".$searched."%'"); $utilisateurs=DAO\getAll("utilisateur","o.prenom LIKE '%".$searched."%' OR o.nom LIKE '%".$searched."%'"); $themes=DAO\getAll("theme","o.libelle LIKE '%".$searched."%'"); $mondes=DAO\getAll("monde","o.libelle LIKE '%".$searched."%'"); $allResult=array($documents,$groupes,$domaines,$utilisateurs,$themes,$mondes); $i=0; foreach($allResult as $typeRes) { $strTablesName=""; $i++; if (!empty($typeRes)){ switch ($i){ case 1: $strTablesName="document"; break; case 2: $strTablesName="groupe"; break; case 3: $strTablesName="domaine"; break; case 4: $strTablesName="utilisateur"; break; case 5: $strTablesName="theme"; break; case 6: $strTablesName="monde"; break; } array_push($tablesNeeded, $strTablesName); } } }else{ if ($valeur=="groupe" OR $valeur=="domaine" OR $valeur=="theme" OR $valeur=="monde"){ ${$valeur."s"}=DAO\getAll($valeur,"o.libelle LIKE '%".$searched."%'"); }else{ if ($valeur=="document"){ ${$valeur."s"}=DAO\getAll($valeur,"o.titre LIKE '%".$searched."%'"); }else{ ${$valeur."s"}=DAO\getAll($valeur,"o.prenom LIKE '%".$searched."%' OR o.nom LIKE '%".$searched."%'"); } } $allResult=array(); $allResultName=array(); array_push($allResult, ${$valeur."s"}); array_push($allResultName, $valeur); $i=0; foreach ($allResult as $typeRes){ $strTablesName=""; if (!empty($typeRes)){ $strTablesName=$allResultName[$i]; array_push($tablesNeeded, $strTablesName); } $i++; } } } $this->jsutils->getAndBindTo(".eltRes_text_world", "click", "CRecherche/loadViewExecSearch/monde","#SearchResultContainer","{'eltId': $(this).attr('id')}"); $this->jsutils->getAndBindTo(".eltRes_text_user", "click", "CRecherche/loadViewExecSearch/utilisateur","#SearchResultContainer","{'eltId': $(this).attr('id')}"); $this->jsutils->getAndBindTo(".eltRes_text_grp", "click", "CRecherche/loadViewExecSearch/groupe","#SearchResultContainer","{'eltId': $(this).attr('id')}"); $this->jsutils->getAndBindTo(".eltRes_text_doc", "click", "CRecherche/loadViewExecSearch/document","#SearchResultContainer","{'eltId': $(this).attr('id')}"); $this->jsutils->getAndBindTo(".eltRes_text_dom", "click", "CRecherche/loadViewExecSearch/domaine","#SearchResultContainer","{'eltId': $(this).attr('id')}"); $this->jsutils->getAndBindTo(".eltRes_text_thm", "click", "CRecherche/loadViewExecSearch/theme","#SearchResultContainer","{'eltId': $(this).attr('id')}"); $this->jsutils->compile(); $this->load->view('vResultatRecherche',array("documents"=>$documents,"groupes"=>$groupes,"domaines"=>$domaines,"utilisateurs"=>$utilisateurs,"themes"=>$themes,"mondes"=>$mondes,"searched"=>$searched,"tablesNeeded"=>$tablesNeeded)); } }
Fonction loadViewExecSearch()
public function loadViewExecSearch($type,$eltId){ $tableName=""; switch ($type){ case "groupe": $tableName="utilisateur"; break; case "domaine": $tableName="theme"; break; case "document": $tableName="partie"; break; case "theme": $tableName="document"; break; case "utilisateur": break; case "monde": $tableName="domaine"; break; } $eltInfo=DAO\getAll($type,"o.id = '".$eltId."'"); if ($type=="groupe" || $type=="domaine" || $type=="theme" || $type=="monde"){ $lstSubElt=DAO\getAll($tableName,"o.".$type." = '".$eltId."'"); $this->jsutils->getAndBindTo(".eltRes_text_dom", "click", "CRecherche/loadViewExecSearch/domaine","#SearchResultContainer","{'eltId': $(this).attr('id')}"); $this->jsutils->getAndBindTo(".eltRes_text_doc", "click", "CRecherche/loadViewExecSearch/document","#SearchResultContainer","{'eltId': $(this).attr('id')}"); $this->jsutils->getAndBindTo(".eltRes_text_thm", "click", "CRecherche/loadViewExecSearch/theme","#SearchResultContainer","{'eltId': $(this).attr('id')}"); $this->jsutils->getAndBindTo(".eltRes_text_user", "click", "CRecherche/loadViewExecSearch/utilisateur","#SearchResultContainer","{'eltId': $(this).attr('id')}"); $this->jsutils->compile(); $this->load->view('vExecSearch', array("type"=>$type, "lstSubElt"=>$lstSubElt, "eltInfo"=>$eltInfo)); }else{ if ($type=="document"){ $lstPartie=DAO\getAll($tableName,"o.".$type." = '".$eltId."' ORDER BY o.ordre ASC"); $this->load->view('vExecSearch', array("type"=>$type, "lstPartie"=>$lstPartie, "eltInfo"=>$eltInfo)); } else{ $this->load->view('vExecSearch', array("type"=>$type,"eltInfo"=>$eltInfo)); } } }
Design/ Aperçu
Ci-dessous, on peut voir les différents résultats suite à la recherche “m” en ayant coché “tout”. Remarquez qu'il n'y aucun résultat concernant les thèmes et qu'ainsi il n'y a pas de tableau Thèmes avec 0 résultats ce qui aurait été inutile.
Et là, ci-dessous, on peut voir les différents résultats suite à la recherche “m” en ayant coché cette fois ci “Groupe”, “Document” et “Utilisateur”. Ainsi, les résultas concernant les domaines et les mondes ne sont pas affichés contrairement à la première image.
Maintenant voici ce qui se passe au click d'un monde :
Et à partir d'ici, si on click sur domaine , voici ce qui se passe : (et ainsi de suite)
Sur un document, affiche les parties des documents dans l'ordre avec leur titre et leur contenu :