晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
|
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/public_html/crm/include/utils/ |
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.
********************************************************************************* */
require_once 'include/events/SqlResultIterator.inc';
/**
* Description of EmailTemplateUtils
*
* @author mak
*/
class EmailTemplate {
protected $module;
protected $rawDescription;
protected $processedDescription;
protected $recordId;
protected $processed;
protected $templateFields;
protected $user;
protected $processedmodules;
protected $referencedFields;
protected $multiRefValues = array();
protected $multiRefIds = array();
public $removeTags = false;
public function __construct($module, $description, $recordId, $user) {
$this->module = $module;
$this->recordId = $recordId;
$this->processed = false;
$this->user = $user;
$this->setDescription($description);
}
public function setDescription($description) {
// Because if we have two dollars like this "$$" it's not working because it'll be like escape char
$description = preg_replace("/\\$\\$/","$ $",$description);
$this->rawDescription = $description;
$this->processedDescription = $description;
$result = preg_match_all("/\\$(?:[a-zA-Z0-9]+)-(?:[a-zA-Z0-9]+)(?:_[a-zA-Z0-9]+)?(?::[a-zA-Z0-9]+)?(?:_[a-zA-Z0-9]+)*\\$/", $this->rawDescription, $matches);
if($result != 0){
$templateVariablePair = $matches[0];
$this->templateFields = Array();
for ($i = 0; $i < count($templateVariablePair); $i++) {
$templateVariablePair[$i] = str_replace('$', '', $templateVariablePair[$i]);
list($module, $columnName) = explode('-', $templateVariablePair[$i]);
list($parentColumn, $childColumn) = explode(':', $columnName);
$this->templateFields[$module][] = $parentColumn;
$this->referencedFields[$parentColumn][] = $childColumn;
$this->processedmodules[$module] = false;
}
$this->processed = false;
}
}
private function getTemplateVariableListForModule($module) {
return $this->templateFields[strtolower($module)];
}
public function process($params) {
$module = $this->module;
$recordId = $this->recordId;
$variableList = $this->getTemplateVariableListForModule($module);
$handler = vtws_getModuleHandlerFromName($module, $this->user);
$meta = $handler->getMeta();
$referenceFields = $meta->getReferenceFieldDetails();
$fieldColumnMapping = $meta->getFieldColumnMapping();
$columnTableMapping = $meta->getColumnTableMapping();
$currentUsersModel = Users_Record_Model::getCurrentUserModel();
if ($this->isProcessingReferenceField($params)) {
$parentFieldColumnMapping = $meta->getFieldColumnMapping();
$module = $params['referencedMeta']->getEntityName();
if (!$this->isModuleActive($module)) {
return;
}
$recordId = $params['id'];
$meta = $params['referencedMeta'];
$referenceFields = $meta->getReferenceFieldDetails();
$fieldColumnMapping = $meta->getFieldColumnMapping();
$columnTableMapping = $meta->getColumnTableMapping();
$referenceColumn = $parentFieldColumnMapping[$params['field']];
$variableList = $this->referencedFields[$referenceColumn];
}
$tableList = array();
$columnList = array();
$allColumnList = $meta->getUserAccessibleColumns();
$fieldList = array();
$baseTable = $meta->getEntityBaseTable();
$tableList[$baseTable] = $baseTable;
if (count($variableList) > 0) {
foreach ($variableList as $column) {
if (in_array($column, $allColumnList)) {
$fieldList[] = array_search($column, $fieldColumnMapping);
$columnList[] = $column;
}
}
foreach ($fieldList as $field) {
if (!empty($columnTableMapping[$fieldColumnMapping[$field]])) {
$tableList[$columnTableMapping[$fieldColumnMapping[$field]]] = '';
}
}
$columnListTable = array();
foreach ($columnList as $column) {
$columnListTable[] = $columnTableMapping[$column] . "." . $column;
}
$tableList = array_keys($tableList);
$defaultTableList = $meta->getEntityDefaultTableList();
foreach ($defaultTableList as $defaultTable) {
if (!in_array($defaultTable, $tableList)) {
$tableList[] = $defaultTable;
}
}
if (count($tableList) > 0 && count($columnListTable) > 0) {
$moduleTableIndexList = $meta->getEntityTableIndexList();
$sql = 'SELECT '.$tableList[0].'.'.$moduleTableIndexList[$tableList[0]].' AS vt_recordid, ' . implode(', ', $columnListTable) . ' FROM ' . $tableList[0];
foreach ($tableList as $index => $tableName) {
if ($tableName != $tableList[0]) {
if($tableName == 'vtiger_seactivityrel' || $tableName == 'vtiger_cntactivityrel') {
$sql .= ' LEFT JOIN ';
} else {
$sql .= ' INNER JOIN ';
}
$sql .= $tableName . ' ON ' . $tableList[0] . '.' .
$moduleTableIndexList[$tableList[0]] . '=' . $tableName . '.' .
$moduleTableIndexList[$tableName];
}
}
//If module is Leads and if you are not selected any leads fields then query failure is happening.
//By default we are checking where condition on base table.
if($module == 'Leads' && !in_array('vtiger_leaddetails', $tableList)){
$sql .=' INNER JOIN vtiger_leaddetails ON vtiger_leaddetails.leadid = vtiger_crmentity.crmid';
}
$sql .= ' WHERE';
$deleteQuery = $meta->getEntityDeletedQuery();
if (!empty($deleteQuery)) {
$sql .= ' ' . $meta->getEntityDeletedQuery() . ' AND';
}
/*If we are processing multi reference fields, we might have record
* id as'24,23'. So we need to explode with comma(,).
*/
$recordIds = explode(',', $recordId);
$sql .= ' ' . $tableList[0] . '.' . $moduleTableIndexList[$tableList[0]] . ' IN('. generateQuestionMarks($recordIds).')';
$sqlparams = $recordIds;
$db = PearDatabase::getInstance();
$result = $db->pquery($sql, $sqlparams);
$it = new SqlResultIterator($db, $result);
//assuming there can only be one row.
$values = array();
foreach ($it as $row) {
foreach ($fieldList as $field) {
$moduleModel = Vtiger_Module_Model::getInstance($module);
$fieldModel = Vtiger_Field_Model::getInstance($field, $moduleModel);
if(!$fieldModel->isViewable()){
continue;
}
$value = $row->get($fieldColumnMapping[$field]);
//Emails are wrapping with hyperlinks, so skipping email fields as well
if($fieldModel->isReferenceField() || $fieldModel->isOwnerField() || $fieldModel->get('uitype') == 13) {
if ($referenceColumn == 'contactid' && $this->module == 'Events') {
/**Getting multi reference record's reference/owner/uitype = 13 values
* and storing it in a class variable, later we will glue them with comma(,)
s */
$this->multiRefValues[$field][] = strip_tags($fieldModel->getDisplayValue($value, $row->get('vt_recordid')));
} else {
if ($value) {
$values[$field] = $value;
}
}
} else if ($this->module == 'Events' && $fieldModel->getFieldDataType() == 'multireference') {
//get all the multi reference record ids and implode with comma(,)
$this->multiRefIds[] = $value;
$values[$field] = implode(',', array_unique($this->multiRefIds));
} else {
if ($referenceColumn == 'contactid' && $this->module == 'Events') {
$this->multiRefValues[$field][] = $fieldModel->getDisplayValue($value, $row->get('vt_recordid'));
} else {
//If removetags variable is set to true then remove tags around value
if($this->removeTags) {
$values[$field] = $fieldModel->getDisplayValue($value, $row->get('vt_recordid'), false, $this->removeTags);
} else {
$values[$field] = $fieldModel->getDisplayValue($value, $row->get('vt_recordid'));
}
$uiType = $fieldModel->get('uitype');
if (in_array($uiType, array('71', '72'))) {
if ($uiType == '72' && $fieldModel->getName() == 'unit_price') {
$currencyId = getProductBaseCurrency($row->get('vt_recordid'), $module);
} else if ($uiType == '71') {
$currencyId = $this->user->currency_id;
}
$currencyInfo = getCurrencySymbolandCRate($currencyId);
$values[$field] = CurrencyField::appendCurrencySymbol($values[$field], $currencyInfo['symbol']);
}
}
}
}
}
$moduleFields = $meta->getModuleFields();
foreach ($moduleFields as $fieldName => $webserviceField) {
$presence = $webserviceField->getPresence();
if(!in_array($presence,array(0,2))){
continue;
}
if (isset($values[$fieldName]) &&
$values[$fieldName] !== null) {
if (strcasecmp($webserviceField->getFieldDataType(), 'reference') === 0) {
$details = $webserviceField->getReferenceList();
if (count($details) == 1) {
$referencedObjectHandler = vtws_getModuleHandlerFromName(
$details[0], $this->user);
} else {
$type = getSalesEntityType(
$values[$fieldName]);
$referencedObjectHandler = vtws_getModuleHandlerFromName($type,
$this->user);
}
$referencedObjectMeta = $referencedObjectHandler->getMeta();
if (!$this->isProcessingReferenceField($params) && !empty($values[$fieldName])) {
$this->process(array('parentMeta' => $meta, 'referencedMeta' => $referencedObjectMeta, 'field' => $fieldName, 'id' => $values[$fieldName]));
}
$values[$fieldName] =
$referencedObjectMeta->getName(vtws_getId(
$referencedObjectMeta->getEntityId(),
$values[$fieldName]));
} elseif (strcasecmp($webserviceField->getFieldDataType(), 'owner') === 0) {
$referencedObjectHandler = vtws_getModuleHandlerFromName(
vtws_getOwnerType($values[$fieldName]),
$this->user);
$referencedObjectMeta = $referencedObjectHandler->getMeta();
/*
* operation supported for format $module-parentcolumn:childcolumn$
*/
if (in_array($fieldColumnMapping[$fieldName], array_keys($this->referencedFields))) {
$this->process(array('parentMeta' => $meta, 'referencedMeta' => $referencedObjectMeta, 'field' => $fieldName, 'id' => $values[$fieldName], 'owner' => true));
}
$values[$fieldName] =
$referencedObjectMeta->getName(vtws_getId(
$referencedObjectMeta->getEntityId(),
$values[$fieldName]));
} elseif (strcasecmp($webserviceField->getFieldDataType(), 'picklist') === 0) {
if ($referenceColumn == 'contactid' && $this->module == 'Events') {
$this->multiRefValues[$fieldName][] = getTranslatedString($values[$fieldName], $module);
} else {
$values[$fieldName] = getTranslatedString(
$values[$fieldName], $module);
}
} elseif (strcasecmp($fieldName, 'salutationtype') === 0 && $webserviceField->getUIType() == '55'){
$values[$fieldName] = getTranslatedString(
$values[$fieldName], $module);
} elseif (strcasecmp($webserviceField->getFieldDataType(), 'datetime') === 0) {
if ($referenceColumn == 'contactid' && $this->module == 'Events') {
$$this->multiRefValues[$fieldName][] = $values[$fieldName] . ' ' . $currentUsersModel->time_zone;
} else {
$values[$fieldName] = $values[$fieldName] . ' ' . $currentUsersModel->time_zone;
}
}
}
}
if (!$this->isProcessingReferenceField($params)) {
foreach ($columnList as $column) {
$needle = '$' . strtolower($this->module) . "-$column$";
$replaceValue = $values[array_search($column, $fieldColumnMapping)];
if($this->removeTags){
$encodedValue = json_encode($replaceValue);
$replaceValue = substr($encodedValue, 1, -1);
}
$this->processedDescription = str_replace($needle,
$replaceValue , $this->processedDescription);
}
} else {
foreach ($columnList as $column) {
$needle = '$' . strtolower($this->module) . '-' . $parentFieldColumnMapping[$params['field']] . ':' . $column . '$';
//mergeing all multi reference fields with their respective values.
if ($this->module == 'Events' && $referenceColumn == 'contactid') {
$multiRefValues = $this->multiRefValues[array_search($column, $fieldColumnMapping)];
if (is_array($multiRefValues)) {
$replacer = implode(',', $this->multiRefValues[array_search($column, $fieldColumnMapping)]);
} else {
$replacer = '';
}
} else {
$replacer = $values[array_search($column, $fieldColumnMapping)];
}
if($this->removeTags){
$encodedValue = json_encode($replacer);
$replacer = substr($encodedValue, 1, -1);
}
$this->processedDescription = str_replace($needle, $replacer, $this->processedDescription);
}
if (!$params['owner'])
$this->processedmodules[$module] = true;
}
}
}
$this->processed = true;
}
public function isProcessingReferenceField($params) {
if (!empty($params['referencedMeta'])
&& (!empty($params['id']))
&& (!empty($params['field']))
) {
return true;
}
return false;
}
public function getProcessedDescription() {
if (!$this->processed) {
$this->process(null);
}
return $this->processedDescription;
}
public function isModuleActive($module) {
include_once 'include/utils/VtlibUtils.php';
if (vtlib_isModuleActive($module) && ((isPermitted($module, 'EditView') == 'yes'))) {
return true;
}
return false;
}
public function isActive($field, $mod) {
global $adb;
$tabid = getTabid($mod);
$query = 'select * from vtiger_field where fieldname = ? and tabid = ? and presence in (0,2)';
$res = $adb->pquery($query, array($field, $tabid));
$rows = $adb->num_rows($res);
if ($rows > 0) {
return true;
}else
return false;
}
}
?>