[ Index ]

PHP Cross Reference of vtigercrm-6.1.0

title

Body

[close]

/include/Webservices/ -> VtigerActorOperation.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  require_once  'include/Webservices/VtigerCRMActorMeta.php';
  12  class VtigerActorOperation extends WebserviceEntityOperation {
  13      protected $entityTableName;
  14      protected $moduleFields;
  15      protected $isEntity = false;
  16      protected $element;
  17      protected $id;
  18      
  19  	public function  __construct($webserviceObject,$user,$adb,$log){
  20          parent::__construct($webserviceObject,$user,$adb,$log);
  21          $this->entityTableName = $this->getActorTables();
  22          if($this->entityTableName === null){
  23              throw new WebServiceException(WebServiceErrorCode::$UNKOWNENTITY,"Entity is not associated with any tables");
  24          }
  25          $this->meta = $this->getMetaInstance();
  26          $this->moduleFields = null;
  27          $this->element = null;
  28          $this->id = null;
  29      }
  30  
  31  	protected function getMetaInstance(){
  32          if(empty(WebserviceEntityOperation::$metaCache[$this->webserviceObject->getEntityName()][$this->user->id])){
  33              WebserviceEntityOperation::$metaCache[$this->webserviceObject->getEntityName()][$this->user->id]  
  34                      = new VtigerCRMActorMeta($this->entityTableName,$this->webserviceObject,$this->pearDB,$this->user);
  35          }
  36          return WebserviceEntityOperation::$metaCache[$this->webserviceObject->getEntityName()][$this->user->id];
  37      }
  38      
  39  	protected function getActorTables(){
  40          static $actorTables = array();
  41          
  42          if(isset($actorTables[$this->webserviceObject->getEntityId()])){
  43              return $actorTables[$this->webserviceObject->getEntityId()];
  44          }
  45          $sql = 'select table_name, webservice_entity_id from vtiger_ws_entity_tables';
  46          $result = $this->pearDB->pquery($sql,array());
  47          if($result){
  48              $rowCount = $this->pearDB->num_rows($result);
  49              for($i=0;$i<$rowCount;++$i){
  50                  $row = $this->pearDB->query_result_rowdata($result,$i);
  51                  // Cache the result for further re-use
  52                  $actorTables[$row['webservice_entity_id']] = $row['table_name'];
  53              }
  54          }
  55          
  56          $tableName = isset($actorTables[$this->webserviceObject->getEntityId()])? $actorTables[$this->webserviceObject->getEntityId()]:null;
  57          return $tableName;
  58      }
  59      
  60  	public function getMeta(){
  61          return $this->meta;
  62      }
  63  
  64  	protected function getNextId($elementType,$element){
  65          if(strcasecmp($elementType,'Groups') === 0){
  66              $tableName="vtiger_users";
  67          }else{
  68              $tableName = $this->entityTableName;
  69  
  70          }
  71          $meta = $this->getMeta();
  72          if(strcasecmp($elementType,'Groups') !== 0 && strcasecmp($elementType,'Users') !== 0) {
  73              $sql = "update $tableName"."_seq set id=(select max(".$meta->getIdColumn().")
  74                  from $tableName)";
  75              $this->pearDB->pquery($sql,array());
  76          }
  77          $id = $this->pearDB->getUniqueId($tableName);
  78          return $id;
  79      }
  80  
  81  	public function __create($elementType,$element){
  82          require_once  'include/utils/utils.php';
  83          $db = PearDatabase::getInstance();
  84  
  85          $this->id=$this->getNextId($elementType, $element);
  86          
  87          $element[$this->meta->getObectIndexColumn()] = $this->id;
  88  
  89          //Insert into group vtiger_table
  90          $query = "insert into {$this->entityTableName}(".implode(',',array_keys($element)).
  91                  ") values(".generateQuestionMarks(array_keys($element)).")";
  92          $result = null;
  93          $transactionSuccessful = vtws_runQueryAsTransaction($query, array_values($element),
  94                  $result);
  95          return $transactionSuccessful;
  96      }
  97  
  98  	public function create($elementType,$element){
  99          $element = DataTransform::sanitizeForInsert($element,$this->meta);
 100  
 101          $element = $this->restrictFields($element);
 102          
 103          $success = $this->__create($elementType,$element);
 104          if(!$success){
 105              throw new WebServiceException(WebServiceErrorCode::$DATABASEQUERYERROR,
 106                  vtws_getWebserviceTranslatedString('LBL_'.
 107                              WebServiceErrorCode::$DATABASEQUERYERROR));
 108          }
 109          return $this->retrieve(vtws_getId($this->meta->getEntityId(),$this->id));
 110      }
 111      
 112  	protected function restrictFields($element, $selectedOnly = false){
 113          $fields = $this->getModuleFields();
 114          $newElement = array();
 115          foreach ($fields as $field) {
 116              if(isset($element[$field['name']])){
 117                  $newElement[$field['name']] = $element[$field['name']];
 118              }else if($field['name'] != 'id' && $selectedOnly == false){
 119                  $newElement[$field['name']] = '';
 120              }
 121          }
 122          return $newElement;
 123      }
 124      
 125  	public function __retrieve($id){
 126          $query = "select * from {$this->entityTableName} where {$this->meta->getObectIndexColumn()}=?";
 127          $transactionSuccessful = vtws_runQueryAsTransaction($query,array($id),$result);
 128          if(!$transactionSuccessful){
 129              throw new WebServiceException(WebServiceErrorCode::$DATABASEQUERYERROR,
 130                  vtws_getWebserviceTranslatedString('LBL_'.
 131                              WebServiceErrorCode::$DATABASEQUERYERROR));
 132          }
 133          $db = $this->pearDB;
 134          if($result){
 135              $rowCount = $db->num_rows($result);
 136              if($rowCount >0){
 137                  $this->element = $db->query_result_rowdata($result,0);
 138                  return true;
 139              }
 140          }
 141          return false;
 142      }
 143      
 144  	public function retrieve($id){
 145  
 146          $ids = vtws_getIdComponents($id);
 147          $elemId = $ids[1];
 148          $success = $this->__retrieve($elemId);
 149          if(!$success){
 150              throw new WebServiceException(WebServiceErrorCode::$RECORDNOTFOUND,
 151                  "Record not found");
 152          }
 153          $element = $this->getElement();
 154  
 155          return DataTransform::filterAndSanitize($element,$this->meta);
 156      }
 157      
 158  	public function __update($element,$id){
 159          $columnStr = 'set '.implode('=?,',array_keys($element)).' =? ';
 160          $query = 'update '.$this->entityTableName.' '.$columnStr.'where '.
 161                  $this->meta->getObectIndexColumn().'=?';
 162          $params = array_values($element);
 163          array_push($params,$id);
 164          $result = null;
 165          $transactionSuccessful = vtws_runQueryAsTransaction($query,$params,$result);
 166          return $transactionSuccessful;
 167      }
 168  
 169  	public function update($element){
 170          $ids = vtws_getIdComponents($element["id"]);
 171          $element = DataTransform::sanitizeForInsert($element,$this->meta);
 172          $element = $this->restrictFields($element);
 173          
 174          $success = $this->__update($element,$ids[1]);
 175          if(!$success){
 176              throw new WebServiceException(WebServiceErrorCode::$DATABASEQUERYERROR,
 177                  vtws_getWebserviceTranslatedString('LBL_'.
 178                              WebServiceErrorCode::$DATABASEQUERYERROR));
 179          }
 180          return $this->retrieve(vtws_getId($this->meta->getEntityId(),$ids[1]));
 181      }
 182      
 183  	public function __revise($element,$id){
 184          $columnStr = 'set '.implode('=?,',array_keys($element)).' =? ';
 185          $query = 'update '.$this->entityTableName.' '.$columnStr.'where '.
 186                  $this->meta->getObectIndexColumn().'=?';
 187          $params = array_values($element);
 188          array_push($params,$id);
 189          $result = null;
 190          $transactionSuccessful = vtws_runQueryAsTransaction($query,$params,$result);
 191          return $transactionSuccessful;
 192      }
 193  
 194  	public function revise($element){
 195          $ids = vtws_getIdComponents($element["id"]);
 196  
 197          $element = DataTransform::sanitizeForInsert($element,$this->meta);
 198          $element = $this->restrictFields($element, true);
 199  
 200          $success = $this->__retrieve($ids[1]);
 201          if(!$success){
 202              throw new WebServiceException(WebServiceErrorCode::$RECORDNOTFOUND,
 203                  "Record not found");
 204          }
 205  
 206          $allDetails = $this->getElement();
 207          foreach ($allDetails as $index=>$value) {
 208              if(!isset($element)){
 209                  $element[$index] = $value;
 210              }
 211          }
 212          $success = $this->__revise($element,$ids[1]);
 213          if(!$success){
 214              throw new WebServiceException(WebServiceErrorCode::$DATABASEQUERYERROR,
 215                  vtws_getWebserviceTranslatedString('LBL_'.
 216                              WebServiceErrorCode::$DATABASEQUERYERROR));
 217          }
 218  
 219          return $this->retrieve(vtws_getId($this->meta->getEntityId(),$ids[1]));
 220      }
 221      
 222  	public function __delete($elemId){
 223          $result = null;
 224          $query = 'delete from '.$this->entityTableName.' where '.
 225                  $this->meta->getObectIndexColumn().'=?';
 226          $transactionSuccessful = vtws_runQueryAsTransaction($query,array($elemId),$result);
 227          return $transactionSuccessful;
 228      }
 229  
 230  	public function delete($id){
 231          $ids = vtws_getIdComponents($id);
 232          $elemId = $ids[1];
 233          
 234          $success = $this->__delete($elemId);
 235          if(!$success){
 236              throw new WebServiceException(WebServiceErrorCode::$DATABASEQUERYERROR,
 237                  vtws_getWebserviceTranslatedString('LBL_'.
 238                              WebServiceErrorCode::$DATABASEQUERYERROR));
 239          }
 240          return array("status"=>"successful");
 241      }
 242      
 243  	public function describe($elementType){
 244          
 245          $app_strings = VTWS_PreserveGlobal::getGlobal('app_strings');
 246          $current_user = vtws_preserveGlobal('current_user',$this->user);;
 247          $label = (isset($app_strings[$elementType]))? $app_strings[$elementType]:$elementType;
 248          $createable = $this->meta->hasWriteAccess();
 249          $updateable = $this->meta->hasWriteAccess();
 250          $deleteable = $this->meta->hasDeleteAccess();
 251          $retrieveable = $this->meta->hasReadAccess();
 252          $fields = $this->getModuleFields();
 253          return array("label"=>$label,"name"=>$elementType,"createable"=>$createable,"updateable"=>$updateable,
 254                  "deleteable"=>$deleteable,"retrieveable"=>$retrieveable,"fields"=>$fields,
 255                  "idPrefix"=>$this->meta->getEntityId(),'isEntity'=>$this->isEntity,'labelFields'=>$this->meta->getNameFields());
 256      }
 257      
 258  	function getModuleFields(){
 259          $app_strings = VTWS_PreserveGlobal::getGlobal('app_strings');
 260          if($this->moduleFields === null){
 261              $fields = array();
 262              $moduleFields = $this->meta->getModuleFields();
 263              foreach ($moduleFields as $fieldName=>$webserviceField) {
 264                  array_push($fields,$this->getDescribeFieldArray($webserviceField));
 265              }
 266              $label = ($app_strings[$this->meta->getObectIndexColumn()])? $app_strings[$this->meta->getObectIndexColumn()]:
 267                  $this->meta->getObectIndexColumn();
 268              $this->moduleFields = $fields;
 269          }
 270          return $this->moduleFields;
 271      }
 272      
 273  	function getDescribeFieldArray($webserviceField){
 274          $app_strings = VTWS_PreserveGlobal::getGlobal('app_strings');
 275          $fieldLabel = $webserviceField->getFieldLabelKey();
 276          if(isset($app_strings[$fieldLabel])){
 277              $fieldLabel = $app_strings[$fieldLabel];
 278          }
 279          if(strcasecmp($webserviceField->getFieldName(),$this->meta->getObectIndexColumn()) === 0){
 280              return $this->getIdField($fieldLabel);
 281          }
 282          
 283          $typeDetails = $this->getFieldTypeDetails($webserviceField);
 284          
 285          //set type name, in the type details array.
 286          $typeDetails['name'] = $webserviceField->getFieldDataType();
 287          $editable = $this->isEditable($webserviceField);
 288          
 289          $describeArray = array('name'=>$webserviceField->getFieldName(),'label'=>$fieldLabel,'mandatory'=>
 290              $webserviceField->isMandatory(),'type'=>$typeDetails,'nullable'=>$webserviceField->isNullable(),
 291              "editable"=>$editable);
 292          if($webserviceField->hasDefault()){
 293              $describeArray['default'] = $webserviceField->getDefault();
 294          }
 295          return $describeArray;
 296      }
 297  	public function query($q){
 298  
 299          $parser = new Parser($this->user, $q);
 300          $error = $parser->parse();
 301  
 302          if($error){
 303              return $parser->getError();
 304          }
 305  
 306          $mysql_query = $parser->getSql();
 307          $meta = $parser->getObjectMetaData();
 308          $this->pearDB->startTransaction();
 309          $result = $this->pearDB->pquery($mysql_query, array());
 310          $error = $this->pearDB->hasFailedTransaction();
 311          $this->pearDB->completeTransaction();
 312  
 313          if($error){
 314              throw new WebServiceException(WebServiceErrorCode::$DATABASEQUERYERROR,
 315                      vtws_getWebserviceTranslatedString('LBL_'.
 316                              WebServiceErrorCode::$DATABASEQUERYERROR));
 317          }
 318  
 319          $noofrows = $this->pearDB->num_rows($result);
 320          $output = array();
 321          for($i=0; $i<$noofrows; $i++){
 322              $row = $this->pearDB->fetchByAssoc($result,$i);
 323              if(!$meta->hasPermission(EntityMeta::$RETRIEVE,$row["crmid"])){
 324                  continue;
 325              }
 326              $output[] = DataTransform::sanitizeDataWithColumn($row,$meta);
 327          }
 328  
 329          return $output;
 330      }
 331  
 332  	protected function getElement(){
 333          return $this->element;
 334      }
 335  
 336  }
 337  ?>


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