[ Index ] |
PHP Cross Reference of vtigercrm-6.1.0 |
[Summary view] [Print] [Text view]
1 <?php 2 /*+*********************************************************************************** 3 * The contents of this file are subject to the vtiger CRM Public License Version 1.0 4 * ("License"); You may not use this file except in compliance with the License 5 * The Original Code is: vtiger CRM Open Source 6 * The Initial Developer of the Original Code is vtiger. 7 * Portions created by vtiger are Copyright (C) vtiger. 8 * All Rights Reserved. 9 *************************************************************************************/ 10 11 class Vtiger_Relation_Model extends Vtiger_Base_Model{ 12 13 protected $parentModule = false; 14 protected $relatedModule = false; 15 16 protected $relationType = false; 17 18 //one to many 19 const RELATION_DIRECT = 1; 20 21 //Many to many and many to one 22 const RELATION_INDIRECT = 2; 23 24 /** 25 * Function returns the relation id 26 * @return <Integer> 27 */ 28 public function getId(){ 29 return $this->get('relation_id'); 30 } 31 32 /** 33 * Function sets the relation's parent module model 34 * @param <Vtiger_Module_Model> $moduleModel 35 * @return Vtiger_Relation_Model 36 */ 37 public function setParentModuleModel($moduleModel){ 38 $this->parentModule = $moduleModel; 39 return $this; 40 } 41 42 /** 43 * Function that returns the relation's parent module model 44 * @return <Vtiger_Module_Model> 45 */ 46 public function getParentModuleModel(){ 47 if(empty($this->parentModule)){ 48 $this->parentModule = Vtiger_Module_Model::getInstance($this->get('tabid')); 49 } 50 return $this->parentModule; 51 } 52 53 public function getRelationModuleModel(){ 54 if(empty($this->relatedModule)){ 55 $this->relatedModule = Vtiger_Module_Model::getInstance($this->get('related_tabid')); 56 } 57 return $this->relatedModule; 58 } 59 60 public function getRelationModuleName() { 61 $relationModuleName = $this->get('relatedModuleName'); 62 if(!empty($relationModuleName)) { 63 return $relationModuleName; 64 } 65 return $this->getRelationModuleModel()->getName(); 66 } 67 68 public function getListUrl($parentRecordModel) { 69 return 'module='.$this->getParentModuleModel()->get('name').'&relatedModule='.$this->get('modulename'). 70 '&view=Detail&record='.$parentRecordModel->getId().'&mode=showRelatedList'; 71 } 72 73 public function setRelationModuleModel($relationModel){ 74 $this->relatedModule = $relationModel; 75 return $this; 76 } 77 78 public function isActionSupported($actionName){ 79 $actionName = strtolower($actionName); 80 $actions = $this->getActions(); 81 foreach($actions as $action) { 82 if(strcmp(strtolower($action), $actionName)== 0){ 83 return true; 84 } 85 } 86 return false; 87 } 88 89 public function isSelectActionSupported() { 90 return $this->isActionSupported('select'); 91 } 92 93 public function isAddActionSupported() { 94 return $this->isActionSupported('add'); 95 } 96 97 public function getActions(){ 98 $actionString = $this->get('actions'); 99 100 $label = $this->get('label'); 101 // No actions for Activity history 102 if($label == 'Activity History') { 103 return array(); 104 } 105 106 return explode(',', $actionString); 107 } 108 109 public function getQuery($parentRecord, $actions=false){ 110 $parentModuleModel = $this->getParentModuleModel(); 111 $relatedModuleModel = $this->getRelationModuleModel(); 112 $parentModuleName = $parentModuleModel->getName(); 113 $relatedModuleName = $relatedModuleModel->getName(); 114 $functionName = $this->get('name'); 115 $query = $parentModuleModel->getRelationQuery($parentRecord->getId(), $functionName, $relatedModuleModel); 116 117 return $query; 118 } 119 120 public function addRelation($sourcerecordId, $destinationRecordId) { 121 $sourceModule = $this->getParentModuleModel(); 122 $sourceModuleName = $sourceModule->get('name'); 123 $sourceModuleFocus = CRMEntity::getInstance($sourceModuleName); 124 $destinationModuleName = $this->getRelationModuleModel()->get('name'); 125 relateEntities($sourceModuleFocus, $sourceModuleName, $sourcerecordId, $destinationModuleName, $destinationRecordId); 126 } 127 128 public function deleteRelation($sourceRecordId, $relatedRecordId){ 129 $sourceModule = $this->getParentModuleModel(); 130 $sourceModuleName = $sourceModule->get('name'); 131 $destinationModuleName = $this->getRelationModuleModel()->get('name'); 132 $destinationModuleFocus = CRMEntity::getInstance($destinationModuleName); 133 DeleteEntity($destinationModuleName, $sourceModuleName, $destinationModuleFocus, $relatedRecordId, $sourceRecordId); 134 return true; 135 } 136 137 public function isDirectRelation() { 138 return ($this->getRelationType() == self::RELATION_DIRECT); 139 } 140 141 public function getRelationType(){ 142 if(empty($this->relationType)){ 143 $this->relationType = self::RELATION_INDIRECT; 144 if ($this->getRelationField()) { 145 $this->relationType = self::RELATION_DIRECT; 146 } 147 } 148 return $this->relationType; 149 } 150 151 /** 152 * Function which will specify whether the relation is editable 153 * @return <Boolean> 154 */ 155 public function isEditable() { 156 return $this->getRelationModuleModel()->isPermitted('EditView'); 157 } 158 159 /** 160 * Function which will specify whether the relation is deletable 161 * @return <Boolean> 162 */ 163 public function isDeletable() { 164 return $this->getRelationModuleModel()->isPermitted('Delete'); 165 } 166 167 public static function getInstance($parentModuleModel, $relatedModuleModel, $label=false) { 168 $db = PearDatabase::getInstance(); 169 170 $query = 'SELECT vtiger_relatedlists.*,vtiger_tab.name as modulename FROM vtiger_relatedlists 171 INNER JOIN vtiger_tab on vtiger_tab.tabid = vtiger_relatedlists.related_tabid AND vtiger_tab.presence != 1 172 WHERE vtiger_relatedlists.tabid = ? AND related_tabid = ?'; 173 $params = array($parentModuleModel->getId(), $relatedModuleModel->getId()); 174 175 if(!empty($label)) { 176 $query .= ' AND label = ?'; 177 $params[] = $label; 178 } 179 180 $result = $db->pquery($query, $params); 181 if($db->num_rows($result)) { 182 $row = $db->query_result_rowdata($result, 0); 183 $relationModelClassName = Vtiger_Loader::getComponentClassName('Model', 'Relation', $parentModuleModel->get('name')); 184 $relationModel = new $relationModelClassName(); 185 $relationModel->setData($row)->setParentModuleModel($parentModuleModel)->setRelationModuleModel($relatedModuleModel); 186 return $relationModel; 187 } 188 return false; 189 } 190 191 public static function getAllRelations($parentModuleModel, $selected = true, $onlyActive = true) { 192 $db = PearDatabase::getInstance(); 193 194 $skipReltionsList = array('get_history'); 195 $query = 'SELECT vtiger_relatedlists.*,vtiger_tab.name as modulename FROM vtiger_relatedlists 196 INNER JOIN vtiger_tab on vtiger_relatedlists.related_tabid = vtiger_tab.tabid 197 WHERE vtiger_relatedlists.tabid = ? AND related_tabid != 0'; 198 199 if ($selected) { 200 $query .= ' AND vtiger_relatedlists.presence <> 1'; 201 } 202 if($onlyActive){ 203 $query .= ' AND vtiger_tab.presence <> 1 '; 204 } 205 $query .= ' AND vtiger_relatedlists.name NOT IN ('.generateQuestionMarks($skipReltionsList).') ORDER BY sequence'; // TODO: Need to handle entries that has related_tabid 0 206 207 $result = $db->pquery($query, array($parentModuleModel->getId(), $skipReltionsList)); 208 209 $relationModels = array(); 210 $relationModelClassName = Vtiger_Loader::getComponentClassName('Model', 'Relation', $parentModuleModel->get('name')); 211 for($i=0; $i<$db->num_rows($result); $i++) { 212 $row = $db->query_result_rowdata($result, $i); 213 //$relationModuleModel = Vtiger_Module_Model::getCleanInstance($moduleName); 214 // Skip relation where target module does not exits or is no permitted for view. 215 if (!Users_Privileges_Model::isPermitted($row['modulename'],'DetailView')) { 216 continue; 217 } 218 $relationModel = new $relationModelClassName(); 219 $relationModel->setData($row)->setParentModuleModel($parentModuleModel)->set('relatedModuleName',$row['modulename']); 220 $relationModels[] = $relationModel; 221 } 222 return $relationModels; 223 } 224 225 /** 226 * Function to get relation field for relation module and parent module 227 * @return Vtiger_Field_Model 228 */ 229 public function getRelationField() { 230 $relationField = $this->get('relationField'); 231 if (!$relationField) { 232 $relationField = false; 233 $relatedModel = $this->getRelationModuleModel(); 234 $parentModule = $this->getParentModuleModel(); 235 $relatedModelFields = $relatedModel->getFields(); 236 237 foreach($relatedModelFields as $fieldName => $fieldModel) { 238 if($fieldModel->getFieldDataType() == Vtiger_Field_Model::REFERENCE_TYPE) { 239 $referenceList = $fieldModel->getReferenceList(); 240 if(in_array($parentModule->getName(), $referenceList)) { 241 $this->set('relationField', $fieldModel); 242 $relationField = $fieldModel; 243 break; 244 } 245 } 246 } 247 } 248 return $relationField; 249 } 250 251 public static function updateRelationSequenceAndPresence($relatedInfoList, $sourceModuleTabId) { 252 $db = PearDatabase::getInstance(); 253 $query = 'UPDATE vtiger_relatedlists SET sequence=CASE '; 254 $relation_ids = array(); 255 foreach($relatedInfoList as $relatedInfo){ 256 $relation_id = $relatedInfo['relation_id']; 257 $relation_ids[] = $relation_id; 258 $sequence = $relatedInfo['sequence']; 259 $presence = $relatedInfo['presence']; 260 $query .= ' WHEN relation_id='.$relation_id.' THEN '.$sequence; 261 } 262 $query.= ' END , '; 263 $query.= ' presence = CASE '; 264 foreach($relatedInfoList as $relatedInfo){ 265 $relation_id = $relatedInfo['relation_id']; 266 $relation_ids[] = $relation_id; 267 $sequence = $relatedInfo['sequence']; 268 $presence = $relatedInfo['presence']; 269 $query .= ' WHEN relation_id='.$relation_id.' THEN '.$presence; 270 } 271 $query .= ' END WHERE tabid=? AND relation_id IN ('. generateQuestionMarks($relation_ids).')'; 272 $result = $db->pquery($query, array($sourceModuleTabId,$relation_ids)); 273 } 274 275 public function isActive() { 276 return $this->get('presence') == 0 ? true : false; 277 } 278 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 20:08:37 2014 | Cross-referenced by PHPXref 0.7.1 |