PageRenderTime 26ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/ww.incs/menus.php

http://webworks-webme.googlecode.com/
PHP | 227 lines | 223 code | 0 blank | 4 comment | 51 complexity | 6b841308aac19fd5a58ffb8f0b22ccbd MD5 | raw file
Possible License(s): Apache-2.0, LGPL-2.1, BSD-3-Clause, BSD-2-Clause
  1. <?php
  2. function Menu_containsPage($needle, $haystack) {
  3. $r=Page::getInstance($needle);
  4. if (!isset($r->parent) || $r->parent==0) {
  5. return 0;
  6. }
  7. if ($r->parent==$haystack) {
  8. return 1;
  9. }
  10. return Menu_containsPage($r->parent, $haystack);
  11. }
  12. function Menu_getChildren(
  13. $parentid,
  14. $currentpage=0,
  15. $isadmin=0,
  16. $topParent=0,
  17. $search_options=0
  18. ) {
  19. $md5=md5(
  20. $parentid.'|'.$currentpage.'|'.$isadmin.'|'.$topParent.'|'.$search_options
  21. );
  22. $cache=cache_load('menus', $md5);
  23. if ($cache) {
  24. return $cache;
  25. }
  26. $pageParentFound=0;
  27. $PARENTDATA=Page::getInstance($parentid);
  28. $PARENTDATA->initValues();
  29. $filter=$isadmin?'':'&& !(special&2)';
  30. // { menu order
  31. $order='ord,name';
  32. if (isset($PARENTDATA->vars['order_of_sub_pages'])) {
  33. switch($PARENTDATA->vars['order_of_sub_pages']) {
  34. case 1: // { alphabetical
  35. $order='name';
  36. if ($PARENTDATA->vars['order_of_sub_pages_dir']) {
  37. $order.=' desc';
  38. }
  39. break; // }
  40. case 2: // { associated_date
  41. $order='associated_date';
  42. if ($PARENTDATA->vars['order_of_sub_pages_dir']) {
  43. $order.=' desc';
  44. }
  45. $order.=',name';
  46. break; // }
  47. default: // { by admin order
  48. $order='ord';
  49. if ($PARENTDATA->vars['order_of_sub_pages_dir']) {
  50. $order.=' desc';
  51. }
  52. $order.=',name'; // }
  53. }
  54. }
  55. // }
  56. $rs=dbAll(
  57. 'select id as subid,id,name,type,(select count(id) from pages where '
  58. ."parent=subid $filter) as numchildren from pages where parent='"
  59. .$parentid."' $filter order by $order"
  60. );
  61. $menuitems=array();
  62. // { optimise db retrieval of pages
  63. $ids=array();
  64. foreach ($rs as $r) {
  65. if (!isset(Page::$instances[$r['id']])) {
  66. $ids[]=$r['id'];
  67. }
  68. }
  69. Pages::precache($ids);
  70. // }
  71. $i=0;
  72. foreach ($rs as $k=>$r) {
  73. $PAGEDATA=Page::getInstance($r['id']);
  74. if (isset($PAGEDATA->banned) && $PAGEDATA->banned) {
  75. continue;
  76. }
  77. $c=array();
  78. $c[]=($parentid==$topParent)?'menuItemTop':'menuItem';
  79. if (!$i++) {
  80. $c[]='first';
  81. }
  82. if ($r['numchildren']) {
  83. $c[]='ajaxmenu_hasChildren';
  84. }
  85. if ($r['id']==$currentpage) {
  86. $c[]='ajaxmenu_currentPage';
  87. $pageParentFound=1;
  88. }
  89. else {
  90. if ($r['numchildren']
  91. &&!$pageParentFound
  92. &&Menu_containsPage($currentpage, $r['id'])
  93. ) {
  94. $c[]='ajaxmenu_containsCurrentPage';
  95. $pageParentFound=1;
  96. }
  97. }
  98. $rs[$k]['classes']=join(' ', $c);
  99. $rs[$k]['link']=$PAGEDATA->getRelativeURL();
  100. $rs[$k]['name']=$PAGEDATA->name;
  101. $rs[$k]['parent']=$parentid;
  102. $menuitems[]=$rs[$k];
  103. }
  104. cache_save('menus', $md5, $menuitems);
  105. return $menuitems;
  106. }
  107. function Menu_show($b) {
  108. global $PAGEDATA;
  109. if (!$PAGEDATA->id) {
  110. return '';
  111. }
  112. $md5=md5('ww_menudisplay|'.print_r($b, true));
  113. $cache=cache_load('menus', $md5);
  114. if ($cache) {
  115. return $cache;
  116. }
  117. if (is_array($b)) {
  118. $align=(isset($b['direction']) && $b['direction']=='vertical')?'Left':'Top';
  119. $vals=$b;
  120. }
  121. else{
  122. $arr=explode('|', $b);
  123. $b=$arr[0];
  124. $vals=array();
  125. if (count($arr)>1) {
  126. $d=split(',', $arr[1]);
  127. }
  128. else {
  129. $d=array();
  130. }
  131. foreach ($d as $e) {
  132. $f=split('=', $e);
  133. if (count($f)>1) {
  134. $vals[$f[0]]=$f[1];
  135. }
  136. else {
  137. $vals[$f[0]]=1;
  138. }
  139. }
  140. $c='';
  141. $align=($b=='vertical')?'Left':'Top';
  142. }
  143. $parent=0;
  144. $classes='';
  145. if (isset($vals['mode'])) {
  146. if ($vals['mode']=='accordian' || $vals['mode']=='accordion') {
  147. $classes.=' click_required accordion';
  148. }
  149. else if ($vals['mode']=='two-tier') {
  150. $classes.=' two-tier';
  151. }
  152. }
  153. else {
  154. $vals['mode']='default';
  155. }
  156. if (isset($vals['preopen_menu'])) {
  157. $classes.=' preopen_menu';
  158. }
  159. if (isset($vals['close']) && $vals['close']=='no') {
  160. $classes.=' noclose';
  161. }
  162. if (isset($vals['parent'])) {
  163. $r=Page::getInstanceByName($vals['parent']);
  164. if ($r) {
  165. $parent=$r->id;
  166. }
  167. }
  168. if (isset($vals['spans'])) {
  169. $vals['spans']=(int)$vals['spans'];
  170. }
  171. else {
  172. $vals['spans']=1;
  173. }
  174. $search_options=0;
  175. $ajaxmenu=$vals['nodropdowns']?'':' ajaxmenu ';
  176. $c='<div id="ajaxmenu'.$parent.'" class="menuBar'.$align.$ajaxmenu
  177. .$classes.' parent'.$parent.'">';
  178. $rs=Menu_getChildren($parent, $PAGEDATA->id, 0, $parent, $search_options);
  179. $links=0;
  180. if ($vals['spans']) {
  181. $spanl='<span class="l"></span>';
  182. $spanr='<span class="r"></span>';
  183. }
  184. else {
  185. $spanl='';
  186. $spanr='';
  187. }
  188. if (count($rs)) {
  189. foreach ($rs as $r) {
  190. $page=Page::getInstance($r['id']);
  191. if (!$links) {
  192. $r['classes'].=' first';
  193. }
  194. $c.='<a id="ajaxmenu_link'.$r['id'].'" class="'.$r['classes'].'" href="'
  195. .$page->getRelativeURL().'">'.$spanl.htmlspecialchars($page->name)
  196. .$spanr.'</a>';
  197. $links++;
  198. }
  199. }
  200. if (!@$GLOBALS['DBVARS']['disable-hidden-sitemap']) {
  201. $c.='<a class="menuItemTop nojs" href="'.$PAGEDATA->getRelativeURL()
  202. .'?webmespecial=sitemap">'.__('Site Map').'</a>';
  203. }
  204. $c.='</div>';
  205. if ($vals['mode']=='two-tier') {
  206. $pid=$PAGEDATA->getTopParentId();
  207. if ($pid!=2 && $pid!=3 && $pid!=17 && $pid!=32 && $pid!=33 && $pid!=34) {
  208. $pid=2;
  209. }
  210. $rs=Menu_getChildren($pid, $PAGEDATA->id, 0, $parent, $search_options);
  211. $c.='<div id="ajaxmenu'.$pid.'" class="menu tier-two">';
  212. if (count($rs)) {
  213. foreach ($rs as $r) {
  214. $page=Page::getInstance($r['id']);
  215. $c.='<a id="ajaxmenu_link'.$r['id'].'" class="'.$r['classes']
  216. .'" href="'.$page->getRelativeURL().'">'.$spanl
  217. .htmlspecialchars($page->name).$spanr.'</a>';
  218. }
  219. }
  220. else {
  221. $c.='<a><span class="l"></span>&nbsp;<span class="r"></span></a>';
  222. }
  223. $c.='</div>';
  224. }
  225. cache_save('menus', $md5, $c);
  226. return $c;
  227. }