* @package tree * @version $Id: model.php 5149 2013-07-16 01:47:01Z zhujinyonging@gmail.com $ * @link http://www.zentao.net */ ?> dao->findById((int)$moduleID)->from(TABLE_MODULE)->fetch(); } /** * Build the sql query. * * @param int $rootID * @param string $type * @param int $startModule * @access public * @return void */ public function buildMenuQuery($rootID, $type, $startModule) { /* Set the start module. */ $startModulePath = ''; if($startModule > 0) { $startModule = $this->getById($startModule); if($startModule) $startModulePath = $startModule->path . '%'; } if($type == 'bug' or $type == 'case') { /* Get createdVersion. */ $createdVersion = $this->dao->select('createdVersion')->from(TABLE_PRODUCT) ->where('id')->eq($rootID) ->fetch('createdVersion'); if($createdVersion and version_compare($createdVersion, '4.1', '>')) { return $this->dao->select('*')->from(TABLE_MODULE) ->where('root')->eq((int)$rootID) ->andWhere('type')->in("story,$type") ->beginIF($startModulePath)->andWhere('path')->like($startModulePath)->fi() ->orderBy('grade desc, type desc, `order`') ->get(); } } /* $createdVersion < 4.1 or $type == 'story','task'. */ return $this->dao->select('*')->from(TABLE_MODULE) ->where('root')->eq((int)$rootID) ->andWhere('type')->eq($type) ->beginIF($startModulePath)->andWhere('path')->like($startModulePath)->fi() ->orderBy('grade desc, `order`') ->get(); } /** * Create an option menu in html. * * @param int $rootID * @param string $type * @param int $startModule * @access public * @return string */ public function getOptionMenu($rootID, $type = 'story', $startModule = 0) { $treeMenu = array(); $stmt = $this->dbh->query($this->buildMenuQuery($rootID, $type, $startModule)); $modules = array(); while($module = $stmt->fetch()) $modules[$module->id] = $module; foreach($modules as $module) { $parentModules = explode(',', $module->path); $moduleName = '/'; foreach($parentModules as $parentModuleID) { if(empty($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 { 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)); $lastMenu[] = '/'; foreach($topMenu as $menu) { if(!strpos($menu, '|')) continue; list($label, $moduleID) = explode('|', $menu); $lastMenu[$moduleID] = $label; } return $lastMenu; } /** * Create an option menu of task in html. * * @param int $rootID * @param int $startModule * @access public * @return void */ 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 > 4.1. */ $startModulePath = ''; if($startModule > 0) { $startModule = $this->getById($startModule); if($startModule) { $startModulePath = $startModule->path . '%'; $modulePaths = explode(",", $startModulePath); $rootModule = $this->getById($modulePaths[0]); $productID = $rootModule->root; } } $treeMenu = array(); $lastMenu[] = '/'; $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'); foreach(array('product' => $products, 'noProduct' => $noProductModules) as $type => $rootModules) { foreach($rootModules as $id => $rootModule) { if($type == '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'); } else { $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) { 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 { 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]); } } } return $lastMenu; } /** * Get the tree menu in html. * * @param int $rootID * @param string $type * @param int $startModule * @param string $userFunc the function used to create link * @param string $extra extra params * @access public * @return string */ public function getTreeMenu($rootID, $type = 'root', $startModule = 0, $userFunc, $extra = '') { $treeMenu = array(); $stmt = $this->dbh->query($this->buildMenuQuery($rootID, $type, $startModule)); /* Add for task #1945. check the module has case or no. */ if($type == 'case' and !empty($extra)) $this->loadModel('testtask'); while($module = $stmt->fetch()) { /* Add for task #1945. check the module has case or no. */ if($type == 'case' and !empty($extra)) { $modules = $this->getAllChildID($module->id); $runs = $this->testtask->getRuns($extra, $modules, 'id'); if(empty($runs)) continue; } $linkHtml = call_user_func($userFunc, $type, $module, $extra); if(isset($treeMenu[$module->id]) and !empty($treeMenu[$module->id])) { if(!isset($treeMenu[$module->parent])) $treeMenu[$module->parent] = ''; $treeMenu[$module->parent] .= "
  • $linkHtml"; $treeMenu[$module->parent] .= "\n"; } else { if(isset($treeMenu[$module->parent]) and !empty($treeMenu[$module->parent])) { $treeMenu[$module->parent] .= "
  • $linkHtml\n"; } else { $treeMenu[$module->parent] = "
  • $linkHtml\n"; } } $treeMenu[$module->parent] .= "
  • \n"; } $lastMenu = "\n"; return $lastMenu; } /** * Get the tree menu of task in html. * * @param int $rootID * @param int $productID * @param int $startModule * @param int $userFunc * @param string $extra * @access public * @return void */ public function getTaskTreeMenu($rootID, $productID = 0, $startModule = 0, $userFunc, $extra = '') { $extra = array('projectID' => $rootID, 'productID' => $productID, 'tip' => true); /* If createdVersion <= 4.1, go to getTreeMenu(). */ $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) { $extra['tip'] = false; return $this->getTreeMenu($rootID, 'task', $startModule, $userFunc, $extra); } /* createdVersion > 4.1. */ $menu = "