晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
|
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/Mobile/ |
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.
************************************************************************************/
chdir( dirname(__FILE__). '/../../');
// Include ICAL library
set_include_path(dirname(__FILE__) . '/third-party/qCal' . PATH_SEPARATOR . get_include_path());
include_once dirname(__FILE__) . '/third-party/qCal/autoload.php';
include_once 'vtlib/Vtiger/Module.php';
/**
* Core class to process ICAL request
*/
class Mobile_ICAL {
// User context
private $userfocus;
// DB Connection
private $db;
/**
* Default constructor
*/
function __construct() {
$this->db = PearDatabase::getInstance();
}
/**
* Authenticate user
*
* @param String $username
* @param String $password
* @return True if authenticated, false otherwise
*/
function authenticate($username, $password) {
$this->userfocus = CRMEntity::getInstance('Users');
$this->userfocus->column_fields['user_name'] = $username;
$authsuccess = $this->userfocus->doLogin($password);
if($authsuccess) {
if(!isset($this->userfocus->id)) {
$this->userfocus->id = $this->userfocus->retrieve_user_id($username);
$this->userfocus->retrieveCurrentUserInfoFromFile($this->userfocus->id);
}
}
return $authsuccess;
}
/**
* Prepare date to useable icalendar format
*
* @param String $date yyyy-mm-dd format
* @return yyyymmdd
*/
function formatDate($date) {
if(empty($date)) $date = date('Y-m-d');
return str_replace('-', '', $date);
}
/**
* Prepare date-time to useable icalendar format
*
* @param String $date yyyy-mm-dd format
* @param String $time hh:ii:ss format
* @return yyyymmddThhiissZ
*/
function formatDateTime($date, $time) {
if(empty($date) || preg_match("/0000-00-00/", $date)) {
$date = date('Y-m-d');
}
if(empty($time)) $time = "00:00:00";
if(strlen($time) == 5) $time = "{$time}:00";
$dateTime = DateTimeField::convertToUserTimeZone($date.' '.$time, $this->userfocus);
if(is_object($dateTime)) {
$dateTimeValue = $dateTime->format('Y-m-d H:i:s');
list($date, $time) = explode(' ', $dateTimeValue);
}
return sprintf("%sT%sZ", $this->formatDate($date), str_replace(':','',$time));
}
/**
* Prepare date-timestamp to useable icalendar format
*
* @param String $value yyyy-mm-dd hh:ii:ss format
* @return yyyymmddThhiissZ
*/
function formatDateTimestamp($value) {
return str_replace(array('-', ':', ' '), array('','','T'), trim($value)) . 'Z';
}
/**
* Format value based on its current state.
*
* @param String $value
* @param String $defvalue
* @return unknown|unknown
*/
function formatValue($value, $defvalue='') {
if(is_null($value) || empty($value)) return $defvalue;
return $value;
}
/**
* Generate icalendar data output.
*
* @return String
*/
function generate() {
$properties = array();
$properties['prodid'] = '-//vtiger/Mobile/NONSGML 1.0//EN';
$ical = new qCal($properties);
// TODO Configure timezone information.
$fieldnames = array(
'activityid', 'subject', 'description', 'activitytype', 'location', 'reminder_time',
'date_start', 'time_start', 'due_date', 'time_end', 'modifiedtime'
);
$query = "SELECT " . implode(',', $fieldnames) . " FROM vtiger_activity
INNER JOIN vtiger_crmentity ON
(vtiger_activity.activityid=vtiger_crmentity.crmid AND vtiger_crmentity.deleted = 0 AND vtiger_crmentity.smownerid = ?)
LEFT JOIN vtiger_activity_reminder ON vtiger_activity_reminder.activity_id=vtiger_activity.activityid
WHERE vtiger_activity.activitytype != 'Emails'";
$result = $this->db->pquery($query, array($this->userfocus->id));
while($resultrow = $this->db->fetch_array($result)) {
$properties = array();
$properties['uid'] = $resultrow['activityid'];
$properties['summary'] = $this->formatValue(decode_html($resultrow['subject']));
$properties['description'] = $this->formatValue(decode_html($resultrow['description']));
$properties['class'] = 'PUBLIC';
$properties['dtstart'] = $this->formatDateTime( $resultrow['date_start'], $resultrow['time_start']);
$properties['dtend'] = $this->formatDateTime( $resultrow['due_date'], $resultrow['time_end']);
$properties['dtstamp'] = $this->formatDateTimestamp($resultrow['modifiedtime']);
$properties['location'] = $this->formatValue($resultrow['location']);
if($resultrow['activitytype'] == 'Task') {
// Tranform the parameter
$properties['due'] = $properties['dtend'];
unset($properties['dtend']);
$icalComponent = new qCal_Component_Vtodo($properties);
} else {
$icalComponent = new qCal_Component_Vevent($properties);
if(!empty($resultrow['reminder_time'])) {
$alarmProperties = array();
$alarmProperties['trigger'] = $resultrow['reminder_time'] * 60;
$icalComponent->attach(new qCal_Component_Valarm($alarmProperties));
}
}
$ical->attach($icalComponent);
}
return $ical->render();
}
/**
* Helper method to process the request and emit output
*
* @param String $username
* @param String $password
*/
static function process($username, $password) {
$mobileical = new Mobile_ICAL();
if(!$mobileical->authenticate($username, $password)) {
header('Content-type: text/plain');
echo "FAILED";
} else {
$icalContent = $mobileical->generate();
header('Content-Disposition: attachment; filename="icalendar.ics"');
header('Content-Length: '. strlen($icalContent));
echo $icalContent;
}
}
}
// To make it easier for subscribing to Calendar via applications we support the
// url format: http://localhost:81/modules/Mobile/ical.php/username@mail.com/password
// Retrieve username and password from the URL
$pathinfo = $_SERVER['PATH_INFO'];
if(empty($pathinfo)) $pathinfo = "/";
// Extract username and password
$parts = explode('/', $pathinfo);
$matches = array();
$matches[2] = array_pop($parts);
$matches[1] = array_pop($parts);
// Process the request
if (vtlib_isModuleActive('Mobile')) {
Mobile_ICAL::process($matches[1], $matches[2]);
}