From bf5fbd3a80c180cedba9d451f61cd1c32c389a75 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 1 Jun 2016 21:14:28 +0200 Subject: [PATCH] FIX Infinite loop on menu tree output for edition FIX Can show tree of entries added by external modules using fk_mainmenu and fk_leftmenu instead of fk_menu. --- htdocs/admin/menus/index.php | 57 +++++++++++++++++++++++++++----- htdocs/core/lib/treeview.lib.php | 23 ++++++++----- 2 files changed, 63 insertions(+), 17 deletions(-) diff --git a/htdocs/admin/menus/index.php b/htdocs/admin/menus/index.php index 7da0673b196..27b8ab74a96 100644 --- a/htdocs/admin/menus/index.php +++ b/htdocs/admin/menus/index.php @@ -289,17 +289,18 @@ if ($conf->use_javascript_ajax) - la chaine a afficher ie: data[]= array (index, index parent, chaine ) */ + //il faut d'abord declarer un element racine de l'arbre - $data[] = array('rowid'=>0,'fk_menu'=>-1,'title'=>"racine",'mainmenu'=>'','leftmenu'=>'','fk_mainmenu'=>'','fk_leftmenu'=>''); - + $data[] = array('rowid'=>0,'fk_menu'=>-1,'title'=>"racine",'mainmenu'=>'','leftmenu'=>'','fk_mainmenu'=>'','fk_leftmenu'=>''); + //puis tous les elements enfants - $sql = "SELECT m.rowid, m.titre, m.langs, m.mainmenu, m.leftmenu, m.fk_menu, m.fk_mainmenu, m.fk_leftmenu"; + $sql = "SELECT m.rowid, m.titre, m.langs, m.mainmenu, m.leftmenu, m.fk_menu, m.fk_mainmenu, m.fk_leftmenu, m.module"; $sql.= " FROM ".MAIN_DB_PREFIX."menu as m"; $sql.= " WHERE menu_handler = '".$menu_handler_to_search."'"; $sql.= " AND entity = ".$conf->entity; - $sql.= " AND fk_menu >= 0"; + //$sql.= " AND fk_menu >= 0"; $sql.= " ORDER BY m.position, m.rowid"; // Order is position then rowid (because we need a sort criteria when position is same) $res = $db->query($sql); @@ -314,9 +315,10 @@ if ($conf->use_javascript_ajax) $titre = $langs->trans($menu['titre']); $data[] = array( 'rowid'=>$menu['rowid'], + 'module'=>$menu['module'], 'fk_menu'=>$menu['fk_menu'], 'title'=>$titre, - 'mainmenu'=>$menu['mainmenu'], + 'mainmenu'=>$menu['mainmenu'], 'leftmenu'=>$menu['leftmenu'], 'fk_mainmenu'=>$menu['fk_mainmenu'], 'fk_leftmenu'=>$menu['fk_leftmenu'], @@ -334,17 +336,54 @@ if ($conf->use_javascript_ajax) } } + global $tree_recur_alreadyadded; // This var was def into tree_recur + // Appelle de la fonction recursive (ammorce) // avec recherche depuis la racine. //var_dump($data); - tree_recur($data,$data[0],0); + tree_recur($data, $data[0], 0, 'iddivjstree'); // $data[0] is virtual record 'racine' + print ''; - + print ''; - + print ''; - + + + // Process remaining records (records that are not linked to root by any path) + $remainingdata = array(); + foreach($data as $datar) + { + if (empty($datar['rowid']) || $tree_recur_alreadyadded[$datar['rowid']]) continue; + $remainingdata[] = $datar; + } + + if (count($remainingdata)) + { + print ''; + + print ''; + print ''; + print ''; + print ''; + + print ''; + print ''; + + print ''; + + print '
'.$langs->trans("NotTopTreeMenuPersonalized").'
'; + + foreach($remainingdata as $datar) + { + $father = array('rowid'=>$datar['rowid'],'title'=>"???",'mainmenu'=>$datar['fk_mainmenu'],'leftmenu'=>$datar['fk_leftmenu'],'fk_mainmenu'=>'','fk_leftmenu'=>''); + //print 'Start with rowid='.$datar['rowid'].' mainmenu='.$father ['mainmenu'].' leftmenu='.$father ['leftmenu'].'
'."\n"; + tree_recur($data, $father, 0, 'iddivjstree'.$datar['rowid'], 1, 1); + } + + print '
'; + } print ''; diff --git a/htdocs/core/lib/treeview.lib.php b/htdocs/core/lib/treeview.lib.php index 225568fd776..6fc0c9f013f 100644 --- a/htdocs/core/lib/treeview.lib.php +++ b/htdocs/core/lib/treeview.lib.php @@ -109,15 +109,17 @@ function tree_showpad(&$fulltree,$key,$silent=0) * @param int $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 + * @param int $donoresetalreadyloaded Do not reset global array $donoresetalreadyloaded used to avoid to go down on an aleady processed record + * @param int $showfk Show fk links to parent into label * @return void */ -function tree_recur($tab, $pere, $rang, $iddivjstree='iddivjstree') +function tree_recur($tab, $pere, $rang, $iddivjstree='iddivjstree', $donoresetalreadyloaded=0, $showfk=0) { global $tree_recur_alreadyadded; - if ($rang == 0) $tree_recur_alreadyadded=array(); + if ($rang == 0 && empty($donoresetalreadyloaded)) $tree_recur_alreadyadded=array(); - if (empty($pere['rowid'])) + if ($rang == 0) { // Test also done with jstree and dynatree (not able to have inside label) print '