* @package branch * @version $Id$ * @link http://www.zentao.net */ class branch extends control { /** * Manage branch. * * @param int $productID * @param string $browseType * @param string $orderBy * @param int $recTotal * @param int $recPerPage * @param int $pageID * @access public * @return void */ public function manage($productID, $browseType = 'active', $orderBy = 'order', $recTotal = 0, $recPerPage = 20, $pageID = 1) { $this->loadModel('product')->setMenu($productID); $this->session->set('branchManage', $this->app->getURI(true), 'product'); $this->branch->changeBranchLanguage($productID); $branchList = $this->branch->getList($productID, 0, $browseType, $orderBy); /* Load pager. */ $this->app->loadClass('pager', $static = true); if($this->app->getViewType() == 'mhtml') $recPerPage = 10; $recTotal = count($branchList); $pager = new pager($recTotal, $recPerPage, $pageID); $branchList = array_chunk($branchList, $pager->recPerPage); $this->view->title = $this->lang->branch->manage; $this->view->branchList = empty($branchList) ? $branchList : $branchList[$pageID - 1]; $this->view->productID = $productID; $this->view->browseType = $browseType; $this->view->orderBy = $orderBy; $this->view->pager = $pager; $this->view->product = $this->product->getById($productID); $this->view->branchPairs = $this->branch->getPairs($productID, 'active'); $this->display(); } /** * Create a branch. * * @param int $productID * @access public * @return void */ public function create($productID) { if($_POST) { $branchID = $this->branch->create($productID); if(dao::isError()) die(js::error(dao::getError())); $this->loadModel('action')->create('branch', $branchID, 'Opened'); die(js::reload('parent.parent')); } $this->view->product = $this->loadModel('product')->getById($productID); $this->display(); } /** * Edit a branch. * * @param int $branchID * @access public * @return void */ public function edit($branchID, $productID) { if($_POST) { $changes = $this->branch->update($branchID); if(dao::isError()) die(js::error(dao::getError())); if($changes) $this->loadModel('action')->create('branch', $branchID, 'Edited'); die(js::reload('parent.parent')); } $this->view->product = $this->loadModel('product')->getById($productID); $this->view->branch = $this->branch->getById($branchID, 0, ''); $this->display(); } /** * Batch edit branch. * * @param int $productID * @access public * @return void */ public function batchEdit($productID) { $this->loadModel('action'); $this->loadModel('product')->setMenu($productID); if($this->post->IDList) { $changes = $this->branch->batchUpdate($productID); foreach($changes as $branchID => $change) { $extra = $branchID == BRANCH_MAIN ? $productID : ''; if($change) $this->action->create('branch', $branchID, 'Edited', '', $extra); } die(js::locate($this->session->branchManage, 'parent')); } $branchList = $this->branch->getList($productID, 0, 'all'); $branchIDList = $this->post->branchIDList; if(empty($branchIDList)) die(js::locate($this->session->branchManage, 'parent')); foreach($branchList as $branch) { if(!in_array($branch->id, $branchIDList)) unset($branchList[$branch->id]); } $this->view->product = $this->product->getById($productID); $this->view->branchList = $branchList; $this->display(); } /** * Close a branch. * * @param int $branchID * @param string $confirm * @access public * @return void */ public function close($branchID, $confirm = 'no') { $this->app->loadLang('product'); $productType = $this->branch->getProductType($branchID); if($confirm == 'no') { die(js::confirm(str_replace('@branch@', $this->lang->product->branchName[$productType], $this->lang->branch->confirmClose), inlink('close', "branchID=$branchID&confirm=yes"))); } $this->branch->close($branchID); if(dao::isError()) die(js::error(dao::getError())); $this->loadModel('action')->create('branch', $branchID, 'Closed'); die(js::reload('parent')); } /** * Activate a branch. * * @param int $branchID * @param string $confirm * @access public * @return void */ public function activate($branchID, $confirm = 'no') { $this->app->loadLang('product'); $productType = $this->branch->getProductType($branchID); if($confirm == 'no') { die(js::confirm(str_replace('@branch@', $this->lang->product->branchName[$productType], $this->lang->branch->confirmActivate), inlink('activate', "branchID=$branchID&confirm=yes"))); } $this->branch->activate($branchID); if(dao::isError()) die(js::error(dao::getError())); $this->loadModel('action')->create('branch', $branchID, 'Activated'); die(js::reload('parent')); } /** * Sort branch. * * @access public * @return void */ public function sort() { $this->branch->sort(); } /** * Ajax get drop menu. * * @param int $productID * @param int $branch * @param string $module * @param string $method * @param string $extra * @access public * @return void */ public function ajaxGetDropMenu($productID, $branch, $module, $method, $extra = '') { parse_str($extra, $output); $branches = $this->branch->getPairs($productID, 'all', isset($output['projectID']) ? $output['projectID'] : 0); $statusList = $this->dao->select('id,status')->from(TABLE_BRANCH)->where('product')->eq($productID)->fetchPairs(); $this->view->link = $this->loadModel('product')->getProductLink($module, $method, $extra, true); $this->view->productID = $productID; $this->view->projectID = $this->session->project; $this->view->module = $module; $this->view->method = $method; $this->view->extra = $extra; $this->view->branches = $branches; $this->view->currentBranchID = $branch; $this->view->branchesPinyin = common::convert2Pinyin($branches); $this->view->statusList = $statusList; $this->display(); } /** * Delete branch * * @param int $branchID * @param string $confirm * @access public * @return void */ public function delete($branchID, $confirm = 'no') { $this->app->loadLang('product'); $productType = $this->branch->getProductType($branchID); if(!$this->branch->checkBranchData($branchID)) die(js::alert(str_replace('@branch@', $this->lang->product->branchName[$productType], $this->lang->branch->canNotDelete))); if($confirm == 'no') { die(js::confirm(str_replace('@branch@', $this->lang->product->branchName[$productType], $this->lang->branch->confirmDelete), inlink('delete', "branchID=$branchID&confirm=yes"))); } $this->branch->delete(TABLE_BRANCH, $branchID); die(js::reload('parent')); } /** * Ajax get branches. * * @param int $productID * @param int $oldBranch * @param string $param * @param int $projectID * @access public * @return void */ public function ajaxGetBranches($productID, $oldBranch = 0, $param = '', $projectID = 0) { $param = $param ? $param : 'all'; $product = $this->loadModel('product')->getById($productID); if(empty($product) or $product->type == 'normal') die(); $branches = $this->loadModel('branch')->getList($productID, $projectID, $param); $branchOption = array(); $branchTagOption = array(); foreach($branches as $branchInfo) { $branchOption[$branchInfo->id] = $branchInfo->name; $branchTagOption[$branchInfo->id] = $branchInfo->name . ($branchInfo->status == 'closed' ? ' (' . $this->lang->branch->statusList['closed'] . ')' : ''); } die(html::select('branch', strpos($param, 'active') !== false ? $branchOption : $branchTagOption, $oldBranch, "class='form-control' onchange='loadBranch(this)'")); } /** * Set default branch. * * @param int $productID * @param int $branchID * @param string $confirm yes|no * @access public * @return void */ public function setDefault($productID, $branchID, $confirm = 'no') { if($confirm == 'no') { $this->app->loadLang('product'); $productType = $this->dao->findById($productID)->from(TABLE_PRODUCT)->fetch('type'); die(js::confirm(str_replace('@branch@', $this->lang->product->branchName[$productType], $this->lang->branch->confirmSetDefault), inlink('setDefault', "productID=$productID&branchID=$branchID&confirm=yes"))); } $this->branch->setDefault($productID, $branchID); $this->loadModel('action')->create('branch', $branchID, 'SetDefaultBranch', '', $productID); die(js::reload('parent')); } /** * Merge multiple branches into one branch. * * @param int $productID * @access public * @return object */ public function mergeBranch($productID) { /* Filter out the main branch and target branch. */ $mergedBranches = array_filter($_POST['mergedBranchIDList'], function($branch) { $mergeToBranch = $_POST['createBranch'] ? '' : $_POST['targetBranch']; return $branch != 0 and $branch != $mergeToBranch; }); $mergedBranchIDList = implode(',', $mergedBranches); $mergedBranches = $this->dao->select('id,name')->from(TABLE_BRANCH)->where('id')->in($mergedBranchIDList)->fetchPairs(); $targetBranch = $this->branch->mergeBranch($productID, $mergedBranchIDList); $this->loadModel('action')->create('branch', $targetBranch, 'MergedBranch', '', implode(',', $mergedBranches)); if(dao::isError()) return $this->send(array('message' => dao::getError(), 'result' => 'fail')); return $this->send(array('message' => $this->lang->saveSuccess, 'result' => 'success')); } /** * AJAX: Get target branches for merge branch. * * @param int $productID * @param string $mergedBranches * @access public * @return string */ public function ajaxGetTargetBranches($productID, $mergedBranches = '') { $branchPairs = $this->branch->getPairs($productID, 'active', 0, $mergedBranches); return print(html::select('targetBranch', $branchPairs, '', "class='form-control chosen'")); } }