Removed treemenu libraries

This commit is contained in:
Laurent Destailleur
2009-01-30 21:21:22 +00:00
parent 3cf8539d4e
commit 43a6797e1b
15 changed files with 326 additions and 1766 deletions

View File

@@ -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:

View File

@@ -512,11 +512,13 @@ 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);
dolibarr_syslog("Categorie::get_full_arbo build motherof array sql=".$sql, LOG_DEBUG);
$resql = $this->db->query($sql);
if ($resql)
{
@@ -539,32 +541,20 @@ 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<br>";
$this->cats[$obj->rowid]['id_children'][$newelempos]=$obj->rowid_fille;
}
else
{
//print "this->cats[".$obj->rowid."]['id_children'] n'est pas encore un tableau<br>";
$this->cats[$obj->rowid]['id_children']=array($obj->rowid_fille);
}
$this->cats[$obj->rowid]['id_children'][]=$obj->rowid_fille;
}
$i++;
@@ -580,9 +570,10 @@ class Categorie
foreach($this->cats as $key => $val)
{
if (isset($motherof[$key])) continue;
$this->build_path_from_id_categ($key,0);
$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();
@@ -591,8 +582,7 @@ class Categorie
}
/**
* \brief Calcule les propri<72>t<EFBFBD>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
*/
@@ -614,13 +604,13 @@ class Categorie
// 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;
}
@@ -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 = '<a href="'.DOL_URL_ROOT.'/compta/facture.php?facid='.$this->id.'">';
$label=$this->label;
$lienfin='</a>';
$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;
}
}
?>

View File

@@ -2,7 +2,7 @@
/* Copyright (C) 2001-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2005 Brice Davoleau <brice.davoleau@gmail.com>
* Copyright (C) 2005-2007 Regis Houssin <regis@dolibarr.fr>
* Copyright (C) 2006-2008 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2006-2009 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2007 Patrick Raguin <patrick.raguin@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
@@ -317,7 +317,10 @@ function formCategory($db,$object,$type,$typeid)
print "<tr ".$bc[$var].">";
// Categorie
print "<td>".$way."</td>";
print "<td>";
//$c->id=;
//print $c->getNomUrl(1);
print $way."</td>";
// Lien supprimer
print '<td align="right">';

View File

@@ -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 '</td><td valign="top" width="70%">';
*/
if($_POST['catname'] || $_REQUEST['id'])
{
$cats = $c->rechercher($_REQUEST['id'],$_POST['catname'],$_POST['type']);
$cats = $categstatic->rechercher($_REQUEST['id'],$_POST['catname'],$_POST['type']);
print '<table class="noborder" width="100%">';
print '<tr class="liste_titre"><td colspan="2">'.$langs->trans("FoundCats").'</td></tr>';
@@ -112,146 +113,190 @@ print '<br>';
// Charge tableau des categories
$cate_arbo = $c->get_full_arbo($_GET['type']);
$cate_arbo = $categstatic->get_full_arbo($_GET['type']);
/*
* Cat<61>gories en javascript
*/
if ($conf->use_javascript_ajax)
{
print '<table class="noborder" width="100%">';
print '<tr class="liste_titre"><td>'.$langs->trans("CategoriesTree").'</td>';
print '<td align="right">';
if ($_GET["expand"] != 'all')
{
print '<a href="'.$_SERVER["PHP_SELF"].'?expand=all&type='.$_GET['type'].'">'.$langs->trans("ExpandAll").'</a>';
print '</td><td width="18"><img border="0" src="'.DOL_URL_ROOT.'/theme/common/treemenu/folder-expanded.gif">';
}
if ($_GET["expand"] && $_GET["expand"] != 'none')
{
print '<a href="'.$_SERVER["PHP_SELF"].'?expand=none&type='.$_GET['type'].'">'.$langs->trans("UndoExpandAll").'</a>';
print '</td><td width="18"><img border="0" src="'.DOL_URL_ROOT.'/theme/common/treemenu/folder.gif">';
}
print '<table class="nobordernopadding" width="100%">';
print '<tr class="liste_titre"><td>'.$langs->trans("Categories").'</td><td colspan="3">'.$langs->trans("Description").'</td></tr>';
$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 '<tr><td>';
print '<table class="nobordernopadding"><tr class="nobordernopadding">';
print '<td align="left" width="24">';
print img_picto_common('','treemenu/base.gif');
print '</td><td align="left">'.$langs->trans("AllCats");
print '</td>';
print '</tr></table></td>';
print '<td align="right">&nbsp;</td>';
print '<td align="right">&nbsp;</td>';
print '<td align="right">&nbsp;</td>';
print '</tr>';
print '<tr><td colspan="2">';
if (sizeof($cate_arbo))
// Define fullpathselected ( _x_y_z ) of $section parameter
$fullpathselected='';
foreach($fulltree as $key => $val)
{
require_once(DOL_DOCUMENT_ROOT.'/includes/treemenu/TreeMenu.php');
$menu = new HTML_TreeMenu();
$icon = 'folder.gif';
$expandedIcon = 'folder-expanded.gif';
// Cr<43>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)
//print $val['id']."-".$section."<br>";
if ($val['id'] == $section)
{
$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'].'&amp;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;
$fullpathselected=$val['fullpath'];
break;
}
}
//echo $nodeparent."|";
//print 'x'.$cate_arbo[$key]['fullpath'].' expand='.$newelement['expanded'].'<br>';
if (is_object($node[$nodeparent])) // Should not happen but occurs on some users.
//print "fullpathselected=".$fullpathselected."<br>";
// Update expandedsectionarray in session
$expandedsectionarray=array();
if (isset($_SESSION['expandedsectionarray'])) $expandedsectionarray=split(',',$_SESSION['expandedsectionarray']);
if ($section && $_GET['sectionexpand'] == 'true')
{
$node[$cate_arbo[$key]['fullpath']]=&$node[$nodeparent]->addItem(new HTML_TreeNode($newelement));
//print 'Resultat: noeud '.$cate_arbo[$key]['fullpath']." cr<63><72><br>\n";
// We add all sections that are parent of opened section
$pathtosection=split('_',$fullpathselected);
foreach($pathtosection as $idcursor)
{
if ($idcursor && ! in_array($idcursor,$expandedsectionarray)) // Not already in array
{
$expandedsectionarray[]=$idcursor;
}
}
$menu->addItem($node[$rootnode]);
// Affiche arbre
print '<script src="'.DOL_URL_ROOT.'/includes/treemenu/TreeMenu.js" language="JavaScript" type="text/javascript"></script>';
$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();
$_SESSION['expandedsectionarray']=join(',',$expandedsectionarray);
}
else
if ($section && $_GET['sectionexpand'] == 'false')
{
print $langs->trans("NoneCategory");
// 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;
}
print '</td></tr>';
print "</table>";
print '<br>';
$_SESSION['expandedsectionarray']=join(',',$expandedsectionarray);
}
else
{
/*
* Cat<61>gories principales en HTML pure
*/
print '<table class="noborder" width="100%">';
print '<tr class="liste_titre"><td>'.$langs->trans("AllCats").'</td><td>'.$langs->trans("Description").'</td></tr>';
//print $_SESSION['expandedsectionarray'].'<br>';
if (sizeof($cate_arbo))
{
if (is_array($cate_arbo))
{
$nbofentries=0;
$oldvallevel=0;
$var=true;
foreach($cate_arbo as $key => $value)
foreach($fulltree as $key => $val)
{
$var = ! $var;
print "\t<tr ".$bc[$var].">\n";
print '<td><a href="viewcat.php?id='.$cate_arbo[$key]['id'].'&amp;type='.$type.'">'.$cate_arbo[$key]['fulllabel'].'</a></td>';
print '<td>'.$c->get_desc($cate_arbo[$key]['id']).'</td>';
print "\t</tr>\n";
}
$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 '<tr>';
// Show tree graph pictos
print '<td align="left">';
print '<table class="nobordernopadding"><tr class="nobordernopadding"><td>';
$resarray=tree_showpad($fulltree,$key);
$a=$resarray[0];
$nbofsubdir=$resarray[1];
$c=$resarray[2];
$nboffilesinsubdir=$resarray[3];
print '</td>';
// Show picto
print '<td valign="top">';
//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 = '<a href="'.$_SERVER["PHP_SELF"].'?section='.$val['id'].'&amp;type='.$type.'&amp;sectionexpand=false">';
if ($option == 'indexnotexpanded') $lien = '<a href="'.$_SERVER["PHP_SELF"].'?section='.$val['id'].'&amp;type='.$type.'&amp;sectionexpand=true">';
$newref=eregi_replace('_',' ',$ref);
$lienfin='</a>';
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 '</td>';
// Show link
print '<td valign="middle">';
if ($section == $val['id']) print ' <u>';
print dolibarr_trunc($val['label'],28);
if ($section == $val['id']) print '</u>';
print '</td>';
print '</tr></table>';
print "</td>\n";
print '<td>';
print dolibarr_trunc($categstatic->get_desc($val['id']),48);
print '</td>';
// Edit link
print '<td align="right"><a href="'.DOL_URL_ROOT.'/categories/edit.php?id='.$val['id'].'&type='.$type.'">'.img_edit().'</a></td>';
// Add link
//print '<td align="right"><a href="'.DOL_URL_ROOT.'/ecm/docdir.php?action=create&amp;catParent='.$val['id'].'">'.img_edit_add().'</a></td>';
print '<td align="right">&nbsp;</td>';
print "</tr>\n";
}
$oldvallevel=$val['level'];
$nbofentries++;
}
// If nothing to show
if ($nbofentries == 0)
{
print '<tr>';
print '<td class="left"><table class="nobordernopadding"><tr class="nobordernopadding"><td>'.img_picto_common('','treemenu/branchbottom.gif').'</td>';
print '<td>'.img_picto('',DOL_URL_ROOT.'/theme/common/treemenu/minustop3.gif','',1).'</td>';
print '<td valign="middle">';
print $langs->trans("NoCategoryYet");
print '</td>';
print '<td>&nbsp;</td>';
print '</table></td>';
print '<td colspan="5">&nbsp;</td>';
print '</tr>';
}
// ----- End of section -----
// --------------------------
print "</table>";
}
$db->close();

View File

@@ -1,6 +1,6 @@
<?php
/* Copyright (C) 2005 Matthieu Valleton <mv@seeschloss.org>
* Copyright (C) 2006-2008 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2006-2009 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2007 Patrick Raguin <patrick.raguin@gmail.com>
* Copyright (C) 2005-2008 Regis Houssin <regis@dolibarr.fr>
*
@@ -209,7 +209,9 @@ else
$i++;
$var=!$var;
print "\t<tr ".$bc[$var].">\n";
print "\t\t<td nowrap=\"nowrap\"><a href='viewcat.php?id=".$cat->id."&amp;type=".$type."'>".$cat->label."</a></td>\n";
print "\t\t<td nowrap=\"nowrap\">";
print "<a href='viewcat.php?id=".$cat->id."&amp;type=".$type."'>".$cat->label."</a>";
print "</td>\n";
print "\t\t<td>".$cat->description."</td>\n";
if ($cat->visible == 1)
@@ -311,7 +313,7 @@ if ($c->type == 1)
print "\t<tr ".$bc[$var].">\n";
print '<td nowrap="nowrap" valign="top">';
print img_object($langs->trans("ShowSuppliers"),"company");
print " <a href='".DOL_URL_ROOT."/fourn/fiche.php?socid=".$soc->id."'>".$soc->nom."</a></td>\n";
print " <a href='".DOL_URL_ROOT."/categories/categorie.php?socid=".$soc->id."'>".$soc->nom."</a></td>\n";
print "</tr>\n";
}
@@ -348,7 +350,7 @@ if($c->type == 2)
print "\t<tr ".$bc[$var].">\n";
print '<td nowrap="nowrap" valign="top">';
print img_object($langs->trans("ShowCompany"),"company");
print " <a href='".DOL_URL_ROOT."/fourn/fiche.php?socid=".$soc->id."'>".$soc->nom."</a></td>\n";
print " <a href='".DOL_URL_ROOT."/categories/categorie.php?socid=".$soc->id."'>".$soc->nom."</a></td>\n";
print "</tr>\n";
}

View File

@@ -295,23 +295,23 @@ if (empty($action) || $action == 'file_manager' || eregi('refresh',$action) || $
print '<br>';
}
// Construit liste des r<EFBFBD>pertoires
// Construit liste des repertoires
print '<table width="100%" class="nobordernopadding">';
print '<tr class="liste_titre">';
print '<td class="liste_titre" align="left">'.$langs->trans("ECMSections").'</td>';
print '<td class="liste_titre" colspan="5" align="right">';
print '<a href="'.$_SERVER["PHP_SELF"].'?action=refreshmanual'.($section?'&amp;section='.$section:'').'">'.$langs->trans("Refresh").' '.img_picto($langs->trans("Refresh"),'refresh').'</a>';
print '<a href="'.$_SERVER["PHP_SELF"].'?action=refreshmanual'.($section?'&amp;section='.$section:'').'">'.img_picto($langs->trans("Refresh"),'refresh').'</a>&nbsp;';
print '</td>';
print '</tr>';
if (sizeof($sectionauto))
{
// Automatic sections title line
// Root title line (Automatic section)
print '<tr>';
print '<td>';
print '<table class="nobordernopadding"><tr class="nobordernopadding">';
print '<td align="left" width="24px">';
print '<td align="left" width="24">';
print img_picto_common('','treemenu/base.gif');
print '</td><td align="left">'.$langs->trans("ECMRoot").' ('.$langs->trans("ECMSectionsAuto").')';
print '</td>';
@@ -391,7 +391,7 @@ if (empty($action) || $action == 'file_manager' || eregi('refresh',$action) || $
}
}
// Manual sections title line
// Root title line (Manual section)
print '<tr><td>';
print '<table class="nobordernopadding"><tr class="nobordernopadding">';
print '<td align="left" width="24px">';
@@ -411,10 +411,16 @@ if (empty($action) || $action == 'file_manager' || eregi('refresh',$action) || $
print '</td>';
print '</tr>';
// 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 = '<a href="'.$_SERVER["PHP_SELF"].'?section='.$val['id'].'&amp;sectionexpand=false">';
if ($option == 'indexnotexpanded') $lien = '<a href="'.$_SERVER["PHP_SELF"].'?section='.$val['id'].'&amp;sectionexpand=true">';
$newref=eregi_replace('_',' ',$ref);
$lienfin='</a>';
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 '</td>';
@@ -586,6 +593,11 @@ if (empty($action) || $action == 'file_manager' || eregi('refresh',$action) || $
print '</tr>';
}
// ----- End of section -----
// --------------------------
print "</table>";
// Fin de zone Ajax

View File

@@ -1471,7 +1471,7 @@ class Form
{
$add = '';
}
$output.= '<option '.$add.'value="'.$cate_arbo[$key]['id'].'">'.$cate_arbo[$key]['fulllabel'].'</option>';
$output.= '<option '.$add.'value="'.$cate_arbo[$key]['id'].'">'.dolibarr_trunc($cate_arbo[$key]['fulllabel'],80,'middle').'</option>';
}
}
}

View File

@@ -1,4 +0,0 @@
docs
imagesAlt
imagesAlt2
images

View File

@@ -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 <richard@phpguru.org> |
// | Harald Radi <harald.radi@nme.at> |
// +-----------------------------------------------------------------------+
//
// $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<nodes.length; i++) {
level[currentlevel] = i+1;
layerID = this.myname + '_' + 'node_' + this.implode('_', level);
/**
* Store this object in the nodeRefs array
*/
this.nodeRefs[layerID] = nodes[i];
/**
* Store the child/parent relationship
*/
this.childParents[layerID] = parentLayerID;
/**
* Gif modifier
*/
if (i == 0 && parentLayerID == null) {
modifier = nodes.length > 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('<img src="{0}/{1}" width="20" height="20" align="top" id="icon_{2}">', 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: '<div style="display:...' will screw up nn4.x
*/
var layerTag = this.doesMenu() ? this.stringFormat('<div id="{0}" style="display: {1}" class="{2}">', layerID, visibility, (nodes[i].cssClass ? nodes[i].cssClass : this.defaultClass)) : this.stringFormat('<div class="{0}">', 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('<img src="{0}/{1}{2}.gif" width="20" height="20" align="top" border="0" name="img_{3}" {4}>', this.iconpath, gifname, modifier, layerID, onMDown);
var linkTarget= nodes[i].linkTarget ? nodes[i].linkTarget : this.linkTarget;
var linkStart = nodes[i].link ? this.stringFormat('<a href="{0}" target="{1}">', nodes[i].link, linkTarget) : '';
var linkEnd = nodes[i].link ? '</a>' : '';
this.output += this.stringFormat('{0}<nobr>{1}{2}{3}{4}<span {5}>{6}</span>{7}</nobr><br></div>',
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('<img src="{0}/line.gif" width="20" height="20" align="top">', this.iconpath);
} else {
var newPrepend = prepend + this.stringFormat('<img src="{0}/linebottom.gif" width="20" height="20" align="top">', 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<this.layerRelations[layerID].length; i++) {
if (this.branchStatus[this.layerRelations[layerID][i]]) {
this.toggleBranch(this.layerRelations[layerID][i], false);
}
this.getLayer(this.layerRelations[layerID][i]).style.display = newDisplay;
}
if (updateStatus) {
this.branchStatus[layerID] = !this.branchStatus[layerID];
/**
* Persistence
*/
if (this.doesPersistence() && !arguments[2] && this.usePersistence) {
this.setExpandedStatusForCookie(layerID, this.branchStatus[layerID]);
}
/**
* Fire custom events
*/
if (fireEvents) {
nodeObject = this.nodeRefs[layerID];
if (nodeObject.ontoggle != null) {
eval(nodeObject.ontoggle);
}
if (newDisplay == 'none' && nodeObject.oncollapse != null) {
eval(nodeObject.oncollapse);
} else if (newDisplay == 'inline' && nodeObject.onexpand != null){
eval(nodeObject.onexpand);
}
}
// Swap image
this.swapImage(layerID);
}
// Swap icon
this.swapIcon(layerID);
}
/**
* Swaps the plus/minus branch images
*/
TreeMenu.prototype.swapImage = function (layerID)
{
var imgSrc = document.images['img_' + layerID].src;
var re = /^(.*)(plus|minus)(bottom|top|single)?.gif$/
if (matches = imgSrc.match(re)) {
document.images['img_' + layerID].src = this.stringFormat('{0}{1}{2}{3}',
matches[1],
matches[2] == 'plus' ? 'minus' : 'plus',
matches[3] ? matches[3] : '',
'.gif');
}
}
/**
* Swaps the icon for the expanded icon if one
* has been supplied.
*/
TreeMenu.prototype.swapIcon = function (layerID)
{
if (document.images['icon_' + layerID]) {
var imgSrc = document.images['icon_' + layerID].src;
if (this.nodeRefs[layerID].icon && this.nodeRefs[layerID].expandedIcon) {
var newSrc = (imgSrc.indexOf(this.nodeRefs[layerID].expandedIcon) == -1 ? this.nodeRefs[layerID].expandedIcon : this.nodeRefs[layerID].icon);
document.images['icon_' + layerID].src = this.iconpath + '/' + newSrc;
}
}
}
/**
* Can the browser handle the dynamic menu?
*/
TreeMenu.prototype.doesMenu = function ()
{
return (is_ie4up || is_nav6up || is_gecko || is_opera7);
}
/**
* Can the browser handle save the branch status
*/
TreeMenu.prototype.doesPersistence = function ()
{
return (is_ie4up || is_gecko || is_nav6up || is_opera7);
}
/**
* Returns the appropriate layer accessor
*/
TreeMenu.prototype.getLayer = function (layerID)
{
if (is_ie4) {
return document.all(layerID);
} else if (document.getElementById(layerID)) {
return document.getElementById(layerID);
} else if (document.all && document.all(layerID)) {
return document.all(layerID);
}
}
/**
* Save the status of the layer
*/
TreeMenu.prototype.setExpandedStatusForCookie = function (layerID, expanded)
{
this.cookieStatuses[layerID] = expanded;
this.saveCookie();
}
/**
* Load the status of the layer
*/
TreeMenu.prototype.getExpandedStatusFromCookie = function (layerID)
{
if (this.cookieStatuses[layerID]) {
return this.cookieStatuses[layerID];
}
return false;
}
/**
* Saves the cookie that holds which branches are expanded.
* Only saves the details of the branches which are expanded.
*/
TreeMenu.prototype.saveCookie = function ()
{
var cookieString = new Array();
for (var i in this.cookieStatuses) {
if (this.cookieStatuses[i] == true) {
cookieString[cookieString.length] = i;
}
}
document.cookie = 'TreeMenuBranchStatus=' + cookieString.join(':');
}
/**
* Reads cookie parses it for status info and
* stores that info in the class member.
*/
TreeMenu.prototype.loadCookie = function ()
{
var cookie = document.cookie.split('; ');
for (var i=0; i < cookie.length; i++) {
var crumb = cookie[i].split('=');
if ('TreeMenuBranchStatus' == crumb[0] && crumb[1]) {
var expandedBranches = crumb[1].split(':');
for (var j=0; j<expandedBranches.length; j++) {
this.cookieStatuses[expandedBranches[j]] = true;
}
}
}
}
/**
* Reset branch status
*/
TreeMenu.prototype.resetBranches = function ()
{
if (!this.doesPersistence()) {
return false;
}
this.loadCookie();
for (var i=0; i<this.branches.length; i++) {
var status = this.getExpandedStatusFromCookie(this.branches[i]);
// Only update if it's supposed to be expanded and it's not already
if (status == true && this.branchStatus[this.branches[i]] != true) {
if (this.checkParentVisibility(this.branches[i])) {
this.toggleBranch(this.branches[i], true, false);
} else {
this.branchStatus[this.branches[i]] = true;
this.swapImage(this.branches[i]);
}
}
}
}
/**
* Checks whether a branch should be open
* or not based on its parents' status
*/
TreeMenu.prototype.checkParentVisibility = function (layerID)
{
if (this.in_array(this.childParents[layerID], this.branches)
&& this.branchStatus[this.childParents[layerID]]
&& this.checkParentVisibility(this.childParents[layerID]) ) {
return true;
} else if (this.childParents[layerID] == null) {
return true;
}
return false;
}
/**
* New C# style string formatter
*/
TreeMenu.prototype.stringFormat = function (strInput)
{
var idx = 0;
for (var i=1; i<arguments.length; i++) {
while ((idx = strInput.indexOf('{' + (i - 1) + '}', idx)) != -1) {
strInput = strInput.substring(0, idx) + arguments[i] + strInput.substr(idx + 3);
}
}
return strInput;
}
/**
* Also much adored, the PHP implode() function
*/
TreeMenu.prototype.implode = function (seperator, input)
{
var output = '';
for (var i=0; i<input.length; i++) {
if (i == 0) {
output += input[i];
} else {
output += seperator + input[i];
}
}
return output;
}
/**
* Aah, all the old favourites are coming out...
*/
TreeMenu.prototype.in_array = function (item, arr)
{
for (var i=0; i<arr.length; i++) {
if (arr[i] == item) {
return true;
}
}
return false;
}
/**
* TreeNode Class
*/
function TreeNode(title, icon, link, expanded, isDynamic, cssClass, linkTarget, expandedIcon)
{
this.title = title;
this.icon = icon;
this.expandedIcon = expandedIcon;
this.link = link;
this.expanded = expanded;
this.isDynamic = isDynamic;
this.cssClass = cssClass;
this.linkTarget = linkTarget;
this.n = new Array();
this.events = new Array();
this.handlers = null;
this.oncollapse = null;
this.onexpand = null;
this.ontoggle = null;
}
/**
* Adds a node to an already existing node
*/
TreeNode.prototype.addItem = function (newNode)
{
newIndex = this.n.length;
this.n[newIndex] = newNode;
return this.n[newIndex];
}
/**
* Sets an event for this particular node
*/
TreeNode.prototype.setEvent = function (eventName, eventHandler)
{
switch (eventName.toLowerCase()) {
case 'onexpand':
this.onexpand = eventHandler;
break;
case 'oncollapse':
this.oncollapse = eventHandler;
break;
case 'ontoggle':
this.ontoggle = eventHandler;
break;
default:
this.events[eventName] = eventHandler;
}
}
/**
* That's the end of the tree classes. What follows is
* the browser detection code.
*/
//<!--
// Ultimate client-side JavaScript client sniff. Version 3.03
// (C) Netscape Communications 1999-2001. Permission granted to reuse and distribute.
// Revised 17 May 99 to add is_nav5up and is_ie5up (see below).
// Revised 20 Dec 00 to add is_gecko and change is_nav5up to is_nav6up
// also added support for IE5.5 Opera4&5 HotJava3 AOLTV
// Revised 22 Feb 01 to correct Javascript Detection for IE 5.x, Opera 4,
// correct Opera 5 detection
// add support for winME and win2k
// synch with browser-type-oo.js
// Revised 26 Mar 01 to correct Opera detection
// Revised 02 Oct 01 to add IE6 detection
// Everything you always wanted to know about your JavaScript client
// but were afraid to ask. Creates "is_" variables indicating:
// (1) browser vendor:
// is_nav, is_ie, is_opera, is_hotjava, is_webtv, is_TVNavigator, is_AOLTV
// (2) browser version number:
// is_major (integer indicating major version number: 2, 3, 4 ...)
// is_minor (float indicating full version number: 2.02, 3.01, 4.04 ...)
// (3) browser vendor AND major version number
// is_nav2, is_nav3, is_nav4, is_nav4up, is_nav6, is_nav6up, is_gecko, is_ie3,
// is_ie4, is_ie4up, is_ie5, is_ie5up, is_ie5_5, is_ie5_5up, is_ie6, is_ie6up, is_hotjava3, is_hotjava3up,
// is_opera2, is_opera3, is_opera4, is_opera5, is_opera5up
// (4) JavaScript version number:
// is_js (float indicating full JavaScript version number: 1, 1.1, 1.2 ...)
// (5) OS platform and version:
// is_win, is_win16, is_win32, is_win31, is_win95, is_winnt, is_win98, is_winme, is_win2k
// is_os2
// is_mac, is_mac68k, is_macppc
// is_unix
// is_sun, is_sun4, is_sun5, is_suni86
// is_irix, is_irix5, is_irix6
// is_hpux, is_hpux9, is_hpux10
// is_aix, is_aix1, is_aix2, is_aix3, is_aix4
// is_linux, is_sco, is_unixware, is_mpras, is_reliant
// is_dec, is_sinix, is_freebsd, is_bsd
// is_vms
//
// See http://www.it97.de/JavaScript/JS_tutorial/bstat/navobj.html and
// http://www.it97.de/JavaScript/JS_tutorial/bstat/Browseraol.html
// for detailed lists of userAgent strings.
//
// Note: you don't want your Nav4 or IE4 code to "turn off" or
// stop working when new versions of browsers are released, so
// in conditional code forks, use is_ie5up ("IE 5.0 or greater")
// is_opera5up ("Opera 5.0 or greater") instead of is_ie5 or is_opera5
// to check version in code which you want to work on future
// versions.
/**
* Severly curtailed all this as only certain elements
* are required by TreeMenu, specifically:
* o is_ie4up
* o is_nav6up
* o is_gecko
*/
// convert all characters to lowercase to simplify testing
var agt=navigator.userAgent.toLowerCase();
// *** BROWSER VERSION ***
// Note: On IE5, these return 4, so use is_ie5up to detect IE5.
var is_major = parseInt(navigator.appVersion);
var is_minor = parseFloat(navigator.appVersion);
// Note: Opera and WebTV spoof Navigator. We do strict client detection.
// If you want to allow spoofing, take out the tests for opera and webtv.
var is_nav = ((agt.indexOf('mozilla')!=-1) && (agt.indexOf('spoofer')==-1)
&& (agt.indexOf('compatible') == -1) && (agt.indexOf('opera')==-1)
&& (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1));
var is_nav6up = (is_nav && (is_major >= 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

View File

@@ -1,822 +0,0 @@
<?php
// +-----------------------------------------------------------------------+
// | 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 <http://www.phpguru.org/> |
// | Harald Radi <harald.radi@nme.at> |
// +-----------------------------------------------------------------------+
//
// $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 <richard@php.net>
* @author Harald Radi <harald.radi@nme.at>
* @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:
*
* <treemenu>
* <node text="First node" icon="folder.gif" expandedIcon="folder-expanded.gif" />
* <node text="Second node" icon="folder.gif" expandedIcon="folder-expanded.gif">
* <node text="Sub node" icon="folder.gif" expandedIcon="folder-expanded.gif" />
* </node>
* <node text="Third node" icon="folder.gif" expandedIcon="folder-expanded.gif">
* </treemenu>
*
* Any of the options you can supply to the HTML_TreeNode constructor can be supplied as
* attributes to the <node> tag. If there are no subnodes for a particular node, you can
* use the XML shortcut <node ... /> instead of <node ... ></node>. 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 <richard@php.net>
* @author Harald Radi <harald.radi@nme.at>
* @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 .= '<script language="javascript" type="text/javascript">' . "\n//<![CDATA[\n\t";
$html .= sprintf('%s = new TreeMenu("%s", "%s", "%s", "%s", %s, %s);',
$menuObj,
$this->images,
$menuObj,
$this->linkTarget,
$this->defaultClass,
$this->usePersistence ? 'true' : 'false',
$this->noTopLevelImages ? 'true' : 'false');
$html .= "\n";
/**
* Loop through subnodes
*/
if (isset($this->menu->items)) {
for ($i=0; $i<count($this->menu->items); $i++) {
$html .= $this->_nodeToHTML($this->menu->items[$i], $menuObj);
}
}
$html .= sprintf("\n\t%s.drawMenu();", $menuObj);
$html .= sprintf("\n\t%s.writeOutput();", $menuObj);
if ($this->usePersistence && $this->isDynamic) {
$html .= sprintf("\n\t%s.resetBranches();", $menuObj);
}
$html .= "\n// ]]>\n</script>";
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; $i<count($nodeObj->items); $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 "&nbsp;"
* 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 = '&nbsp;';
$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; $i<count($this->menu->items); $i++) {
$nodeHTML .= $this->_nodeToHTML($this->menu->items[$i]);
}
}
return sprintf('<form target="%s" action="" onsubmit="var link = this.%s.options[this.%s.selectedIndex].value; if (link) {this.action = link; return true} else return false"><select name="%s"><option value="">%s</option>%s</select> <input type="submit" value="%s" /></form>',
$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('<option value="%s">%s%s</option>', $node->link, $prefix, $node->text);
/**
* Loop through subnodes
*/
if (isset($node->items)) {
for ($i=0; $i<count($node->items); $i++) {
$html .= $this->_nodeToHTML($node->items[$i], $prefix . str_repeat($this->indentChar, $this->indentNum));
}
}
return $html;
}
} // End class HTML_TreeMenu_Listbox
?>

View File

@@ -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

View File

@@ -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

View File

@@ -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);

View File

@@ -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;

View File

@@ -1,5 +1,5 @@
-- ============================================================================
-- Copyright (C) 2007 Laurent Destailleur <eldy@users.sourceforge.net>
-- Copyright (C) 2007-2009 Laurent Destailleur <eldy@users.sourceforge.net>
--
-- 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);