diff --git a/module/tree/model.php b/module/tree/model.php index 112c6d6bcd..44b51a8fa4 100644 --- a/module/tree/model.php +++ b/module/tree/model.php @@ -147,14 +147,10 @@ class treeModel extends model public function getTaskOptionMenu($rootID, $productID = 0, $startModule = 0) { /* If createdVersion <= 4.1, go to getOptionMenu(). */ - $createdVersion = $this->dao->select('openedVersion')->from(TABLE_PROJECT) - ->where('id')->eq($rootID) - ->fetch('openedVersion'); - $products = $this->loadModel('product')->getProductsByProject($rootID); - if(!$createdVersion or version_compare($createdVersion, '4.1', '<=') or !$products) - { - return $this->getOptionMenu($rootID, 'task', $startModule); - } + $createdVersion = $this->dao->select('openedVersion')->from(TABLE_PROJECT)->where('id')->eq($rootID)->fetch('openedVersion'); + $products = $this->loadModel('product')->getProductsByProject($rootID); + + if(!$createdVersion or version_compare($createdVersion, '4.1', '<=') or !$products) return $this->getOptionMenu($rootID, 'task', $startModule); /* createdVersion > 4.1. */ $startModulePath = ''; @@ -171,61 +167,80 @@ class treeModel extends model } $treeMenu = array(); $lastMenu[] = '/'; - $projectModules = $this->getTaskTreeModules($rootID, false, false); - foreach($products as $id => $product) - { - $modules = $this->dao->select('*')->from(TABLE_MODULE) - ->where("((root = $rootID and type = 'task') OR (root = $id and type = 'story'))") - ->beginIF($startModulePath)->andWhere('path')->like($startModulePath)->fi() - ->orderBy('grade desc, type, `order`') - ->fetchAll('id'); - foreach($modules as $module) - { - $parentModules = explode(',', $module->path); - $moduleName = '/' . $product; - foreach($parentModules as $parentModuleID) - { - if(empty($parentModuleID) or !isset($modules[$parentModuleID])) continue; - $moduleName .= '/' . $modules[$parentModuleID]->name; - } - $moduleName = rtrim($moduleName, '/'); - $moduleName .= "|$module->id\n"; + $projectModules = $this->getTaskTreeModules($rootID, false, false); + $noProductModules = $this->dao->select('*')->from(TABLE_MODULE)->where("root = $rootID and type = 'task' and parent = 0")->fetchPairs('id', 'name'); - if(isset($treeMenu[$module->id]) and !empty($treeMenu[$module->id])) + foreach(array('product' => $products, 'noProduct' => $noProductModules) as $type => $rootModules) + { + foreach($rootModules as $id => $rootModule) + { + if($type == 'product') { - if(isset($treeMenu[$module->parent])) - { - $treeMenu[$module->parent] .= $moduleName; - } - else - { - $treeMenu[$module->parent] = $moduleName;; - } - $treeMenu[$module->parent] .= $treeMenu[$module->id]; + $modules = $this->dao->select('*')->from(TABLE_MODULE) + ->where("((root = $rootID and type = 'task') OR (root = $id and type = 'story'))") + ->beginIF($startModulePath)->andWhere('path')->like($startModulePath)->fi() + ->orderBy('grade desc, type, `order`') + ->fetchAll('id'); } else { - if(isset($treeMenu[$module->parent]) and !empty($treeMenu[$module->parent])) + $modules = $this->dao->select('*')->from(TABLE_MODULE) + ->where("root = $rootID and type = 'task' and path like '%,$id,%'") + ->beginIF($startModulePath)->andWhere('path')->like($startModulePath)->fi() + ->orderBy('grade desc, type, `order`') + ->fetchAll('id'); + } + + foreach($modules as $module) + { + $parentModules = explode(',', trim($module->path, ',')); + if($type == 'product' and isset($noProductModules[$parentModules[0]])) continue; + + $moduleName = $type == 'product' ? '/' . $rootModule : ''; + foreach($parentModules as $parentModuleID) { - $treeMenu[$module->parent] .= $moduleName; + if(empty($parentModuleID) or !isset($modules[$parentModuleID])) continue; + $moduleName .= '/' . $modules[$parentModuleID]->name; + } + $moduleName = rtrim($moduleName, '/'); + $moduleName .= "|$module->id\n"; + + if(isset($treeMenu[$module->id]) and !empty($treeMenu[$module->id])) + { + if(isset($treeMenu[$module->parent])) + { + $treeMenu[$module->parent] .= $moduleName; + } + else + { + $treeMenu[$module->parent] = $moduleName;; + } + $treeMenu[$module->parent] .= $treeMenu[$module->id]; } else { - $treeMenu[$module->parent] = $moduleName; - } + if(isset($treeMenu[$module->parent]) and !empty($treeMenu[$module->parent])) + { + $treeMenu[$module->parent] .= $moduleName; + } + else + { + $treeMenu[$module->parent] = $moduleName; + } + } + } + $topMenu = @array_pop($treeMenu); + $topMenu = explode("\n", trim($topMenu)); + foreach($topMenu as $menu) + { + if(!strpos($menu, '|')) continue; + list($label, $moduleID) = explode('|', $menu); + if(isset($projectModules[$moduleID])) $lastMenu[$moduleID] = $label; + } + foreach($topMenu as $moduleID => $moduleName) + { + if(!isset($projectModules[$moduleID])) unset($treeMenu[$moduleID]); } - } - $topMenu = @array_pop($treeMenu); - $topMenu = explode("\n", trim($topMenu)); - foreach($topMenu as $menu) - { - if(!strpos($menu, '|')) continue; - list($label, $moduleID) = explode('|', $menu); - if(isset($projectModules[$moduleID])) $lastMenu[$moduleID] = $label; - } - foreach($topMenu as $moduleID => $moduleName) - { - if(!isset($projectModules[$moduleID])) unset($treeMenu[$moduleID]); } } return $lastMenu;