[ 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_RelationListView_Model extends Vtiger_Base_Model { 12 13 protected $relationModel = false; 14 protected $parentRecordModel = false; 15 protected $relatedModuleModel = false; 16 17 public function setRelationModel($relation){ 18 $this->relationModel = $relation; 19 return $this; 20 } 21 22 public function getRelationModel() { 23 return $this->relationModel; 24 } 25 26 public function setParentRecordModel($parentRecord){ 27 $this->parentRecordModel = $parentRecord; 28 return $this; 29 } 30 31 public function getParentRecordModel(){ 32 return $this->parentRecordModel; 33 } 34 35 public function setRelatedModuleModel($relatedModuleModel){ 36 $this->relatedModuleModel = $relatedModuleModel; 37 return $this; 38 } 39 40 public function getRelatedModuleModel(){ 41 return $this->relatedModuleModel; 42 } 43 44 public function getCreateViewUrl(){ 45 $relationModel = $this->getRelationModel(); 46 $relatedModel = $relationModel->getRelationModuleModel(); 47 $parentRecordModule = $this->getParentRecordModel(); 48 $parentModule = $parentRecordModule->getModule(); 49 50 $createViewUrl = $relatedModel->getCreateRecordUrl().'&sourceModule='.$parentModule->get('name'). 51 '&sourceRecord='.$parentRecordModule->getId().'&relationOperation=true'; 52 53 //To keep the reference fieldname and record value in the url if it is direct relation 54 if($relationModel->isDirectRelation()) { 55 $relationField = $relationModel->getRelationField(); 56 $createViewUrl .='&'.$relationField->getName().'='.$parentRecordModule->getId(); 57 } 58 return $createViewUrl; 59 } 60 61 public function getCreateEventRecordUrl(){ 62 $relationModel = $this->getRelationModel(); 63 $relatedModel = $relationModel->getRelationModuleModel(); 64 $parentRecordModule = $this->getParentRecordModel(); 65 $parentModule = $parentRecordModule->getModule(); 66 67 $createViewUrl = $relatedModel->getCreateEventRecordUrl().'&sourceModule='.$parentModule->get('name'). 68 '&sourceRecord='.$parentRecordModule->getId().'&relationOperation=true'; 69 70 //To keep the reference fieldname and record value in the url if it is direct relation 71 if($relationModel->isDirectRelation()) { 72 $relationField = $relationModel->getRelationField(); 73 $createViewUrl .='&'.$relationField->getName().'='.$parentRecordModule->getId(); 74 } 75 return $createViewUrl; 76 } 77 78 public function getCreateTaskRecordUrl(){ 79 $relationModel = $this->getRelationModel(); 80 $relatedModel = $relationModel->getRelationModuleModel(); 81 $parentRecordModule = $this->getParentRecordModel(); 82 $parentModule = $parentRecordModule->getModule(); 83 84 $createViewUrl = $relatedModel->getCreateTaskRecordUrl().'&sourceModule='.$parentModule->get('name'). 85 '&sourceRecord='.$parentRecordModule->getId().'&relationOperation=true'; 86 87 //To keep the reference fieldname and record value in the url if it is direct relation 88 if($relationModel->isDirectRelation()) { 89 $relationField = $relationModel->getRelationField(); 90 $createViewUrl .='&'.$relationField->getName().'='.$parentRecordModule->getId(); 91 } 92 return $createViewUrl; 93 } 94 95 public function getLinks(){ 96 $relationModel = $this->getRelationModel(); 97 $actions = $relationModel->getActions(); 98 99 $selectLinks = $this->getSelectRelationLinks(); 100 foreach($selectLinks as $selectLinkModel) { 101 $selectLinkModel->set('_selectRelation',true)->set('_module',$relationModel->getRelationModuleModel()); 102 } 103 $addLinks = $this->getAddRelationLinks(); 104 105 $links = array_merge($selectLinks, $addLinks); 106 $relatedLink = array(); 107 $relatedLink['LISTVIEWBASIC'] = $links; 108 return $relatedLink; 109 } 110 111 public function getSelectRelationLinks() { 112 $relationModel = $this->getRelationModel(); 113 $selectLinkModel = array(); 114 115 if(!$relationModel->isSelectActionSupported()) { 116 return $selectLinkModel; 117 } 118 119 $relatedModel = $relationModel->getRelationModuleModel(); 120 121 $selectLinkList = array( 122 array( 123 'linktype' => 'LISTVIEWBASIC', 124 'linklabel' => vtranslate('LBL_SELECT')." ".vtranslate($relatedModel->get('label')), 125 'linkurl' => '', 126 'linkicon' => '', 127 ) 128 ); 129 130 131 foreach($selectLinkList as $selectLink) { 132 $selectLinkModel[] = Vtiger_Link_Model::getInstanceFromValues($selectLink); 133 } 134 return $selectLinkModel; 135 } 136 137 public function getAddRelationLinks() { 138 $relationModel = $this->getRelationModel(); 139 $addLinkModel = array(); 140 141 if(!$relationModel->isAddActionSupported()) { 142 return $addLinkModel; 143 } 144 $relatedModel = $relationModel->getRelationModuleModel(); 145 146 if($relatedModel->get('label') == 'Calendar'){ 147 148 $addLinkList[] = array( 149 'linktype' => 'LISTVIEWBASIC', 150 'linklabel' => vtranslate('LBL_ADD_EVENT'), 151 'linkurl' => $this->getCreateEventRecordUrl(), 152 'linkicon' => '', 153 ); 154 $addLinkList[] = array( 155 'linktype' => 'LISTVIEWBASIC', 156 'linklabel' => vtranslate('LBL_ADD_TASK'), 157 'linkurl' => $this->getCreateTaskRecordUrl(), 158 'linkicon' => '', 159 ); 160 }else{ 161 $addLinkList = array( 162 array( 163 'linktype' => 'LISTVIEWBASIC', 164 // NOTE: $relatedModel->get('label') assuming it to be a module name - we need singular label for Add action. 165 'linklabel' => vtranslate('LBL_ADD')." ".vtranslate('SINGLE_' . $relatedModel->getName(), $relatedModel->getName()), 166 'linkurl' => $this->getCreateViewUrl(), 167 'linkicon' => '', 168 ) 169 ); 170 } 171 172 foreach($addLinkList as $addLink) { 173 $addLinkModel[] = Vtiger_Link_Model::getInstanceFromValues($addLink); 174 } 175 return $addLinkModel; 176 } 177 178 public function getEntries($pagingModel) { 179 $db = PearDatabase::getInstance(); 180 $parentModule = $this->getParentRecordModel()->getModule(); 181 $relationModule = $this->getRelationModel()->getRelationModuleModel(); 182 $relationModuleName = $relationModule->get('name'); 183 $relatedColumnFields = $relationModule->getConfigureRelatedListFields(); 184 if(count($relatedColumnFields) <= 0){ 185 $relatedColumnFields = $relationModule->getRelatedListFields(); 186 } 187 188 if($relationModuleName == 'Calendar') { 189 //Adding visibility in the related list, showing records based on the visibility 190 $relatedColumnFields['visibility'] = 'visibility'; 191 } 192 193 if($relationModuleName == 'PriceBooks') { 194 //Adding fields in the related list 195 $relatedColumnFields['unit_price'] = 'unit_price'; 196 $relatedColumnFields['listprice'] = 'listprice'; 197 $relatedColumnFields['currency_id'] = 'currency_id'; 198 } 199 200 $query = $this->getRelationQuery(); 201 202 if ($this->get('whereCondition')) { 203 $query = $this->updateQueryWithWhereCondition($query); 204 } 205 206 $startIndex = $pagingModel->getStartIndex(); 207 $pageLimit = $pagingModel->getPageLimit(); 208 209 $orderBy = $this->getForSql('orderby'); 210 $sortOrder = $this->getForSql('sortorder'); 211 if($orderBy) { 212 213 $orderByFieldModuleModel = $relationModule->getFieldByColumn($orderBy); 214 if($orderByFieldModuleModel && $orderByFieldModuleModel->isReferenceField()) { 215 //If reference field then we need to perform a join with crmentity with the related to field 216 $queryComponents = $split = spliti(' where ', $query); 217 $selectAndFromClause = $queryComponents[0]; 218 $whereCondition = $queryComponents[1]; 219 $qualifiedOrderBy = 'vtiger_crmentity'.$orderByFieldModuleModel->get('column'); 220 $selectAndFromClause .= ' LEFT JOIN vtiger_crmentity AS '.$qualifiedOrderBy.' ON '. 221 $orderByFieldModuleModel->get('table').'.'.$orderByFieldModuleModel->get('column').' = '. 222 $qualifiedOrderBy.'.crmid '; 223 $query = $selectAndFromClause.' WHERE '.$whereCondition; 224 $query .= ' ORDER BY '.$qualifiedOrderBy.'.label '.$sortOrder; 225 } elseif($orderByFieldModuleModel && $orderByFieldModuleModel->isOwnerField()) { 226 $query .= ' ORDER BY COALESCE(CONCAT(vtiger_users.first_name,vtiger_users.last_name),vtiger_groups.groupname) '.$sortOrder; 227 } else{ 228 // Qualify the the column name with table to remove ambugity 229 $qualifiedOrderBy = $orderBy; 230 $orderByField = $relationModule->getFieldByColumn($orderBy); 231 if ($orderByField) { 232 $qualifiedOrderBy = $relationModule->getOrderBySql($qualifiedOrderBy); 233 } 234 $query = "$query ORDER BY $qualifiedOrderBy $sortOrder"; 235 } 236 } 237 238 $limitQuery = $query .' LIMIT '.$startIndex.','.$pageLimit; 239 $result = $db->pquery($limitQuery, array()); 240 $relatedRecordList = array(); 241 $currentUser = Users_Record_Model::getCurrentUserModel(); 242 $groupsIds = Vtiger_Util_Helper::getGroupsIdsForUsers($currentUser->getId()); 243 for($i=0; $i< $db->num_rows($result); $i++ ) { 244 $row = $db->fetch_row($result,$i); 245 $newRow = array(); 246 foreach($row as $col=>$val){ 247 if(array_key_exists($col,$relatedColumnFields)){ 248 $newRow[$relatedColumnFields[$col]] = $val; 249 } 250 } 251 //To show the value of "Assigned to" 252 $ownerId = $row['smownerid']; 253 $newRow['assigned_user_id'] = $row['smownerid']; 254 if($relationModuleName == 'Calendar') { 255 $visibleFields = array('activitytype','date_start','time_start','due_date','time_end','assigned_user_id','visibility','smownerid','parent_id'); 256 $visibility = true; 257 if(in_array($ownerId, $groupsIds)) { 258 $visibility = false; 259 } else if($ownerId == $currentUser->getId()){ 260 $visibility = false; 261 } 262 if(!$currentUser->isAdminUser() && $newRow['activitytype'] != 'Task' && $newRow['visibility'] == 'Private' && $ownerId && $visibility) { 263 foreach($newRow as $data => $value) { 264 if(in_array($data, $visibleFields) != -1) { 265 unset($newRow[$data]); 266 } 267 } 268 $newRow['subject'] = vtranslate('Busy','Events').'*'; 269 } 270 if($newRow['activitytype'] == 'Task') { 271 unset($newRow['visibility']); 272 } 273 274 } 275 276 $record = Vtiger_Record_Model::getCleanInstance($relationModule->get('name')); 277 $record->setData($newRow)->setModuleFromInstance($relationModule); 278 $record->setId($row['crmid']); 279 $relatedRecordList[$row['crmid']] = $record; 280 } 281 $pagingModel->calculatePageRange($relatedRecordList); 282 283 $nextLimitQuery = $query. ' LIMIT '.($startIndex+$pageLimit).' , 1'; 284 $nextPageLimitResult = $db->pquery($nextLimitQuery, array()); 285 if($db->num_rows($nextPageLimitResult) > 0){ 286 $pagingModel->set('nextPageExists', true); 287 }else{ 288 $pagingModel->set('nextPageExists', false); 289 } 290 return $relatedRecordList; 291 } 292 293 public function getHeaders() { 294 $relationModel = $this->getRelationModel(); 295 $relatedModuleModel = $relationModel->getRelationModuleModel(); 296 297 $summaryFieldsList = $relatedModuleModel->getSummaryViewFieldsList(); 298 299 $headerFields = array(); 300 if(count($summaryFieldsList) > 0) { 301 foreach($summaryFieldsList as $fieldName => $fieldModel) { 302 $headerFields[$fieldName] = $fieldModel; 303 } 304 } else { 305 $headerFieldNames = $relatedModuleModel->getRelatedListFields(); 306 foreach($headerFieldNames as $fieldName) { 307 $headerFields[$fieldName] = $relatedModuleModel->getField($fieldName); 308 } 309 } 310 return $headerFields; 311 } 312 313 /** 314 * Function to get Relation query 315 * @return <String> 316 */ 317 public function getRelationQuery() { 318 $relationModel = $this->getRelationModel(); 319 320 if(!empty($relationModel) && $relationModel->get('name') != NULL){ 321 $recordModel = $this->getParentRecordModel(); 322 $query = $relationModel->getQuery($recordModel); 323 return $query; 324 } 325 $relatedModuleModel = $this->getRelatedModuleModel(); 326 $relatedModuleName = $relatedModuleModel->getName(); 327 328 $relatedModuleBaseTable = $relatedModuleModel->basetable; 329 $relatedModuleEntityIdField = $relatedModuleModel->basetableid; 330 331 $parentModuleModel = $relationModel->getParentModuleModel(); 332 $parentModuleBaseTable = $parentModuleModel->basetable; 333 $parentModuleEntityIdField = $parentModuleModel->basetableid; 334 $parentRecordId = $this->getParentRecordModel()->getId(); 335 $parentModuleDirectRelatedField = $parentModuleModel->get('directRelatedFieldName'); 336 337 $relatedModuleFields = array_keys($this->getHeaders()); 338 $currentUserModel = Users_Record_Model::getCurrentUserModel(); 339 $queryGenerator = new QueryGenerator($relatedModuleName, $currentUserModel); 340 $queryGenerator->setFields($relatedModuleFields); 341 342 $query = $queryGenerator->getQuery(); 343 344 $queryComponents = spliti(' FROM ', $query); 345 $query = $queryComponents[0].' ,vtiger_crmentity.crmid FROM '.$queryComponents[1]; 346 347 $whereSplitQueryComponents = spliti(' WHERE ', $query); 348 $joinQuery = ' INNER JOIN '.$parentModuleBaseTable.' ON '.$parentModuleBaseTable.'.'.$parentModuleDirectRelatedField." = ".$relatedModuleBaseTable.'.'.$relatedModuleEntityIdField; 349 350 $query = "$whereSplitQueryComponents[0] $joinQuery WHERE $parentModuleBaseTable.$parentModuleEntityIdField = $parentRecordId AND $whereSplitQueryComponents[1]"; 351 352 return $query; 353 } 354 355 public static function getInstance($parentRecordModel, $relationModuleName, $label=false) { 356 $parentModuleName = $parentRecordModel->getModule()->get('name'); 357 $className = Vtiger_Loader::getComponentClassName('Model', 'RelationListView', $parentModuleName); 358 $instance = new $className(); 359 360 $parentModuleModel = $parentRecordModel->getModule(); 361 $relatedModuleModel = Vtiger_Module_Model::getInstance($relationModuleName); 362 $instance->setRelatedModuleModel($relatedModuleModel); 363 364 $relationModel = Vtiger_Relation_Model::getInstance($parentModuleModel, $relatedModuleModel, $label); 365 $instance->setParentRecordModel($parentRecordModel); 366 367 if(!$relationModel){ 368 $relatedModuleName = $relatedModuleModel->getName(); 369 $parentModuleModel = $instance->getParentRecordModel()->getModule(); 370 $referenceFieldOfParentModule = $parentModuleModel->getFieldsByType('reference'); 371 foreach ($referenceFieldOfParentModule as $fieldName=>$fieldModel) { 372 $refredModulesOfReferenceField = $fieldModel->getReferenceList(); 373 if(in_array($relatedModuleName, $refredModulesOfReferenceField)){ 374 $relationModelClassName = Vtiger_Loader::getComponentClassName('Model', 'Relation', $parentModuleModel->getName()); 375 $relationModel = new $relationModelClassName(); 376 $relationModel->setParentModuleModel($parentModuleModel)->setRelationModuleModel($relatedModuleModel); 377 $parentModuleModel->set('directRelatedFieldName',$fieldModel->get('column')); 378 } 379 } 380 } 381 if(!$relationModel){ 382 $relationModel = false; 383 } 384 $instance->setRelationModel($relationModel); 385 return $instance; 386 } 387 388 /** 389 * Function to get Total number of record in this relation 390 * @return <Integer> 391 */ 392 public function getRelatedEntriesCount() { 393 $db = PearDatabase::getInstance(); 394 $relationQuery = $this->getRelationQuery(); 395 $relationQuery = ereg_replace("[ \t\n\r]+", " ", $relationQuery); 396 $position = stripos($relationQuery,' from '); 397 if ($position) { 398 $split = spliti(' FROM ', $relationQuery); 399 $splitCount = count($split); 400 $relationQuery = 'SELECT COUNT(DISTINCT vtiger_crmentity.crmid) AS count'; 401 for ($i=1; $i<$splitCount; $i++) { 402 $relationQuery = $relationQuery. ' FROM ' .$split[$i]; 403 } 404 } 405 if(strpos($relationQuery,' GROUP BY ') !== false){ 406 $parts = explode(' GROUP BY ',$relationQuery); 407 $relationQuery = $parts[0]; 408 } 409 $result = $db->pquery($relationQuery, array()); 410 return $db->query_result($result, 0, 'count'); 411 } 412 413 /** 414 * Function to update relation query 415 * @param <String> $relationQuery 416 * @return <String> $updatedQuery 417 */ 418 public function updateQueryWithWhereCondition($relationQuery) { 419 $condition = ''; 420 421 $whereCondition = $this->get("whereCondition"); 422 $count = count($whereCondition); 423 if ($count > 1) { 424 $appendAndCondition = true; 425 } 426 427 $i = 1; 428 foreach ($whereCondition as $fieldName => $fieldValue) { 429 $condition .= " $fieldName = '$fieldValue' "; 430 if ($appendAndCondition && ($i++ != $count)) { 431 $condition .= " AND "; 432 } 433 } 434 435 $pos = stripos($relationQuery, 'where'); 436 if ($pos) { 437 $split = spliti('where', $relationQuery); 438 $updatedQuery = $split[0] . ' WHERE ' . $split[1] . ' AND ' . $condition; 439 } else { 440 $updatedQuery = $relationQuery . ' WHERE ' . $condition; 441 } 442 return $updatedQuery; 443 } 444 445 public function getCurrencySymbol($recordId, $fieldModel) { 446 $db = PearDatabase::getInstance(); 447 $moduleName = $fieldModel->getModuleName(); 448 $fieldName = $fieldModel->get('name'); 449 $tableName = $fieldModel->get('table'); 450 $columnName = $fieldModel->get('column'); 451 452 if(($fieldName == 'currency_id') && ($moduleName == 'Products' || $moduleName == 'Services')) { 453 $query = "SELECT currency_symbol FROM vtiger_currency_info WHERE id = ("; 454 if($moduleName == 'Products') 455 $query .= "SELECT currency_id FROM vtiger_products WHERE productid = ?)"; 456 else if($moduleName == 'Services') 457 $query .= "SELECT currency_id FROM vtiger_service WHERE serviceid = ?)"; 458 459 $result = $db->pquery($query, array($recordId)); 460 return $db->query_result($result, 0, 'currency_symbol'); 461 } else if(($tableName == 'vtiger_invoice' || $tableName == 'vtiger_quotes' || $tableName == 'vtiger_purchaseorder' || $tableName == 'vtiger_salesorder') && 462 ($columnName == 'total' || $columnName == 'subtotal' || $columnName == 'discount_amount' || $columnName == 's_h_amount' || $columnName == 'paid' || 463 $columnName == 'balance' || $columnName == 'received' || $columnName == 'listprice' || $columnName == 'adjustment' || $columnName == 'pre_tax_total')) { 464 $focus = CRMEntity::getInstance($moduleName); 465 $query = "SELECT currency_symbol FROM vtiger_currency_info WHERE id = ( SELECT currency_id FROM ".$tableName." WHERE ".$focus->table_index." = ? )"; 466 $result = $db->pquery($query, array($recordId)); 467 return $db->query_result($result, 0, 'currency_symbol'); 468 } else { 469 $fieldInfo = $fieldModel->getFieldInfo(); 470 return $fieldInfo['currency_symbol']; 471 } 472 } 473 474 }
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 |