[ Index ]

PHP Cross Reference of vtigercrm-6.1.0

title

Body

[close]

/modules/Vtiger/models/ -> Relation.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_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  }


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