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"]!=" "){
+ $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&which=$which"."&rand=$rand&'
,'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]." : ";
+ /* 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