晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
|
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/models/ |
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.
*************************************************************************************/
class Vtiger_Relation_Model extends Vtiger_Base_Model{
protected $parentModule = false;
protected $relatedModule = false;
protected $relationType = false;
//one to many
const RELATION_DIRECT = 1;
//Many to many and many to one
const RELATION_INDIRECT = 2;
/**
* Function returns the relation id
* @return <Integer>
*/
public function getId(){
return $this->get('relation_id');
}
/**
* Function sets the relation's parent module model
* @param <Vtiger_Module_Model> $moduleModel
* @return Vtiger_Relation_Model
*/
public function setParentModuleModel($moduleModel){
$this->parentModule = $moduleModel;
return $this;
}
/**
* Function that returns the relation's parent module model
* @return <Vtiger_Module_Model>
*/
public function getParentModuleModel(){
if(empty($this->parentModule)){
$this->parentModule = Vtiger_Module_Model::getInstance($this->get('tabid'));
}
return $this->parentModule;
}
public function getRelationModuleModel(){
if(empty($this->relatedModule)){
$this->relatedModule = Vtiger_Module_Model::getInstance($this->get('related_tabid'));
}
return $this->relatedModule;
}
public function getParentModuleName() {
return $this->getParentModuleModel()->getName();
}
public function getRelationModuleName() {
$relationModuleName = $this->get('relatedModuleName');
if(!empty($relationModuleName)) {
return $relationModuleName;
}
return $this->getRelationModuleModel()->getName();
}
public function getListUrl($parentRecordModel) {
return 'module='.$this->getParentModuleModel()->get('name').'&relatedModule='.$this->get('modulename').
'&view=Detail&record='.$parentRecordModel->getId().'&mode=showRelatedList&relationId='.$this->get('relation_id');
}
public function setRelationModuleModel($relationModel){
$this->relatedModule = $relationModel;
return $this;
}
public function isActionSupported($actionName){
$actionName = strtolower($actionName);
$actions = $this->getActions();
foreach($actions as $action) {
if(strcmp(strtolower($action), $actionName)== 0){
return true;
}
}
return false;
}
public function isSelectActionSupported() {
return $this->isActionSupported('select');
}
public function isAddActionSupported() {
return $this->isActionSupported('add');
}
public function getActions(){
$actionString = $this->get('actions');
$label = $this->get('label');
// No actions for Activity history
if($label == 'Activity History') {
return array();
}
return explode(',', $actionString);
}
public function getQuery($parentRecord, $actions=false){
$parentModuleModel = $this->getParentModuleModel();
$relatedModuleModel = $this->getRelationModuleModel();
$parentModuleName = $parentModuleModel->getName();
$relatedModuleName = $relatedModuleModel->getName();
$functionName = $this->get('name');
if ($relatedModuleName == "ModComments") {
$focus = CRMEntity::getInstance($relatedModuleName);
$query = $focus->$functionName($parentRecord->getId());
} else {
$query = $parentModuleModel->getRelationQuery($parentRecord->getId(), $functionName, $relatedModuleModel, $this->getId());
}
return $query;
}
public function addRelation($sourcerecordId, $destinationRecordId) {
$sourceModule = $this->getParentModuleModel();
$sourceModuleName = $sourceModule->get('name');
$sourceModuleFocus = CRMEntity::getInstance($sourceModuleName);
$destinationModuleName = $this->getRelationModuleModel()->get('name');
relateEntities($sourceModuleFocus, $sourceModuleName, $sourcerecordId, $destinationModuleName, $destinationRecordId);
}
public function deleteRelation($sourceRecordId, $relatedRecordId){
$sourceModule = $this->getParentModuleModel();
$sourceModuleName = $sourceModule->get('name');
$destinationModuleName = $this->getRelationModuleModel()->get('name');
$destinationModuleFocus = CRMEntity::getInstance($destinationModuleName);
DeleteEntity($destinationModuleName, $sourceModuleName, $destinationModuleFocus, $relatedRecordId, $sourceRecordId);
return true;
}
public function isDirectRelation() {
return ($this->getRelationType() == self::RELATION_DIRECT);
}
public function getRelationType(){
if(empty($this->relationType)){
$this->relationType = self::RELATION_INDIRECT;
if ($this->getRelationField()) {
$this->relationType = self::RELATION_DIRECT;
}
}
return $this->relationType;
}
/**
* Function which will specify whether the relation is editable
* @return <Boolean>
*/
public function isEditable() {
return $this->getRelationModuleModel()->isPermitted('EditView');
}
/**
* Function which will specify whether the relation is deletable
* @return <Boolean>
*/
public function isDeletable() {
return $this->getRelationModuleModel()->isPermitted('Delete');
}
public static function getInstance($parentModuleModel, $relatedModuleModel, $label=false) {
$db = PearDatabase::getInstance();
$query = 'SELECT vtiger_relatedlists.*,vtiger_tab.name as modulename FROM vtiger_relatedlists
INNER JOIN vtiger_tab on vtiger_tab.tabid = vtiger_relatedlists.related_tabid AND vtiger_tab.presence != 1
WHERE vtiger_relatedlists.tabid = ? AND related_tabid = ?';
$params = array($parentModuleModel->getId(), $relatedModuleModel->getId());
if(!empty($label)) {
$query .= ' AND label = ?';
$params[] = decode_html($label);
}
$result = $db->pquery($query, $params);
if($db->num_rows($result)) {
$row = $db->query_result_rowdata($result, 0);
$relationModelClassName = Vtiger_Loader::getComponentClassName('Model', 'Relation', $parentModuleModel->get('name'));
$relationModel = new $relationModelClassName();
$relationModel->setData($row)->setParentModuleModel($parentModuleModel)->setRelationModuleModel($relatedModuleModel);
return $relationModel;
}
return false;
}
public static function getInstanceByModuleName($moduleName, $relModuleName) {
$moduleModel = Vtiger_Module_Model::getInstance($moduleName);
$relModuleModel = Vtiger_Module_Model::getInstance($relModuleName);
return self::getInstance($moduleModel, $relModuleModel);
}
public static function getAllRelations($parentModuleModel, $selected = true, $onlyActive = true) {
$db = PearDatabase::getInstance();
$moduleRelations = Vtiger_Cache::get('moduleRelations',array($parentModuleModel->getName(),$selected,$onlyActive));
if($moduleRelations){
return $moduleRelations;
}
$skipReltionsList = array('get_history');
$query = 'SELECT vtiger_relatedlists.*,vtiger_tab.name as modulename FROM vtiger_relatedlists
INNER JOIN vtiger_tab on vtiger_relatedlists.related_tabid = vtiger_tab.tabid
WHERE vtiger_relatedlists.tabid = ? AND related_tabid != 0';
if ($selected) {
$query .= ' AND vtiger_relatedlists.presence <> 1';
}
if($onlyActive){
$query .= ' AND vtiger_tab.presence <> 1 ';
}
$query .= ' AND vtiger_relatedlists.name NOT IN ('.generateQuestionMarks($skipReltionsList).') ORDER BY sequence'; // TODO: Need to handle entries that has related_tabid 0
$result = $db->pquery($query, array($parentModuleModel->getId(), $skipReltionsList));
$relationModels = array();
$relationModelClassName = Vtiger_Loader::getComponentClassName('Model', 'Relation', $parentModuleModel->get('name'));
for($i=0; $i<$db->num_rows($result); $i++) {
$row = $db->query_result_rowdata($result, $i);
//$relationModuleModel = Vtiger_Module_Model::getCleanInstance($moduleName);
// Skip relation where target module does not exits or is no permitted for view.
if (!Users_Privileges_Model::isPermitted($row['modulename'],'DetailView')) {
continue;
}
$relationModel = new $relationModelClassName();
$relationModel->setData($row)->setParentModuleModel($parentModuleModel)->set('relatedModuleName',$row['modulename']);
$relationModels[] = $relationModel;
}
Vtiger_Cache::set('moduleRelations',array($parentModuleModel->getName(),$selected,$onlyActive),$relationModels);
return $relationModels;
}
public static function getInstanceFromId($relationId) {
$db = PearDatabase::getInstance();
$query = "SELECT * FROM vtiger_relatedlists WHERE relation_id=?";
$result = $db->pquery($query, array($relationId));
$relationModel = false;
if ($db->num_rows($result) > 0) {
$row = $db->query_result_rowdata($result, 0);
$parentModuleId = $row['tabid'];
$relationModuleId = $row['related_tabid'];
$parentModuleModel = Vtiger_Module_Model::getInstance($parentModuleId);
$relatedModuleModel = Vtiger_Module_Model::getInstance($relationModuleId);
$relationModelClassName = Vtiger_Loader::getComponentClassName('Model', 'Relation', $parentModuleModel->get('name'));
$relationModel = new $relationModelClassName();
$relationModel->setData($row)->setParentModuleModel($parentModuleModel)->setRelationModuleModel($relatedModuleModel);
}
return $relationModel;
}
public static function getInstanceFromRelationFied($relationFieldId) {
$db = PearDatabase::getInstance();
$query = "SELECT * FROM vtiger_relatedlists WHERE relationfieldid=?";
$result = $db->pquery($query, array($relationFieldId));
$relationModel = false;
if ($db->num_rows($result) > 0) {
$row = $db->query_result_rowdata($result, 0);
$parentModuleId = $row['tabid'];
$relationModuleId = $row['related_tabid'];
$parentModuleModel = Vtiger_Module_Model::getInstance($parentModuleId);
$relatedModuleModel = Vtiger_Module_Model::getInstance($relationModuleId);
$relationModelClassName = Vtiger_Loader::getComponentClassName('Model', 'Relation', $parentModuleModel->get('name'));
$relationModel = new $relationModelClassName();
$relationModel->setData($row)->setParentModuleModel($parentModuleModel)->setRelationModuleModel($relatedModuleModel);
}
return $relationModel;
}
/**
* Function to get relation field for relation module and parent module
* @return Vtiger_Field_Model
*/
public function getRelationField() {
$db = PearDatabase::getInstance();
$relationField = $this->get('relationField');
if (!$relationField) {
$relationField = false;
$relationFieldSql = "SELECT relationfieldid FROM vtiger_relatedlists WHERE relation_id=?";
$result = $db->pquery($relationFieldSql,array($this->getId()));
if($db->num_rows($result) > 0) {
$relationFieldId = $db->query_result($result,0,'relationfieldid');
$relationField = Vtiger_Field_Model::getInstance($relationFieldId);
}
}
return $relationField;
}
public static function updateRelationSequenceAndPresence($relatedInfoList, $sourceModuleTabId) {
$db = PearDatabase::getInstance();
$query = 'UPDATE vtiger_relatedlists SET sequence=CASE ';
$relation_ids = array();
foreach($relatedInfoList as $relatedInfo){
$relation_id = $relatedInfo['relation_id'];
$relation_ids[] = $relation_id;
$sequence = $relatedInfo['sequence'];
$presence = $relatedInfo['presence'];
$query .= ' WHEN relation_id='.$relation_id.' THEN '.$sequence;
}
$query.= ' END , ';
$query.= ' presence = CASE ';
foreach($relatedInfoList as $relatedInfo){
$relation_id = $relatedInfo['relation_id'];
$relation_ids[] = $relation_id;
$sequence = $relatedInfo['sequence'];
$presence = $relatedInfo['presence'];
$query .= ' WHEN relation_id='.$relation_id.' THEN '.$presence;
}
$query .= ' END WHERE tabid=? AND relation_id IN ('. generateQuestionMarks($relation_ids).')';
$result = $db->pquery($query, array($sourceModuleTabId,$relation_ids));
}
public function isActive() {
return $this->get('presence') == 0 ? true : false;
}
}