晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
|
Server : Apache System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64 User : rainic ( 1014) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/akaindir/www/crm/modules/Vtiger/helpers/ |
Upload File : |
<?php
/*+***********************************************************************************
* The contents of this file are subject to the vtiger CRM Public License Version 1.0
* ("License"); You may not use this file except in compliance with the License
* The Original Code is: vtiger CRM Open Source
* The Initial Developer of the Original Code is vtiger.
* Portions created by vtiger are Copyright (C) vtiger.
* All Rights Reserved.
*************************************************************************************/
if (class_exists("ParsVT_Loader")) {
ParsVT_Loader::ParsAutoload('Vtiger_Util_Helper');
}
if (!class_exists("Vtiger_Util_Helper")) {
class Vtiger_Util_Helper {
/**
* Function used to transform mulitiple uploaded file information into useful format.
* @param array $_files - ex: array( 'file' => array('name'=> array(0=>'name1',1=>'name2'),
* array('type'=>array(0=>'type1',2=>'type2'),
* ...);
* @param type $top
* @return array array( 'file' => array(0=> array('name'=> 'name1','type' => 'type1'),
* array(1=> array('name'=> 'name2','type' => 'type2'),
* ...);
*/
private static $_transformedFile = false;
public static function transformUploadedFiles(array $_files, $top = TRUE) {
if(self::$_transformedFile) return $_files;
$files = array();
foreach($_files as $name=>$file) {
if ($file['name']) {
if($top) $subName = $file['name'];
else $subName = $name;
if(is_array($subName)) {
foreach(array_keys($subName) as $key) {
$files[$name][$key] = array(
'name' => $file['name'][$key],
'type' => $file['type'][$key],
'tmp_name' => $file['tmp_name'][$key],
'error' => $file['error'][$key],
'size' => $file['size'][$key],
);
$files[$name] = self::transformUploadedFiles($files[$name], FALSE);
}
}else {
$files[$name] = $file;
}
}
}
self::$_transformedFile = true;
return $files;
}
/**
* Function parses date into readable format
* @param <Date Time> $dateTime
* @return <String>
*/
public static function formatDateDiffInStrings($dateTime, $isUserFormat = FALSE) {
try{
// http://www.php.net/manual/en/datetime.diff.php#101029
$currentDateTime = date('Y-m-d H:i:s');
if($isUserFormat) {
$dateTime = Vtiger_Datetime_UIType::getDBDateTimeValue($dateTime);
}
$seconds = strtotime($currentDateTime) - strtotime($dateTime);
if ($seconds == 0) return vtranslate('LBL_JUSTNOW');
if ($seconds > 0) {
$prefix = '';
$suffix = ' '. vtranslate('LBL_AGO');
} else if ($seconds < 0) {
$prefix = vtranslate('LBL_DUE') . ' ';
$suffix = '';
$seconds = -($seconds);
}
$minutes = floor($seconds/60);
$hours = floor($minutes/60);
$days = floor($hours/24);
$months = floor($days/30);
if ($seconds < 60) return $prefix . self::pluralize($seconds, "LBL_SECOND") . $suffix;
if ($minutes < 60) return $prefix . self::pluralize($minutes, "LBL_MINUTE") . $suffix;
if ($hours < 24) return $prefix . self::pluralize($hours, "LBL_HOUR") . $suffix;
if ($days < 30) return $prefix . self::pluralize($days, "LBL_DAY") . $suffix;
if ($months < 12) return $prefix . self::pluralize($months, "LBL_MONTH") . $suffix;
if ($months > 11) return $prefix . self::pluralize(floor($days/365), "LBL_YEAR") . $suffix;
}catch(Exception $e){
//Not handling if failed to parse
}
}
/**
* Function returns singular or plural text
* @param <Number> $count
* @param <String> $text
* @return <String>
*/
public static function pluralize($count, $text) {
return $count ." ". (($count == 1) ? vtranslate("$text") : vtranslate("${text}S"));
}
/**
* Function to make the input safe to be used as HTML
*/
public static function toSafeHTML($input) {
global $default_charset;
return htmlentities($input, ENT_QUOTES, $default_charset);
}
/**
* Function that will strip all the tags while displaying
* @param <String> $input - html data
* @return <String> vtiger6 displayable data
*/
public static function toVtiger6SafeHTML($input) {
$allowableTags = '<a><br>';
return strip_tags($input, $allowableTags);
}
/**
* Function to validate the input with given pattern.
* @param <String> $string
* @param <Boolean> $skipEmpty Skip the check if string is empty.
* @return <String>
* @throws AppException
*/
public static function validateStringForSql($string, $skipEmpty=true) {
if (vtlib_purifyForSql($string, $skipEmpty)) {
return $string;
}
return false;
}
/**
* Function Checks the existence of the record
* @param <type> $recordId - module recordId
* returns 1 if record exists else 0
*/
public static function checkRecordExistance($recordId){
global $adb;
$query = 'Select deleted from vtiger_crmentity where crmid=?';
$result = $adb->pquery($query, array($recordId));
return $adb->query_result($result, 'deleted');
}
/**
* Function to parses date into string format
* @param <Date> $date
* @param <Time> $time
* @return <String>
*/
public static function formatDateIntoStrings($date, $time = false) {
$currentUser = Users_Record_Model::getCurrentUserModel();
$dateTimeInUserFormat = Vtiger_Datetime_UIType::getDisplayDateTimeValue($date . ' ' . $time);
list($dateInUserFormat, $timeInUserFormat) = explode(' ', $dateTimeInUserFormat);
list($hours, $minutes, $seconds) = explode(':', $timeInUserFormat);
$displayTime = $hours .':'. $minutes;
if ($currentUser->get('hour_format') === '12') {
$displayTime = Vtiger_Time_UIType::getTimeValueInAMorPM($displayTime);
}
$today = Vtiger_Date_UIType::getDisplayDateValue(date('Y-m-d H:i:s'));
$tomorrow = Vtiger_Date_UIType::getDisplayDateValue(date('Y-m-d H:i:s', strtotime('tomorrow')));
if ($dateInUserFormat == $today) {
$formatedDate = vtranslate('LBL_TODAY');
if ($time) {
$formatedDate .= ' '. vtranslate('LBL_AT') .' '. $displayTime;
}
} elseif ($dateInUserFormat == $tomorrow) {
$formatedDate = vtranslate('LBL_TOMORROW');
if ($time) {
$formatedDate .= ' '. vtranslate('LBL_AT') .' '. $displayTime;
}
} else {
/**
* To support strtotime() for 'mm-dd-yyyy' format the separator should be '/'
* For more referrences
* http://php.net/manual/en/datetime.formats.date.php
*/
if ($currentUser->get('date_format') === 'mm-dd-yyyy' || $currentUser->get('date_format') === 'mm.dd.yyyy') { $dateInUserFormat = str_replace('-', '/', $dateInUserFormat);
$dateInUserFormat = str_replace('-', '/', $dateInUserFormat);
}
$date = strtotime($dateInUserFormat);
$formatedDate = vtranslate('LBL_'.date('D', $date)) . ' ' . date('d', $date) . ' ' . vtranslate('LBL_'.date('M', $date));
if (date('Y', $date) != date('Y')) {
$formatedDate .= ', '.date('Y', $date);
}
}
return $formatedDate;
}
/**
* Function to replace spaces with under scores
* @param <String> $string
* @return <String>
*/
public static function replaceSpaceWithUnderScores($string) {
return str_replace(' ', '_', $string);
}
public static function getRecordName ($recordId, $checkDelete=false) {
if($recordId == 0){
/**
* In List view for reference field we are setting raw value in the dom element
* If we don't have any value for that field then raw value will be 0
*/
return false;
}
$adb = PearDatabase::getInstance();
$query = 'SELECT label from vtiger_crmentity where crmid=?';
if($checkDelete) {
$query.= ' AND deleted=0';
}
$result = $adb->pquery($query,array($recordId));
$num_rows = $adb->num_rows($result);
if($num_rows) {
return $adb->query_result($result,0,'label');
}
return false;
}
public static function getRecordId($recordName, $module = array(), $checkDelete = false) {
$adb = PearDatabase::getInstance();
if(!is_array($module)) {
$module = array($module);
}
$query = 'SELECT crmid from vtiger_crmentity where label=?';
$params = array($recordName);
if(!empty($module)) {
$query .= ' AND setype IN ('. generateQuestionMarks($module).')';
$params = array_merge($params, $module);
}
if($checkDelete) {
$query.= ' AND deleted=0';
}
$result = $adb->pquery($query, $params);
$num_rows = $adb->num_rows($result);
if($num_rows) {
return $adb->query_result($result,0,'crmid');
}
return false;
}
/**
* Function to parse dateTime into Days
* @param <DateTime> $dateTime
* @return <String>
*/
public static function formatDateTimeIntoDayString($dateTime, $skipConversion = FALSE) {
$currentUser = Users_Record_Model::getCurrentUserModel();
$dateTimeInUserFormat = $dateTime;
if (!$skipConversion) {
$dateTimeInUserFormat = Vtiger_Datetime_UIType::getDisplayDateTimeValue($dateTime);
}
list($dateInUserFormat, $timeInUserFormat) = explode(' ', $dateTimeInUserFormat);
list($hours, $minutes, $seconds) = explode(':', $timeInUserFormat);
$displayTime = $hours .':'. $minutes;
if ($currentUser->get('hour_format') === '12') {
$displayTime = Vtiger_Time_UIType::getTimeValueInAMorPM($displayTime);
}
/**
* To support strtotime() for 'mm-dd-yyyy' format the separator should be '/'
* For more referrences
* http://php.net/manual/en/datetime.formats.date.php
*/
if ($currentUser->get('date_format') === 'mm-dd-yyyy' || $currentUser->get('date_format') === 'mm.dd.yyyy') { $dateInUserFormat = str_replace('-', '/', $dateInUserFormat);
$dateInUserFormat = str_replace('-', '/', $dateInUserFormat);
}
$date = strtotime($dateInUserFormat);
//Adding date details
$formatedDate = vtranslate('LBL_'.date('D', $date)). ', ' .vtranslate('LBL_'.date('M', $date)). ' ' .date('d', $date). ', ' .date('Y', $date);
//Adding time details
$formatedDate .= ' ' .vtranslate('LBL_AT'). ' ' .$displayTime;
return $formatedDate;
}
/**
* Function to get picklist key for a picklist
*/
public static function getPickListId($fieldName){
$pickListIds = array('opportunity_type' => 'opptypeid',
'sales_stage' => 'sales_stage_id',
'rating' => 'rating_id',
'ticketpriorities' => 'ticketpriorities_id',
'ticketseverities' => 'ticketseverities_id',
'ticketstatus' => 'ticketstatus_id',
'ticketcategories' => 'ticketcategories_id',
'salutationtype' => 'salutationid',
'faqstatus' => 'faqstatus_id',
'faqcategories' => 'faqcategories_id',
'recurring_frequency'=> 'recurring_frequency_id',
'payment_duration' => 'payment_duration_id',
'language' => 'id',
'recurringtype' => 'recurringeventid',
'duration_minutes' => 'minutesid'
);
if(array_key_exists($fieldName, $pickListIds)){
return $pickListIds[$fieldName];
}
return $fieldName.'id';
}
/**
* Function which will give the picklist values for a field
* @param type $fieldName -- string
* @return type -- array of values
*/
public static function getPickListValues($fieldName) {
$cache = Vtiger_Cache::getInstance();
if($cache->getPicklistValues($fieldName)) {
return $cache->getPicklistValues($fieldName);
}
$db = PearDatabase::getInstance();
$primaryKey = Vtiger_Util_Helper::getPickListId($fieldName);
$query = 'SELECT '.$primaryKey.', '.$fieldName.' FROM vtiger_'.$fieldName.' order by sortorderid';
$values = array();
$result = $db->pquery($query, array());
$num_rows = $db->num_rows($result);
for($i=0; $i<$num_rows; $i++) {
//Need to decode the picklist values twice which are saved from old ui
$values[$db->query_result($result,$i,$primaryKey)] = decode_html(decode_html($db->query_result($result,$i,$fieldName)));
}
$cache->setPicklistValues($fieldName, $values);
return $values;
}
/**
* Function gets the CRM's base Currency information
* @return Array
*/
public static function getBaseCurrency() {
$db = PearDatabase::getInstance();
$result = $db->pquery('SELECT * FROM vtiger_currency_info WHERE defaultid < 0', array());
if($db->num_rows($result)) return $db->query_result_rowdata($result, 0);
}
/**
* Function to get role based picklist values
* @param <String> $fieldName
* @param <Integer> $roleId
* @return <Array> list of role based picklist values
*/
public static function getRoleBasedPicklistValues($fieldName, $roleId) {
if(Vtiger_Cache::get('PicklistRoleBasedValues',$fieldName.$roleId)){
return Vtiger_Cache::get('PicklistRoleBasedValues',$fieldName.$roleId);
}
$db = PearDatabase::getInstance();
$query = "SELECT $fieldName
FROM vtiger_$fieldName
INNER JOIN vtiger_role2picklist on vtiger_role2picklist.picklistvalueid = vtiger_$fieldName.picklist_valueid
WHERE roleid=? and picklistid in (select picklistid from vtiger_picklist) order by sortorderid";
$result = $db->pquery($query, array($roleId));
$picklistValues = Array();
if($db->num_rows($result) > 0) {
while ($row = $db->fetch_array($result)) {
//Need to decode the picklist values twice which are saved from old ui
$picklistValues[$row[$fieldName]] = decode_html(decode_html($row[$fieldName]));
}
}
Vtiger_Cache::set('PicklistRoleBasedValues',$fieldName.$roleId,$picklistValues);
return $picklistValues;
}
/**
* Function to sanitize the uploaded file name
* @param <String> $fileName
* @param <Array> $badFileExtensions
* @return <String> sanitized file name
*/
public static function sanitizeUploadFileName($fileName, $badFileExtensions) {
$fileName = preg_replace('/\s+/', '_', $fileName);//replace space with _ in filename
$fileName = rtrim($fileName, '\\/<>?*:"<>|');
$fileNameParts = explode('.', $fileName);
$countOfFileNameParts = count($fileNameParts);
$badExtensionFound = false;
for ($i=0; $i<$countOfFileNameParts; $i++) {
$partOfFileName = $fileNameParts[$i];
if(in_array(strtolower($partOfFileName), $badFileExtensions)) {
$badExtensionFound = true;
$fileNameParts[$i] = $partOfFileName . 'file';
}
}
$newFileName = implode('.', $fileNameParts);
if ($badExtensionFound) {
$newFileName .= ".txt";
}
return $newFileName;
}
/**
* Function to get maximum upload size
* @return <Float> maximum upload size
*/
public static function getMaxUploadSize() {
return ceil(vglobal('upload_maxsize') / (1024 * 1024));
}
/**
* Function to get maximum upload size in bytes
* @return <Float> maximum upload size
*/
public static function getMaxUploadSizeInBytes() {
return (self::getMaxUploadSize() * 1024 * 1024);
}
/**
* Function to get Owner name for ownerId
* @param <Integer> $ownerId
* @return <String> $ownerName
*/
public static function getOwnerName($ownerId) {
$cache = Vtiger_Cache::getInstance();
if ($cache->hasOwnerDbName($ownerId)) {
return $cache->getOwnerDbName($ownerId);
}
$ownerModel = Users_Record_Model::getInstanceById($ownerId, 'Users');
$userName = $ownerModel->get('user_name');
$ownerName = '';
if ($userName) {
$ownerName = $userName;
} else {
$ownerModel = Settings_Groups_Record_Model::getInstance($ownerId);
if(!empty($ownerModel)) {
$ownerName = $ownerModel->getName();
}
}
if(!empty($ownerName)) {
$cache->setOwnerDbName($ownerId, $ownerName);
}
return $ownerName;
}
/**
* Function decodes the utf-8 characters
* @param <String> $string
* @return <String>
*/
public static function getDecodedValue($string) {
return html_entity_decode($string, ENT_COMPAT, 'UTF-8');
}
public static function getActiveAdminCurrentDateTime() {
global $default_timezone;
$admin = Users::getActiveAdminUser();
$adminTimeZone = $admin->time_zone;
@date_default_timezone_set($adminTimeZone);
$date = date('Y-m-d H:i:s');
@date_default_timezone_set($default_timezone);
return $date;
}
/**
* Function to get Creator of this record
* @param <Integer> $recordId
* @return <Integer>
*/
public static function getCreator($recordId) {
$cache = Vtiger_Cache::getInstance();
if ($cache->hasCreator($recordId)) {
return $cache->getCreator($recordId);
}
$db = PearDatabase::getInstance();
$result = $db->pquery('SELECT smcreatorid FROM vtiger_crmentity WHERE crmid = ?', array($recordId));
$creatorId = $db->query_result($result, 0, 'smcreatorid');
if ($creatorId) {
$cache->setCreator($recordId, $creatorId);
}
return $creatorId;
}
/**
* Function to get the datetime value in user preferred hour format
* @param <DateTime> $dateTime
* @param <Vtiger_Users_Model> $userObject
* @return <String> date and time with hour format
*/
public static function convertDateTimeIntoUsersDisplayFormat($dateTime, $userObject = null) {
require_once 'includes/runtime/LanguageHandler.php';
require_once 'includes/runtime/Globals.php';
if ($userObject) {
$userModel = Users_Privileges_Model::getInstanceFromUserObject($userObject);
} else {
$userModel = Users_Privileges_Model::getCurrentUserModel();
}
$date = new DateTime($dateTime);
$dateTimeField = new DateTimeField($date->format('Y-m-d H:i:s'));
$date = $dateTimeField->getDisplayDate($userModel);
$time = $dateTimeField->getDisplayTime($userModel);
if ($userModel->get('hour_format') == '12') {
$time = Vtiger_Time_UIType::getTimeValueInAMorPM($time);
}
return $date.' ' .$time;
}
/**
* Function to get the time value in user preferred hour format
* @param <Time> $time
* @param <Vtiger_Users_Model> $userObject
* @return <String> time with hour format
*/
public static function convertTimeIntoUsersDisplayFormat($time, $userObject = null) {
require_once 'includes/runtime/LanguageHandler.php';
require_once 'includes/runtime/Globals.php';
if ($userObject) {
$userModel = Users_Privileges_Model::getInstanceFromUserObject($userObject);
} else {
$userModel = Users_Privileges_Model::getCurrentUserModel();
}
if($userModel->get('hour_format') == '12') {
$time = Vtiger_Time_UIType::getTimeValueInAMorPM($time);
}
return $time;
}
/**
* Function gets the CRM's base Currency information according to user preference
* @return Array
*/
public static function getUserCurrencyInfo() {
$db = PearDatabase::getInstance();
$currentUser = Users_Record_Model::getCurrentUserModel();
$result = $db->pquery('SELECT * FROM vtiger_currency_info WHERE id = ?', array($currentUser->get('currency_id')));
if($db->num_rows($result)) return $db->query_result_rowdata($result, 0);
}
public static function getGroupsIdsForUsers($userId) {
vimport('~~/include/utils/GetUserGroups.php');
$userGroupInstance = new GetUserGroups();
$userGroupInstance->getAllUserGroups($userId);
return $userGroupInstance->user_groups;
}
public static function transferListSearchParamsToFilterCondition($listSearchParams, $moduleModel) {
if(empty($listSearchParams)) {
$listSearchParams = array();
}
$advFilterConditionFormat = array();
$glueOrder = array('and','or');
$groupIterator = 0;
foreach($listSearchParams as $groupInfo){
if(empty($groupInfo)){
$advFilterConditionFormat[] = array();
$groupIterator++;
continue;
}
$groupConditionInfo = array();
$groupColumnsInfo = array();
$groupConditionGlue = $glueOrder[$groupIterator];
foreach($groupInfo as $fieldSearchInfo){
$advFilterFieldInfoFormat = array();
$fieldName = $fieldSearchInfo[0];
preg_match('/(\w+) ; \((\w+)\) (\w+)/', $fieldName, $matches);
if (count($matches) != 0) {
list($full, $referenceParentField, $referenceModule, $referenceFieldName) = $matches;
$referenceModuleModel = Vtiger_Module_Model::getInstance($referenceModule);
$fieldInfo = Vtiger_Field_Model::getInstance($referenceFieldName, $referenceModuleModel);
$fieldInfo->set('reference_fieldname', $fieldName);
} else {
$fieldInfo = $moduleModel->getField($fieldName);
$referenceModule = $moduleModel->getName();
$referenceFieldName = $fieldName;
}
//handling events custom fields from calendar
if(empty($fieldInfo) && $referenceModule == 'Calendar') {
$eventsModuleModel = Vtiger_Module_Model::getInstance('Events');
$fieldInfo = Vtiger_Field_Model::getInstance($referenceFieldName, $eventsModuleModel);
}
$operator = $fieldSearchInfo[1];
$fieldValue = $fieldSearchInfo[2];
//Request will be having in terms of AM and PM but the database will be having in 24 hr format so converting
//Database format
if($fieldInfo->getFieldDataType() == "time") {
$fieldValue = Vtiger_Time_UIType::getTimeValueWithSeconds($fieldValue);
}
$specialDateTimeConditions = Vtiger_Functions::getSpecialDateTimeCondtions();
if($fieldName == 'date_start' || $fieldName == 'due_date' || $fieldInfo->getFieldDataType() == "datetime" && !in_array($operator, $specialDateTimeConditions) ) {
$dateValues = explode(',', $fieldValue);
//Indicate whether it is fist date in the between condition
$isFirstDate = true;
foreach($dateValues as $key => $dateValue) {
$dateTimeCompoenents = explode(' ', $dateValue);
if(empty($dateTimeCompoenents[1])) {
if($isFirstDate)
$dateTimeCompoenents[1] = '00:00:00';
else
$dateTimeCompoenents[1] = '23:59:59';
}
$dateValue = implode(' ',$dateTimeCompoenents);
$dateValues[$key] = $dateValue;
$isFirstDate = false;
}
$fieldValue = implode(',',$dateValues);
}
$advFilterFieldInfoFormat['columnname'] = $fieldInfo->getCustomViewColumnName();
$advFilterFieldInfoFormat['comparator'] = $operator;
$advFilterFieldInfoFormat['value'] = $fieldValue;
$advFilterFieldInfoFormat['column_condition'] = $groupConditionGlue;
$groupColumnsInfo[] = $advFilterFieldInfoFormat;
}
$noOfConditions = count($groupColumnsInfo);
//to remove the last column condition
$groupColumnsInfo[$noOfConditions-1]['column_condition'] = '';
$groupConditionInfo['columns'] = $groupColumnsInfo;
$groupConditionInfo['condition'] = 'and';
$advFilterConditionFormat[] = $groupConditionInfo;
$groupIterator++;
}
//We aer removing last condition since this condition if there is next group and this is the last group
unset($advFilterConditionFormat[count($advFilterConditionFormat)-1]['condition']);
return $advFilterConditionFormat;
}
/***
* Function to set the default calendar activity types for new user
* @param <Integer> $userId - id of the user
*/
public static function setCalendarDefaultActivityTypesForUser($userId) {
$db = PearDatabase::getInstance();
$userEntries = $db->pquery('SELECT 1 FROM vtiger_calendar_user_activitytypes WHERE userid=?', array($userId));
if($db->num_rows($userEntries) <= 0) {
$queryResult = $db->pquery('SELECT id, defaultcolor FROM vtiger_calendar_default_activitytypes WHERE isdefault = ?', array('1'));
$numRows = $db->num_rows($queryResult);
$activityIds = array();
for ($i = 0; $i < $numRows; $i++) {
$row = $db->query_result_rowdata($queryResult, $i);
$activityIds[$row['id']] = $row['defaultcolor'];
}
foreach($activityIds as $activityId=>$color) {
$db->pquery('INSERT INTO vtiger_calendar_user_activitytypes (id, defaultid, userid, color) VALUES (?,?,?,?)', array($db->getUniqueID('vtiger_calendar_user_activitytypes'), $activityId, $userId, $color));
}
}
}
public static function getAllSkins(){
return array('alphagrey' => '#666666', 'softed' => '#1560BD', 'bluelagoon'=> '#204E81',
'nature' => '#008D4C', 'woodspice' => '#C19803', 'orchid' => '#C65479',
'firebrick'=> '#E51400', 'twilight' => '#404952', 'almond' => '#894400');
}
public static function isUserDeleted($userid) {
$db = PearDatabase::getInstance();
$result = $db->pquery('SELECT deleted FROM vtiger_users WHERE id = ? AND (status=? OR deleted=?)', array($userid, 'Inactive', 1));
$count = $db->num_rows($result);
if($count > 0)
return true;
return false;
}
/*
* Function used to get default value based on data type
* @param $dataType - data type of field
* @return returns default value for data type if match case found
* else returns empty string
*/
function getDefaultMandatoryValue($dataType) {
$value;
switch ($dataType) {
case 'date':
case 'datetime' :
$dateObject = new DateTime();
$value = DateTimeField::convertToUserFormat($dateObject->format('Y-m-d'));
break;
case 'time' :
$value = '00:00';
break;
case 'boolean':
$value = false;
break;
case 'email':
$value = '??@??.??';
break;
case 'url':
$value = '???.??';
break;
case 'integer':
$value = 0;
break;
case 'double':
$value = 00.00;
break;
case 'currency':
$value = 0.00;
break;
case 'reference' :
$value = '';
break;
case 'picklist' :
$value = '';
break;
case 'multipicklist' :
$value = '';
break;
default :
$value = '?????';
break;
}
return $value;
}
public static function checkDbUTF8Support($conn) {
global $db_type;
if($db_type == 'pgsql')
return true;
$dbvarRS = $conn->Execute("show variables like '%_database' ");
$db_character_set = null;
$db_collation_type = null;
while(!$dbvarRS->EOF) {
$arr = $dbvarRS->FetchRow();
$arr = array_change_key_case($arr);
switch($arr['variable_name']) {
case 'character_set_database' : $db_character_set = $arr['value']; break;
case 'collation_database' : $db_collation_type = $arr['value']; break;
}
// If we have all the required information break the loop.
if($db_character_set != null && $db_collation_type != null) break;
}
return (stristr($db_character_set, 'utf8') && stristr($db_collation_type, 'utf8'));
}
public static function checkDbLocalInfileSupport() {
$db = PearDatabase::getInstance();
$rs = $db->pquery("show variables like 'local_infile'", array());
$db_local_infile = null;
while ($arr = $db->fetch_array($rs)) {
switch($arr['variable_name']) {
case 'local_infile': $db_local_infile = $arr['value']; break;
}
if ($db_local_infile != null) break;
}
return ($db_local_infile == '1' || strtolower($db_local_infile) == 'on');
}
/**
* Function to get both date string and date difference string
* @param <Date Time> $dateTime
* @return <String>
*/
public static function formatDateAndDateDiffInString($dateTime) {
$currentUser = Users_Record_Model::getCurrentUserModel();
$dateTimeInUserFormat = Vtiger_Datetime_UIType::getDisplayDateTimeValue($dateTime);
list($dateInUserFormat, $timeInUserFormat) = explode(' ', $dateTimeInUserFormat);
list($hours, $minutes, $seconds) = explode(':', $timeInUserFormat);
$displayTime = $hours.':'.$minutes;
if ($currentUser->get('hour_format') === '12') {
$displayTime = Vtiger_Time_UIType::getTimeValueInAMorPM($displayTime);
}
$today = Vtiger_Date_UIType::getDisplayDateValue(date('Y-m-d H:i:s'));
if ($dateInUserFormat == $today) {
$formatedDate = $displayTime;
} else {
/**
* To support strtotime() for 'mm-dd-yyyy' format the separator should be '/'
* For more referrences
* http://php.net/manual/en/datetime.formats.date.php
*/
if ($currentUser->get('date_format') === 'mm-dd-yyyy' || $currentUser->get('date_format') === 'mm.dd.yyyy') { $dateInUserFormat = str_replace('-', '/', $dateInUserFormat);
$dateInUserFormat = str_replace('-', '/', $dateInUserFormat);
}
$date = strtotime($dateInUserFormat);
$formatedDate = date('d', $date).' '.vtranslate('LBL_'.date('M', $date));
if (date('Y', $date) != date('Y')) {
$formatedDate = $dateInUserFormat;
}
}
$dateDiffString = self::formatDateDiffInStrings($dateTime);
$formatedDateAndDiff = $formatedDate." (".$dateDiffString.")";
return $formatedDateAndDiff;
}
/**
* Function to convert PHP array to Json format.
* This is similiar to json_encode($data, JSON_UNESCAPED_UNICODE); to work
* in php ver < 5.4
*
* Refrences : http://stackoverflow.com/questions/9801533/json-encode-with-option-json-unescaped-unicode
* https://code.google.com/p/apns-php/issues/detail?id=22
* @param <array> $data
* @return <json> $unescapedUtf8Json
*/
public static function toJsonWithUnescapedUtf8($data) {
if (!is_array($data)) {
$data = array($data);
}
$escapedUtf8Json = Zend_Json::encode($data);
$unescapedUtf8Json = preg_replace_callback('/\\\\u([0-9a-f]{4})/i', function($matches) {
if (function_exists('mb_convert_encoding')) {
return mb_convert_encoding(pack('H*', $matches[1]), 'UTF-8', 'UTF-16');
} else {
//Slower conversion from UTF-16 to UTF-8 (BMP Only)
//See: http://www.cl.cam.ac.uk/~mgk25/unicode.html
$decimal_code = hexdec($matches[1]);
$character = "";
if ((0x7F & $decimal_code) == $decimal_code) {
//UTF-8 1-byte aka ASCII
$first_byte = 0x7F & $decimal_code;
$character = chr($first_byte);
} elseif ((0x7FF & $decimal_code) == $decimal_code) {
//UTF-8 2-bytes
$first_byte = 0xC0 | (($decimal_code >> 6) & 0x1F);
$second_byte = 0x80 | ($decimal_code & 0x3F);
$character = chr($first_byte).chr($second_byte);
} elseif ((0xFFFF & $decimal_code) == $decimal_code) {
//UTF-8 3-bytes
$first_byte = 0xE0 | (($decimal_code >> 12) & 0x0F);
$second_byte = 0x80 | (($decimal_code >> 6) & 0x3F);
$third_byte = 0x80 | ($decimal_code & 0x3F);
$character = chr($first_byte).chr($second_byte).chr($third_byte);
}
return $character;
}
}, $escapedUtf8Json);
return $unescapedUtf8Json;
}
/*
* Function to escape string for sql query.
* It returns string with escaped _ and %
*/
public static function escapeSqlString($string) {
return str_replace(array('\\','_', '%'), array('\\\\','\_', '\%'), $string);
}
public static function GetDirectorySize($path) {
$bytestotal = 0;
$path = realpath($path);
if ($path !== false) {
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS)) as $object) {
$bytestotal += $object->getSize();
}
}
return $bytestotal;
}
public static function getCalendarReferenceModulesList() {
$moduleInstance = Vtiger_Module_Model::getInstance('Calendar');
$fieldInstance = Vtiger_Field_Model::getInstance('parent_id', $moduleInstance);
$referenceModuleList = $fieldInstance->getReferenceList();
return $referenceModuleList;
}
public static function getBrowserInfo() {
$u_agent = vtlib_purify($_SERVER['HTTP_USER_AGENT']);
$bname = 'Unknown';
$platform = 'Unknown';
$version = "";
//First get the platform?
if (preg_match('/linux/i', $u_agent)) {
$platform = 'linux';
} elseif (preg_match('/macintosh|mac os x/i', $u_agent)) {
$platform = 'mac';
} elseif (preg_match('/windows|win32/i', $u_agent)) {
$platform = 'windows';
}
// Next get the name of the useragent yes seperately and for good reason
if (preg_match('/MSIE/i', $u_agent) && !preg_match('/Opera/i', $u_agent)) {
$bname = 'Internet Explorer';
$ub = "MSIE";
} elseif (preg_match('/Firefox/i', $u_agent)) {
$bname = 'Mozilla Firefox';
$ub = "Firefox";
} elseif (preg_match('/Chrome/i', $u_agent)) {
$bname = 'Google Chrome';
$ub = "Chrome";
} elseif (preg_match('/Safari/i', $u_agent)) {
$bname = 'Apple Safari';
$ub = "Safari";
} elseif (preg_match('/Opera/i', $u_agent)) {
$bname = 'Opera';
$ub = "Opera";
} elseif (preg_match('/Netscape/i', $u_agent)) {
$bname = 'Netscape';
$ub = "Netscape";
}
// finally get the correct version number
$known = array('Version', $ub, 'other');
$pattern = '#(?<browser>'.join('|', $known) .
')[/ ]+(?<version>[0-9.|a-zA-Z.]*)#';
if (!preg_match_all($pattern, $u_agent, $matches)) {
// we have no matching number just continue
}
// see how many we have
$i = count($matches['browser']);
if ($i != 1) {
//we will have two since we are not using 'other' argument yet
//see if version is before or after the name
if (strripos($u_agent, "Version") < strripos($u_agent, $ub)) {
$version = $matches['version'][0];
} else {
$version = $matches['version'][1];
}
} else {
$version = $matches['version'][0];
}
// check if we have a number
if ($version == null || $version == "") {
$version = "?";
}
$browserInfo = array(
'userAgent' => $u_agent,
'name' => $bname,
'userBrowser' => strtolower($ub),
'version' => $version,
'platform' => $platform,
'pattern' => $pattern
);
$browserInfoModel = new Vtiger_Base_Model($browserInfo);
return $browserInfoModel;
}
static function detectModulenameFromRecordId($wsrecordid) {
global $adb;
$idComponents = vtws_getIdComponents($wsrecordid);
$result = $adb->pquery("SELECT name FROM vtiger_ws_entity WHERE id=?", array($idComponents[0]));
if ($result && $adb->num_rows($result)) {
return $adb->query_result($result, 0, 'name');
}
return false;
}
static $detectFieldnamesToResolveCache = array();
static function detectFieldnamesToResolve($module) {
global $adb;
// Cache hit?
if (isset(self::$detectFieldnamesToResolveCache[$module])) {
return self::$detectFieldnamesToResolveCache[$module];
}
$resolveUITypes = array(10, 101, 116, 117, 26, 357, 50, 51, 52, 53, 57, 58, 59, 66, 68, 73, 75, 76, 77, 78, 80, 81);
$result = $adb->pquery(
"SELECT DISTINCT fieldname FROM vtiger_field WHERE uitype IN(" .
generateQuestionMarks($resolveUITypes).") AND tabid=?", array($resolveUITypes, getTabid($module))
);
$fieldnames = array();
while ($resultrow = $adb->fetch_array($result)) {
$fieldnames[] = $resultrow['fieldname'];
}
// Cache information
self::$detectFieldnamesToResolveCache[$module] = $fieldnames;
return $fieldnames;
}
static function resolveRecordValues(&$record, $user = null, $ignoreUnsetFields = false) {
$userTypeFields = array('assigned_user_id', 'creator', 'userid', 'created_user_id', 'modifiedby');
if (empty($record))
return $record;
$module = self::detectModulenameFromRecordId($record['id']);
$fieldnamesToResolve = self::detectFieldnamesToResolve($module);
if (!empty($fieldnamesToResolve)) {
foreach ($fieldnamesToResolve as $resolveFieldname) {
if (isset($record[$resolveFieldname]) && !empty($record[$resolveFieldname])) {
$fieldvalueid = $record[$resolveFieldname];
if (in_array($resolveFieldname, $userTypeFields)) {
$fieldvalue = decode_html(trim(vtws_getName($fieldvalueid, $user)));
} else {
$fieldvalue = self::fetchRecordLabelForId($fieldvalueid);
}
$record[$resolveFieldname] = $fieldvalue;
}
}
}
return $record;
}
static function fetchRecordLabelsForIds($recordIds) {
global $adb;
$crmIds = array();
foreach ($recordIds as $id) {
$idComponents = vtws_getIdComponents($id);
$crmIds[] = $idComponents[1];
}
$sqlResult = $adb->pquery("SELECT crmid,label from vtiger_crmentity WHERE crmid IN (".generateQuestionMarks($crmIds).") ;", $crmIds);
$num_rows = $adb->num_rows($sqlResult);
$labels = array();
for ($i = 0; $i < $num_rows; $i++) {
$crmId = $adb->query_result($sqlResult, $i, 'crmid');
$recordId = $recordIds[array_search($crmId, $crmIds)];
$labels[$recordId] = decode_html($adb->query_result($sqlResult, $i, 'label'));
}
return $labels;
}
static function fetchRecordLabelForId($recordId) {
$recordLabels = self::fetchRecordLabelsForIds(array($recordId));
foreach ($recordLabels as $key => $value) {
if ($recordId == $key) {
return $value;
}
}
return null;
}
static function getRelatedModuleLabel($relatedModule, $parentModule = "Contacts") {
global $adb;
if (in_array($relatedModule, array('ProjectTask', 'ProjectMilestone')))
$parentModule = 'Project';
$sql = "SELECT vtiger_relatedlists.label FROM vtiger_relatedlists
INNER JOIN vtiger_tab ON vtiger_relatedlists.related_tabid =vtiger_tab.tabid WHERE vtiger_tab.name=? AND vtiger_relatedlists.tabid=?";
$sqlResult = $adb->pquery($sql, array($relatedModule, getTabid($parentModule)));
if ($adb->num_rows($sqlResult) > 0) {
$relatedModuleLabel = $adb->query_result($sqlResult, 0, 'label');
}
return $relatedModuleLabel;
}
// Source should be Zapier if record is Created from Zapier
static function fillMandatoryFields($fieldName, $module, $source = '') {
global $adb;
$moduleModel = Vtiger_Module_Model::getInstance($module);
$fieldModel = Vtiger_Field_Model::getInstance($fieldName, $moduleModel);
$fieldDataType = $fieldModel->getFieldDataType();
$defaultValue = $fieldModel->getDefaultFieldValue();
switch ($fieldDataType) {
case 'date' : $value = $defaultValue;
if (empty($defaultValue)) {
$dateObject = new DateTime();
$value = $dateObject->format('Y-m-d');
}
break;
case 'datetime' : $value = $defaultValue;
if (empty($defaultValue)) {
$dateObject = new DateTime();
$value = DateTimeField::convertToUserFormat($dateObject->format('Y-m-d'));
}
break;
case 'time' : $value = '00:00:00';
if (!empty($defaultValue)) {
$value = $defaultValue;
}
break;
case 'text' : $value = '?????';
if (!empty($defaultValue)) {
$value = $defaultValue;
}
break;
case 'phone' : $value = '?????';
if (!empty($defaultValue)) {
$value = $defaultValue;
}
break;
case 'boolean' : $value = false;
if (!empty($defaultValue)) {
$value = $defaultValue;
}
break;
case 'email' : $value = '??@??.??';
if (!empty($defaultValue)) {
$value = $defaultValue;
}
break;
case 'string' : $value = '?????';
if (!empty($defaultValue)) {
$value = $defaultValue;
}
break;
case 'url' : $value = '???.??';
if (!empty($defaultValue)) {
$value = $defaultValue;
}
break;
case 'integer' : $value = 0;
if (!empty($defaultValue)) {
$value = $defaultValue;
}
break;
case 'double' : $value = 00.00;
if (!empty($defaultValue)) {
$value = $defaultValue;
}
break;
case 'currency' : $value = 0.00;
if (!empty($defaultValue)) {
$value = $defaultValue;
}
break;
case 'skype' : $value = '?????';
if (!empty($defaultValue)) {
$value = $defaultValue;
}
break;
case 'picklist' : $pickListDetails = $fieldModel->getPicklistValues();
foreach ($pickListDetails as $key => $value) {
$value = $key;
break;
}
break;
case 'multipicklist': $pickListDetails = $fieldModel->getPicklistValues();
foreach ($pickListDetails as $key => $value) {
$value = $key;
break;
}
break;
case 'documentsFolder': // get default folder wsId
$value = vtws_getWebserviceEntityId("DocumentFolders", "1");
break;
case 'reference' : $referenceFieldModule = $fieldModel->getReferenceList(true);
if (count($referenceFieldModule) > 0) {
$user = Users_Record_Model::getCurrentUserModel();
$referenceModule = $referenceFieldModule[0];
$referenceFieldModuleModel = Vtiger_Module_Model::getInstance($referenceModule);
$mandatoryFieldModels = $referenceFieldModuleModel->getMandatoryFieldModels();
$nameFields = $referenceFieldModuleModel->getNameFields();
$element = array();
foreach ($mandatoryFieldModels as $mandatoryFieldModel) {
$fieldName = $mandatoryFieldModel->get('name');
$type = $mandatoryFieldModel->getFieldDataType();
if ($type == 'reference')
return '';
$fieldValue = Vtiger_Util_Helper::fillMandatoryFields($fieldName, $referenceModule);
$element[$fieldName] = $fieldValue;
}
$element['assigned_user_id'] = vtws_getWebserviceEntityId('Users', $user->id);
$fieldLabel = '';
foreach ($nameFields as $nameField) {
$fieldLabel .= $element[$nameField].' ';
}
$fieldLabel = trim($fieldLabel);
$query = "SELECT crmid FROM vtiger_crmentity WHERE label = ? AND deleted = ? AND setype = ?";
$result = $adb->pquery($query, array($fieldLabel, 0, $referenceModule));
if ($adb->num_rows($result)) {
$crmid = $adb->query_result($result, 0, 'crmid');
return $crmid;
} else {
try {
if (isset($source) && !empty($source)) {
$element['source'] = $source;
}
if (!function_exists(vtws_create)) {
include_once 'include/Webservices/Create.php';
}
$entity = vtws_create($referenceModule, $element, $user);
$wsId = vtws_getIdComponents($entity['id']);
return $wsId[1];
} catch (Exception $ex) {
return '';
}
}
} else {
return '';
}
break;
default : $value = '?????';
break;
}
return $value;
}
public static function convertSpaceToHyphen($string) {
if (!empty($string)) {
return str_replace(" ", "-", $string);
}
}
public static function escapeCssSpecialCharacters($string) {
if(!empty($string)) {
$pattern = "/[!#$%&'()*+,.\/:;<=>?@^`~]/";
return preg_replace($pattern, '\\\\$0', $string);
}
}
}
}