From 3910229e1d6fac432d0e6012dd27e6541aff63b8 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Mon, 26 Nov 2012 05:34:50 +0000 Subject: [PATCH] * finish task #901. --- module/product/model.php | 53 ++++++++++++++++++++++++---------------- module/search/model.php | 21 +++++++++++++--- 2 files changed, 49 insertions(+), 25 deletions(-) diff --git a/module/product/model.php b/module/product/model.php index fdcf55d2bd..f7336f2612 100644 --- a/module/product/model.php +++ b/module/product/model.php @@ -74,7 +74,6 @@ class productModel extends model $productGroup[$this->lang->product->statusList['closed']][$product->id] = $product->name; } } - ksort($productGroup); /** * 1. if user selected by mouse, reload it. @@ -137,26 +136,8 @@ class productModel extends model if($product->acl == 'open') return true; /* Get team members. */ - $teamMembers = $this->getTeamMemberPairs($product); - - /* Private. */ - if($product->acl == 'private') - { - return isset($teamMembers[$this->app->user->account]); - } - - /* Custom, check groups. */ - if($product->acl == 'custom') - { - if(isset($teamMembers[$this->app->user->account])) return true; - $userGroups = $this->app->user->groups; - $productGroups = explode(',', $product->whitelist); - foreach($userGroups as $groupID) - { - if(in_array($groupID, $productGroups)) return true; - } - return false; - } + $privProducts = $this->getPrivProducts(); + return isset($privProducts[$product->id]) ? true : false;; } /** @@ -541,4 +522,34 @@ class productModel extends model return $stats; } + + public function getPrivProducts() + { + $account = ',' . $this->app->user->account . ','; + static $products; + if($products === null) + { + $groupSql = ''; + foreach($this->app->user->groups as $group) $groupSql .= "INSTR(CONCAT(',', t1.whitelist, ','), ',$group,') > 0 OR "; + $groupSql = !empty($groupSql) ? '(' . substr($groupSql, 0, strlen($groupSql) - 4) . ')' : '1 != 1'; + $products = $this->dao->select('distinct t1.id')->from(TABLE_PRODUCT)->alias('t1') + ->leftJoin(TABLE_PROJECTPRODUCT)->alias('t2')->on('t1.id = t2.product') + ->leftJoin(TABLE_TEAM)->alias('t3')->on('t2.project = t3.project') + ->leftJoin(TABLE_PROJECT)->alias('t4')->on('t2.project = t4.id') + ->beginIF(strpos($this->app->company->admins, $account) !== false)->where('t1.deleted')->eq(0)->fi() + ->beginIF(strpos($this->app->company->admins, $account) === false) + ->where('t1.acl')->eq('open') + ->orWhere("(t1.acl = 'custom' AND $groupSql)") + ->orWhere('t1.PO')->eq($this->app->user->account) + ->orWhere('t1.QM')->eq($this->app->user->account) + ->orWhere('t1.RM')->eq($this->app->user->account) + ->orWhere('t1.createdBy')->eq($this->app->user->account) + ->orWhere('t3.account')->eq($this->app->user->account) + ->andWhere('t1.deleted')->eq(0) + ->andWhere('t4.deleted')->eq(0) + ->fi() + ->fetchAll('id'); + } + return $products; + } } diff --git a/module/search/model.php b/module/search/model.php index 1189213b7e..625a91744b 100644 --- a/module/search/model.php +++ b/module/search/model.php @@ -136,10 +136,23 @@ class searchModel extends model */ public function setDefaultParams($fields, $params) { - $users = $this->loadModel('user')->getPairs(); - $products = array('' => '') + $this->loadModel('product')->getPairs(); - $projects = array('' => '') + $this->loadModel('project')->getPairs(); - $fields = array_keys($fields); + $hasProduct = false; + $hasProject = false; + $hasUser = false; + + $fields = array_keys($fields); + foreach($fields as $fieldName) + { + if(empty($params[$fieldName])) continue; + if($params[$fieldName]['values'] == 'products') $hasProduct = true; + if($params[$fieldName]['values'] == 'users') $hasUser = true; + if($params[$fieldName]['values'] == 'projects') $hasProject = true; + } + + if($hasUser) $users = $this->loadModel('user')->getPairs(); + if($hasProduct) $products = array('' => '') + $this->loadModel('product')->getPairs(); + if($hasProject) $projects = array('' => '') + $this->loadModel('project')->getPairs(); + foreach($fields as $fieldName) { if(!isset($params[$fieldName])) $params[$fieldName] = array('operator' => '=', 'control' => 'input', 'values' => '');