Navré j'ai oublié de joindre les fichiers ...

Guillaume PERRIER a écrit :
Bonjour,
j'en avais parlé sur le forum, et je l'ai enfin fini.
Voici donc les fichiers patch du code que j'ai écris pour rattacher les articles de la base de connaissance à une entité.
Egalement le script sql pour les modifications à apporter dans la base.

Ce que j'ai écrit prévoit que les utilisateurs aient accès aux articles qui sont dans une des entités de la branche à la laquelle ils appartiennent,
le distingo FAQ/base de connaissance n'a pas été touché.
Tout les articles qui sont dans des entités autres que ancêtres directs ou enfants directs ne sont pas visibles. Le "dropdown" de la page de recherche est prévu pour n'afficher que les catégories qui contiennent des articles visibles, et les parents de ces catégories pour que l'affichage reste cohérent. Ce "dropdown" prend également en compte le cas ou on n'a accès qu'à la FAQ. Je n'ai pas modifié les autres dropdown, celui la création d'un article par exemple ou ceux qui se trouvent dans la fenetre popup de gestion des catégories car il me semblait jusdicieux que les toutes catégories restent accessibles dans ces cas là ne serait-ce que pour éviter de créer une catégorie déjà existente.
Un article est créé dans l'entité active.

Les fichiers de code sont issus du tarball du 12/09/07.

Voila j'espère que ce code sera util.



--
Guillaume PERRIER
e-mail : [EMAIL PROTECTED]

ALTER TABLE `glpi_kbitems` ADD `FK_entities2` INT( 11 ) NOT NULL DEFAULT '0' 
AFTER `ID` ;
ALTER TABLE `glpi_kbitems` ADD INDEX ( `FK_entities` );
--- temp\auth.function.php      2007-09-12 06:26:13.000000000 +0200
+++ glpi-trunk-2007-09-12\inc\auth.function.php 2007-09-12 16:59:54.268302900 
+0200
@@ -597,6 +597,25 @@
                loadGroups();
                doHook("change_entity");
                cleanCache("GLPI_HEADER_".$_SESSION["glpiID"]);
+
+               // Ajout par GP pour BDC-entites
+               // Ici je force la mise a jour de la variable 
$_SESSION['glpi_entities_ancestors'] avec les ancetres de toutes les entites 
active grace a la fonction "getEntityAncestors()"
+               foreach ($_SESSION['glpiactiveentities'] as $val) {
+                       getEntityAncestors($val);
+               }
+               // Initialisation de la variable de session contenant toute les 
entités de la (ou des)  branche(s)  dans la(es)quelle(s) se trouve 
l'utilisateur en commençant avec les entites actives.
+               // a cette variable s'ajoute ensuite tous les ancetres et tous 
les enfants de chacune des entites actives.
+               
$_SESSION['glpi_merged_entities_forkb']=$_SESSION['glpiactiveentities'];
+               foreach ($_SESSION['glpiactiveentities'] as $val) {
+                       
$_SESSION['glpi_merged_entities_forkb']=array_merge($_SESSION['glpi_merged_entities_forkb'],$_SESSION['glpi_entities_ancestors'][$val],getSonsOfTreeItem("glpi_entities",$val));
+               }
+               
$_SESSION['glpi_merged_entities_forkb']=array_unique($_SESSION['glpi_merged_entities_forkb']);
+               
+               // Je remet j'ecrase ici la variable contenant la liste des 
catégories de premier niveau accessibles par l'utlisateur.
+               // le contenu de cette variable change systematiquement quand 
on change d'entites, et est recalculee au besoin.
+               // Cependant si on ne change pas d'entité, il n'est pas utile 
de la recaculer. C'est pour cela que je ne la remet a zero qu'ici.
+               unset($_SESSION['glpi_entitykbcategories']);
+               // Fin Ajout
        }
 }
 
--- temp\define.php     2007-09-12 06:26:02.000000000 +0200
+++ glpi-trunk-2007-09-12\config\define.php     2007-09-12 10:28:47.555916300 
+0200
@@ -299,8 +299,8 @@
                "glpi_contacts","glpi_contracts","glpi_docs",
                
"glpi_dropdown_locations","glpi_dropdown_netpoint","glpi_enterprises","glpi_groups",
                
"glpi_mailgate","glpi_monitors","glpi_networking","glpi_peripherals","glpi_phones","glpi_printers","glpi_software",
-               "glpi_tracking","state_types","reservation_types");
+               
"glpi_tracking","state_types","reservation_types","glpi_kbitems");
 
        
$CFG_GLPI["union_search_type"]=array(RESERVATION_TYPE=>"reservation_types",STATE_TYPE=>"state_types");
 
-?>
\ No newline at end of file
+?>
--- temp\dropdown.function.php  2007-09-12 06:26:13.000000000 +0200
+++ glpi-trunk-2007-09-12\inc\dropdown.function.php     2007-09-12 
16:38:01.463812100 +0200
@@ -1851,4 +1851,90 @@
 
        dropdownArrayValues("ranking",$ranks);
 }
+
+// Ajout par GP pour BDC-entites
+// Base sur la fonction dropDownValue
+// Cette fonction genere en HTMLune liste déroulante des categories de la base 
de connaissance mais ne donne que les categories
+// Qui contiennent un article visible par l'utilisateur ainsi que les parents 
de ces categorie afin d'eviter les incoherence d'affichage.
+/**
+ * Print out an HTML "<select>" for a dropdown with preselected value
+ *
+ *
+ * @param $value the preselected value we want
+ * @param $display_comments display the comments near the dropdown
+ * @param $faq is set to 1 when we only want Categories containing a faq
+ * @return nothing (display the select box)
+ *
+ */
+function dropdownKbCategories($value=0, $faq=0, $display_comments=1) {
+
+       global $DB,$CFG_GLPI,$LANG;
+
+       $rand=mt_rand();
+
+       $name="------";
+       $comments="";
+       $limit_length=$CFG_GLPI["dropdown_limit"];
+       if (empty($value)) $value=0;
+       if ($value>0){
+               $tmpname=getDropdownName("glpi_dropdown_kbcategories",$value,1);
+               if ($tmpname["name"]!="&nbsp;"){
+                       $name=$tmpname["name"];
+                       $comments=$tmpname["comments"];
+                       
$limit_length=max(strlen($name),$CFG_GLPI["dropdown_limit"]);
+               }
+       }
+
+       $use_ajax=false;
+       if ($CFG_GLPI["use_ajax"]){
+               
$condition="glpi_kbitems.categoryID=glpi_dropdown_kbcategories.ID ";
+               
$condition.=getEntitiesRestrictRequest("AND","glpi_kbitems","",$_SESSION['glpi_merged_entities_forkb']);
+               if ($faq) {
+                       $condition .= "AND glpi_kbitems.faq = '1' ";
+               }
+               $nb=countElementsInTable("glpi_kbitems, 
glpi_dropdown_kbcategories",$condition);
+               if ($nb>$CFG_GLPI["ajax_limit_count"]){
+                       $use_ajax=true;
+               }
+       }
+       
+    $params=array('searchText'=>'__VALUE__',
+               'value'=>$value,
+               'table'=>'glpi_dropdown_kbcategories',
+               'myname'=>'parentID',
+               'limit'=>$limit_length,
+               'comments'=>$display_comments,
+               'rand'=>$rand,
+               'faq'=>$faq
+       );
+       
+       $default="<select name='parentID' 
id='dropdown_parentID".$rand."'><option 
value='$value'>$name</option></select>\n";
+       
ajaxDropdown($use_ajax,"/ajax/dropdownValue.php",$params,$default,$rand);
+
+       // Display comments
+       $which="";
+
+       $dropdown_right=false;
+
+       $dropdown_right=haveRight("dropdown","w");
+
+       if ($dropdown_right){
+               $which="glpi_dropdown_kbcategories";
+       }
+
+       if ($display_comments){
+               echo "<img alt='' src='".$CFG_GLPI["root_doc"]."/pics/aide.png' 
onmouseout=\"cleanhide('comments_parentID$rand')\" 
onmouseover=\"cleandisplay('comments_parentID$rand')\" ";
+               if ($dropdown_right&&!empty($which)) echo " 
style='cursor:pointer;'  
onClick=\"window.open('".$CFG_GLPI["root_doc"]."/front/popup.php?popup=dropdown&amp;which=$which"."&amp;rand=$rand&amp;'
 ,'glpipopup', 'height=400, width=1000, top=100, left=100, scrollbars=yes' )\"";
+               echo ">";
+               echo "<span class='over_link' 
id='comments_parentID$rand'>".nl2br($comments)."</span>";
+       }
+       // Display specific Links
+       if ($table=="glpi_enterprises"){
+               echo getEnterpriseLinks($value);        
+       }
+
+       return $rand;
+}
+// Fin Ajout
+
 ?>
--- temp\dropdownValue.php      2007-09-12 06:25:54.000000000 +0200
+++ glpi-trunk-2007-09-12\ajax\dropdownValue.php        2007-09-12 
16:31:46.100685500 +0200
@@ -94,14 +94,49 @@
                        } else {
                                
$where.=getEntitiesRestrictRequest("",$_POST['table']);
                        }
+                       
                }
 
+               // Ajout par GP pour BDC-enties
+               // Je construis ici la clause "where" qui correspond a mon 
besoin et qui permettra de sortir la liste des categories et de leurs parents
+               // Dans lesquelles on peut trouver un article de la BDC ou de l 
FAQ ou seulement de la FAQ selon les droits utilisateur.
+               if 
($_POST['table']=="glpi_dropdown_kbcategories"&&isset($_POST['faq'])) {
+                       $subquery="SELECT DISTINCT categoryID FROM glpi_kbitems 
";
+                       
$subquery.="WHERE".getEntitiesRestrictRequest("","glpi_kbitems","",$_SESSION['glpi_merged_entities_forkb']);
+                       if ($_POST['faq']){
+                               $subquery.="AND glpi_kbitems.faq='1'";
+                       }
+                       $subresult = $DB->query($subquery);
 
-               if ($where=="WHERE ") $where="";
+                       $array_kbcat=array();
+                       while ($row=$DB->fetch_row($subresult)) {
+                               $array_kbcat[$row['0']]=$row['0'];
+                       }
+                       $array_kbparent=array();
+                       foreach ($array_kbcat as $val) {
+                               $array_kbparent=array_merge($array_kbparent, 
getAncestorsOfTreeItem("glpi_dropdown_kbcategories",$val));
+                       }
+                       
$array_kbcat=array_unique(array_merge($array_kbcat,$array_kbparent));
 
+                       $list_kbcat="(";
+                       $firstfor=true;
+                       foreach ($array_kbcat as $val) {
+                               if (!$firstfor){
+                                       $list_kbcat.=", ";
+                               } else {
+                                       $firstfor=false;
+                               }
+                               $list_kbcat.=$val;
+                       }
+                       $list_kbcat.=")";
+                       
+                       $where="WHERE glpi_dropdown_kbcategories.ID IN 
$list_kbcat";
+               }
+               // Fin Ajout
 
+               if ($where=="WHERE ") $where="";
                $query = "SELECT * FROM ".$_POST['table']." $where ORDER BY 
$add_order completename $LIMIT";
-//             echo $query;
+               //echo $query;
 
                $result = $DB->query($query);
 
--- temp\knowbase.class.php     2007-09-12 06:26:13.000000000 +0200
+++ glpi-trunk-2007-09-12\inc\knowbase.class.php        2007-09-12 
16:34:09.362923500 +0200
@@ -97,13 +97,21 @@
                if (empty($ID)) {
        
                        if ($this->getEmpty()) $spotted=true;
-       
+
+                       // Ajout par GP pour BDC-entites
+                       // Si $ID est vide c'est que l'on ajoute un ticket, il 
faut donc prendre la valeur de l'entité active pour la mettre dans un champ 
"hidden"
+                       $hidden_entity = $_SESSION['glpiactive_entity'];
+                       // Fin Ajout
        
                } else {
                        if ($this->getFromDB($ID)) $spotted=true;
                        if ($this->fields["faq"]&&!haveRight("faq","w")) 
$spotted=false;
                        if (!$this->fields["faq"]&&!haveRight("knowbase","w")) 
$spotted=false;
-       
+
+                       // Ajout par GP pour BDC-entites
+                       // Si $ID n'est pas vide c'est que l'on va modifier un 
article, il faut donc récupérer l'entité de ce dernier pour le mettre dans le 
champ "hidden"
+                       $hidden_entity = $this->fields["FK_entities"];
+                       // Fin Ajout
                }       
 
                if($spotted) {
@@ -119,6 +127,11 @@
                        if (!empty($ID)) {
                                echo "<input type='hidden' name='ID' 
value=\"$ID\">\n";
                        }
+                       
+                       // Ajout par GP pour BDC-entites
+                       // écriture du champ caché contenant la bonne entites 
dans le formulaire afin que ce dernier soit mis a jour dans la base de donnees
+                       echo "<input type='hidden' name='FK_entities' 
value=\"$hidden_entity\">\n";
+                       // Fin Ajout
                
                
                        echo "<fieldset>";
--- temp\knowbase.function.php  2007-09-12 06:26:13.000000000 +0200
+++ glpi-trunk-2007-09-12\inc\knowbase.function.php     2007-09-12 
17:13:18.185246700 +0200
@@ -73,14 +73,22 @@
        echo "</td>";
        
        // Category select not for anonymous FAQ
-       if (isset($_SESSION["glpiID"])&&!$faq){
+       /* Avant Modification par GP pour BDC-entites
+       if (isset($_SESSION["glpiID"])/*&&!$faq){
+       J'enleve la variable $faq de la condition car elle est geree par la 
nouvelle fonction.*/
+       if (isset($_SESSION["glpiID"])){
+       // Fin Modification
                echo "<td><form method=get action=\"".$target."\">";
                echo "<table border='0' class='tab_cadre'>";
                echo "<tr ><th colspan='2'>".$LANG["buttons"][43]."</th></tr>";
                echo "<tr><td class='center'>";
                echo $LANG["common"][36]." : &nbsp; &nbsp;";
+               /* Avant Modification par GP pour BDC-entites
                
dropdownValue("glpi_dropdown_kbcategories","parentID",$parentID);
                // ----***** TODO Dropdown qui affiche uniquement les 
categories contenant une FAQ
+               Remplacement par la nouvelle fonction.*/
+               dropdownKbCategories($parentID, $faq, '1');
+               // Fin Modification
                
                echo "</td><td><input type='submit' 
value=\"".$LANG["buttons"][2]."\" class='submit' ></td></tr>";
        
@@ -108,7 +116,14 @@
                // Get All FAQ categories
                if (!isset($_SESSION['glpi_faqcategories'])){
                        $_SESSION['glpi_faqcategories']=array();
-                       $query="SELECT DISTINCT categoryID FROM glpi_kbitems 
WHERE (glpi_kbitems.faq = '1')";
+
+                       /* Avant Modification BDC-entites :
+                       $query="SELECT DISTINCT categoryID FROM glpi_kbitems 
WHERE glpi_kbitems.faq = '1' ";
+                       Ajout d'une restriction sur les entites dans la 
requete.*/
+               
+                       $query="SELECT DISTINCT categoryID FROM glpi_kbitems 
WHERE glpi_kbitems.faq = '1' 
".getEntitiesRestrictRequest("AND","glpi_kbitems","",$_SESSION['glpi_merged_entities_forkb']);
+                       // Fin Modification
+
                        if ($result=$DB->query($query)){
                                if ($DB->numrows($result)){
                                        while ($data=$DB->fetch_array($result)){
@@ -135,8 +150,42 @@
                }
                $query = "SELECT DISTINCT glpi_dropdown_kbcategories.* FROM 
glpi_dropdown_kbcategories WHERE ID IN ".$_SESSION['glpi_faqcategories']." AND  
(glpi_dropdown_kbcategories.parentID = '$parentID') ORDER  BY name ASC";
        }else{
+               /* Avant Modification BDC-entites :
                if (!haveRight("knowbase","r")) return false;
                $query = "SELECT * FROM glpi_dropdown_kbcategories WHERE  
(glpi_dropdown_kbcategories.parentID = '$parentID') ORDER  BY name ASC";
+               Ajout ici d'un restriction sur les entites dans la requete, il 
faut cependant calculer la variable contenant les ID des categories de premier 
niveau a afficher si la variable n'existe pas ou plus.*/
+               if (!haveRight("knowbase","r")) return false;
+               
+               if (!isset($_SESSION['glpi_entitykbcategories'])){
+                       $_SESSION['glpi_entitykbcategories']=array();
+
+                       $query="SELECT DISTINCT categoryID FROM glpi_kbitems 
WHERE".getEntitiesRestrictRequest("","glpi_kbitems","",$_SESSION['glpi_merged_entities_forkb']);
+
+                       if ($result=$DB->query($query)){
+                               if ($DB->numrows($result)){
+                                       while ($data=$DB->fetch_array($result)){
+                                               if 
(!in_array($data['categoryID'],$_SESSION['glpi_entitykbcategories'])){
+                                                       
$_SESSION['glpi_entitykbcategories'][]=$data['categoryID'];
+                                                       
$_SESSION['glpi_entitykbcategories']=array_merge($_SESSION['glpi_entitykbcategories'],getAncestorsOfTreeItem('glpi_dropdown_kbcategories',$data['categoryID']));
+                                               }
+                                       }
+                               }
+                               if 
(count($_SESSION['glpi_entitykbcategories'])){
+                                       $tmp='(';
+                                       $first=true;
+                                       foreach 
($_SESSION['glpi_entitykbcategories'] as $key => $val){
+                                               if ($first) $first=false;
+                                               else $tmp.=',';
+                                               $tmp.=$val;
+                                       }
+                                       $tmp.=')';
+                                       
$_SESSION['glpi_entitykbcategories']=$tmp;
+                               }
+
+                       }
+               }
+               $query = "SELECT DISTINCT glpi_dropdown_kbcategories.* FROM 
glpi_dropdown_kbcategories WHERE ID IN ".$_SESSION['glpi_entitykbcategories']." 
AND  (glpi_dropdown_kbcategories.parentID = '$parentID') ORDER  BY name ASC";
+               // Fin Modification
        }
 
        /// Show category
@@ -218,7 +267,7 @@
                        $where.=" (glpi_kbitems.question $search OR 
glpi_kbitems.answer $search) ";
                        
                } else {
-                       $where.= "($field ".makeTextSearch($contains).")";
+                       $where.= " ($field ".makeTextSearch($contains).")";
                        
                }
        }else { // Il ne s'agit pas d'une recherche, on browse by category
@@ -227,6 +276,10 @@
        
        }
        
+       // Ajout pas GP pour BDC-entites
+       // Ajout du tableau des entites actives et de leurs ancetres a la 
requetes, les enfants sont donc supposes avoir acces aux articles des entites 
parents.
+       
$where.=getEntitiesRestrictRequest("AND","glpi_kbitems","",$_SESSION['glpi_merged_entities_forkb']);
+       // Fin Ajout
        
        if (!$start) {
                $start = 0;
@@ -236,7 +289,7 @@
        }
 
        $query = "SELECT  *  FROM glpi_kbitems";
-  // $query.= " LEFT JOIN glpi_users  ON (glpi_users.ID = glpi_kbitems.author) 
";
+       //$query.= " LEFT JOIN glpi_users  ON (glpi_users.ID = 
glpi_kbitems.author) ";
        $query.=" WHERE $where ORDER BY $sort $order";
        //echo $query;
        
@@ -355,7 +408,8 @@
        global $DB,$CFG_GLPI, $LANG;
        
        
-       if ($order=="recent"){
+//     if ($order=="recent"){
+       if ($order=="popular"){
                $orderby="ORDER BY view DESC";
                $title=$LANG["knowbase"][30];
        }else {
@@ -365,11 +419,22 @@
                
 
        $faq_limit="";          
+       /* Avant modification par GP pour BDC-entites :
        if($faq){ // FAQ
                $faq_limit=" WHERE (glpi_kbitems.faq = '1')";
        }
 
-       $query = "SELECT  *  FROM glpi_kbitems $faq_limit $orderby LIMIT 10";
+       $query = "SELECT  *  FROM glpi_kbitems $faq_limit $orderby LIMIT 10";*/
+       if($faq){ // FAQ
+               $faq_limit="(glpi_kbitems.faq = '1')";
+       }
+       
+       // Ajout du tableau des entites actives et de leurs ancetres a la 
requetes, les enfants sont donc supposes avoir acces aux articles des entites 
parents.
+       
$entity_limit=getEntitiesRestrictRequest("","glpi_kbitems","",$_SESSION['glpi_merged_entities_forkb']);
+       
+       $query = "SELECT  *  FROM glpi_kbitems WHERE $faq_limit $entity_limit 
$orderby LIMIT 10";
+       // Fin Modification
+
        //echo $query;
        $result = $DB->query($query);
        $number = $DB->numrows($result);
@@ -474,8 +539,15 @@
                        if ($CFG_GLPI["public_faq"] == 
0&&!haveRight("faq","r")&&!haveRight("knowbase","r")) return false;      
                }
                else 
-                       if (!haveRight("knowbase","r")) return false;   
-       
+                       if (!haveRight("knowbase","r")) return false;
+
+               // Ajout par GP pour BDC-entites
+               // redirection vers la page de la liste des articles de BDC si 
on essaye d'ouvrir un article se trouvant dans une entite a laquelle on n'a pas 
acces.
+               if 
(!haveAccessToEntity($ki->fields["FK_entities"])&&!in_array($ki->fields["FK_entities"],$_SESSION['glpi_merged_entities_forkb']))
 {
+                       
glpi_header($CFG_GLPI["root_doc"]."/front/knowbase.php");
+               }
+               // Fin Ajout
+
                //update counter view
                $query="UPDATE glpi_kbitems SET view=view+1 WHERE ID = '$ID'";
                $DB->query($query);
_______________________________________________
Glpi-dev mailing list
Glpi-dev@gna.org
https://mail.gna.org/listinfo/glpi-dev

Reply via email to