晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。   林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。   见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝)   既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。   南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。 .
Prv8 Shell
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/modules/Vtiger/handlers/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //home/akaindir/public_html/crm/modules/Vtiger/handlers/FollowRecordHandler.php
<?php
/* +**********************************************************************************
 * The contents of this file are subject to the vtiger CRM Public License Version 1.1
 * ("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/VTEventHandler.inc';
class FollowRecordHandler extends VTEventHandler {

	function handleEvent($eventName, $entityData) {
		if ($eventName == 'vtiger.entity.aftersave') {
			global $site_URL;
			$db = PearDatabase::getInstance();

			//current user details
			$currentUserModel = Users_Record_Model::getCurrentUserModel();
			$currentUserId = $currentUserModel->getId();

			//record details
			$recordId = $entityData->getId();
			$moduleName = $entityData->getModuleName();

			$restrictedModules = array('CustomerPortal', 'Dashboard', 'Emails', 'EmailTemplates', 'ExtensionStore', 'Google', 'Home',
										'Import', 'MailManager', 'Mobile', 'ModComments', 'ModTracker', 'PBXManager', 'Portal',
										'RecycleBin', 'Reports', 'Rss', 'SMSNotifier', 'Users', 'Webforms', 'Webmails', 'WSAPP');

			if (!in_array($moduleName, $restrictedModules)) {
				$tableName = Vtiger_Functions::getUserSpecificTableName($moduleName);

				//following users
				$userIdsList = array();
				$result = $db->pquery("SELECT userid FROM $tableName WHERE recordid = ? AND starred = ? AND userid != ?", array($recordId, '1', $currentUserId));
				if ($result && $db->num_rows($result)) {
					while ($rowData = $db->fetch_row($result)) {
						$userIdsList[] = $rowData['userid'];
					}
				}

				if ($userIdsList) {
					//changed fields data
					$vtEntityDelta = new VTEntityDelta();
					$delta = $vtEntityDelta->getEntityDelta($moduleName, $recordId, true);

					if ($delta) {
						$newEntity = $vtEntityDelta->getNewEntity($moduleName, $recordId);
						$label = decode_html(trim($newEntity->get('label')));

						$fieldModels = array();
						$changedValues = array();
						$skipFields = array('modifiedtime', 'modifiedby', 'label');
						$moduleModel = Vtiger_Module_Model::getInstance($moduleName);

						foreach ($delta as $fieldName => $fieldInfo) {
							if (!in_array($fieldName, $skipFields)) {
								$fieldModel = Vtiger_Field_Model::getInstance($fieldName, $moduleModel);
								if ($fieldModel) {
									$fieldModels[$fieldName] = $fieldModel;
									$changedValues[$fieldName] = $fieldInfo;
								}
							}
						}

						if ($fieldModels) {
							$companyDetails = getCompanyDetails();
							$userModuleModel = Users_Module_Model::getInstance('Users');

							foreach ($userIdsList as $userId) {
								$userRecordModel = Users_Record_Model::getInstanceById($userId, $userModuleModel);
								if ($userRecordModel && $userRecordModel->get('status') == 'Active') {

									$changedFieldString = $this->getChangedFieldString($fieldModels, $changedValues, $userRecordModel);
									$detailViewLink = "$site_URL/index.php?module=$moduleName&view=Detail&record=$recordId";
									$recordDetailViewLink = '<a style="text-decoration:none;" target="_blank" href="'.$detailViewLink.'">'.$label.'</a>';

									$data = vtranslate('LBL_STARRED_RECORD_UPDATED', $moduleName, $currentUserModel->getName(), $recordDetailViewLink).$changedFieldString;
									$body = '<table><tbody><tr><td style="padding:10px">'.nl2br(decode_html($data)).'</td></tr></tbody></table>';

									$notificationMessage = ucwords($companyDetails['companyname']).' '.vtranslate('LBL_NOTIFICATION', $moduleName).' - '.$currentUserModel->getName();
									$subject = vtranslate('LBL_STARRED_RECORD_UPDATED', $moduleName, $notificationMessage, $label);

									$this->sendEmail($userRecordModel->get('email1'), $subject, $body, $recordId);
								}
							}
						}
					}
				}
			}
		}
	}

	public function getChangedFieldString($fieldModels, $changedValues, $userRecordModel) {
		$userEntity = $userRecordModel->entity;

		$changedFieldString = '';
		foreach ($fieldModels as $fieldName => $fieldModel) {
			$moduleName = $fieldModel->getModule()->getName();
			$fieldCurrentValue = $changedValues[$fieldName]['currentValue'];

			if ($fieldModel->isReferenceField()) {
				$fieldDisplayValue = Vtiger_Util_Helper::getRecordName($fieldCurrentValue);
			} else if ($fieldModel->isOwnerField()) {
				$fieldDisplayValue = getOwnerName($fieldCurrentValue);
			} else if ($fieldModel->get('uitype') == 117 && $fieldCurrentValue) {
				$fieldDisplayValue = getCurrencyName($fieldCurrentValue, FALSE);
			} else {
				$fieldDataType = $fieldModel->getFieldDataType();
				switch ($fieldDataType) {
					case 'boolean'		:
					case 'multipicklist':	$fieldDisplayValue = $fieldModel->getDisplayValue($fieldCurrentValue);break;
					case 'date'			:	$fieldDisplayValue = DateTimeField::convertToUserFormat($fieldCurrentValue, $userEntity);break;
					case 'double'		:	$fieldDisplayValue = CurrencyField::convertToUserFormat(decimalFormat($fieldCurrentValue), $userEntity, true);break;
					case 'time'			:	if ($userRecordModel->get('hour_format') == '12') {
												$fieldDisplayValue = Vtiger_Time_UIType::getTimeValueInAMorPM($fieldCurrentValue);
											} else {
												$fieldDisplayValue = $fieldModel->getEditViewDisplayValue($fieldCurrentValue);
											}
											break;
					case 'currency'		:	$skipConversion = false;
											if ($fieldModel->get('uitype') == 72) {
												$skipConversion = true;
											}
											$fieldDisplayValue = CurrencyField::convertToUserFormat($fieldCurrentValue, $userEntity, $skipConversion);
											break;

					default				:	$fieldDisplayValue = $fieldModel->getEditViewDisplayValue($fieldCurrentValue);break;
				}
			}
			$changedFieldString .= '<br/>'.vtranslate('LBL_STARRED_RECORD_TO', $moduleName, vtranslate($fieldModel->get('label'), $moduleName), $fieldDisplayValue);
		}
		return $changedFieldString;
	}

	public function sendEmail($toEmailId, $subject, $body, $recordId) {
		//It will not show in CRM
		$generatedMessageId = Emails_Mailer_Model::generateMessageID();
		Emails_Mailer_Model::updateMessageIdByCrmId($generatedMessageId, $recordId);

		$mailer = new Emails_Mailer_Model();
		$mailer->reinitialize();
		$mailer->Body = $body;
		$mailer->Subject = decode_html($subject);

		$activeUserModel = $this->getActiveUserModel();
		$replyTo = decode_html($activeUserModel->email1);
		$replyToName = decode_html($activeUserModel->first_name.' '.$activeUserModel->last_name);
		$fromEmail = decode_html($activeUserModel->email1);

		$mailer->ConfigSenderInfo($fromEmail, $replyTo, $replyToName);
		$mailer->IsHTML();
		$mailer->AddCustomHeader("In-Reply-To", $generatedMessageId);
		$mailer->AddAddress($toEmailId);

		$response = $mailer->Send(true);
	}

	var $activeAdmin = '';
	public function getActiveUserModel() {
		if (!$this->activeAdmin) {
			$activeUserModel = new Users();
			$activeUserModel->retrieveCurrentUserInfoFromFile(Users::getActiveAdminId());
			$this->activeAdmin = $activeUserModel;
		}
		return $this->activeAdmin;
	}
}

haha - 2025