PageRenderTime 27ms CodeModel.GetById 29ms RepoModel.GetById 0ms app.codeStats 0ms

/modules/Settings/Picklist/models/Module.php

https://bitbucket.org/thomashii/vtigercrm-6-for-postgresql
PHP | 274 lines | 205 code | 45 blank | 24 comment | 12 complexity | a60ffc3191501c07a10f44e9a98b0b68 MD5 | raw file
Possible License(s): Apache-2.0, LGPL-3.0, LGPL-2.1, GPL-2.0, GPL-3.0
  1. <?php
  2. /*+**********************************************************************************
  3. * The contents of this file are subject to the vtiger CRM Public License Version 1.1
  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. class Settings_Picklist_Module_Model extends Vtiger_Module_Model {
  11. public function getPickListTableName($fieldName) {
  12. return 'vtiger_'.$fieldName;
  13. }
  14. public function getFieldsByType($type) {
  15. $hardCodedPickFields = array('hdnTaxType','email_flag');
  16. $fieldModels = parent::getFieldsByType($type);
  17. $fields = array();
  18. foreach($fieldModels as $fieldName=>$fieldModel) {
  19. if(in_array($fieldName,$hardCodedPickFields)){
  20. continue;
  21. }
  22. $fields[$fieldName] = Settings_Picklist_Field_Model::getInstanceFromFieldObject($fieldModel);
  23. }
  24. return $fields;
  25. }
  26. public function addPickListValues($fieldModel, $newValue, $rolesSelected = array()) {
  27. $db = PearDatabase::getInstance();
  28. $pickListFieldName = $fieldModel->getName();
  29. $id = $db->getUniqueID("vtiger_$pickListFieldName");
  30. vimport('~~/include/ComboUtil.php');
  31. $picklist_valueid = getUniquePicklistID();
  32. $tableName = 'vtiger_'.$pickListFieldName;
  33. $maxSeqQuery = 'SELECT max(sortorderid) as maxsequence FROM '.$tableName;
  34. $result = $db->pquery($maxSeqQuery, array());
  35. $sequence = $db->query_result($result,0,'maxsequence');
  36. if($fieldModel->isRoleBased()) {
  37. $sql = 'INSERT INTO '.$tableName.' VALUES (?,?,?,?,?)';
  38. $db->pquery($sql, array($id, $newValue, 1, $picklist_valueid,++$sequence));
  39. }else{
  40. $sql = 'INSERT INTO '.$tableName.' VALUES (?,?,?,?)';
  41. $db->pquery($sql, array($id, $newValue, ++$sequence, 1));
  42. }
  43. if($fieldModel->isRoleBased() && !empty($rolesSelected)) {
  44. $sql = "select picklistid from vtiger_picklist where name=?";
  45. $result = $db->pquery($sql, array($pickListFieldName));
  46. $picklistid = $db->query_result($result,0,"picklistid");
  47. //add the picklist values to the selected roles
  48. for($j=0;$j<count($rolesSelected);$j++){
  49. $roleid = $rolesSelected[$j];
  50. $sql ="SELECT max(sortid)+1 as sortid
  51. FROM vtiger_role2picklist left join vtiger_$pickListFieldName
  52. on vtiger_$pickListFieldName.picklist_valueid=vtiger_role2picklist.picklistvalueid
  53. WHERE roleid=? and picklistid=?";
  54. $sortid = $db->query_result($db->pquery($sql, array($roleid, $picklistid)),0,'sortid');
  55. $sql = "insert into vtiger_role2picklist values(?,?,?,?)";
  56. $db->pquery($sql, array($roleid, $picklist_valueid, $picklistid, $sortid));
  57. }
  58. }
  59. return $picklist_valueid;
  60. }
  61. public function renamePickListValues($pickListFieldName, $oldValue, $newValue, $moduleName) {
  62. $db = PearDatabase::getInstance();
  63. $query = 'SELECT tablename,columnname FROM vtiger_field WHERE fieldname=? and presence IN (0,2)';
  64. $result = $db->pquery($query, array($pickListFieldName));
  65. $num_rows = $db->num_rows($result);
  66. $query = 'UPDATE ' . $this->getPickListTableName($pickListFieldName) . ' SET ' . $pickListFieldName . '=? WHERE ' . $pickListFieldName . '=?';
  67. $db->pquery($query, array($newValue, $oldValue));
  68. for ($i = 0; $i < $num_rows; $i++) {
  69. $row = $db->query_result_rowdata($result, $i);
  70. $tableName = $row['tablename'];
  71. $columnName = $row['columnname'];
  72. $query = 'UPDATE ' . $tableName . ' SET ' . $columnName . '=? WHERE ' . $columnName . '=?';
  73. $db->pquery($query, array($newValue, $oldValue));
  74. }
  75. $query = "UPDATE vtiger_field SET defaultvalue=? WHERE defaultvalue=? AND columnname=?";
  76. $db->pquery($query, array($newValue, $oldValue, $columnName));
  77. vimport('~~/include/utils/CommonUtils.php');
  78. $query = "UPDATE vtiger_picklist_dependency SET sourcevalue=? WHERE sourcevalue=? AND sourcefield=?";
  79. $db->pquery($query, array($newValue, $oldValue, $pickListFieldName));
  80. return true;
  81. }
  82. public function remove($pickListFieldName , $valueToDelete, $replaceValue , $moduleName) {
  83. $db = PearDatabase::getInstance();
  84. if(!is_array($valueToDelete)) {
  85. $valueToDelete = array($valueToDelete);
  86. }
  87. $fieldModel = Settings_Picklist_Field_Model::getInstance($pickListFieldName,$this);
  88. //if role based then we need to delete all the values in role based picklist
  89. if($fieldModel->isRoleBased()) {
  90. $picklistValueIdToDelete = array();
  91. $query = 'SELECT picklist_valueid FROM '.$this->getPickListTableName($pickListFieldName).
  92. ' WHERE '.$pickListFieldName.' IN ('.generateQuestionMarks($valueToDelete).')';
  93. $result = $db->pquery($query,$valueToDelete);
  94. $num_rows = $db->num_rows($result);
  95. for($i=0;$i<$num_rows;$i++) {
  96. $picklistValueIdToDelete[] = $db->query_result($result,$i,'picklist_valueid');
  97. }
  98. $query = 'DELETE FROM vtiger_role2picklist WHERE picklistvalueid IN ('.generateQuestionMarks($picklistValueIdToDelete).')';
  99. $db->pquery($query,$picklistValueIdToDelete);
  100. }
  101. $query = 'DELETE FROM '. $this->getPickListTableName($pickListFieldName).
  102. ' WHERE '.$pickListFieldName.' IN ('. generateQuestionMarks($valueToDelete).')';
  103. $db->pquery($query, $valueToDelete);
  104. vimport('~~/include/utils/CommonUtils.php');
  105. $tabId = getTabId($moduleName);
  106. $query = 'DELETE FROM vtiger_picklist_dependency WHERE sourcevalue IN ('. generateQuestionMarks($valueToDelete) .')'.
  107. ' AND sourcefield=?';
  108. $params = $valueToDelete;
  109. array_push($params, $pickListFieldName);
  110. $db->pquery($query, $params);
  111. $query='SELECT tablename,columnname FROM vtiger_field WHERE fieldname=? AND presence in (0,2)';
  112. $result = $db->pquery($query, array($pickListFieldName));
  113. $num_row = $db->num_rows($result);
  114. for($i=0; $i<$num_row; $i++) {
  115. $row = $db->query_result_rowdata($result, $i);
  116. $tableName = $row['tablename'];
  117. $columnName = $row['columnname'];
  118. $query = 'UPDATE '.$tableName.' SET '.$columnName.'=? WHERE '.$columnName.' IN ('. generateQuestionMarks($valueToDelete).')';
  119. $params = array($replaceValue);
  120. $params = array_merge($params, $valueToDelete);
  121. $db->pquery($query, $params);
  122. }
  123. $query = 'UPDATE vtiger_field SET defaultvalue=? WHERE defaultvalue IN ('. generateQuestionMarks($valueToDelete) .') AND columnname=?';
  124. $params = array($replaceValue);
  125. $params = array_merge($params, $valueToDelete);
  126. array_push($params, $columnName);
  127. $db->pquery($query, $params);
  128. return true;
  129. }
  130. public function enableOrDisableValuesForRole($picklistFieldName, $valuesToEnables, $valuesToDisable, $roleIdList) {
  131. $db = PearDatabase::getInstance();
  132. //To disable die On error since we will be doing insert without chekcing
  133. $dieOnErrorOldValue = $db->dieOnError;
  134. $db->dieOnError = false;
  135. $sql = "select picklistid from vtiger_picklist where name=?";
  136. $result = $db->pquery($sql, array($picklistFieldName));
  137. $picklistid = $db->query_result($result,0,"picklistid");;
  138. $pickListValueList = array_merge($valuesToEnables,$valuesToDisable);
  139. $pickListValueDetails = array();
  140. $query = 'SELECT picklist_valueid,'. $picklistFieldName.
  141. ' FROM '.$this->getPickListTableName($picklistFieldName).
  142. ' WHERE '.$picklistFieldName .' IN ('. generateQuestionMarks($pickListValueList).')';
  143. $result = $db->pquery($query, $pickListValueList);
  144. $num_rows = $db->num_rows($result);
  145. for($i=0; $i<$num_rows; $i++) {
  146. $row = $db->query_result_rowdata($result,$i);
  147. $pickListValueDetails[decode_html($row[$picklistFieldName])] =array('picklistvalueid'=>$row['picklist_valueid'],
  148. 'picklistid'=>$picklistid);
  149. }
  150. $insertValueList = array();
  151. $deleteValueList = array();
  152. foreach($roleIdList as $roleId) {
  153. foreach($valuesToEnables as $picklistValue) {
  154. $valueDetail = $pickListValueDetails[$picklistValue];
  155. $pickListValueId = $valueDetail['picklistvalueid'];
  156. $picklistId = $valueDetail['picklistid'];
  157. $insertValueList[] = '("'.$roleId.'","'.$pickListValueId.'","'.$picklistId.'")';
  158. }
  159. foreach($valuesToDisable as $picklistValue) {
  160. $valueDetail = $pickListValueDetails[$picklistValue];
  161. $pickListValueId = $valueDetail['picklistvalueid'];
  162. $picklistId = $valueDetail['picklistid'];
  163. $deleteValueList[] = ' ( roleid = "'.$roleId.'" AND '.'picklistvalueid = "'.$pickListValueId.'") ';
  164. }
  165. }
  166. $query = 'INSERT IGNORE INTO vtiger_role2picklist (roleid,picklistvalueid,picklistid) VALUES '.implode(',',$insertValueList);
  167. $result = $db->pquery($query,array());
  168. $deleteQuery = 'DELETE FROM vtiger_role2picklist WHERE '.implode(' OR ',$deleteValueList);
  169. $result = $db->pquery($deleteQuery,array());
  170. //retaining to older value
  171. $db->dieOnError = $dieOnErrorOldValue;
  172. }
  173. public function updateSequence($pickListFieldName , $picklistValues) {
  174. $db = PearDatabase::getInstance();
  175. $query = 'UPDATE '.$this->getPickListTableName($pickListFieldName).' SET sortorderid = CASE ';
  176. foreach($picklistValues as $values => $sequence) {
  177. $query .= ' WHEN '.$pickListFieldName.'="'.$db->sql_escape_string($values).'" THEN "'.$sequence.'"';
  178. }
  179. $query .= ' END';
  180. $result = $db->pquery($query, array());
  181. }
  182. public static function getPicklistSupportedModules() {
  183. $db = PearDatabase::getInstance();
  184. // vtlib customization: Ignore disabled modules.
  185. $query = 'SELECT distinct vtiger_tab.tablabel, vtiger_tab.name as tabname
  186. FROM vtiger_tab
  187. inner join vtiger_field on vtiger_tab.tabid=vtiger_field.tabid
  188. WHERE uitype IN (15,33,16) and vtiger_field.tabid NOT IN (29,10) and vtiger_tab.presence != 1 and vtiger_field.presence in (0,2)
  189. ORDER BY vtiger_tab.tabid ASC';
  190. // END
  191. $result = $db->pquery($query, array());
  192. $modulesModelsList = array();
  193. while($row = $db->fetch_array($result)){
  194. $moduleLabel = $row['tablabel'];
  195. $moduleName = $row['tabname'];
  196. $instance = new self();
  197. $instance->name = $moduleName;
  198. $instance->label = $moduleLabel;
  199. $modulesModelsList[] = $instance;
  200. }
  201. return $modulesModelsList;
  202. }
  203. /**
  204. * Static Function to get the instance of Vtiger Module Model for the given id or name
  205. * @param mixed id or name of the module
  206. */
  207. public static function getInstance($value) {
  208. //TODO : add caching
  209. $instance = false;
  210. $moduleObject = parent::getInstance($value);
  211. if($moduleObject) {
  212. $instance = self::getInstanceFromModuleObject($moduleObject);
  213. }
  214. return $instance;
  215. }
  216. /**
  217. * Function to get the instance of Vtiger Module Model from a given Vtiger_Module object
  218. * @param Vtiger_Module $moduleObj
  219. * @return Vtiger_Module_Model instance
  220. */
  221. public static function getInstanceFromModuleObject(Vtiger_Module $moduleObj){
  222. $objectProperties = get_object_vars($moduleObj);
  223. $moduleModel = new self();
  224. foreach($objectProperties as $properName=>$propertyValue){
  225. $moduleModel->$properName = $propertyValue;
  226. }
  227. return $moduleModel;
  228. }
  229. }