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
2008-10-13 17:00:27 +02:00
while ( $pos <= $fulltree [ $key ][ 'level' ] && $fulltree [ $key ][ 'level' ] > 0 )
2008-09-02 02:27:05 +02:00
{
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;
2020-04-10 10:59:32 +02:00
foreach ( $fulltree as $key2 => $val2 )
2008-10-13 17:00:27 +02:00
{
2012-03-21 21:30:08 +01:00
//print "x".$pos." ".$key2." ".$found." ".$fulltree[$key2]['level'];
2008-10-26 02:28:11 +02:00
if ( $found == 1 ) // We are after the entry to show
2008-10-13 17:00:27 +02:00
{
2008-10-26 02:28:11 +02:00
if ( $fulltree [ $key2 ][ 'level' ] > $pos )
{
2008-10-26 02:26:18 +01:00
$nbofdirinsub ++ ;
2020-04-10 10:59:32 +02:00
if ( isset ( $fulltree [ $key2 ][ 'cachenbofdoc' ]) && $fulltree [ $key2 ][ 'cachenbofdoc' ] > 0 ) $nbofdocinsub += $fulltree [ $key2 ][ 'cachenbofdoc' ];
2010-07-02 00:42:42 +02:00
}
2008-10-13 17:00:27 +02:00
if ( $fulltree [ $key2 ][ 'level' ] == $pos )
{
2020-04-10 10:59:32 +02:00
$atleastoneofthislevelafter = 1 ;
2010-07-02 00:42:42 +02:00
}
2008-10-26 02:28:11 +02: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
}
2012-03-21 21:30:08 +01:00
if ( $key2 == $key ) // We found ourself, so now every lower level will be counted
2008-10-26 02:26:18 +01:00
{
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
2020-04-10 10:59:32 +02:00
if ( ! $silent )
2008-09-02 02:27:05 +02:00
{
2012-03-21 21:30:08 +01:00
if ( $atleastoneofthislevelafter )
{
2019-01-27 11:55:16 +01:00
if ( $fulltree [ $key ][ 'level' ] == $pos ) print img_picto_common ( '' , 'treemenu/branch.gif' );
else print img_picto_common ( '' , 'treemenu/line.gif' );
2020-05-21 15:05:19 +02:00
} else {
2019-01-27 11:55:16 +01:00
if ( $fulltree [ $key ][ 'level' ] == $pos ) print img_picto_common ( '' , 'treemenu/branchbottom.gif' );
else print img_picto_common ( '' , 'treemenu/linebottom.gif' );
2012-03-21 21:30:08 +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
{
2019-02-12 18:56:32 +01:00
global $tree_recur_alreadyadded , $menu_handler_to_search ;
2017-07-01 12:42:49 +02:00
2020-04-10 10:59:32 +02:00
if ( $rang == 0 && empty ( $donoresetalreadyloaded )) $tree_recur_alreadyadded = array ();
2017-07-01 12:42:49 +02:00
2016-06-01 21:14:28 +02:00
if ( $rang == 0 )
2013-02-19 20:15:30 +01:00
{
2013-02-20 18:34:54 +01:00
// Test also done with jstree and dynatree (not able to have <a> inside label)
2013-02-19 20:15:30 +01:00
print ' < script type = " text/javascript " language = " javascript " >
$ ( 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
if ( $rang > 50 )
2017-02-21 23:52:13 +01:00
{
2020-04-10 10:59:32 +02: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 ;
for ( $x = 0 ; $x < $sizeoftab ; $x ++ )
2008-09-01 23:51:38 +02:00
{
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
2012-09-27 00:05:13 +02:00
if ( $tab [ $x ][ 'fk_menu' ] != - 1 && $tab [ $x ][ 'fk_menu' ] == $pere [ 'rowid' ])
2008-09-01 23:51:38 +02:00
{
2016-06-01 17:49:20 +02:00
//print 'rang='.$rang.'-x='.$x." rowid=".$tab[$x]['rowid']." tab[x]['fk_leftmenu'] = ".$tab[$x]['fk_leftmenu']." leftmenu pere = ".$pere['leftmenu']."<br>\n";
2020-04-10 10:59:32 +02:00
if ( empty ( $ulprinted ) && ! empty ( $pere [ 'rowid' ]))
2017-07-01 12:42:49 +02:00
{
2020-04-10 10:59:32 +02:00
if ( ! empty ( $tree_recur_alreadyadded [ $tab [ $x ][ 'rowid' ]]))
2016-06-01 17:49:20 +02: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
2020-04-10 10:59:32 +02:00
print '<ul' . ( empty ( $pere [ 'rowid' ]) ? ' id="treeData"' : '' ) . '>' ; $ulprinted ++ ;
2016-06-01 17:49:20 +02:00
}
2020-04-10 10:59:32 +02:00
print " \n " . '<li ' . ( $tab [ $x ][ 'statut' ] ? ' class="liuseractive"' : 'class="liuserdisabled"' ) . '>' ;
2017-07-01 12:42:49 +02:00
if ( $showfk )
{
print '<table class="nobordernopadding centpercent"><tr><td>' ;
print '<strong> ' ;
print $tab [ $x ][ 'title' ];
print ' (fk_mainmenu=' . $tab [ $x ][ 'fk_mainmenu' ] . ' fk_leftmenu=' . $tab [ $x ][ 'fk_leftmenu' ] . ')' ;
2019-03-14 14:21:54 +01:00
print '</td><td class="right">' ;
2017-07-01 12:42:49 +02:00
print $tab [ $x ][ 'buttons' ];
print '</td></tr></table>' ;
2020-05-21 15:05:19 +02:00
} else {
2017-07-01 12:42:49 +02:00
print $tab [ $x ][ 'entry' ];
}
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-04-10 10:59:32 +02: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' ]) {
2016-06-01 17:49:20 +02:00
//print 'rang='.$rang.'-x='.$x." rowid=".$tab[$x]['rowid']." tab[x]['fk_leftmenu'] = ".$tab[$x]['fk_leftmenu']." leftmenu pere = ".$pere['leftmenu']."<br>\n";
2020-04-10 10:59:32 +02:00
if ( empty ( $ulprinted ) && ! empty ( $pere [ 'rowid' ]))
2016-06-01 17:49:20 +02:00
{
2020-04-10 10:59:32 +02:00
if ( ! empty ( $tree_recur_alreadyadded [ $tab [ $x ][ 'rowid' ]]))
2016-06-01 17:49:20 +02:00
{
2016-06-01 21:14:28 +02: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.';
2016-06-01 17:49:20 +02:00
continue ;
}
2017-07-01 12:42:49 +02:00
2020-04-10 10:59:32 +02:00
print '<ul' . ( empty ( $pere [ 'rowid' ]) ? ' id="treeData"' : '' ) . '>' ; $ulprinted ++ ;
2016-06-01 17:49:20 +02:00
}
2020-04-10 10:59:32 +02:00
print " \n " . '<li ' . ( $tab [ $x ][ 'statut' ] ? ' class="liuseractive"' : 'class="liuserdisabled"' ) . '>' ;
2017-07-01 12:42:49 +02:00
if ( $showfk )
{
print '<table class="nobordernopadding centpercent"><tr><td>' ;
2020-09-23 16:36:19 +02:00
print '<strong> <a href="edit.php?menu_handler=' . $menu_handler_to_search . '&action=edit&menuId=' . $tab [ $x ][ 'rowid' ] . $moreparam . '">' ;
2017-07-01 12:42:49 +02:00
print $tab [ $x ][ 'title' ];
print '</a></strong>' ;
2017-07-30 19:38:12 +02:00
print ' (mainmenu=' . $tab [ $x ][ 'mainmenu' ] . ' leftmenu=' . $tab [ $x ][ 'leftmenu' ] . ' - fk_mainmenu=' . $tab [ $x ][ 'fk_mainmenu' ] . ' fk_leftmenu=' . $tab [ $x ][ 'fk_leftmenu' ] . ')' ;
2019-03-14 14:21:54 +01:00
print '</td><td class="right">' ;
2017-07-01 12:42:49 +02:00
print $tab [ $x ][ 'buttons' ];
print '</td></tr></table>' ;
2020-05-21 15:05:19 +02:00
} else {
2017-07-01 12:42:49 +02:00
print $tab [ $x ][ 'entry' ];
}
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-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>' ;
2008-09-01 23:51:38 +02:00
}
}
2020-04-10 10:59:32 +02:00
if ( ! empty ( $ulprinted ) && ! empty ( $pere [ 'rowid' ])) { print '</ul>' . " \n " ; }
2013-02-20 18:34:54 +01:00
2016-06-01 21:14:28 +02:00
if ( $rang == 0 ) print '</ul>' ;
2008-09-01 23:51:38 +02:00
}