2008-09-01 23:51:38 +02:00
< ? php
/* Copyright ( C ) 2007 Patrick Raguin < patrick . raguin @ gmail . com >
2013-02-19 20:15:30 +01:00
* Copyright ( C ) 2007 - 2012 Laurent Destailleur < eldy @ users . sourceforge . net >
2008-09-01 23:51:38 +02:00
*
* 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
2013-01-16 15:36:08 +01:00
* the Free Software Foundation ; either version 3 of the License , or
2008-09-01 23:51:38 +02:00
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2019-09-23 21:55:30 +02:00
* along with this program . If not , see < https :// www . gnu . org / licenses />.
2008-09-01 23:51:38 +02:00
*/
/**
2011-10-24 10:45:06 +02:00
* \file htdocs / core / lib / treeview . lib . php
2008-09-01 23:51:38 +02:00
* \ingroup core
* \brief Libraries for tree views
*/
2008-09-09 01:21:22 +02:00
2013-03-30 14:27:13 +01:00
// ------------------------------- Used by ajax tree view -----------------
2008-09-25 17:54:08 +02:00
2008-09-02 02:27:05 +02:00
/**
2012-03-21 21:30:08 +01:00
* Show indent and picto of a tree line . Return array with information of line .
*
2014-09-27 16:00:11 +02:00
* @ param array $fulltree Array of entries in correct order
2012-03-24 15:20:49 +01:00
* @ param string $key Key of entry into fulltree to show picto
2012-03-21 21:30:08 +01:00
* @ param int $silent Do not output indent and picto , returns only value
2015-03-17 00:21:17 +01:00
* @ return integer [] array ( 0 or 1 if at least one of this level after , 0 or 1 if at least one of higher level after , nbofdirinsub , nbofdocinsub )
2008-09-02 02:27:05 +02:00
*/
2019-01-27 15:20:16 +01:00
function tree_showpad ( & $fulltree , $key , $silent = 0 )
2008-09-02 02:27:05 +02:00
{
2020-04-10 10:59:32 +02:00
$pos = 1 ;
2010-07-02 00:42:42 +02:00
2008-10-26 02:28:11 +02:00
// Loop on each pos, because we will output an img for each pos
2021-02-23 22:03:23 +01:00
while ( $pos <= $fulltree [ $key ][ 'level' ] && $fulltree [ $key ][ 'level' ] > 0 ) {
2012-03-21 21:30:08 +01:00
// Process for column $pos
2008-10-13 17:00:27 +02:00
2020-04-10 10:59:32 +02:00
$atleastoneofthislevelafter = 0 ;
$nbofdirinsub = 0 ;
$nbofdocinsub = 0 ;
$found = 0 ;
2008-10-13 17:00:27 +02:00
//print 'x'.$key;
2021-02-23 22:03:23 +01:00
foreach ( $fulltree as $key2 => $val2 ) {
2020-10-31 14:32:18 +01:00
//print "x".$pos." ".$key2." ".$found." ".$fulltree[$key2]['level'];
2021-02-23 22:03:23 +01:00
if ( $found == 1 ) { // We are after the entry to show
if ( $fulltree [ $key2 ][ 'level' ] > $pos ) {
2008-10-26 02:26:18 +01:00
$nbofdirinsub ++ ;
2021-02-23 22:03:23 +01:00
if ( isset ( $fulltree [ $key2 ][ 'cachenbofdoc' ]) && $fulltree [ $key2 ][ 'cachenbofdoc' ] > 0 ) {
$nbofdocinsub += $fulltree [ $key2 ][ 'cachenbofdoc' ];
}
2010-07-02 00:42:42 +02:00
}
2021-02-23 22:03:23 +01:00
if ( $fulltree [ $key2 ][ 'level' ] == $pos ) {
2020-04-10 10:59:32 +02:00
$atleastoneofthislevelafter = 1 ;
2010-07-02 00:42:42 +02:00
}
2021-02-23 22:03:23 +01:00
if ( $fulltree [ $key2 ][ 'level' ] <= $pos ) {
2008-10-13 17:00:27 +02:00
break ;
2010-07-02 00:42:42 +02:00
}
2008-10-13 17:00:27 +02:00
}
2021-02-23 22:03:23 +01:00
if ( $key2 == $key ) { // We found ourself, so now every lower level will be counted
2020-04-10 10:59:32 +02:00
$found = 1 ;
2008-10-26 02:26:18 +01:00
}
2008-10-13 17:00:27 +02:00
}
2012-03-21 21:30:08 +01:00
//print $atleastoneofthislevelafter;
2010-07-02 00:42:42 +02:00
2021-02-23 22:03:23 +01:00
if ( ! $silent ) {
if ( $atleastoneofthislevelafter ) {
if ( $fulltree [ $key ][ 'level' ] == $pos ) {
print img_picto_common ( '' , 'treemenu/branch.gif' );
} else {
print img_picto_common ( '' , 'treemenu/line.gif' );
}
2020-10-31 14:32:18 +01:00
} else {
2021-02-23 22:03:23 +01:00
if ( $fulltree [ $key ][ 'level' ] == $pos ) {
print img_picto_common ( '' , 'treemenu/branchbottom.gif' );
} else {
print img_picto_common ( '' , 'treemenu/linebottom.gif' );
}
2020-10-31 14:32:18 +01:00
}
2008-09-02 02:27:05 +02:00
}
$pos ++ ;
}
2010-07-02 00:42:42 +02:00
2020-04-10 10:59:32 +02:00
return array ( $atleastoneofthislevelafter , $nbofdirinsub , $nbofdocinsub );
2008-09-02 02:27:05 +02:00
}
2015-08-13 01:26:25 +02:00
// ------------------------------- Used by menu editor, category view, ... -----------------
2008-09-02 02:27:05 +02:00
2008-09-01 23:51:38 +02:00
/**
2017-02-21 23:52:13 +01:00
* Recursive function to output a tree . < ul id = " iddivjstree " >< li >...</ li ></ ul >
2015-12-19 13:55:27 +01:00
* It is also used for the tree of categories .
2013-02-20 21:16:31 +01:00
* Note : To have this function working , check you have loaded the js and css for treeview .
* $arrayofjs = array ( '/includes/jquery/plugins/jquerytreeview/jquery.treeview.js' ,
* '/includes/jquery/plugins/jquerytreeview/lib/jquery.cookie.js' );
* $arrayofcss = array ( '/includes/jquery/plugins/jquerytreeview/jquery.treeview.css' );
2014-04-08 23:28:26 +02:00
* TODO Replace with jstree plugin instead of treeview plugin .
2012-03-21 21:30:08 +01:00
*
2020-09-23 16:36:19 +02:00
* @ param array $tab Array of all elements
* @ param array $pere Array with parent ids ( 'rowid' => , 'mainmenu' => , 'leftmenu' => , 'fk_mainmenu=>,' fk_leftmenu => )
* @ param int $rang Level of element
* @ param string $iddivjstree Id to use for parent ul element
2016-06-01 21:14:28 +02:00
* @ param int $donoresetalreadyloaded Do not reset global array $donoresetalreadyloaded used to avoid to go down on an aleady processed record
2020-09-23 16:36:19 +02:00
* @ param int $showfk 1 = show fk_links to parent into label ( used by menu editor only )
* @ param string $moreparam Add more param on url of elements
2012-02-04 10:48:47 +01:00
* @ return void
2008-09-01 23:51:38 +02:00
*/
2020-09-23 16:36:19 +02:00
function tree_recur ( $tab , $pere , $rang , $iddivjstree = 'iddivjstree' , $donoresetalreadyloaded = 0 , $showfk = 0 , $moreparam = '' )
2008-09-01 23:51:38 +02:00
{
2020-10-31 14:32:18 +01:00
global $tree_recur_alreadyadded , $menu_handler_to_search ;
2017-07-01 12:42:49 +02:00
2021-02-23 22:03:23 +01:00
if ( $rang == 0 && empty ( $donoresetalreadyloaded )) {
$tree_recur_alreadyadded = array ();
}
2017-07-01 12:42:49 +02:00
2021-02-23 22:03:23 +01:00
if ( $rang == 0 ) {
2013-02-20 18:34:54 +01:00
// Test also done with jstree and dynatree (not able to have <a> inside label)
2021-11-29 15:09:18 +01:00
print ' < script type = " text/javascript " >
2013-02-19 20:15:30 +01:00
$ ( document ) . ready ( function (){
2013-02-20 19:01:29 +01:00
$ ( " #'. $iddivjstree .' " ) . treeview ({
2013-02-19 20:15:30 +01:00
collapsed : true ,
animated : " fast " ,
2013-02-20 21:16:31 +01:00
persist : " cookie " ,
control : " #'. $iddivjstree .'control " ,
toggle : function () {
/* window.console && console.log("%o was toggled", this); */
}
2013-02-19 20:15:30 +01:00
});
})
</ script > ' ;
2013-02-20 18:34:54 +01:00
2013-02-20 21:16:31 +01:00
print '<ul id="' . $iddivjstree . '">' ;
2013-02-19 20:15:30 +01:00
}
2017-07-01 12:42:49 +02:00
2021-02-23 22:03:23 +01:00
if ( $rang > 50 ) {
2020-10-31 14:32:18 +01:00
return ; // Protect against infinite loop. Max 50 depth
2017-02-21 23:52:13 +01:00
}
2008-09-01 23:51:38 +02:00
//ballayage du tableau
2020-04-10 10:59:32 +02:00
$sizeoftab = count ( $tab );
$ulprinted = 0 ;
2021-02-23 22:03:23 +01:00
for ( $x = 0 ; $x < $sizeoftab ; $x ++ ) {
2012-09-27 00:05:13 +02:00
//var_dump($tab[$x]);exit;
2011-04-06 13:11:32 +02:00
// If an element has $pere for parent
2021-02-23 22:03:23 +01:00
if ( $tab [ $x ][ 'fk_menu' ] != - 1 && $tab [ $x ][ 'fk_menu' ] == $pere [ 'rowid' ]) {
2020-10-31 14:32:18 +01:00
//print 'rang='.$rang.'-x='.$x." rowid=".$tab[$x]['rowid']." tab[x]['fk_leftmenu'] = ".$tab[$x]['fk_leftmenu']." leftmenu pere = ".$pere['leftmenu']."<br>\n";
2021-02-23 22:03:23 +01:00
if ( empty ( $ulprinted ) && ! empty ( $pere [ 'rowid' ])) {
if ( ! empty ( $tree_recur_alreadyadded [ $tab [ $x ][ 'rowid' ]])) {
2020-10-31 14:32:18 +01:00
dol_syslog ( 'Error, record with id ' . $tab [ $x ][ 'rowid' ] . ' seems to be a child of record with id ' . $pere [ 'rowid' ] . ' but it was already output. Complete field "leftmenu" and "mainmenu" on ALL records to avoid ambiguity.' , LOG_WARNING );
continue ;
}
2017-07-01 12:42:49 +02:00
2021-03-01 20:37:16 +01:00
print '<ul' . ( empty ( $pere [ 'rowid' ]) ? ' id="treeData"' : '' ) . '>' ;
$ulprinted ++ ;
2016-06-01 17:49:20 +02:00
}
2020-12-30 11:27:03 +01:00
print " \n " . '<li ' . ( ! empty ( $tab [ $x ][ 'statut' ]) ? ' class="liuseractive"' : 'class="liuserdisabled"' ) . '>' ;
2021-02-23 22:03:23 +01:00
if ( $showfk ) {
2020-10-31 14:32:18 +01:00
print '<table class="nobordernopadding centpercent"><tr><td>' ;
2021-06-15 01:18:17 +02:00
print '<span class="paddingleftonly">' . $tab [ $x ][ 'title' ] . '</span>' ;
print ' <span class="opacitymedium">(fk_mainmenu=' . $tab [ $x ][ 'fk_mainmenu' ] . ' fk_leftmenu=' . $tab [ $x ][ 'fk_leftmenu' ] . ')</span>' ;
print '</td><td class="right nowraponall">' ;
2020-10-31 14:32:18 +01:00
print $tab [ $x ][ 'buttons' ];
print '</td></tr></table>' ;
2020-05-21 15:05:19 +02:00
} else {
2020-10-31 14:32:18 +01:00
print $tab [ $x ][ 'entry' ];
2017-07-01 12:42:49 +02:00
}
2016-06-01 21:14:28 +02:00
//print ' -> A '.$tab[$x]['rowid'].' mainmenu='.$tab[$x]['mainmenu'].' leftmenu='.$tab[$x]['leftmenu'].' fk_mainmenu='.$tab[$x]['fk_mainmenu'].' fk_leftmenu='.$tab[$x]['fk_leftmenu'].'<br>'."\n";
2020-10-31 14:32:18 +01:00
$tree_recur_alreadyadded [ $tab [ $x ][ 'rowid' ]] = ( $rang + 1 );
2011-04-06 13:11:32 +02:00
// And now we search all its sons of lower level
2020-04-10 10:59:32 +02:00
tree_recur ( $tab , $tab [ $x ], $rang + 1 , 'iddivjstree' , 0 , $showfk );
2013-02-19 20:15:30 +01:00
print '</li>' ;
2020-09-15 14:45:51 +02:00
} elseif ( ! empty ( $tab [ $x ][ 'rowid' ]) && $tab [ $x ][ 'fk_menu' ] == - 1 && $tab [ $x ][ 'fk_mainmenu' ] == $pere [ 'mainmenu' ] && $tab [ $x ][ 'fk_leftmenu' ] == $pere [ 'leftmenu' ]) {
2020-10-31 14:32:18 +01:00
//print 'rang='.$rang.'-x='.$x." rowid=".$tab[$x]['rowid']." tab[x]['fk_leftmenu'] = ".$tab[$x]['fk_leftmenu']." leftmenu pere = ".$pere['leftmenu']."<br>\n";
2021-02-23 22:03:23 +01:00
if ( empty ( $ulprinted ) && ! empty ( $pere [ 'rowid' ])) {
if ( ! empty ( $tree_recur_alreadyadded [ $tab [ $x ][ 'rowid' ]])) {
2020-10-31 14:32:18 +01:00
dol_syslog ( 'Error, record with id ' . $tab [ $x ][ 'rowid' ] . ' seems to be a child of record with id ' . $pere [ 'rowid' ] . ' but it was already output. Complete field "leftmenu" and "mainmenu" on ALL records to avoid ambiguity.' , LOG_WARNING );
//print 'Error, record with id '.$tab[$x]['rowid'].' seems to be a child of record with id '.$pere['rowid'].' but it was already output. Complete field "leftmenu" and "mainmenu" on ALL records to avoid ambiguity.';
continue ;
}
2021-03-01 20:37:16 +01:00
print '<ul' . ( empty ( $pere [ 'rowid' ]) ? ' id="treeData"' : '' ) . '>' ;
$ulprinted ++ ;
2020-10-31 14:32:18 +01:00
}
2020-12-30 11:27:03 +01:00
print " \n " . '<li ' . ( ! empty ( $tab [ $x ][ 'statut' ]) ? ' class="liuseractive"' : 'class="liuserdisabled"' ) . '>' ;
2021-02-23 22:03:23 +01:00
if ( $showfk ) {
2020-10-31 14:32:18 +01:00
print '<table class="nobordernopadding centpercent"><tr><td>' ;
2021-09-27 12:24:01 +02:00
print '<strong> <a href="edit.php?menu_handler=' . $menu_handler_to_search . '&action=edit&token=' . newToken () . '&menuId=' . $tab [ $x ][ 'rowid' ] . $moreparam . '">' ;
2020-10-31 14:32:18 +01:00
print $tab [ $x ][ 'title' ];
print '</a></strong>' ;
print ' (mainmenu=' . $tab [ $x ][ 'mainmenu' ] . ' leftmenu=' . $tab [ $x ][ 'leftmenu' ] . ' - fk_mainmenu=' . $tab [ $x ][ 'fk_mainmenu' ] . ' fk_leftmenu=' . $tab [ $x ][ 'fk_leftmenu' ] . ')' ;
print '</td><td class="right">' ;
print $tab [ $x ][ 'buttons' ];
print '</td></tr></table>' ;
2020-05-21 15:05:19 +02:00
} else {
2020-10-31 14:32:18 +01:00
print $tab [ $x ][ 'entry' ];
2017-07-01 12:42:49 +02:00
}
2016-06-01 21:14:28 +02:00
//print ' -> B '.$tab[$x]['rowid'].' mainmenu='.$tab[$x]['mainmenu'].' leftmenu='.$tab[$x]['leftmenu'].' fk_mainmenu='.$tab[$x]['fk_mainmenu'].' fk_leftmenu='.$tab[$x]['fk_leftmenu'].'<br>'."\n";
2020-04-10 10:59:32 +02:00
$tree_recur_alreadyadded [ $tab [ $x ][ 'rowid' ]] = ( $rang + 1 );
2012-09-27 00:05:13 +02:00
// And now we search all its sons of lower level
2016-06-01 21:14:28 +02:00
//print 'Call tree_recur for x='.$x.' rowid='.$tab[$x]['rowid']." fk_mainmenu pere = ".$tab[$x]['fk_mainmenu']." fk_leftmenu pere = ".$tab[$x]['fk_leftmenu']."<br>\n";
2020-10-31 14:32:18 +01:00
tree_recur ( $tab , $tab [ $x ], $rang + 1 , 'iddivjstree' , 0 , $showfk );
2013-02-19 20:15:30 +01:00
print '</li>' ;
2008-09-01 23:51:38 +02:00
}
}
2021-02-23 22:03:23 +01:00
if ( ! empty ( $ulprinted ) && ! empty ( $pere [ 'rowid' ])) {
print '</ul>' . " \n " ;
}
2013-02-20 18:34:54 +01:00
2021-02-23 22:03:23 +01:00
if ( $rang == 0 ) {
print '</ul>' ;
}
2008-09-01 23:51:38 +02:00
}