Skip to content
Snippets Groups Projects
Select Git revision
  • be1dc7f9632fd31567f207bb2f93f0b25dc125a7
  • master default
  • calendar_starttime
  • calendar_preferred_start_time
  • calendar_start_time
  • calendar_feed
  • minilist4cols2
  • minilist4cols
  • popuptranslated
  • getSelectedDefaultTaxMode
  • googlecalfix
  • relfieldcss
  • ui10_fix
  • fix_dates_filter
  • mass_mail
  • mailconverter-latest
  • mailconverter
  • max_columns
  • google_cal_sync_minimum_date
  • fix_responsive_menu2
  • add-ons
  • 7.3RC
  • 7.2.0
  • 7.1.0H3
  • 7.1.0
  • 7.1.0RC
  • 7.0.1
  • 7.0.0
  • 6.5.0
  • 6.4.0
30 results

RelatedListView.php

Blame
  • Forked from vtiger / vtigercrm
    Source project has a limited visibility.
    PackageImport.php 28.43 KiB
    <?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.
     ************************************************************************************/
    include_once('vtlib/Vtiger/PackageExport.php');
    include_once('vtlib/Vtiger/Unzip.php');
    include_once('vtlib/Vtiger/Module.php');
    include_once('vtlib/Vtiger/Event.php');
    include_once('vtlib/Vtiger/Cron.php');
    
    /**
     * Provides API to import module into vtiger CRM
     * @package vtlib
     */
    class Vtiger_PackageImport extends Vtiger_PackageExport {
    
    	/**
    	 * Module Meta XML File (Parsed)
    	 * @access private
    	 */
    	var $_modulexml;
    	/**
    	 * Module Fields mapped by [modulename][fieldname] which
    	 * will be used to create customviews.
    	 * @access private
    	 */
    	var $_modulefields_cache = Array();
    
    	/**
    	 * License of the package.
    	 * @access private
    	 */
    	var $_licensetext = false;
    
    	/**
    	 * Constructor
    	 */
    	function Vtiger_PackageImport() {
    		parent::__construct();
    	}
    
    	/**
    	 * Parse the manifest file
    	 * @access private
    	 */
    	function __parseManifestFile($unzip) {
    		$manifestfile = $this->__getManifestFilePath();
    		$unzip->unzip('manifest.xml', $manifestfile);
    		$this->_modulexml = simplexml_load_file($manifestfile);
    		unlink($manifestfile);
    	}
    
    	/**
    	 * Get type of package (as specified in manifest)
    	 */
    	function type() {
    		if(!empty($this->_modulexml) && !empty($this->_modulexml->type)) {
    			return $this->_modulexml->type;
    		}
    		return false;
    	}
    
    	/**
    	 * XPath evaluation on the root module node.
    	 * @param String Path expression
    	 */
    	function xpath($path) {
    		return $this->_modulexml->xpath($path);
    	}
    
    	/**
    	 * Get the value of matching path (instead of complete xpath result)
    	 * @param String Path expression for which value is required
    	 */
    	function xpath_value($path) {
    		$xpathres = $this->xpath($path);
    		foreach($xpathres as $pathkey=>$pathvalue) {
    			if($pathkey == $path) return $pathvalue;
    		}
    		return false;
    	}
    
    	/**
    	 * Are we trying to import language package?
    	 */
    	function isLanguageType($zipfile =null) {
    		if(!empty($zipfile)) {
    			if(!$this->checkZip($zipfile)) {
    				return false;
    			}
    		}
    		$packagetype = $this->type();
    
    		if($packagetype) {
    			$lcasetype = strtolower($packagetype);
    			if($lcasetype == 'language') return true;
    		}
    		return false;
    	}
    
    	/**
    	 * Are we trying to import extension package?
    	 */
    	function isExtensionType($zipfile =null) {
    		if(!empty($zipfile)) {
    			if(!$this->checkZip($zipfile)) {
    				return false;
    			}
    		}
    		$packagetype = $this->type();
    
    				if($packagetype) {
    			$lcasetype = strtolower($packagetype);
    			if($lcasetype == 'extension') return true;
    		}
    		return false;
    	}
    
    	/**
    	 * Are we trying to import language package?
    	 */
    	function isLayoutType($zipfile =null) {
    		if(!empty($zipfile)) {
    			if(!$this->checkZip($zipfile)) {
    				return false;
    			}
    		}
    		$packagetype = $this->type();
    
    				if($packagetype) {
    			$lcasetype = strtolower($packagetype);
    			if($lcasetype == 'layout') return true;
    		}
    		return false;
    	}
    
    	/**
    	 * checks whether a package is module bundle or not.
    	 * @param String $zipfile - path to the zip file.
    	 * @return Boolean - true if given zipfile is a module bundle and false otherwise.
    	 */
    	function isModuleBundle($zipfile = null) {
    		// If data is not yet available
    		if(!empty($zipfile)) {
    			if(!$this->checkZip($zipfile)) {
    				return false;
    			}
    		}
    
    		return (boolean)$this->_modulexml->modulebundle;
    	}
    
    	/**
    	 * @return Array module list available in the module bundle.
    	 */
    	function getAvailableModuleInfoFromModuleBundle() {
    		$list = (Array)$this->_modulexml->modulelist;
    		return (Array)$list['dependent_module'];
    	}
    
    	/**
    	 * Get the license of this package
    	 * NOTE: checkzip should have been called earlier.
    	 */
    	function getLicense() {
    		return $this->_licensetext;
    	}
    
    	/**
    	 * Check if zipfile is a valid package
    	 * @access private
    	 */
    	function checkZip($zipfile) {
    		$unzip = new Vtiger_Unzip($zipfile);
    		$filelist = $unzip->getList();
    
    		$manifestxml_found = false;
    		$languagefile_found = false;
    		$layoutfile_found = false;
    		$vtigerversion_found = false;
    
    		$modulename = null;
    		$language_modulename = null;
    
    		foreach($filelist as $filename=>$fileinfo) {
    			$matches = Array();
    			preg_match('/manifest.xml/', $filename, $matches);
    			if(count($matches)) {
    				$manifestxml_found = true;
    				$this->__parseManifestFile($unzip);
    				$modulename = $this->_modulexml->name;
    				$isModuleBundle = (string)$this->_modulexml->modulebundle;
    
    				if($isModuleBundle === 'true' && (!empty($this->_modulexml)) &&
    						(!empty($this->_modulexml->dependencies)) &&
    						(!empty($this->_modulexml->dependencies->vtiger_version))) {
    					$languagefile_found = true;
    					break;
    				}
    
    				// Do we need to check the zip further?
    				if($this->isLanguageType()) {
    					$languagefile_found = true; // No need to search for module language file.
    					break;
    				}else if($this->isLayoutType()){
    					$layoutfile_found = true; // No need to search for module language file.
    					break;
    				}else if($this->isExtensionType()){
    					$extensionfile_found = true; // No need to search for module language file.
    					break;
    				}else {
    				continue;
    				}
    			}
    			// Language file present in en_us folder
    			$pattern = '/languages\/en_us\/([^\/]+).php/';
    			preg_match($pattern, $filename, $matches);
    			if(count($matches)) { $language_modulename = $matches[1]; }
    
    			// or Language file may be present in en_us/Settings folder
    			$settingsPattern = '/languages\/en_us\/Settings\/([^\/]+).php/';
    			preg_match($settingsPattern, $filename, $matches);
    			if(count($matches)) { $language_modulename = $matches[1]; }
    		}
    
    		// Verify module language file.
    		if(!empty($language_modulename) && $language_modulename == $modulename) {
    			$languagefile_found = true;
    		}
    
    		if(!empty($this->_modulexml) &&
    			!empty($this->_modulexml->dependencies) &&
    			!empty($this->_modulexml->dependencies->vtiger_version)) {
    				$vtigerVersion = (string)$this->_modulexml->dependencies->vtiger_version;
    				if(version_compare($vtigerVersion, '6.0.0rc', '>=') === true) {
    				$vtigerversion_found = true;
    			}
    		}
    
    		$validzip = false;
    		if($manifestxml_found && $languagefile_found && $vtigerversion_found)
    			$validzip = true;
    
    		if($manifestxml_found && $layoutfile_found && $vtigerversion_found)
    			$validzip = true;
    
    		if($manifestxml_found && $extensionfile_found && $vtigerversion_found)
    			$validzip = true;
    
    		if($validzip) {
    			if(!empty($this->_modulexml->license)) {
    				if(!empty($this->_modulexml->license->inline)) {
    					$this->_licensetext = $this->_modulexml->license->inline;
    				} else if(!empty($this->_modulexml->license->file)) {
    					$licensefile = $this->_modulexml->license->file;
    					$licensefile = "$licensefile";
    					if(!empty($filelist[$licensefile])) {
    						$this->_licensetext = $unzip->unzip($licensefile);
    					} else {
    						$this->_licensetext = "Missing $licensefile!";
    					}
    				}
    			}
    		}
    
    		if($unzip) $unzip->close();
    
    		return $validzip;
    	}
    
    	/**
    	 * Get module name packaged in the zip file
    	 * @access private
    	 */
    	function getModuleNameFromZip($zipfile) {
    		if(!$this->checkZip($zipfile)) return null;
    
    		return (string)$this->_modulexml->name;
    	}
    
    	/**
    	 * returns the name of the module.
    	 * @return String - name of the module as given in manifest file.
    	 */
    	function getModuleName() {
    		return (string)$this->_modulexml->name;
    	}
    
    	/**
    	 * Cache the field instance for re-use
    	 * @access private
    	 */
    	function __AddModuleFieldToCache($moduleInstance, $fieldname, $fieldInstance) {
    		$this->_modulefields_cache["$moduleInstance->name"]["$fieldname"] = $fieldInstance;
    	}
    
    	/**
    	 * Get field instance from cache
    	 * @access private
    	 */
    	function __GetModuleFieldFromCache($moduleInstance, $fieldname) {
    		return $this->_modulefields_cache["$moduleInstance->name"]["$fieldname"];
    	}
    
    	/**
    	 * Initialize Import
    	 * @access private
    	 */
    	function initImport($zipfile, $overwrite=true) {
    		$module = $this->getModuleNameFromZip($zipfile);
    		if($module != null) {
    
    			$unzip = new Vtiger_Unzip($zipfile, $overwrite);
    
    			// Unzip selectively
    			$unzip->unzipAllEx( ".",
    				Array(
    					// Include only file/folders that need to be extracted
    					'include' => Array('templates', "modules/$module", 'cron', 'languages', 'settings', 
    						'settings/actions', 'settings/views', 'settings/models', 'settings/templates',
    						'settings/connectors', 'settings/libraries', 'settings/handlers', "$module.png", "images", 'layouts'),
    					// NOTE: If excludes is not given then by those not mentioned in include are ignored.
    				),
    				// What files needs to be renamed?
    				Array(
    					// Templates folder
    					'templates' => "layouts/vlayout/modules/$module",
    					// Cron folder
    					'cron' => "cron/modules/$module",
    					// Settings folder
    					'settings/actions' => "modules/Settings/$module/actions",
    					'settings/views' => "modules/Settings/$module/views",
    					'settings/models' => "modules/Settings/$module/models",
    					'settings/connectors' => "modules/Settings/$module/connectors",
    					'settings/libraries' => "modules/Settings/$module/libraries",
    					'settings/handlers' => "modules/Settings/$module/handlers",
    
    					// Settings templates folder
    					'settings/templates' => "layouts/vlayout/modules/Settings/$module",
    					//module images
    					'images' =>   "layouts/vlayout/skins/images/$module",
    					'settings' => "modules/Settings",
    					'layouts' => 'layouts'
    				)
    			);
    
    			if($unzip->checkFileExistsInRootFolder("$module.png")) {
    				$unzip->unzip("$module.png", "layouts/vlayout/skins/images/$module.png");
    			}
    
    			if($unzip) $unzip->close();
    		}
    		return $module;
    	}
    
    	function getTemporaryFilePath($filepath=false) {
    		return 'cache/'. $filepath;
    	}
    	/**
    	 * Get dependent version
    	 * @access private
    	 */
    	function getDependentVtigerVersion() {
    		return $this->_modulexml->dependencies->vtiger_version;
    	}
    
    	/**
    	 * Get dependent Maximum version
    	 * @access private
    	 */
    	function getDependentMaxVtigerVersion() {
    		return $this->_modulexml->dependencies->vtiger_max_version;
    	}
    
    	/**
    	 * Get package version
    	 * @access private
    	 */
    	function getVersion() {
    		return (string)$this->_modulexml->version;
    	}
    
    	/**
    	 * Get package author name
    	 * @access private
    	 */
    	function getAuthorName() {
    		return $this->_modulexml->authorname;
    	}
    
    	/**
    	 * Get package author phone number
    	 * @access private
    	 */
    	function getAuthorPhone() {
    		return $this->_modulexml->authorphone;
    	}
    
    	/**
    	 * Get package author phone email
    	 * @access private
    	 */
    	function getAuthorEmail() {
    		return $this->_modulexml->authoremail;
    	}
    
    	/**
    	 * Get package author phone email
    	 * @access private
    	 */
    	function getDescription() {
    		return $this->_modulexml->description;
    	}
    
    	/**
    	 * Import Module from zip file
    	 * @param String Zip file name
    	 * @param Boolean True for overwriting existing module
    	 *
    	 * @todo overwrite feature is not functionally currently.
    	 */
    	function import($zipfile, $overwrite=false) {
    		$module = $this->getModuleNameFromZip($zipfile);
    		if($module != null) {
    			// If data is not yet available
    			if(empty($this->_modulexml)) {
    				$this->__parseManifestFile($unzip);
    			}
    
    			$buildModuleArray = array();
    			$installSequenceArray = array();
    			$moduleBundle = (boolean)$this->_modulexml->modulebundle;
    			if($moduleBundle == true) {
    				$moduleList = (Array)$this->_modulexml->modulelist;
    				foreach($moduleList as $moduleInfos) {
    					foreach($moduleInfos as $moduleInfo) {
    						$moduleInfo = (Array)$moduleInfo;
    						$buildModuleArray[] = $moduleInfo;
    						$installSequenceArray[] = $moduleInfo['install_sequence'];
    					}
    				}
    				sort($installSequenceArray);
    				$unzip = new Vtiger_Unzip($zipfile);
    				$unzip->unzipAllEx($this->getTemporaryFilePath());
    				foreach ($installSequenceArray as $sequence) {
    					foreach ($buildModuleArray as $moduleInfo) {
    						if($moduleInfo['install_sequence'] == $sequence) {
    							$this->import($this->getTemporaryFilePath($moduleInfo['filepath']), $overwrite);
    						}
    					}
    				}
    			} else {
    				$module = $this->initImport($zipfile, $overwrite);
    				// Call module import function
    				$this->import_Module();
    			}
    		}
    	}
    
    	/**
    	 * Import Module
    	 * @access private
    	 */
    	function import_Module() {
    		$tabname = (string)$this->_modulexml->name;
    		$tablabel= (string)$this->_modulexml->label;
    		$parenttab=(string)$this->_modulexml->parent;
    		$tabversion=(string)$this->_modulexml->version;
    
    		$isextension= false;
    		if(!empty($this->_modulexml->type)) {
    			$type = strtolower($this->_modulexml->type);
    			if($type == 'extension' || $type == 'language')
    				$isextension = true;
    		}
    
    		$vtigerMinVersion = (string)$this->_modulexml->dependencies->vtiger_version;
    		$vtigerMaxVersion = (string)$this->_modulexml->dependencies->vtiger_max_version;
    
    		$parentTabs = explode(',', $parenttab);
    
    		$moduleInstance = new Vtiger_Module();
    		$moduleInstance->name = $tabname;
    		$moduleInstance->label= $tablabel;
    		$moduleInstance->parent=$parentTabs[0];
    		$moduleInstance->isentitytype = ($isextension != true);
    		$moduleInstance->version = (!$tabversion)? 0 : $tabversion;
    		$moduleInstance->minversion = (!$vtigerMinVersion)? false : $vtigerMinVersion;
    		$moduleInstance->maxversion = (!$vtigerMaxVersion)?  false : $vtigerMaxVersion;
    		$moduleInstance->save();
    
    		if(!empty($parenttab)) {
    			$parenttab = $parentTabs[0];
    			$menuInstance = Vtiger_Menu::getInstance($parenttab);
    			$menuInstance->addModule($moduleInstance);
    		}
    
    		$this->import_Tables($this->_modulexml, $moduleInstance);
    		$this->import_Blocks($this->_modulexml, $moduleInstance);
    		$this->import_CustomViews($this->_modulexml, $moduleInstance);
    		$this->import_SharingAccess($this->_modulexml, $moduleInstance);
    		$this->import_Events($this->_modulexml, $moduleInstance);
    		$this->import_Actions($this->_modulexml, $moduleInstance);
    		$this->import_RelatedLists($this->_modulexml, $moduleInstance);
    		$this->import_CustomLinks($this->_modulexml, $moduleInstance);
    		$this->import_CronTasks($this->_modulexml);
    
    		// Add module entry for menu editor
    		foreach($parentTabs as $parenttabName) {
    			Settings_MenuEditor_Module_Model::addModuleToApp($tabname, $parenttabName);
    		}
    
    		Vtiger_Module::fireEvent($moduleInstance->name, Vtiger_Module::EVENT_MODULE_POSTINSTALL);
    
    		$moduleInstance->initWebservice();
    		Vtiger_Cache::delete('module', $this->getModuleName());
    	}
    
    	/**
    	 * Import Tables of the module
    	 * @access private
    	 */
    	function import_Tables($modulenode, $moduleInstance = false) {
    		if(empty($modulenode->tables) || empty($modulenode->tables->table)) return;
    
    		/**
    		 * Record the changes in schema file
    		 */
    
    		if(file_exists("modules/$modulenode->name")){
    			$fileToOpen = "modules/$modulenode->name/schema.xml";
    		} else if(file_exists("modules/Settings/$modulenode->name")){
    			$fileToOpen = "modules/Settings/$modulenode->name/schema.xml";
    		}
    		$schemafile = fopen($fileToOpen, 'w');
    		if($schemafile) {
    			fwrite($schemafile, "<?xml version='1.0'?>\n");
    			fwrite($schemafile, "<schema>\n");
    			fwrite($schemafile, "\t<tables>\n");
    		}
    
    		// Import the table via queries
    		foreach($modulenode->tables->table as $tablenode) {
    			$tablename = $tablenode->name;
    			$tablesql  = "$tablenode->sql"; // Convert to string format
    
    			// Save the information in the schema file.
    			fwrite($schemafile, "\t\t<table>\n");
    			fwrite($schemafile, "\t\t\t<name>$tablename</name>\n");
    			fwrite($schemafile, "\t\t\t<sql><![CDATA[$tablesql]]></sql>\n");
    			fwrite($schemafile, "\t\t</table>\n");
    
    			// Avoid executing SQL that will DELETE or DROP table data
    			if(Vtiger_Utils::IsCreateSql($tablesql)) {
    				if(!Vtiger_Utils::checkTable($tablename)) {
    					self::log("SQL: $tablesql ... ", false);
    					Vtiger_Utils::ExecuteQuery($tablesql);
    					self::log("DONE");
    				}
    			} else {
    				if(Vtiger_Utils::IsDestructiveSql($tablesql)) {
    					self::log("SQL: $tablesql ... SKIPPED");
    				} else {
    					self::log("SQL: $tablesql ... ", false);
    					Vtiger_Utils::ExecuteQuery($tablesql);
    					self::log("DONE");
    				}
    			}
    		}
    
    		//Adding user specific table for new modules if does not exists in manifest file
    		$moduleModel = Vtiger_Module_Model::getInstance($modulenode->name);
    		if($moduleInstance && $moduleInstance->isentitytype && $moduleModel->isStarredEnabled()) {
    			$moduleUserSpecificTable = Vtiger_Functions::getUserSpecificTableName($modulenode->name);
    			if (!Vtiger_Utils::CheckTable($moduleUserSpecificTable)) {
    				Vtiger_Utils::CreateTable($moduleUserSpecificTable, 
    						'(`recordid` INT(19) NOT NULL, 
    						   `userid` INT(19) NOT NULL,
    						   Index `record_user_idx` (`recordid`, `userid`)
    							)', true);
    			}
    		}
    
    		if($schemafile) {
    			fwrite($schemafile, "\t</tables>\n");
    			fwrite($schemafile, "</schema>\n");
    			fclose($schemafile);
    		}
    	}
    
    	/**
    	 * Import Blocks of the module
    	 * @access private
    	 */
    	function import_Blocks($modulenode, $moduleInstance) {
    		if(empty($modulenode->blocks) || empty($modulenode->blocks->block)) return;
    		foreach($modulenode->blocks->block as $blocknode) {
    			$blockInstance = $this->import_Block($modulenode, $moduleInstance, $blocknode);
    			$this->import_Fields($blocknode, $blockInstance, $moduleInstance);
    		}
    		if($moduleInstance->isentitytype) {
    			//Add mandatory fields to first block
    			foreach ($modulenode->blocks->block as $blocknode) {
    				$blockInstance = Vtiger_Block::getInstance((string)$blocknode->label, $moduleInstance);
    				$this->import_mandatoryFields($blocknode, $blockInstance, $moduleInstance);
    				break;
    			}
    		}
    	}
    
    	/**
    	 * Import Block of the module
    	 * @access private
    	 */
    	function import_Block($modulenode, $moduleInstance, $blocknode) {
    		$blocklabel = $blocknode->label;
    
    		$blockInstance = new Vtiger_Block();
    		$blockInstance->label = $blocklabel;
    		$moduleInstance->addBlock($blockInstance);
    		return $blockInstance;
    	}
    
    	/**
    	 * Import Fields of the module
    	 * @access private
    	 */
    	function import_Fields($blocknode, $blockInstance, $moduleInstance) {
    		if(empty($blocknode->fields) || empty($blocknode->fields->field)) return;
    
    		foreach($blocknode->fields->field as $fieldnode) {
    			$fieldInstance = $this->import_Field($blocknode, $blockInstance, $moduleInstance, $fieldnode);
    		}
    	}
    
    	/**
    	 * Import Field of the module
    	 * @access private
    	 */
    	function import_Field($blocknode, $blockInstance, $moduleInstance, $fieldnode) {
    		$fieldInstance = new Vtiger_Field();
    		$fieldInstance->name		 = $fieldnode->fieldname;
    		$fieldInstance->label		 = $fieldnode->fieldlabel;
    		$fieldInstance->table		 = $fieldnode->tablename;
    		$fieldInstance->column		 = $fieldnode->columnname;
    		$fieldInstance->uitype		 = $fieldnode->uitype;
    		$fieldInstance->generatedtype= $fieldnode->generatedtype;
    		$fieldInstance->readonly	 = $fieldnode->readonly;
    		$fieldInstance->presence	 = $fieldnode->presence;
    		$fieldInstance->defaultvalue = $fieldnode->defaultvalue;
    		$fieldInstance->maximumlength= $fieldnode->maximumlength;
    		$fieldInstance->sequence	 = $fieldnode->sequence;
    		$fieldInstance->quickcreate	 = $fieldnode->quickcreate;
    		$fieldInstance->quicksequence= $fieldnode->quickcreatesequence;
    		$fieldInstance->typeofdata	 = $fieldnode->typeofdata;
    		$fieldInstance->displaytype	 = $fieldnode->displaytype;
    		$fieldInstance->info_type	 = $fieldnode->info_type;
    		$fieldInstance->summaryfield = $fieldnode->summaryfield;
    
    		if(!empty($fieldnode->helpinfo))
    			$fieldInstance->helpinfo = $fieldnode->helpinfo;
    
    		if(isset($fieldnode->masseditable))
    			$fieldInstance->masseditable = $fieldnode->masseditable;
    
    		if(isset($fieldnode->columntype) && !empty($fieldnode->columntype))
    			$fieldInstance->columntype = $fieldnode->columntype;
    
    		$blockInstance->addField($fieldInstance);
    
    		// Set the field as entity identifier if marked.
    		if(!empty($fieldnode->entityidentifier)) {
    			$moduleInstance->entityidfield = (string)$fieldnode->entityidentifier->entityidfield;
    			$moduleInstance->entityidcolumn= (string)$fieldnode->entityidentifier->entityidcolumn;
    			$moduleInstance->setEntityIdentifier($fieldInstance);
    		}
    
    		// Check picklist values associated with field if any.
    		if(!empty($fieldnode->picklistvalues) && !empty($fieldnode->picklistvalues->picklistvalue)) {
    			$picklistvalues = Array();
    			foreach($fieldnode->picklistvalues->picklistvalue as $picklistvaluenode) {
    				$picklistvalues[] = $picklistvaluenode;
    			}
    			$fieldInstance->setPicklistValues( $picklistvalues );
    		}
    
    		// Check related modules associated with this field
    		if(!empty($fieldnode->relatedmodules) && !empty($fieldnode->relatedmodules->relatedmodule)) {
    			$relatedmodules = Array();
    			foreach($fieldnode->relatedmodules->relatedmodule as $relatedmodulenode) {
    				$relatedmodules[] = (string)$relatedmodulenode;
    			}
    			$fieldInstance->setRelatedModules($relatedmodules);
    		}
    
    		$this->__AddModuleFieldToCache($moduleInstance, $fieldnode->fieldname, $fieldInstance);
    		return $fieldInstance;
    	}
    
    	/**
    	 * Import Custom views of the module
    	 * @access private
    	 */
    	function import_CustomViews($modulenode, $moduleInstance) {
    		if(empty($modulenode->customviews) || empty($modulenode->customviews->customview)) return;
    		foreach($modulenode->customviews->customview as $customviewnode) {
    			$filterInstance = $this->import_CustomView($modulenode, $moduleInstance, $customviewnode);
    
    		}
    	}
    
    	/**
    	 * Import Custom View of the module
    	 * @access private
    	 */
    	function import_CustomView($modulenode, $moduleInstance, $customviewnode) {
    		$viewname = $customviewnode->viewname;
    		$setdefault=$customviewnode->setdefault;
    		$setmetrics=$customviewnode->setmetrics;
    
    		$filterInstance = new Vtiger_Filter();
    		$filterInstance->name = $viewname;
    		$filterInstance->isdefault = $setdefault;
    		$filterInstance->inmetrics = $setmetrics;
    
    		$moduleInstance->addFilter($filterInstance);
    
    		foreach($customviewnode->fields->field as $fieldnode) {
    			$fieldInstance = $this->__GetModuleFieldFromCache($moduleInstance, $fieldnode->fieldname);
    			$filterInstance->addField($fieldInstance, $fieldnode->columnindex);
    
    			if(!empty($fieldnode->rules->rule)) {
    				foreach($fieldnode->rules->rule as $rulenode) {
    					$filterInstance->addRule($fieldInstance, $rulenode->comparator, $rulenode->value, $rulenode->columnindex);
    				}
    			}
    		}
    	}
    
    	/**
    	 * Import Sharing Access of the module
    	 * @access private
    	 */
    	function import_SharingAccess($modulenode, $moduleInstance) {
    		if(empty($modulenode->sharingaccess)) return;
    
    		if(!empty($modulenode->sharingaccess->default)) {
    			foreach($modulenode->sharingaccess->default as $defaultnode) {
    				$moduleInstance->setDefaultSharing($defaultnode);
    			}
    		}
    	}
    
    	/**
    	 * Import Events of the module
    	 * @access private
    	 */
    	function import_Events($modulenode, $moduleInstance) {
    		if(empty($modulenode->events) || empty($modulenode->events->event))	return;
    
    		if(Vtiger_Event::hasSupport()) {
    			foreach($modulenode->events->event as $eventnode) {
    				$this->import_Event($modulenode, $moduleInstance, $eventnode);
    			}
    		}
    	}
    
    	/**
    	 * Import Event of the module
    	 * @access private
    	 */
    	function import_Event($modulenode, $moduleInstance, $eventnode) {
    		$event_condition = '';
    		$event_dependent = '[]';
    		if(!empty($eventnode->condition)) $event_condition = "$eventnode->condition";
    		if(!empty($eventnode->dependent)) $event_dependent = "$eventnode->dependent";
    		Vtiger_Event::register($moduleInstance,
    			(string)$eventnode->eventname, (string)$eventnode->classname,
    			(string)$eventnode->filename, (string)$event_condition, (string)$event_dependent
    		);
    	}
    
    	/**
    	 * Import actions of the module
    	 * @access private
    	 */
    	function import_Actions($modulenode, $moduleInstance) {
    		if(empty($modulenode->actions) || empty($modulenode->actions->action)) return;
    		foreach($modulenode->actions->action as $actionnode) {
    			$this->import_Action($modulenode, $moduleInstance, $actionnode);
    		}
    	}
    
    	/**
    	 * Import action of the module
    	 * @access private
    	 */
    	function import_Action($modulenode, $moduleInstance, $actionnode) {
    		$actionstatus = $actionnode->status;
    		if($actionstatus == 'enabled')
    			$moduleInstance->enableTools($actionnode->name);
    		else
    			$moduleInstance->disableTools($actionnode->name);
    	}
    
    	/**
    	 * Import related lists of the module
    	 * @access private
    	 */
    	function import_RelatedLists($modulenode, $moduleInstance) {
    		if(empty($modulenode->relatedlists) || empty($modulenode->relatedlists->relatedlist)) return;
    		foreach($modulenode->relatedlists->relatedlist as $relatedlistnode) {
    			$relModuleInstance = $this->import_Relatedlist($modulenode, $moduleInstance, $relatedlistnode);
    		}
    	}
    
    	/**
    	 * Import related list of the module.
    	 * @access private
    	 */
    	function import_Relatedlist($modulenode, $moduleInstance, $relatedlistnode) {
    		$relModuleInstance = Vtiger_Module::getInstance($relatedlistnode->relatedmodule);
    		$label = $relatedlistnode->label;
    		$actions = false;
    		if(!empty($relatedlistnode->actions) && !empty($relatedlistnode->actions->action)) {
    			$actions = Array();
    			foreach($relatedlistnode->actions->action as $actionnode) {
    				$actions[] = "$actionnode";
    			}
    		}
    		if($relModuleInstance) {
    			$moduleInstance->setRelatedList($relModuleInstance, "$label", $actions, "$relatedlistnode->function");
    		}
    		return $relModuleInstance;
    	}
    
    	/**
    	 * Import custom links of the module.
    	 * @access private
    	 */
    	function import_CustomLinks($modulenode, $moduleInstance) {
    		if(empty($modulenode->customlinks) || empty($modulenode->customlinks->customlink)) return;
    
    		foreach($modulenode->customlinks->customlink as $customlinknode) {
    			$handlerInfo = null;
    			if(!empty($customlinknode->handler_path)) {
    				$handlerInfo = array();
    				$handlerInfo = array("$customlinknode->handler_path",
    										"$customlinknode->handler_class",
    										"$customlinknode->handler");
    			}
    			$moduleInstance->addLink(
    				"$customlinknode->linktype",
    				"$customlinknode->linklabel",
    				"$customlinknode->linkurl",
    				"$customlinknode->linkicon",
    				"$customlinknode->sequence",
    				$handlerInfo
    			);
    		}
    	}
    
    	/**
    	 * Import cron jobs of the module.
    	 * @access private
    	 */
    	function import_CronTasks($modulenode){
    		if(empty($modulenode->crons) || empty($modulenode->crons->cron)) return;
    		foreach ($modulenode->crons->cron as $cronTask){
    			if(empty($cronTask->status)){
    				$cronTask->status = Vtiger_Cron::$STATUS_DISABLED;
    			} else {
    				$cronTask->status = Vtiger_Cron::$STATUS_ENABLED;
    			}
    			if((empty($cronTask->sequence))){
    				$cronTask->sequence=Vtiger_Cron::nextSequence();
    			}
    			Vtiger_Cron::register("$cronTask->name","$cronTask->handler", "$cronTask->frequency", "$modulenode->name","$cronTask->status","$cronTask->sequence","$cronTask->description");
    		}
    	}
    
    	/**
    	 * Function which will import mandatory field for entity module if doest not exists
    	 * @param type $blocknode -- block for which fields needs to be added 
    	 */
    	function import_mandatoryFields($blocknode, $blockInstance, $moduleInstance) {
    		if(Vtiger_Field::getInstance('source', $moduleInstance) === false) {
    			// For Source of the record
    			$field = new Vtiger_Field();
    			$field->name = 'source';
    			$field->label = 'Source';
    			$field->table = 'vtiger_crmentity';
    			$field->presence = 2;
    			$field->displaytype = 2; // to disable field in Edit View
    			$field->readonly = 1;
    			$field->uitype = 1;
    			$field->typeofdata = 'V~O';
    			$field->quickcreate = 3;
    			$field->masseditable = 0;
    			$blockInstance->addField($field);
    		}
    
    		$moduleModel = Vtiger_Module_Model::getInstance($moduleInstance->name);
    		if(Vtiger_Field::getInstance('starred', $moduleInstance) === false && $moduleModel->isStarredEnabled()) {
    			//for starred record 
    			$field = new Vtiger_Field();
    			$field->name = 'starred';
    			$field->label = 'starred';
    			$field->table = Vtiger_Functions::getUserSpecificTableName($moduleInstance->name);
    			$field->presence = 2;
    			$field->displaytype = 6;
    			$field->readonly = 1;
    			$field->uitype = 56;
    			$field->typeofdata = 'C~O';
    			$field->quickcreate = 3;
    			$field->masseditable = 0;
    			$blockInstance->addField($field);
    		}
    
    		if (Vtiger_Field::getInstance('tags', $moduleInstance) === false && $moduleModel->isTagsEnabled()) {
    			$module = (string) $moduleInstance->name;
    			$focus = CRMEntity::getInstance($module);
    			if (isset($focus->customFieldTable)) {
    				$tableName = $focus->customFieldTable[0];
    			} else {
    				$tableName = 'vtiger_'.strtolower($module).'cf';
    			}
    			//Adding tag field
    			$field = new Vtiger_Field();
    			$field->name = "tags";
    			$field->label = "tags";
    			$field->table = $tableName;
    			$field->presence = 2;
    			$field->displaytype = 6;
    			$field->readonly = 1;
    			$field->uitype = 1;
    			$field->typeofdata = 'V~O';
    			$field->columntype = 'varchar(1)';
    			$field->quickcreate = 3;
    			$field->masseditable = 0;
    			$blockInstance->addField($field);
    		}
    	}
    
    }