Всякий раз, когда я отображаю элемент меню, для каждого элемента меню, найденного в базе данных, я использую его для проверки его подменю.
Мой контроллер, отображающий пункт меню и рекурсивную функцию для обнаружения его подменю, выглядит следующим образом
public function renderAction()
{
$menu = $this -> _request -> getParam('menu');
$itemArray = $this -> getSubItems($menu);
$container = new Zend_Navigation($itemArray);
$this -> view -> navigation() -> setContainer($container);
}
private function getSubItems($menu, $parent = 0) {
$mapperMenuItem = new Apanel_Model_Mapper_MenuItem();
$menuItems = $mapperMenuItem -> getItemsByMenu($menu, $parent);
if(count($menuItems) > 0) {
$itemArray = array();
foreach($menuItems as $item) {
$label = $item -> label;
$uri = $this -> getSubItemUrl($item);
$subItems = $this -> getSubItems($menu, $item -> id);
if(count($subItems)) {
$tArray['pages'] = $subItems;
}
$tArray['label'] = $label;
$tArray['uri'] = $uri;
$itemArray[] = $tArray;
unset($tArray);
}
if(count($itemArray)) {
return $itemArray;
} else {
return null;
}
} else {
return null;
}
}
private function getSubItemUrl($item) {
if(!empty($item -> link)) {
$uri = $item -> link;
} else {
$pageMapper = new Apanel_Model_Mapper_Page();
$details = $pageMapper -> getPageDetails($item -> page_id);
$pageClass = "CMS_Content_Item_".ucwords($details['namespace']);
$page = new $pageClass($item -> page_id);
$title = str_replace(" ", "-", strtolower($details['name']));
$uri = $this -> view -> url(array(
"namespace" => $details['namespace'],
"title" => $title
),'page-view');
}
return $uri;
}
И функция getItemsByMenu в MenuItem Mapper
public function getItemsByMenu($menuId, $parent = 0) {
$select = $this -> getDbTable() -> select();
$select -> where("menu_id = ?", $menuId)
-> where("parent = ?", $parent)
-> order("position");
$items = $this -> getDbTable() -> fetchAll($select);
if($items -> count() > 0) {
return $items;
} else {
return null;
}
}
В моем приложении отображается около 4 различных типов меню, и я замечаю значительное снижение производительности при выполнении. Я часто получаю тайм-ауты выполнения, разница между временем рендеринга с меню составляет около 35 секунд, а без - около 22 секунд. И это все в localhost. Есть ли недостаток в моей рекурсии? Какие меры я могу предпринять для улучшения производительности кода?