[ 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 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 ?>
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 |