[ Index ]

PHP Cross Reference of vtigercrm-6.1.0

title

Body

[close]

/modules/Vtiger/models/ -> RelationListView.php (source)

   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  }


Generated: Fri Nov 28 20:08:37 2014 Cross-referenced by PHPXref 0.7.1