diff --git a/COPYRIGHT b/COPYRIGHT index b0a3364420e..66737b1f7bb 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -26,7 +26,6 @@ PHP_WriteExcel 0.3.0 LGPL 2.1 Yes Excel fi Prototype 1.6.0.2 MIT License Yes Ajax library PWC 1.3 MIT License Yes Ajax library Scriptaculous 1.8.1 MIT License Yes Ajax library -Treemenu 1.1 Perso Yes Tree in HTML pages (like categories) VCard 2.0 GPL 2.0 Yes Fonctions vcard For licenses compatibility informations: diff --git a/htdocs/categories/categorie.class.php b/htdocs/categories/categorie.class.php index fa68e73a967..13247d3f659 100644 --- a/htdocs/categories/categorie.class.php +++ b/htdocs/categories/categorie.class.php @@ -126,7 +126,7 @@ class Categorie { global $conf,$langs; $langs->load('categories'); - + if ($this->already_exists ()) { $this->error=$langs->trans("ImpossibleAddCat"); @@ -188,11 +188,11 @@ class Categorie function update() { global $conf; - + // Clean parameters $this->label=trim($this->label); $this->description=trim($this->description); - + $this->db->begin(); $sql = 'delete from '.MAIN_DB_PREFIX.'categorie_association'; @@ -210,7 +210,7 @@ class Categorie { $sql = 'insert into '.MAIN_DB_PREFIX.'categorie_association(fk_categorie_mere,fk_categorie_fille)'; $sql .= ' VALUES ("'.$this->id_mere.'","'.$this->id.'")'; - + dolibarr_syslog("Categorie::update sql=".$sql); if (! $this->db->query($sql)) { @@ -408,11 +408,11 @@ class Categorie function get_type($field,$class,$table='') { $objs = array(); - + // Clean parameters if (empty($table)) $table=$field; - - + + $sql = "SELECT fk_".$field." FROM ".MAIN_DB_PREFIX."categorie_".$table; $sql .= " WHERE fk_categorie = ".$this->id; @@ -435,8 +435,8 @@ class Categorie return -1; } } - - + + /** @@ -480,7 +480,7 @@ class Categorie return ($n[0]); } - + /** * La catégorie $fille est-elle une fille de cette catégorie ? */ @@ -512,15 +512,17 @@ class Categorie */ function get_full_arbo($type) { + $this->cats = array(); + // Charge tableau des meres $sql = "SELECT fk_categorie_mere as id_mere, fk_categorie_fille as id_fille"; $sql.= " FROM ".MAIN_DB_PREFIX."categorie_association"; - dolibarr_syslog("Categorie::get_full_arbo sql=".$sql); - $resql = $this->db->query ($sql); + dolibarr_syslog("Categorie::get_full_arbo build motherof array sql=".$sql, LOG_DEBUG); + $resql = $this->db->query($sql); if ($resql) { - while ($obj= $this->db->fetch_object($resql)) + while ($obj=$this->db->fetch_object($resql)) { $this->motherof[$obj->id_fille]=$obj->id_mere; } @@ -539,33 +541,21 @@ class Categorie $sql.= " WHERE c.type = ".$type; $sql.= " ORDER BY c.label, c.rowid"; - dolibarr_syslog("Categorie::get_full_arbo sql=".$sql); + dolibarr_syslog("Categorie::get_full_arbo get category list sql=".$sql, LOG_DEBUG); $resql = $this->db->query($sql); if ($resql) { - $this->cats = array(); $i=0; while ($obj = $this->db->fetch_object($resql)) { - $this->cats[$obj->rowid]['id'] = $obj->rowid; - $this->cats[$obj->rowid]['id_mere'] = $this->motherof[$obj->rowid]; + if (isset($this->motherof[$obj->rowid])) $this->cats[$obj->rowid]['id_mere'] = $this->motherof[$obj->rowid]; $this->cats[$obj->rowid]['label'] = $obj->label; if ($obj->rowid_fille) { - if (is_array($this->cats[$obj->rowid]['id_children'])) - { - $newelempos=sizeof($this->cats[$obj->rowid]['id_children']); - //print "this->cats[$i]['id_children'] est deja un tableau de $newelem elements
"; - $this->cats[$obj->rowid]['id_children'][$newelempos]=$obj->rowid_fille; - } - else - { - //print "this->cats[".$obj->rowid."]['id_children'] n'est pas encore un tableau
"; - $this->cats[$obj->rowid]['id_children']=array($obj->rowid_fille); - } - } + $this->cats[$obj->rowid]['id_children'][]=$obj->rowid_fille; + } $i++; } @@ -575,24 +565,24 @@ class Categorie dolibarr_print_error ($this->db); return -1; } - + // On ajoute la propriete fullpath a tous les éléments foreach($this->cats as $key => $val) { - if (isset($motherof[$key])) continue; - $this->build_path_from_id_categ($key,0); + if (isset($motherof[$key])) continue; + $this->build_path_from_id_categ($key,0); // Process a path of a root category (no mother exists) } - + + dolibarr_syslog("Categorie::get_full_arbo dol_sort_array", LOG_DEBUG); $this->cats=dol_sort_array($this->cats, 'fulllabel', 'asc', true, false); //$this->debug_cats(); - + return $this->cats; } /** - * \brief Calcule les propriétés fullpath et fulllabel d'une categorie - * du tableau this->cats et de toutes ces enfants + * \brief For category id_categ and its child available in this->cats, define property fullpath * \param id_categ id_categ entry to update * \param protection Deep counter to avoid infinite loop */ @@ -608,29 +598,29 @@ class Categorie } else { - $this->cats[$id_categ]['fullpath']='_'.$id_categ; + $this->cats[$id_categ]['fullpath']='_'.$id_categ; $this->cats[$id_categ]['fulllabel']=$this->cats[$id_categ]['label']; } // We count number of _ to have level $this->cats[$id_categ]['level']=strlen(eregi_replace('[^_]','',$this->cats[$id_categ]['fullpath'])); - - // Traite ces enfants + + // Process all childs on several levels of this category $protection++; if ($protection > 20) return; // On ne traite pas plus de 20 niveaux if (! is_array($this->cats[$id_categ]['id_children'])) return; - foreach($this->cats[$id_categ]['id_children'] as $key => $val) + foreach($this->cats[$id_categ]['id_children'] as $key => $idchild) { - $this->build_path_from_id_categ($val,$protection); + $this->build_path_from_id_categ($idchild,$protection); } return; } - + /** * \brief Affiche contenu de $this->cats */ function debug_cats() { - // Affiche $this->cats + // Affiche $this->cats foreach($this->cats as $key => $val) { print 'id: '.$this->cats[$key]['id']; @@ -643,7 +633,7 @@ class Categorie } } - + /** * \brief Retourne toutes les catégories * \return array Tableau d'objet Categorie @@ -670,7 +660,7 @@ class Categorie return -1; } } - + /** * \brief Retourne le nombre total de catégories * \return int Nombre de categories @@ -826,7 +816,7 @@ class Categorie return implode($sep, $w); } - + /** * Retourne un tableau contenant la liste des catégories mères */ @@ -838,7 +828,7 @@ class Categorie $sql .= "WHERE fk_categorie_fille = ".$this->id; $res = $this->db->query ($sql); - + if ($res) { while ($cat = $this->db->fetch_array ($res)) @@ -940,11 +930,11 @@ class Categorie return -1; } } - - + + /** * \brief Vérifie le type de la catégorie - * + * */ function verify_type($id) { @@ -1010,5 +1000,32 @@ class Categorie return -1; } } + + /** + * \brief Renvoie nom clicable (avec eventuellement le picto) + * \param withpicto 0=Pas de picto, 1=Inclut le picto dans le lien, 2=Picto seul + * \param option Sur quoi pointe le lien ('', 'withdraw') + * \return string Chaine avec URL + */ + function getNomUrl($withpicto=0,$option='') + { + global $langs; + + $result=''; + + $lien = ''; + $label=$this->label; + $lienfin=''; + + $picto='category'; + + $label=$langs->trans("ShowCategory").': '.$this->ref; + + if ($withpicto) $result.=($lien.img_object($label,$picto).$lienfin); + if ($withpicto && $withpicto != 2) $result.=' '; + if ($withpicto != 2) $result.=$lien.$this->ref.$lienfin; + return $result; + } + } ?> diff --git a/htdocs/categories/categorie.php b/htdocs/categories/categorie.php index 60ede623502..825ffab7cb1 100644 --- a/htdocs/categories/categorie.php +++ b/htdocs/categories/categorie.php @@ -2,7 +2,7 @@ /* Copyright (C) 2001-2007 Rodolphe Quiedeville * Copyright (C) 2005 Brice Davoleau * Copyright (C) 2005-2007 Regis Houssin - * Copyright (C) 2006-2008 Laurent Destailleur + * Copyright (C) 2006-2009 Laurent Destailleur * Copyright (C) 2007 Patrick Raguin * * This program is free software; you can redistribute it and/or modify @@ -89,21 +89,21 @@ if (isset($_REQUEST["catMere"]) && $_REQUEST["catMere"]>=0) if ($_REQUEST["id"]) $result = $object->fetch($_REQUEST["id"]); $type = 'product'; } - + $cat = new Categorie($db); $result=$cat->fetch($_REQUEST["catMere"]); $result=$cat->add_type($object,$type); if ($result >= 0) { - $mesg='
'.$langs->trans("WasAddedSuccessfully",$cat->label).'
'; + $mesg='
'.$langs->trans("WasAddedSuccessfully",$cat->label).'
'; } else { if ($cat->error == 'DB_ERROR_RECORD_ALREADY_EXISTS') $mesg='
'.$langs->trans("ObjectAlreadyLinkedToCategory").'
'; - else $mesg='
'.$langs->trans("Error").' '.$cat->error.'
'; + else $mesg='
'.$langs->trans("Error").' '.$cat->error.'
'; } - + } @@ -120,17 +120,17 @@ if ($_GET["socid"]) { require_once(DOL_DOCUMENT_ROOT."/lib/company.lib.php"); require_once(DOL_DOCUMENT_ROOT."/societe.class.php"); - + $langs->load("companies"); - + /* * Creation de l'objet client/fournisseur correspondant au socid */ $soc = new Societe($db); $result = $soc->fetch($_GET["socid"]); llxHeader("","",$langs->trans("Category")); - - + + /* * Affichage onglets */ @@ -139,7 +139,7 @@ if ($_GET["socid"]) dolibarr_fiche_head($head, 'category', $langs->trans("ThirdParty")); print ''; - + print ''; @@ -154,7 +154,7 @@ if ($_GET["socid"]) if ($soc->check_codeclient() <> 0) print ' '.$langs->trans("WrongCustomerCode"); print ''; } - + if ($soc->fournisseur) { print '
'.$langs->trans("Name").''; print $soc->nom; print '
'; @@ -187,13 +187,13 @@ if ($_GET["socid"]) print '
'; print ''; - + if ($mesg) print($mesg); - + if ($soc->client) formCategory($db,$soc,'societe',2); - + if ($soc->client && $soc->fournisseur) print '

'; - + if ($soc->fournisseur) formCategory($db,$soc,'fournisseur',1); } else if ($_GET["id"] || $_GET["ref"]) @@ -203,19 +203,19 @@ else if ($_GET["id"] || $_GET["ref"]) */ require_once(DOL_DOCUMENT_ROOT."/lib/product.lib.php"); require_once(DOL_DOCUMENT_ROOT."/product.class.php"); - + // Produit $product = new Product($db); if ($_GET["ref"]) $result = $product->fetch('',$_GET["ref"]); if ($_GET["id"]) $result = $product->fetch($_GET["id"]); - + llxHeader("","",$langs->trans("CardProduct".$product->type)); $head=product_prepare_head($product, $user); $titre=$langs->trans("CardProduct".$product->type); dolibarr_fiche_head($head, 'category', $titre); - + print ''; print ""; @@ -249,20 +249,20 @@ else if ($_GET["id"] || $_GET["ref"]) print '
'; print ''; - + if ($mesg) print($mesg); - + formCategory($db,$product,'product',0); } - + /* * Fonction Barre d'actions */ function formCategory($db,$object,$type,$typeid) { global $user,$langs,$html,$bc; - + if ($typeid == 0) $title = $langs->trans("ProductsCategoriesShort"); if ($typeid == 1) $title = $langs->trans("SuppliersCategoriesShort"); if ($typeid == 2) $title = $langs->trans("CustomersProspectsCategoriesShort"); @@ -274,7 +274,7 @@ function formCategory($db,$object,$type,$typeid) { $nameId = 'id'; } - + // Formulaire ajout dans une categorie print '
'; print_fiche_titre($title,'',''); @@ -295,7 +295,7 @@ function formCategory($db,$object,$type,$typeid) print ''; print '
'; - + $c = new Categorie($db); $cats = $c->containing($object->id,$type,$typeid); @@ -310,14 +310,17 @@ function formCategory($db,$object,$type,$typeid) $var = true; foreach ($cats as $cat) { - $ways = $cat->print_all_ways (); + $ways = $cat->print_all_ways(); foreach ($ways as $way) { $var = ! $var; print ""; - + // Categorie - print "".$way.""; + print ""; + //$c->id=; + //print $c->getNomUrl(1); + print $way.""; // Lien supprimer print ''; @@ -354,7 +357,7 @@ function formCategory($db,$object,$type,$typeid) print $title; print "
"; } -} +} $db->close(); diff --git a/htdocs/categories/index.php b/htdocs/categories/index.php index d082c6cce4c..7c08afab80d 100644 --- a/htdocs/categories/index.php +++ b/htdocs/categories/index.php @@ -21,13 +21,14 @@ */ /** - \file htdocs/categories/index.php - \ingroup category - \brief Page accueil espace categories - \version $Id$ -*/ + * \file htdocs/categories/index.php + * \ingroup category + * \brief Page accueil espace categories + * \version $Id$ + */ require("./pre.inc.php"); +require_once(DOL_DOCUMENT_ROOT."/lib/treeview.lib.php"); $type=isset($_GET['type'])?$_GET['type']:$_POST['type']; @@ -40,7 +41,7 @@ if (!$user->rights->categorie->lire) accessforbidden(); * View */ -$c = new Categorie($db); +$categstatic = new Categorie($db); $html = new Form($db); if ($type == 0) $title=$langs->trans("ProductsCategoriesArea"); @@ -88,7 +89,7 @@ print ''; */ if($_POST['catname'] || $_REQUEST['id']) { - $cats = $c->rechercher($_REQUEST['id'],$_POST['catname'],$_POST['type']); + $cats = $categstatic->rechercher($_REQUEST['id'],$_POST['catname'],$_POST['type']); print ''; print ''; @@ -112,146 +113,190 @@ print '
'; // Charge tableau des categories -$cate_arbo = $c->get_full_arbo($_GET['type']); +$cate_arbo = $categstatic->get_full_arbo($_GET['type']); -/* -* Catégories en javascript -*/ -if ($conf->use_javascript_ajax) +print '
'.$langs->trans("FoundCats").'
'; +print ''; + + +$section=isset($_GET["section"])?$_GET["section"]:$_POST['section']; +if (! $section) $section=0; + +// Define fulltree array +$fulltree=$cate_arbo; + + +// ----- This section will show a tree from a fulltree array ----- +// $section must also be defined +// --------------------------------------------------------------- + + +// Root title line +print ''; +print ''; +print ''; +print ''; +print ''; + + + +// Define fullpathselected ( _x_y_z ) of $section parameter +$fullpathselected=''; +foreach($fulltree as $key => $val) { - print '
'.$langs->trans("Categories").''.$langs->trans("Description").'
'; +print ''; +print ''; +print '
'; +print img_picto_common('','treemenu/base.gif'); +print ''.$langs->trans("AllCats"); +print '
   
'; - print ''; - print ''; + + // Show tree graph pictos + print '\n"; + + print ''; + + // Edit link + print ''; + + // Add link + //print ''; + print ''; + + print "\n"; + } + + $oldvallevel=$val['level']; + $nbofentries++; +} + + +// If nothing to show +if ($nbofentries == 0) +{ + print ''; + print ''; + print ''; print ''; - - print ''; - - print "
'.$langs->trans("CategoriesTree").''; - if ($_GET["expand"] != 'all') + //print $val['id']."-".$section."
"; + if ($val['id'] == $section) { - print ''.$langs->trans("ExpandAll").''; - print '
'; + $fullpathselected=$val['fullpath']; + break; } - if ($_GET["expand"] && $_GET["expand"] != 'none') +} +//print "fullpathselected=".$fullpathselected."
"; + +// Update expandedsectionarray in session +$expandedsectionarray=array(); +if (isset($_SESSION['expandedsectionarray'])) $expandedsectionarray=split(',',$_SESSION['expandedsectionarray']); + +if ($section && $_GET['sectionexpand'] == 'true') +{ + // We add all sections that are parent of opened section + $pathtosection=split('_',$fullpathselected); + foreach($pathtosection as $idcursor) { - print ''.$langs->trans("UndoExpandAll").''; - print '
'; + if ($idcursor && ! in_array($idcursor,$expandedsectionarray)) // Not already in array + { + $expandedsectionarray[]=$idcursor; + } } + $_SESSION['expandedsectionarray']=join(',',$expandedsectionarray); +} +if ($section && $_GET['sectionexpand'] == 'false') +{ + // We removed all expanded sections that are child of the closed section + $oldexpandedsectionarray=$expandedsectionarray; + $expandedsectionarray=array(); + foreach($oldexpandedsectionarray as $sectioncursor) + { + // is_in_subtree(fulltree,sectionparent,sectionchild) + if ($sectioncursor && ! is_in_subtree($fulltree,$section,$sectioncursor)) $expandedsectionarray[]=$sectioncursor; + } + $_SESSION['expandedsectionarray']=join(',',$expandedsectionarray); +} +//print $_SESSION['expandedsectionarray'].'
'; + +$nbofentries=0; +$oldvallevel=0; +$var=true; +foreach($fulltree as $key => $val) +{ + $var=false; + + //$fullpathparent=eregi_replace('_[^_]+$','',$val['fullpath']); + + // Define showline + $showline=0; + + // If directory is son of expanded directory, we show line + if (in_array($val['id_mere'],$expandedsectionarray)) $showline=4; + // If directory is brother of selected directory, we show line + elseif ($val['id'] != $section && $val['id_mere'] == $ecmdirstatic->motherof[$section]) $showline=3; + // If directory is parent of selected directory or is selected directory, we show line + elseif (eregi($val['fullpath'].'_',$fullpathselected.'_')) $showline=2; + // If we are level one we show line + elseif ($val['level'] < 2) $showline=1; + + if ($showline) + { + if (in_array($val['id'],$expandedsectionarray)) $option='indexexpanded'; + else $option='indexnotexpanded'; + //print $option; + + print '
'; + print ''; + + // Show picto + print ''; + // Show link + print ''; + print '
'; + $resarray=tree_showpad($fulltree,$key); + $a=$resarray[0]; + $nbofsubdir=$resarray[1]; + $c=$resarray[2]; + $nboffilesinsubdir=$resarray[3]; + print ''; + //print $val['fullpath']."(".$showline.")"; + $n='2'; + if ($b == 0 || ! in_array($val['id'],$expandedsectionarray)) $n='3'; + if (! in_array($val['id'],$expandedsectionarray)) $ref=img_picto('',DOL_URL_ROOT.'/theme/common/treemenu/plustop'.$n.'.gif','',1); + else $ref=img_picto('',DOL_URL_ROOT.'/theme/common/treemenu/minustop'.$n.'.gif','',1); + if ($option == 'indexexpanded') $lien = ''; + if ($option == 'indexnotexpanded') $lien = ''; + $newref=eregi_replace('_',' ',$ref); + $lienfin=''; + print $lien.$newref.$lienfin; + if (! in_array($val['id'],$expandedsectionarray)) print img_picto('',DOL_URL_ROOT.'/theme/common/treemenu/folder.gif','',1); + else print img_picto('',DOL_URL_ROOT.'/theme/common/treemenu/folder-expanded.gif','',1); + print ''; + if ($section == $val['id']) print ' '; + print dolibarr_trunc($val['label'],28); + if ($section == $val['id']) print ''; + print '
'; + print "
'; + print dolibarr_trunc($categstatic->get_desc($val['id']),48); + print ''.img_edit().''.img_edit_add().' 
'; + print ''; + print ''; + print ''; + print '
'.img_picto_common('','treemenu/branchbottom.gif').''.img_picto('',DOL_URL_ROOT.'/theme/common/treemenu/minustop3.gif','',1).''; + print $langs->trans("NoCategoryYet"); print ' 
 
'; - - if (sizeof($cate_arbo)) - { - require_once(DOL_DOCUMENT_ROOT.'/includes/treemenu/TreeMenu.php'); - - $menu = new HTML_TreeMenu(); - $icon = 'folder.gif'; - $expandedIcon = 'folder-expanded.gif'; - - // Création noeud racine - $node=array(); - $rootnode='-1'; - $node[$rootnode] = new HTML_TreeNode(array( - 'text' => $langs->trans("AllCats"), - 'link' => '', - 'icon' => 'base.gif', - 'expandedIcon' => 'base.gif', - 'expanded' => true) - //,array('onclick' => "alert('foo'); return false", 'onexpand' => "alert('Expanded')") - ); - - // Ajoute id_mere sur tableau cate_arbo - $i=0; - foreach ($cate_arbo as $key => $val) - { - $i++; - $nodeparent=ereg_replace('_[0-9]+$','',$cate_arbo[$key]['fullpath']); - if (! $nodeparent) $nodeparent=$rootnode; - // Definition du nouvel element a ajouter dans l'arbre - $newelement=array( - 'text' => $cate_arbo[$key]['label'], - //'link' => $_SERVER["PHP_SELF"].'?id='.$cate_arbo[$key]['id'], - 'link' => DOL_URL_ROOT.'/categories/viewcat.php?id='.$cate_arbo[$key]['id'].'&type='.$type, - 'icon' => $icon, - 'expandedIcon' => $expandedIcon - ); - - if ($_GET["expand"]) - { - $patharray=split('_',$cate_arbo[$key]['fullpath']); - $level=(sizeof($patharray)-1); - if ($_GET["expand"] == 'all' || $level <= $_GET["expand"]) { - $newelement['expanded']=true; - } - if ($_GET["expand"] == 'none') - { - $newelement['expanded']=false; - } - } - //echo $nodeparent."|"; - //print 'x'.$cate_arbo[$key]['fullpath'].' expand='.$newelement['expanded'].'
'; - if (is_object($node[$nodeparent])) // Should not happen but occurs on some users. - { - $node[$cate_arbo[$key]['fullpath']]=&$node[$nodeparent]->addItem(new HTML_TreeNode($newelement)); - //print 'Resultat: noeud '.$cate_arbo[$key]['fullpath']." créé
\n"; - } - } - - $menu->addItem($node[$rootnode]); - - // Affiche arbre - print ''; - $treeMenu = new HTML_TreeMenu_DHTML($menu, - array( - 'images' => DOL_URL_ROOT.'/theme/common/treemenu', - 'defaultClass' => 'treeMenuDefault', - 'noTopLevelImages' => false, - 'jsObjectName' => 'tree_categories', - 'usePersistence' => false - ), - true); - $treeMenu->printMenu(); - - //$listBox = new HTML_TreeMenu_Listbox($menu, array('linkTarget' => '_self')); - //$listBox->printMenu(); - - } - else - { - print $langs->trans("NoneCategory"); - } - - print '
"; - print '
'; } -else -{ - /* - * Catégories principales en HTML pure - */ - print ''; - print ''; - if (sizeof($cate_arbo)) - { - if (is_array($cate_arbo)) - { - $var=true; - foreach($cate_arbo as $key => $value) - { - $var = ! $var; - print "\t\n"; - print ''; - print ''; - print "\t\n"; - } - } - } +// ----- End of section ----- +// -------------------------- + + + +print "
'.$langs->trans("AllCats").''.$langs->trans("Description").'
'.$cate_arbo[$key]['fulllabel'].''.$c->get_desc($cate_arbo[$key]['id']).'
"; - print ""; -} $db->close(); diff --git a/htdocs/categories/viewcat.php b/htdocs/categories/viewcat.php index eb8d8c117b7..2b529106ad0 100644 --- a/htdocs/categories/viewcat.php +++ b/htdocs/categories/viewcat.php @@ -1,6 +1,6 @@ - * Copyright (C) 2006-2008 Laurent Destailleur + * Copyright (C) 2006-2009 Laurent Destailleur * Copyright (C) 2007 Patrick Raguin * Copyright (C) 2005-2008 Regis Houssin * @@ -128,12 +128,12 @@ if ($type == 0 && $conf->global->CATEGORY_ASSIGNED_TO_A_CUSTOMER) { $soc = new Societe($db); $soc->fetch($c->socid); - + print ''; print $langs->trans("AssignedToTheCustomer").''; print $soc->getNomUrl(1); print ''; - + $catsMeres = $c->get_meres (); if ($catsMeres < 0) @@ -202,16 +202,18 @@ else print "\n"; print "\n"; if (sizeof ($cats) > 0) - { + { $var=true; foreach ($cats as $cat) { $i++; $var=!$var; print "\t\n"; - print "\t\t\n"; + print "\t\t\n"; print "\t\t\n"; - + if ($cat->visible == 1) { print "\t\t\n"; @@ -220,7 +222,7 @@ else { print "\t\t\n"; } - + print "\t\n"; } } @@ -229,19 +231,19 @@ else print ""; } print "
".$langs->trans("SubCats")."
".$cat->label.""; + print "".$cat->label.""; + print "".$cat->description."".$langs->trans("ContentsVisibleByAllShort")."".$langs->trans("ContentsNotVisibleByAllShort")."
".$langs->trans("NoSubCat")."
\n"; - + /* * Boutons actions */ if ($type == 0 && $conf->global->CATEGORY_ASSIGNED_TO_A_CUSTOMER) { print "
\n"; - + if ($user->rights->categorie->creer) { print "".$langs->trans("Create").""; } - + print "
"; } } @@ -260,7 +262,7 @@ if ($c->type == 0) print "
"; print "\n"; print "\n"; - + if (sizeof ($prods) > 0) { $i = 0; @@ -299,7 +301,7 @@ if ($c->type == 1) print "
"; print "
".$langs->trans("ProductsAndServices")."
\n"; print "\n"; - + if (sizeof ($socs) > 0) { $i = 0; @@ -311,8 +313,8 @@ if ($c->type == 1) print "\t\n"; print '\n"; - + print " ".$soc->nom."\n"; + print "\n"; } } @@ -336,7 +338,7 @@ if($c->type == 2) print "
"; print "
".$langs->trans("Suppliers")."
'; print img_object($langs->trans("ShowSuppliers"),"company"); - print " ".$soc->nom."
\n"; print "\n"; - + if (sizeof ($socs) > 0) { $i = 0; @@ -348,8 +350,8 @@ if($c->type == 2) print "\t\n"; print '\n"; - + print " ".$soc->nom."\n"; + print "\n"; } } diff --git a/htdocs/ecm/index.php b/htdocs/ecm/index.php index e2824c3ba93..7ebb534040d 100644 --- a/htdocs/ecm/index.php +++ b/htdocs/ecm/index.php @@ -295,23 +295,23 @@ if (empty($action) || $action == 'file_manager' || eregi('refresh',$action) || $ print '
'; } - // Construit liste des r�pertoires + // Construit liste des repertoires print '
".$langs->trans("Customers")."
'; print img_object($langs->trans("ShowCompany"),"company"); - print " ".$soc->nom."
'; print ''; print ''; print ''; print ''; if (sizeof($sectionauto)) { - // Automatic sections title line + // Root title line (Automatic section) print ''; print '
'.$langs->trans("ECMSections").''; - print ''.$langs->trans("Refresh").' '.img_picto($langs->trans("Refresh"),'refresh').''; + print ''.img_picto($langs->trans("Refresh"),'refresh').' '; print '
'; print ''; - print ''; @@ -391,7 +391,7 @@ if (empty($action) || $action == 'file_manager' || eregi('refresh',$action) || $ } } - // Manual sections title line + // Root title line (Manual section) print '
'; + print ''; print img_picto_common('','treemenu/base.gif'); print ''.$langs->trans("ECMRoot").' ('.$langs->trans("ECMSectionsAuto").')'; print '
'; print ''; print ''; print ''; + + // Load full tree $fulltree=$ecmdirstatic->get_full_arbo(); - // Define fullpathselected ( _x_y_z ) + // ----- This section will show a tree from a fulltree array ----- + // $section must also be defined + // ---------------------------------------------------------------- + + // Define fullpathselected ( _x_y_z ) of $section parameter $fullpathselected=''; foreach($fulltree as $key => $val) { @@ -517,10 +523,11 @@ if (empty($action) || $action == 'file_manager' || eregi('refresh',$action) || $ if ($b == 0 || ! in_array($val['id'],$expandedsectionarray)) $n='3'; if (! in_array($val['id'],$expandedsectionarray)) $ref=img_picto('',DOL_URL_ROOT.'/theme/common/treemenu/plustop'.$n.'.gif','',1); else $ref=img_picto('',DOL_URL_ROOT.'/theme/common/treemenu/minustop'.$n.'.gif','',1); - $oldref=$ecmdirstatic->ref; - $ecmdirstatic->ref=$ref; - print $ecmdirstatic->getNomUrl(0,$option); - $ecmdirstatic->ref=$oldref; + if ($option == 'indexexpanded') $lien = ''; + if ($option == 'indexnotexpanded') $lien = ''; + $newref=eregi_replace('_',' ',$ref); + $lienfin=''; + print $lien.$newref.$lienfin; if (! in_array($val['id'],$expandedsectionarray)) print img_picto('',DOL_URL_ROOT.'/theme/common/treemenu/folder.gif','',1); else print img_picto('',DOL_URL_ROOT.'/theme/common/treemenu/folder-expanded.gif','',1); print ''; @@ -586,6 +593,11 @@ if (empty($action) || $action == 'file_manager' || eregi('refresh',$action) || $ print ''; } + + // ----- End of section ----- + // -------------------------- + + print "
'; @@ -411,10 +411,16 @@ if (empty($action) || $action == 'file_manager' || eregi('refresh',$action) || $ print '
"; // Fin de zone Ajax diff --git a/htdocs/html.form.class.php b/htdocs/html.form.class.php index 36c3491127f..067d478fcc2 100644 --- a/htdocs/html.form.class.php +++ b/htdocs/html.form.class.php @@ -1471,7 +1471,7 @@ class Form { $add = ''; } - $output.= ''; + $output.= ''; } } } diff --git a/htdocs/includes/treemenu/.cvsignore b/htdocs/includes/treemenu/.cvsignore deleted file mode 100644 index fb160255aec..00000000000 --- a/htdocs/includes/treemenu/.cvsignore +++ /dev/null @@ -1,4 +0,0 @@ -docs -imagesAlt -imagesAlt2 -images diff --git a/htdocs/includes/treemenu/TreeMenu.js b/htdocs/includes/treemenu/TreeMenu.js deleted file mode 100644 index 32c61c64d09..00000000000 --- a/htdocs/includes/treemenu/TreeMenu.js +++ /dev/null @@ -1,697 +0,0 @@ -// +-----------------------------------------------------------------------+ -// | Copyright (c) 2002-2005, Richard Heyes, Harald Radi | -// | All rights reserved. | -// | | -// | Redistribution and use in source and binary forms, with or without | -// | modification, are permitted provided that the following conditions | -// | are met: | -// | | -// | o Redistributions of source code must retain the above copyright | -// | notice, this list of conditions and the following disclaimer. | -// | o Redistributions in binary form must reproduce the above copyright | -// | notice, this list of conditions and the following disclaimer in the | -// | documentation and/or other materials provided with the distribution.| -// | o The names of the authors may not be used to endorse or promote | -// | products derived from this software without specific prior written | -// | permission. | -// | | -// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | -// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | -// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | -// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | -// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | -// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | -// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | -// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | -// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | -// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | -// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | -// | | -// +-----------------------------------------------------------------------+ -// | Author: Richard Heyes | -// | Harald Radi | -// +-----------------------------------------------------------------------+ -// -// $Id$ - -/** -* Function to create copies of objects which are -* normally passed around by references (Arrays for example) -*/ -function arrayCopy(input) -{ - var output = new Array(input.length); - - for (i in input) { - if (typeof(input[i]) == 'array') { - output[i] = arrayCopy(input[i]); - } else { - output[i] = input[i]; - } - } - - return output; -} - -/** -* TreeMenu class -*/ - function TreeMenu(iconpath, myname, linkTarget, defaultClass, usePersistence, noTopLevelImages) - { - // Properties - this.iconpath = iconpath; - this.myname = myname; - this.linkTarget = linkTarget; - this.defaultClass = defaultClass; - this.usePersistence = usePersistence; - this.noTopLevelImages = noTopLevelImages; - this.n = new Array(); - this.output = ''; - - this.nodeRefs = new Array(); - this.branches = new Array(); - this.branchStatus = new Array(); - this.layerRelations = new Array(); - this.childParents = new Array(); - this.cookieStatuses = new Array(); - - this.preloadImages(); - } - -/** -* Adds a node to the tree -*/ - TreeMenu.prototype.addItem = function (newNode) - { - newIndex = this.n.length; - this.n[newIndex] = newNode; - - return this.n[newIndex]; - } - -/** -* Preload images hack for Mozilla -*/ - TreeMenu.prototype.preloadImages = function () - { - var plustop = new Image; plustop.src = this.iconpath + '/plustop.gif'; - var plusbottom = new Image; plusbottom.src = this.iconpath + '/plusbottom.gif'; - var plus = new Image; plus.src = this.iconpath + '/plus.gif'; - - var minustop = new Image; minustop.src = this.iconpath + '/minustop.gif'; - var minusbottom = new Image; minusbottom.src = this.iconpath + '/minusbottom.gif'; - var minus = new Image; minus.src = this.iconpath + '/minus.gif'; - - var branchtop = new Image; branchtop.src = this.iconpath + '/branchtop.gif'; - var branchbottom = new Image; branchbottom.src = this.iconpath + '/branchbottom.gif'; - var branch = new Image; branch.src = this.iconpath + '/branch.gif'; - - var linebottom = new Image; linebottom.src = this.iconpath + '/linebottom.gif'; - var line = new Image; line.src = this.iconpath + '/line.gif'; - } - -/** -* Main function that draws the menu and assigns it -* to the layer (or document.write()s it) -*/ - TreeMenu.prototype.drawMenu = function ()// OPTIONAL ARGS: nodes = [], level = [], prepend = '', expanded = false, visbility = 'inline', parentLayerID = null - { - /** - * Necessary variables - */ - var output = ''; - var modifier = ''; - var layerID = ''; - var parentLayerID = ''; - - /** - * Parse any optional arguments - */ - var nodes = arguments[0] ? arguments[0] : this.n - var level = arguments[1] ? arguments[1] : []; - var prepend = arguments[2] ? arguments[2] : ''; - var expanded = arguments[3] ? arguments[3] : false; - var visibility = arguments[4] ? arguments[4] : 'inline'; - var parentLayerID = arguments[5] ? arguments[5] : null; - - var currentlevel = level.length; - - for (var i=0; i 1 ? "top" : 'single'; - } else if(i == (nodes.length-1)) { - modifier = "bottom"; - } else { - modifier = ""; - } - - /** - * Single root branch is always expanded - */ - if (!this.doesMenu() || (parentLayerID == null && (nodes.length == 1 || this.noTopLevelImages))) { - expanded = true; - - } else if (nodes[i].expanded) { - expanded = true; - - } else { - expanded = false; - } - - /** - * Make sure visibility is correct based on parent status - */ - visibility = this.checkParentVisibility(layerID) ? visibility : 'none'; - - /** - * Setup branch status and build an indexed array - * of branch layer ids - */ - if (nodes[i].n.length > 0) { - this.branchStatus[layerID] = expanded; - this.branches[this.branches.length] = layerID; - } - - /** - * Setup toggle relationship - */ - if (!this.layerRelations[parentLayerID]) { - this.layerRelations[parentLayerID] = new Array(); - } - this.layerRelations[parentLayerID][this.layerRelations[parentLayerID].length] = layerID; - - /** - * Branch images - */ - var gifname = nodes[i].n.length && this.doesMenu() && nodes[i].isDynamic ? (expanded ? 'minus' : 'plus') : 'branch'; - var iconName = expanded && nodes[i].expandedIcon ? nodes[i].expandedIcon : nodes[i].icon; - var iconimg = nodes[i].icon ? this.stringFormat('', this.iconpath, iconName, layerID) : ''; - - /** - * Add event handlers - */ - var eventHandlers = ""; - for (j in nodes[i].events) { - eventHandlers += this.stringFormat('{0}="{1}" ', j, nodes[i].events[j]); - } - - /** - * Build the html to write to the document - * IMPORTANT: - * document.write()ing the string: '
', layerID, visibility, (nodes[i].cssClass ? nodes[i].cssClass : this.defaultClass)) : this.stringFormat('
', nodes[i].cssClass ? nodes[i].cssClass : this.defaultClass); - var onMDown = this.doesMenu() && nodes[i].n.length && nodes[i].isDynamic ? this.stringFormat('onmousedown="{0}.toggleBranch(\'{1}\', true)" style="cursor: pointer; cursor: hand"', this.myname, layerID) : ''; - var imgTag = this.stringFormat('', this.iconpath, gifname, modifier, layerID, onMDown); - var linkTarget= nodes[i].linkTarget ? nodes[i].linkTarget : this.linkTarget; - var linkStart = nodes[i].link ? this.stringFormat('', nodes[i].link, linkTarget) : ''; - - var linkEnd = nodes[i].link ? '' : ''; - - this.output += this.stringFormat('{0}{1}{2}{3}{4}{6}{7}
', - layerTag, - prepend, - parentLayerID == null && (nodes.length == 1 || this.noTopLevelImages) ? '' : imgTag, - iconimg, - linkStart, - eventHandlers, - nodes[i].title, - linkEnd); - - /** - * Traverse sub nodes ? - */ - if (nodes[i].n.length) { - /** - * Determine what to prepend. If there is only one root - * node then the prepend to pass to children is nothing. - * Otherwise it depends on where we are in the tree. - */ - if (parentLayerID == null && (nodes.length == 1 || this.noTopLevelImages)) { - var newPrepend = ''; - - } else if (i < (nodes.length - 1)) { - var newPrepend = prepend + this.stringFormat('', this.iconpath); - - } else { - var newPrepend = prepend + this.stringFormat('', this.iconpath); - } - - this.drawMenu(nodes[i].n, - arrayCopy(level), - newPrepend, - nodes[i].expanded, - expanded ? 'inline' : 'none', - layerID); - } - } - } - -/** -* Writes the output generated by drawMenu() to the page -*/ - TreeMenu.prototype.writeOutput = function () - { - document.write(this.output); - } - -/** -* Toggles a branches visible status. Called from resetBranches() -* and also when a +/- graphic is clicked. -*/ - TreeMenu.prototype.toggleBranch = function (layerID, updateStatus) // OPTIONAL ARGS: fireEvents = true - { - var currentDisplay = this.getLayer(layerID).style.display; - var newDisplay = (this.branchStatus[layerID] && currentDisplay == 'inline') ? 'none' : 'inline'; - var fireEvents = arguments[2] != null ? arguments[2] : true; - - for (var i=0; i= 5)); - var is_gecko = (agt.indexOf('gecko') != -1); - - - var is_ie = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1)); - var is_ie4 = (is_ie && (is_major == 4) && (agt.indexOf("msie 4")!=-1) ); - var is_ie4up = (is_ie && (is_major >= 4)); - - var is_opera = (agt.indexOf("opera") != -1); - var is_opera7 = (is_opera && is_major >= 7) || agt.indexOf("opera 7") != -1; - - // Patch from Harald Fielker - if (agt.indexOf('konqueror') != -1) { - var is_nav = false; - var is_nav6up = false; - var is_gecko = false; - var is_ie = true; - var is_ie4 = true; - var is_ie4up = true; - } -//--> end hide JavaScript diff --git a/htdocs/includes/treemenu/TreeMenu.php b/htdocs/includes/treemenu/TreeMenu.php deleted file mode 100644 index 2ddaea48afe..00000000000 --- a/htdocs/includes/treemenu/TreeMenu.php +++ /dev/null @@ -1,822 +0,0 @@ - | -// | Harald Radi | -// +-----------------------------------------------------------------------+ -// -// $Id$ - -/** -* HTML_TreeMenu Class -* -* A simple couple of PHP classes and some not so simple -* Jabbascript which produces a tree menu. In IE this menu -* is dynamic, with branches being collapsable. In IE5+ the -* status of the collapsed/open branches persists across page -* refreshes.In any other browser the tree is static. Code is -* based on work of Harald Radi. -* -* Usage. -* -* After installing the package, copy the example php script to -* your servers document root. Also place the TreeMenu.js and the -* images folder in the same place. Running the script should -* then produce the tree. -* -* Thanks go to Chip Chapin (http://www.chipchapin.com) for many -* excellent ideas and improvements. -* -* @author Richard Heyes -* @author Harald Radi -* @access public -* @package HTML_TreeMenu -*/ - -class HTML_TreeMenu -{ - /** - * Indexed array of subnodes - * @var array - */ - var $items; - - /** - * Constructor - * - * @access public - */ - function HTML_TreeMenu() - { - // Not much to do here :( - } - - /** - * This function adds an item to the the tree. - * - * @access public - * @param object $node The node to add. This object should be - * a HTML_TreeNode object. - * @return object Returns a reference to the new node inside - * the tree. - */ - function &addItem(&$node) - { - $this->items[] = &$node; - return $this->items[count($this->items) - 1]; - } - - /** - * Import method for creating HTML_TreeMenu objects/structures - * out of existing tree objects/structures. Currently supported - * are Wolfram Kriesings' PEAR Tree class, and Richard Heyes' (me!) - * Tree class (available here: http://www.phpguru.org/). This - * method is intended to be used statically, eg: - * $treeMenu = &HTML_TreeMenu::createFromStructure($myTreeStructureObj); - * - * @param array $params An array of parameters that determine - * how the import happens. This can consist of: - * structure => The tree structure - * type => The type of the structure, currently - * can be either 'heyes' or 'kriesing' - * nodeOptions => Default options for each node - * - * @return object The resulting HTML_TreeMenu object - */ - function createFromStructure($params) - { - if (!isset($params['nodeOptions'])) { - $params['nodeOptions'] = array(); - } - - switch (@$params['type']) { - - /** - * Wolfram Kriesings' PEAR Tree class - */ - case 'kriesing': - $className = strtolower(get_class($params['structure']->dataSourceClass)); - $isXMLStruct = strpos($className,'_xml') !== false ? true : false; - - // Get the entire tree, the $nodes are sorted like in the tree view - // from top to bottom, so we can easily put them in the nodes - $nodes = $params['structure']->getNode(); - - // Make a new menu and fill it with the values from the tree - $treeMenu = new HTML_TreeMenu(); - $curNode[0] = &$treeMenu; // we need the current node as the reference to the - - foreach ( $nodes as $aNode ) { - $events = array(); - $data = array(); - - // In an XML, all the attributes are saved in an array, but since they might be - // used as the parameters, we simply extract them here if we handle an XML-structure - if ( $isXMLStruct && sizeof($aNode['attributes']) ){ - foreach ( $aNode['attributes'] as $key=>$val ) { - if ( !$aNode[$key] ) { // dont overwrite existing values - $aNode[$key] = $val; - } - } - } - - // Process all the data that are saved in $aNode and put them in the data and/or events array - foreach ( $aNode as $key=>$val ) { - if ( !is_array($val) ) { - // Dont get the recursive data in here! they are always arrays - if ( substr($key,0,2) == 'on' ){ // get the events - $events[$key] = $val; - } - - // I put it in data too, so in case an options starts with 'on' its also passed to the node ... not too cool i know - $data[$key] = $val; - } - } - - // Normally the text is in 'name' in the Tree class, so we check both but 'text' is used if found - $data['text'] = $aNode['text'] ? $aNode['text'] : $aNode['name']; - - // Add the item to the proper node - $thisNode = &$curNode[$aNode['level']]->addItem( new HTML_TreeNode( $data , $events ) ); - $curNode[$aNode['level']+1] = &$thisNode; - } - break; - - /** - * Richard Heyes' (me!) second (array based) Tree class - */ - case 'heyes_array': - // Need to create a HTML_TreeMenu object ? - if (!isset($params['treeMenu'])) { - $treeMenu = &new HTML_TreeMenu(); - $parentID = 0; - } else { - $treeMenu = &$params['treeMenu']; - $parentID = $params['parentID']; - } - - // Loop thru the trees nodes - foreach ($params['structure']->getChildren($parentID) as $nodeID) { - $data = $params['structure']->getData($nodeID); - $parentNode = &$treeMenu->addItem(new HTML_TreeNode(array_merge($params['nodeOptions'], $data))); - - // Recurse ? - if ($params['structure']->hasChildren($nodeID)) { - $recurseParams['type'] = 'heyes_array'; - $recurseParams['parentID'] = $nodeID; - $recurseParams['nodeOptions'] = $params['nodeOptions']; - $recurseParams['structure'] = &$params['structure']; - $recurseParams['treeMenu'] = &$parentNode; - HTML_TreeMenu::createFromStructure($recurseParams); - } - } - - break; - - /** - * Richard Heyes' (me!) original OO based Tree class - */ - case 'heyes': - default: - // Need to create a HTML_TreeMenu object ? - if (!isset($params['treeMenu'])) { - $treeMenu = &new HTML_TreeMenu(); - } else { - $treeMenu = &$params['treeMenu']; - } - - // Loop thru the trees nodes - foreach ($params['structure']->nodes->nodes as $node) { - $tag = $node->getTag(); - $parentNode = &$treeMenu->addItem(new HTML_TreeNode(array_merge($params['nodeOptions'], $tag))); - - // Recurse ? - if (!empty($node->nodes->nodes)) { - $recurseParams['structure'] = $node; - $recurseParams['nodeOptions'] = $params['nodeOptions']; - $recurseParams['treeMenu'] = &$parentNode; - HTML_TreeMenu::createFromStructure($recurseParams); - } - } - break; - - } - - return $treeMenu; - } - - /** - * Creates a treeMenu from XML. The structure of your XML should be - * like so: - * - * - * - * - * - * - * - * - * - * Any of the options you can supply to the HTML_TreeNode constructor can be supplied as - * attributes to the tag. If there are no subnodes for a particular node, you can - * use the XML shortcut instead of . The $xml argument can - * be either the XML as a string, or an pre-created XML_Tree object. Also, this method - * REQUIRES my own Tree class to work (http://phpguru.org/tree.html). If this has not - * been include()ed or require()ed this method will die(). - * - * @param mixed $xml This can be either a string containing the XML, or an XML_Tree object - * (the PEAR::XML_Tree package). - * @return object The HTML_TreeMenu object - */ - function createFromXML($xml) - { - if (!class_exists('Tree')) { - die('Could not find Tree class'); - } - - // Supplied $xml is a string - if (is_string($xml)) { - require_once('XML/Tree.php'); - $xmlTree = &new XML_Tree(); - $xmlTree->getTreeFromString($xml); - - // Supplied $xml is an XML_Tree object - } else { - $xmlTree = $xml; - } - - // Now process the XML_Tree object, setting the XML attributes - // to be the tag data (with out the XML tag name or contents). - $treeStructure = Tree::createFromXMLTree($xmlTree, true); - $treeStructure->nodes->traverse(create_function('&$node', '$tagData = $node->getTag(); $node->setTag($tagData["attributes"]);')); - - - return HTML_TreeMenu::createFromStructure(array('structure' => $treeStructure)); - } -} // HTML_TreeMenu - - -/** -* HTML_TreeNode class -* -* This class is supplementary to the above and provides a way to -* add nodes to the tree. A node can have other nodes added to it. -* -* @author Richard Heyes -* @author Harald Radi -* @access public -* @package HTML_TreeMenu -*/ -class HTML_TreeNode -{ - /** - * The text for this node. - * @var string - */ - var $text; - - /** - * The link for this node. - * @var string - */ - var $link; - - /** - * The icon for this node. - * @var string - */ - var $icon; - - /** - * The icon to show when expanded for this node. - * @var string - */ - var $expandedIcon; - - /** - * The css class for this node - * @var string - */ - var $cssClass; - - /** - * The link target for this node - * @var string - */ - var $linkTarget; - - /** - * Indexed array of subnodes - * @var array - */ - var $items; - - /** - * Whether this node is expanded or not - * @var bool - */ - var $expanded; - - /** - * Whether this node is dynamic or not - * @var bool - */ - var $isDynamic; - - /** - * Should this node be made visible? - * @var bool - */ - var $ensureVisible; - - /** - * The parent node. Null if top level - * @var object - */ - var $parent; - - /** - * Javascript event handlers; - * @var array - */ - var $events; - - /** - * Constructor - * - * @access public - * @param array $options An array of options which you can pass to change - * the way this node looks/acts. This can consist of: - * o text The title of the node, defaults to blank - * o link The link for the node, defaults to blank - * o icon The icon for the node, defaults to blank - * o expandedIcon The icon to show when the node is expanded - * o cssClass The CSS class for this node, defaults to blank - * o expanded The default expanded status of this node, defaults to false - * This doesn't affect non dynamic presentation types - * o linkTarget Target for the links. Defaults to linkTarget of the - * HTML_TreeMenu_Presentation. - * o isDynamic If this node is dynamic or not. Only affects - * certain presentation types. - * o ensureVisible If true this node will be made visible despite the expanded - * settings, and client side persistence. Will not affect - * some presentation styles, such as Listbox. Default is false - * @param array $events An array of javascript events and the corresponding event handlers. - * Additionally to the standard javascript events you can specify handlers - * for the 'onexpand', 'oncollapse' and 'ontoggle' events which will be fired - * whenever a node is collapsed and/or expanded. - */ - function HTML_TreeNode($options = array(), $events = array()) - { - $this->text = ''; - $this->link = ''; - $this->icon = ''; - $this->expandedIcon = ''; - $this->cssClass = ''; - $this->expanded = false; - $this->isDynamic = true; - $this->ensureVisible = false; - $this->linkTarget = null; - - $this->parent = null; - $this->events = $events; - - foreach ($options as $option => $value) { - $this->$option = $value; - } - } - - /** - * Allows setting of various parameters after the initial - * constructor call. Possible options you can set are: - * o text - * o link - * o icon - * o cssClass - * o expanded - * o isDynamic - * o ensureVisible - * ie The same options as in the constructor - * - * @access public - * @param string $option Option to set - * @param string $value Value to set the option to - */ - function setOption($option, $value) - { - $this->$option = $value; - } - - /** - * Adds a new subnode to this node. - * - * @access public - * @param object $node The new node - */ - function &addItem(&$node) - { - $node->parent = &$this; - $this->items[] = &$node; - - /** - * If the subnode has ensureVisible set it needs - * to be handled, and all parents set accordingly. - */ - if ($node->ensureVisible) { - $this->_ensureVisible(); - } - - return $this->items[count($this->items) - 1]; - } - - /** - * Private function to handle ensureVisible stuff - * - * @access private - */ - function _ensureVisible() - { - $this->ensureVisible = true; - $this->expanded = true; - - if (!is_null($this->parent)) { - $this->parent->_ensureVisible(); - } - } -} // HTML_TreeNode - - -/** -* HTML_TreeMenu_Presentation class -* -* Base class for other presentation classes to -* inherit from. -*/ -class HTML_TreeMenu_Presentation -{ - /** - * The TreeMenu structure - * @var object - */ - var $menu; - - /** - * Base constructor simply sets the menu object - * - * @param object $structure The menu structure - */ - function HTML_TreeMenu_Presentation(&$structure) - { - $this->menu = &$structure; - } - - /** - * Prints the HTML generated by the toHTML() method. - * toHTML() must therefore be defined by the derived - * class. - * - * @access public - * @param array Options to set. Any options taken by - * the presentation class can be specified - * here. - */ - function printMenu($options = array()) - { - foreach ($options as $option => $value) { - $this->$option = $value; - } - - echo $this->toHTML(); - } -} - - -/** -* HTML_TreeMenu_DHTML class -* -* This class is a presentation class for the tree structure -* created using the TreeMenu/TreeNode. It presents the -* traditional tree, static for browsers that can't handle -* the DHTML. -*/ -class HTML_TreeMenu_DHTML extends HTML_TreeMenu_Presentation -{ - /** - * Dynamic status of the treemenu. If true (default) this has no effect. If - * false it will override all dynamic status vars and set the menu to be - * fully expanded an non-dynamic. - */ - var $isDynamic; - - /** - * Path to the images - * @var string - */ - var $images; - - /** - * Target for the links generated - * @var string - */ - var $linkTarget; - - /** - * Whether to use clientside persistence or not - * @var bool - */ - var $usePersistence; - - /** - * The default CSS class for the nodes - */ - var $defaultClass; - - /** - * Whether to skip first level branch images - * @var bool - */ - var $noTopLevelImages; - - /** - * Name of Jabbascript object to use - * @var string - */ - var $jsObjectName; - - /** - * Constructor, takes the tree structure as - * an argument and an array of options which - * can consist of: - * o images - The path to the images folder. Defaults to "images" - * o linkTarget - The target for the link. Defaults to "_self" - * o defaultClass - The default CSS class to apply to a node. Default is none. - * o usePersistence - Whether to use clientside persistence. This persistence - * is achieved using cookies. Default is true. - * o noTopLevelImages - Whether to skip displaying the first level of images if - * there is multiple top level branches. - * o maxDepth - The maximum depth of indentation. Useful for ensuring - * deeply nested trees don't go way off to the right of your - * page etc. Defaults to no limit. - * o jsObjectName - Name to use for jabbascript object. Set this if you have - * different menus that should maintain their persistence - * information separately. - * - * And also a boolean for whether the entire tree is dynamic or not. - * This overrides any perNode dynamic settings. - * - * @param object $structure The menu structure - * @param array $options Array of options - * @param bool $isDynamic Whether the tree is dynamic or not - */ - function HTML_TreeMenu_DHTML(&$structure, $options = array(), $isDynamic = true) - { - $this->HTML_TreeMenu_Presentation($structure); - $this->isDynamic = $isDynamic; - - // Defaults - $this->images = 'images'; - $this->maxDepth = 0; // No limit - $this->linkTarget = '_self'; - $this->jsObjectName = 'objTreeMenu'; - $this->defaultClass = ''; - $this->usePersistence = true; - $this->noTopLevelImages = false; - - foreach ($options as $option => $value) { - $this->$option = $value; - } - } - - /** - * Returns the HTML for the menu. This method can be - * used instead of printMenu() to use the menu system - * with a template system. - * - * @access public - * @return string The HTML for the menu - */ - function toHTML() - { - static $count = 0; - $menuObj = $this->jsObjectName . '_' . ++$count; - - $html = "\n"; - $html .= '"; - - return $html; - } - - /** - * Prints a node of the menu - * - * @access private - */ - function _nodeToHTML($nodeObj, $prefix, $return = 'newNode', $currentDepth = 0, $maxDepthPrefix = null) - { - $prefix = empty($maxDepthPrefix) ? $prefix : $maxDepthPrefix; - - $expanded = $this->isDynamic ? ($nodeObj->expanded ? 'true' : 'false') : 'true'; - $isDynamic = $this->isDynamic ? ($nodeObj->isDynamic ? 'true' : 'false') : 'false'; - $html = sprintf("\t %s = %s.addItem(new TreeNode('%s', %s, %s, %s, %s, '%s', '%s', %s));\n", - $return, - $prefix, - str_replace("'", "\\'", $nodeObj->text), - !empty($nodeObj->icon) ? "'" . $nodeObj->icon . "'" : 'null', - !empty($nodeObj->link) ? "'" . $nodeObj->link . "'" : 'null', - $expanded, - $isDynamic, - $nodeObj->cssClass, - $nodeObj->linkTarget, - !empty($nodeObj->expandedIcon) ? "'" . $nodeObj->expandedIcon . "'" : 'null'); - - foreach ($nodeObj->events as $event => $handler) { - $html .= sprintf("\t %s.setEvent('%s', '%s');\n", - $return, - $event, - str_replace(array("\r", "\n", "'"), array('\r', '\n', "\'"), $handler)); - } - - if ($this->maxDepth > 0 AND $currentDepth == $this->maxDepth) { - $maxDepthPrefix = $prefix; - } - - /** - * Loop through subnodes - */ - if (!empty($nodeObj->items)) { - for ($i=0; $iitems); $i++) { - $html .= $this->_nodeToHTML($nodeObj->items[$i], $return, $return . '_' . ($i + 1), $currentDepth + 1, $maxDepthPrefix); - } - } - - return $html; - } -} // End class HTML_TreeMenu_DHTML - - -/** -* HTML_TreeMenu_Listbox class -* -* This class presents the menu as a listbox -*/ -class HTML_TreeMenu_Listbox extends HTML_TreeMenu_Presentation -{ - /** - * The text that is displayed in the first option - * @var string - */ - var $promoText; - - /** - * The character used for indentation - * @var string - */ - var $indentChar; - - /** - * How many of the indent chars to use - * per indentation level - * @var integer - */ - var $indentNum; - - /** - * Target for the links generated - * @var string - */ - var $linkTarget; - - /** - * Constructor - * - * @param object $structure The menu structure - * @param array $options Options whic affect the display of the listbox. - * These can consist of: - * o promoText The text that appears at the the top of the listbox - * Defaults to "Select..." - * o indentChar The character to use for indenting the nodes - * Defaults to " " - * o indentNum How many of the indentChars to use per indentation level - * Defaults to 2 - * o linkTarget Target for the links. Defaults to "_self" - * o submitText Text for the submit button. Defaults to "Go" - */ - function HTML_TreeMenu_Listbox($structure, $options = array()) - { - $this->HTML_TreeMenu_Presentation($structure); - - $this->promoText = 'Select...'; - $this->indentChar = ' '; - $this->indentNum = 2; - $this->linkTarget = '_self'; - $this->submitText = 'Go'; - - foreach ($options as $option => $value) { - $this->$option = $value; - } - } - - /** - * Returns the HTML generated - */ - function toHTML() - { - static $count = 0; - $nodeHTML = ''; - - /** - * Loop through subnodes - */ - if (isset($this->menu->items)) { - for ($i=0; $imenu->items); $i++) { - $nodeHTML .= $this->_nodeToHTML($this->menu->items[$i]); - } - } - - return sprintf('
', - $this->linkTarget, - 'HTML_TreeMenu_Listbox_' . ++$count, - 'HTML_TreeMenu_Listbox_' . $count, - 'HTML_TreeMenu_Listbox_' . $count, - $this->promoText, - $nodeHTML, - $this->submitText); - } - - /** - * Returns HTML for a single node - * - * @access private - */ - function _nodeToHTML($node, $prefix = '') - { - $html = sprintf('', $node->link, $prefix, $node->text); - - /** - * Loop through subnodes - */ - if (isset($node->items)) { - for ($i=0; $iitems); $i++) { - $html .= $this->_nodeToHTML($node->items[$i], $prefix . str_repeat($this->indentChar, $this->indentNum)); - } - } - - return $html; - } -} // End class HTML_TreeMenu_Listbox -?> diff --git a/htdocs/langs/en_US/categories.lang b/htdocs/langs/en_US/categories.lang index c18e7a62733..e75e4c0a842 100644 --- a/htdocs/langs/en_US/categories.lang +++ b/htdocs/langs/en_US/categories.lang @@ -6,6 +6,7 @@ Rubrique=Category Rubriques=Categories categories=categories TheCategorie=The category +NoCategoryYet=No category of this type created In=In AddIn=Add in modify=modify diff --git a/htdocs/langs/fr_FR/categories.lang b/htdocs/langs/fr_FR/categories.lang index 15b6e579f89..f4ea5033283 100644 --- a/htdocs/langs/fr_FR/categories.lang +++ b/htdocs/langs/fr_FR/categories.lang @@ -6,6 +6,7 @@ Rubrique=Rubrique Rubriques=Rubriques categories=catégorie(s) TheCategorie=La catégorie +NoCategoryYet=Aucune catégorie de ce type créée In=Dans AddIn=Ajouter dans modify=modifier diff --git a/htdocs/lib/functions.lib.php b/htdocs/lib/functions.lib.php index c0219af19b9..eee4de94e26 100644 --- a/htdocs/lib/functions.lib.php +++ b/htdocs/lib/functions.lib.php @@ -2779,7 +2779,7 @@ function stopwithmem() * natural case insensitive sorting (which can be optionally case * sensitive as well). */ -function dol_sort_array($array, $index, $order='asc', $natsort, $case_sensitive) +function dol_sort_array(&$array, $index, $order='asc', $natsort, $case_sensitive) { // Clean parameters $order=strtolower($order); diff --git a/mysql/migration/2.5.0-2.6.0.sql b/mysql/migration/2.5.0-2.6.0.sql index a1a37696a38..d95c1640de0 100644 --- a/mysql/migration/2.5.0-2.6.0.sql +++ b/mysql/migration/2.5.0-2.6.0.sql @@ -34,6 +34,7 @@ ALTER TABLE llx_mailing_cibles add column other varchar(255) NULL; ALTER TABLE llx_mailing_cibles ADD INDEX idx_mailing_cibles_email (email); +ALTER TABLE llx_categorie ADD INDEX idx_categorie_type (type); + ALTER TABLE llx_product drop column stock_propale; ALTER TABLE llx_product drop column stock_commande; - diff --git a/mysql/tables/llx_categorie.key.sql b/mysql/tables/llx_categorie.key.sql index 08b64f96b1d..0df39ab8662 100644 --- a/mysql/tables/llx_categorie.key.sql +++ b/mysql/tables/llx_categorie.key.sql @@ -1,5 +1,5 @@ -- ============================================================================ --- Copyright (C) 2007 Laurent Destailleur +-- Copyright (C) 2007-2009 Laurent Destailleur -- -- This program is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by @@ -19,3 +19,5 @@ -- ============================================================================ ALTER TABLE llx_categorie ADD UNIQUE INDEX uk_categorie_ref (label,type); + +ALTER TABLE llx_categorie ADD INDEX idx_categorie_type (type);