index.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. <?php
  2. /* Copyright (C) 2007 Patrick Raguin <patrick.raguin@gmail.com>
  3. * Copyright (C) 2007-2012 Laurent Destailleur <eldy@users.sourceforge.net>
  4. * Copyright (C) 2009-2012 Regis Houssin <regis.houssin@capnetworks.com>
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. /**
  20. * \file htdocs/admin/menus/index.php
  21. * \ingroup core
  22. * \brief Index page for menu editor
  23. */
  24. require '../../main.inc.php';
  25. require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
  26. require_once DOL_DOCUMENT_ROOT.'/core/lib/treeview.lib.php';
  27. $langs->load("other");
  28. $langs->load("admin");
  29. if (! $user->admin) accessforbidden();
  30. $dirstandard = array();
  31. $dirsmartphone = array();
  32. $dirmenus=array_merge(array("/core/menus/"),(array) $conf->modules_parts['menus']);
  33. foreach($dirmenus as $dirmenu)
  34. {
  35. $dirstandard[]=$dirmenu.'standard';
  36. $dirsmartphone[]=$dirmenu.'smartphone';
  37. }
  38. $action=GETPOST('action','alpha');
  39. $confirm=GETPOST('confirm','alpha');
  40. $menu_handler_top=$conf->global->MAIN_MENU_STANDARD;
  41. $menu_handler_smartphone=$conf->global->MAIN_MENU_SMARTPHONE;
  42. $menu_handler_top=preg_replace('/(_backoffice\.php|_menu\.php)/i','',$menu_handler_top);
  43. $menu_handler_top=preg_replace('/(_frontoffice\.php|_menu\.php)/i','',$menu_handler_top);
  44. $menu_handler_smartphone=preg_replace('/(_backoffice\.php|_menu\.php)/i','',$menu_handler_smartphone);
  45. $menu_handler_smartphone=preg_replace('/(_frontoffice\.php|_menu\.php)/i','',$menu_handler_smartphone);
  46. $menu_handler=$menu_handler_top;
  47. if (GETPOST("handler_origine")) $menu_handler=GETPOST("handler_origine");
  48. if (GETPOST("menu_handler")) $menu_handler=GETPOST("menu_handler");
  49. $menu_handler_to_search=preg_replace('/(_backoffice|_frontoffice|_menu)?(\.php)?/i','',$menu_handler);
  50. /*
  51. * Actions
  52. */
  53. if ($action == 'up')
  54. {
  55. $current=array();
  56. $previous=array();
  57. // Get current position
  58. $sql = "SELECT m.rowid, m.position, m.type, m.fk_menu";
  59. $sql.= " FROM ".MAIN_DB_PREFIX."menu as m";
  60. $sql.= " WHERE m.rowid = ".$_GET["menuId"];
  61. dol_syslog("admin/menus/index.php ".$sql);
  62. $result = $db->query($sql);
  63. $num = $db->num_rows($result);
  64. $i = 0;
  65. while($i < $num)
  66. {
  67. $obj = $db->fetch_object($result);
  68. $current['rowid'] = $obj->rowid;
  69. $current['order'] = $obj->position;
  70. $current['type'] = $obj->type;
  71. $current['fk_menu'] = $obj->fk_menu;
  72. $i++;
  73. }
  74. // Menu before
  75. $sql = "SELECT m.rowid, m.position";
  76. $sql.= " FROM ".MAIN_DB_PREFIX."menu as m";
  77. $sql.= " WHERE (m.position < ".($current['order'])." OR (m.position = ".($current['order'])." AND rowid < ".$_GET["menuId"]."))";
  78. $sql.= " AND m.menu_handler='".$menu_handler_to_search."'";
  79. $sql.= " AND m.entity = ".$conf->entity;
  80. $sql.= " AND m.type = '".$current['type']."'";
  81. $sql.= " AND m.fk_menu = '".$current['fk_menu']."'";
  82. $sql.= " ORDER BY m.position, m.rowid";
  83. dol_syslog("admin/menus/index.php ".$sql);
  84. $result = $db->query($sql);
  85. $num = $db->num_rows($result);
  86. $i = 0;
  87. while($i < $num)
  88. {
  89. $obj = $db->fetch_object($result);
  90. $previous['rowid'] = $obj->rowid;
  91. $previous['order'] = $obj->position;
  92. $i++;
  93. }
  94. $sql = "UPDATE ".MAIN_DB_PREFIX."menu as m";
  95. $sql.= " SET m.position = ".$previous['order'];
  96. $sql.= " WHERE m.rowid = ".$current['rowid']; // Up the selected entry
  97. dol_syslog("admin/menus/index.php ".$sql);
  98. $db->query($sql);
  99. $sql = "UPDATE ".MAIN_DB_PREFIX."menu as m";
  100. $sql.= " SET m.position = ".($current['order']!=$previous['order']?$current['order']:$current['order']+1);
  101. $sql.= " WHERE m.rowid = ".$previous['rowid']; // Descend celui du dessus
  102. dol_syslog("admin/menus/index.php ".$sql);
  103. $db->query($sql);
  104. }
  105. elseif ($action == 'down')
  106. {
  107. $current=array();
  108. $next=array();
  109. // Get current position
  110. $sql = "SELECT m.rowid, m.position, m.type, m.fk_menu";
  111. $sql.= " FROM ".MAIN_DB_PREFIX."menu as m";
  112. $sql.= " WHERE m.rowid = ".$_GET["menuId"];
  113. dol_syslog("admin/menus/index.php ".$sql);
  114. $result = $db->query($sql);
  115. $num = $db->num_rows($result);
  116. $i = 0;
  117. while($i < $num)
  118. {
  119. $obj = $db->fetch_object($result);
  120. $current['rowid'] = $obj->rowid;
  121. $current['order'] = $obj->position;
  122. $current['type'] = $obj->type;
  123. $current['fk_menu'] = $obj->fk_menu;
  124. $i++;
  125. }
  126. // Menu after
  127. $sql = "SELECT m.rowid, m.position";
  128. $sql.= " FROM ".MAIN_DB_PREFIX."menu as m";
  129. $sql.= " WHERE (m.position > ".($current['order'])." OR (m.position = ".($current['order'])." AND rowid > ".$_GET["menuId"]."))";
  130. $sql.= " AND m.menu_handler='".$menu_handler_to_search."'";
  131. $sql.= " AND m.entity = ".$conf->entity;
  132. $sql.= " AND m.type = '".$current['type']."'";
  133. $sql.= " AND m.fk_menu = '".$current['fk_menu']."'";
  134. $sql.= " ORDER BY m.position, m.rowid";
  135. dol_syslog("admin/menus/index.php ".$sql);
  136. $result = $db->query($sql);
  137. $num = $db->num_rows($result);
  138. $i = 0;
  139. while($i < $num)
  140. {
  141. $obj = $db->fetch_object($result);
  142. $next['rowid'] = $obj->rowid;
  143. $next['order'] = $obj->position;
  144. $i++;
  145. }
  146. $sql = "UPDATE ".MAIN_DB_PREFIX."menu as m";
  147. $sql.= " SET m.position = ".($current['order']!=$next['order']?$next['order']:$current['order']+1); // Down the selected entry
  148. $sql.= " WHERE m.rowid = ".$current['rowid'];
  149. dol_syslog("admin/menus/index.php ".$sql);
  150. $db->query($sql);
  151. $sql = "UPDATE ".MAIN_DB_PREFIX."menu as m"; // Up the next entry
  152. $sql.= " SET m.position = ".$current['order'];
  153. $sql.= " WHERE m.rowid = ".$next['rowid'];
  154. dol_syslog("admin/menus/index.php ".$sql);
  155. $db->query($sql);
  156. }
  157. elseif ($action == 'confirm_delete' && $confirm == 'yes')
  158. {
  159. $db->begin();
  160. $sql = "DELETE FROM ".MAIN_DB_PREFIX."menu";
  161. $sql.= " WHERE rowid = ".$_GET['menuId'];
  162. $resql=$db->query($sql);
  163. if ($resql)
  164. {
  165. $db->commit();
  166. setEventMessages($langs->trans("MenuDeleted"), null, 'mesgs');
  167. header("Location: ".DOL_URL_ROOT.'/admin/menus/index.php?menu_handler='.$menu_handler);
  168. exit ;
  169. }
  170. else
  171. {
  172. $db->rollback();
  173. $reload = 0;
  174. $action='';
  175. }
  176. }
  177. /*
  178. * View
  179. */
  180. $form=new Form($db);
  181. $formadmin=new FormAdmin($db);
  182. $arrayofjs=array('/includes/jquery/plugins/jquerytreeview/jquery.treeview.js', '/includes/jquery/plugins/jquerytreeview/lib/jquery.cookie.js');
  183. $arrayofcss=array('/includes/jquery/plugins/jquerytreeview/jquery.treeview.css');
  184. llxHeader('',$langs->trans("Menus"),'','',0,0,$arrayofjs,$arrayofcss);
  185. print load_fiche_titre($langs->trans("Menus"),'','title_setup');
  186. $h = 0;
  187. $head[$h][0] = DOL_URL_ROOT."/admin/menus.php";
  188. $head[$h][1] = $langs->trans("MenuHandlers");
  189. $head[$h][2] = 'handler';
  190. $h++;
  191. $head[$h][0] = DOL_URL_ROOT."/admin/menus/index.php";
  192. $head[$h][1] = $langs->trans("MenuAdmin");
  193. $head[$h][2] = 'editor';
  194. $h++;
  195. $head[$h][0] = DOL_URL_ROOT."/admin/menus/other.php";
  196. $head[$h][1] = $langs->trans("Miscellaneous");
  197. $head[$h][2] = 'misc';
  198. $h++;
  199. dol_fiche_head($head, 'editor', $langs->trans("Menus"));
  200. print $langs->trans("MenusEditorDesc")."<br>\n";
  201. print "<br>\n";
  202. // Confirmation for remove menu entry
  203. if ($action == 'delete')
  204. {
  205. $sql = "SELECT m.titre";
  206. $sql.= " FROM ".MAIN_DB_PREFIX."menu as m";
  207. $sql.= " WHERE m.rowid = ".$_GET['menuId'];
  208. $result = $db->query($sql);
  209. $obj = $db->fetch_object($result);
  210. print $form->formconfirm("index.php?menu_handler=".$menu_handler."&menuId=".$_GET['menuId'],$langs->trans("DeleteMenu"),$langs->trans("ConfirmDeleteMenu",$obj->titre),"confirm_delete");
  211. }
  212. print '<form name="newmenu" class="nocellnopadd" action="'.$_SERVER["PHP_SELF"].'">';
  213. print '<input type="hidden" action="change_menu_handler">';
  214. print $langs->trans("MenuHandler").': ';
  215. print $formadmin->select_menu_families($menu_handler.(preg_match('/_menu/',$menu_handler)?'':'_menu'),'menu_handler',array_merge($dirstandard,$dirsmartphone));
  216. print ' &nbsp; <input type="submit" class="button" value="'.$langs->trans("Refresh").'">';
  217. print '</form>';
  218. print '<br>';
  219. print '<table class="noborder centpercent">';
  220. print '<tr class="liste_titre">';
  221. print '<td>'.$langs->trans("TreeMenuPersonalized").'</td>';
  222. print '<td align="right"><div id="iddivjstreecontrol"><a href="#">'.img_picto('','object_category').' '.$langs->trans("UndoExpandAll").'</a>';
  223. print ' | <a href="#">'.img_picto('','object_category-expanded').' '.$langs->trans("ExpandAll").'</a></div></td>';
  224. print '</tr>';
  225. print '<tr>';
  226. print '<td colspan="2">';
  227. // ARBORESCENCE
  228. $rangLast = 0;
  229. $idLast = -1;
  230. if ($conf->use_javascript_ajax)
  231. {
  232. /*-------------------- MAIN -----------------------
  233. tableau des elements de l'arbre:
  234. c'est un tableau a 2 dimensions.
  235. Une ligne represente un element : data[$x]
  236. chaque ligne est decomposee en 3 donnees:
  237. - l'index de l'élément
  238. - l'index de l'élément parent
  239. - la chaine a afficher
  240. ie: data[]= array (index, index parent, chaine )
  241. */
  242. //il faut d'abord declarer un element racine de l'arbre
  243. $data[] = array('rowid'=>0,'fk_menu'=>-1,'title'=>"racine",'mainmenu'=>'','leftmenu'=>'','fk_mainmenu'=>'','fk_leftmenu'=>'');
  244. //puis tous les elements enfants
  245. $sql = "SELECT m.rowid, m.titre, m.langs, m.mainmenu, m.leftmenu, m.fk_menu, m.fk_mainmenu, m.fk_leftmenu, m.module";
  246. $sql.= " FROM ".MAIN_DB_PREFIX."menu as m";
  247. $sql.= " WHERE menu_handler = '".$menu_handler_to_search."'";
  248. $sql.= " AND entity = ".$conf->entity;
  249. //$sql.= " AND fk_menu >= 0";
  250. $sql.= " ORDER BY m.position, m.rowid"; // Order is position then rowid (because we need a sort criteria when position is same)
  251. $res = $db->query($sql);
  252. if ($res)
  253. {
  254. $num = $db->num_rows($res);
  255. $i = 1;
  256. while ($menu = $db->fetch_array($res))
  257. {
  258. if (! empty($menu['langs'])) $langs->load($menu['langs']);
  259. $titre = $langs->trans($menu['titre']);
  260. $data[] = array(
  261. 'rowid'=>$menu['rowid'],
  262. 'module'=>$menu['module'],
  263. 'fk_menu'=>$menu['fk_menu'],
  264. 'title'=>$titre,
  265. 'mainmenu'=>$menu['mainmenu'],
  266. 'leftmenu'=>$menu['leftmenu'],
  267. 'fk_mainmenu'=>$menu['fk_mainmenu'],
  268. 'fk_leftmenu'=>$menu['fk_leftmenu'],
  269. 'entry'=>'<table class="nobordernopadding centpercent"><tr><td>'.
  270. '<strong> &nbsp; <a href="edit.php?menu_handler='.$menu_handler_to_search.'&action=edit&menuId='.$menu['rowid'].'">'.$titre.'</a></strong>'.
  271. '</td><td align="right">'.
  272. '<a href="edit.php?menu_handler='.$menu_handler_to_search.'&action=edit&menuId='.$menu['rowid'].'">'.img_edit('default',0,'class="menuEdit" id="edit'.$menu['rowid'].'"').'</a> '.
  273. '<a href="edit.php?menu_handler='.$menu_handler_to_search.'&action=create&menuId='.$menu['rowid'].'">'.img_edit_add('default').'</a> '.
  274. '<a href="index.php?menu_handler='.$menu_handler_to_search.'&action=delete&menuId='.$menu['rowid'].'">'.img_delete('default').'</a> '.
  275. '&nbsp; &nbsp; &nbsp;'.
  276. '<a href="index.php?menu_handler='.$menu_handler_to_search.'&action=up&menuId='.$menu['rowid'].'">'.img_picto("Monter","1uparrow").'</a><a href="index.php?menu_handler='.$menu_handler_to_search.'&action=down&menuId='.$menu['rowid'].'">'.img_picto("Descendre","1downarrow").'</a>'.
  277. '</td></tr></table>'
  278. );
  279. $i++;
  280. }
  281. }
  282. global $tree_recur_alreadyadded; // This var was def into tree_recur
  283. // Appelle de la fonction recursive (ammorce)
  284. // avec recherche depuis la racine.
  285. //var_dump($data);
  286. tree_recur($data, $data[0], 0, 'iddivjstree'); // $data[0] is virtual record 'racine'
  287. print '</td>';
  288. print '</tr>';
  289. print '</table>';
  290. // Process remaining records (records that are not linked to root by any path)
  291. $remainingdata = array();
  292. foreach($data as $datar)
  293. {
  294. if (empty($datar['rowid']) || $tree_recur_alreadyadded[$datar['rowid']]) continue;
  295. $remainingdata[] = $datar;
  296. }
  297. if (count($remainingdata))
  298. {
  299. print '<table class="noborder centpercent">';
  300. print '<tr class="liste_titre">';
  301. print '<td>'.$langs->trans("NotTopTreeMenuPersonalized").'</td>';
  302. print '<td align="right"></td>';
  303. print '</tr>';
  304. print '<tr>';
  305. print '<td colspan="2">';
  306. foreach($remainingdata as $datar)
  307. {
  308. $father = array('rowid'=>$datar['rowid'],'title'=>"???",'mainmenu'=>$datar['fk_mainmenu'],'leftmenu'=>$datar['fk_leftmenu'],'fk_mainmenu'=>'','fk_leftmenu'=>'');
  309. //print 'Start with rowid='.$datar['rowid'].' mainmenu='.$father ['mainmenu'].' leftmenu='.$father ['leftmenu'].'<br>'."\n";
  310. tree_recur($data, $father, 0, 'iddivjstree'.$datar['rowid'], 1, 1);
  311. }
  312. print '</td>';
  313. print '</tr>';
  314. print '</table>';
  315. }
  316. print '</div>';
  317. /*
  318. * Boutons actions
  319. */
  320. print '<div class="tabsAction">';
  321. print '<a class="butAction" href="'.DOL_URL_ROOT.'/admin/menus/edit.php?menuId=0&amp;action=create&amp;menu_handler='.urlencode($menu_handler).'">'.$langs->trans("NewMenu").'</a>';
  322. print '</div>';
  323. }
  324. else
  325. {
  326. $langs->load("errors");
  327. setEventMessages($langs->trans("ErrorFeatureNeedJavascript"), null, 'errors');
  328. }
  329. print '<br>';
  330. llxFooter();
  331. $db->close();