* @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); 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"; 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)); while($module = $stmt->fetch()) { $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 = "