PageRenderTime 43ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/public/codeCore/Classes/php/Menu.php

https://github.com/IAmCorbin/MooKit
PHP | 153 lines | 106 code | 1 blank | 46 comment | 11 complexity | 8af7544b88250c7d57023f4efa13a173 MD5 | raw file
Possible License(s): GPL-3.0
  1. <?php
  2. /**
  3. * contains Menu Class
  4. * @package MooKit
  5. */
  6. /**
  7. * A Class for creating a Menu
  8. *
  9. * Creates an array of link objects with optional sublink objects
  10. *
  11. * @author Corbin Tarrant
  12. * @birth March 30th, 2010
  13. * @package MooKit
  14. */
  15. class Menu {
  16. /** @var array $links an array of Link objects */
  17. var $links;
  18. /**
  19. * Constructor
  20. *
  21. * @param string $path
  22. */
  23. public function __construct($links=NULL) {
  24. if($links)
  25. $this->links = $links;
  26. else
  27. $this->links = array();
  28. }
  29. /**
  30. * Create a new Link
  31. * @param array $userInput array containing keys { name, href, desc, weight, ajaxLink, menuLink, access_level }
  32. * @param array $sublinks optional array of sublinks
  33. */
  34. public function add($userInput, $sublinks=NULL) {
  35. array_push($this->links,new Link($userInput,$sublinks));
  36. }
  37. /**
  38. * Add a new SubLink to the last created Link
  39. * @param array $userInput array containing keys { name, href, desc, weight, ajaxLink, menuLink, access_level }
  40. * @param array $sublinks optional array of sublinks
  41. */
  42. public function addSub($userInput, $sublinks=NULL) {
  43. $this->links[sizeof($this->links)-1]->addSub($userInput, $sublinks);
  44. }
  45. /**
  46. * Sort all the links and sublinks by weight
  47. */
  48. public function sortWeight() {
  49. //used to frag another sort check when links are swapped
  50. $SORTEDLINKS = FALSE;
  51. while(!$SORTEDLINKS) {
  52. $SORTEDLINKS = TRUE;
  53. //sort links
  54. $numLinks = sizeof($this->links)-1;
  55. for($x=0; $x<$numLinks; $x++) {
  56. //sort links
  57. if( (int)$this->links[$x]->weight > (int)$this->links[$x+1]->weight ) {
  58. list($this->links[$x+1],$this->links[$x]) = array($this->links[$x],$this->links[$x+1]);
  59. $SORTEDLINKS = FALSE;
  60. }
  61. }
  62. }
  63. //used to flag another sort check when sublinks are swapped
  64. $SORTEDSUBLINKS = FALSE;
  65. while(!$SORTEDSUBLINKS) {
  66. $SORTEDSUBLINKS = TRUE;
  67. //sort sublinks
  68. for($x=0; $x<$numLinks; $x++) {
  69. $numSublinks = sizeof($this->links[$x]->sublinks)-1;
  70. for($y = 0; $y < $numSublinks; $y++) {
  71. //compare sublink weight with next weight and swap if needed
  72. if( (int)$this->links[$x]->sublinks[$y]->weight > (int)$this->links[$x]->sublinks[$y+1]->weight ) {
  73. list($this->links[$x]->sublinks[$y+1],$this->links[$x]->sublinks[$y]) = array($this->links[$x]->sublinks[$y],$this->links[$x]->sublinks[$y+1]);
  74. $SORTEDSUBLINKS = FALSE;
  75. }
  76. }
  77. }
  78. }
  79. }
  80. /**
  81. * Output all the links and sublinks in formatted html
  82. * @param string $linkContainer must be a valid html element, these will hold the links
  83. * @param string $sublinkContainer must be a valid html element, these will hold the sublinks
  84. * @param string $linkClass CSS class for links
  85. * @param string $sublinkClass CSS class for sublinks
  86. * @param string $ajaxLinkClass CSS class for ajaxlinks
  87. */
  88. public function output($linkContainer="div",$sublinkContainer="span",$linkClass='link',$sublinkClass="sublink",$ajaxLinkClass='ajaxLink') {
  89. foreach($this->links as $link): ?>
  90. <? echo "<".$linkContainer." class=".$linkClass.">"; ?>
  91. <? echo '<a '; if($link->ajaxLink) { echo 'class="'.$ajaxLinkClass; } ?> <? echo " target=\"_blank\" href=\"$link->href\">$link->name</a>"; ?>
  92. <? if(isset($link->desc) && $link->desc!='') echo "<span class=\"linkDesc\">$link->desc</span>";
  93. if(isset($link->sublinks)) { ?>
  94. <? foreach($link->sublinks as $sublink): /* <!-- Optional Sublinks --> */ ?>
  95. <? echo "<$sublinkContainer class=\"$sublinkClass\">"; ?>
  96. <? echo '<a '; if($sublink->ajaxLink) { echo 'class="'.$ajaxLinkClass; } ?> <? echo "\" target=\"_blank\" href=\"$sublink->href\">$sublink->name</a>"; ?>
  97. <? if(isset($sublink->desc) && $sublink->desc!='') echo "<span class=\"linkDesc\">$sublink->desc</span>"; ?>
  98. <? echo "</".$sublinkContainer.">"; ?>
  99. <? endforeach;//$links->sublinks' ?>
  100. <? } ?>
  101. <? echo "</".$linkContainer.">"; ?>
  102. <? endforeach; //$links->links
  103. }
  104. /** Create the main menu from database tables using the user's access_level */
  105. public static function buildMain() {
  106. //grab links for current security clearance
  107. $menuLinks = Link::get('',TRUE,"object",false,Security::clearance());
  108. //create Menu object
  109. $mainMenu = new Menu;
  110. //store last link id to determine if this is a sublink row
  111. $lastLink_id = null;
  112. foreach($menuLinks as $link) {
  113. //avoid double display of links
  114. if($link->link_id != $lastLink_id) {
  115. //add this link to the menu
  116. $mainMenu->add(array('name'=>$link->name,
  117. 'href'=>$link->href,
  118. 'desc'=>$link->desc,
  119. 'weight'=>$link->weight,
  120. 'ajaxLink'=>$link->ajaxLink,
  121. 'menuLink'=>$link->menuLink,
  122. 'access_level'=>$link->access_level));
  123. //add first sublink - need this because the first sublink is stored on the row of the link itself
  124. if($link->sublink_id) {
  125. //add first sublink
  126. $mainMenu->addSub(array('name'=>$link->sub_name,
  127. 'href'=>$link->sub_href,
  128. 'desc'=>$link->sub_desc,
  129. 'weight'=>$link->sub_weight,
  130. 'ajaxLink'=>$link->sub_ajaxLink,
  131. 'menuLink'=>$link->sub_menuLink,
  132. 'access_level'=>$link->sub_access_level));
  133. }
  134. } else {
  135. //add subsequent sublink
  136. $mainMenu->addSub(array('name'=>$link->sub_name,
  137. 'href'=>$link->sub_href,
  138. 'desc'=>$link->sub_desc,
  139. 'weight'=>$link->sub_weight,
  140. 'ajaxLink'=>$link->sub_ajaxLink,
  141. 'menuLink'=>$link->sub_menuLink,
  142. 'access_level'=>$link->sub_access_level));
  143. }
  144. $lastLink_id = $link->link_id;
  145. }
  146. //sort weight and then return sorted menu
  147. $mainMenu->sortWeight();
  148. return $mainMenu;
  149. }
  150. }
  151. ?>