Current Path : /var/www/html/clients/old.e-nkama.ru/e-nkama_bitrix/bitrix/modules/main/classes/general/ |
Current File : /var/www/html/clients/old.e-nkama.ru/e-nkama_bitrix/bitrix/modules/main/classes/general/module.php |
<? ############################################## # Bitrix Site Manager # # Copyright (c) 2002-2007 Bitrix # # http://www.bitrixsoft.com # # mailto:admin@bitrixsoft.com # ############################################## global $MAIN_MODULE_EVENTS, $MAIN_MODULE_INCLUDED, $MAIN_MODULE_INCLUDED_EX, $MAIN_MODULE_EVENTS_INIT; $MAIN_MODULE_INCLUDED = Array(); $MAIN_MODULE_INCLUDED_EX = Array(); $MAIN_MODULE_EVENTS = Array(); $MAIN_MODULE_EVENTS_INIT = false; $GLOBALS["arBitrixModuleClasses"] = array(); define("MODULE_NOT_FOUND", 0); define("MODULE_INSTALLED", 1); define("MODULE_DEMO", 2); define("MODULE_DEMO_EXPIRED", 3); if (!function_exists("__autoload")) { function __autoload($className) { CModule::RequireAutoloadClass($className); } define("NO_BITRIX_AUTOLOAD", False); } else { define("NO_BITRIX_AUTOLOAD", True); } Class CModule { var $MODULE_NAME; var $MODULE_DESCRIPTION; var $MODULE_VERSION; var $MODULE_ID; var $MODULE_SORT=10000; function AddAutoloadClasses($module, $arParams = array()) { if (!is_array($arParams) || count($arParams) <= 0) return False; $module = Trim($module); if (!minimumPHPVersion("5.0.0") || defined("NO_BITRIX_AUTOLOAD") && NO_BITRIX_AUTOLOAD) { foreach ($arParams as $key => $value) include_once($_SERVER["DOCUMENT_ROOT"].((StrLen($module) > 0) ? BX_ROOT."/modules/".$module."/" : "").$value); } else { foreach ($arParams as $key => $value) $GLOBALS["arBitrixModuleClasses"][strtolower($key)] = array( "module" => $module, "file" => $value ); } } function AutoloadClassDefined($className) { $className = Trim($className); if (StrLen($className) <= 0) return False; $className = strtolower($className); return array_key_exists($className, $GLOBALS["arBitrixModuleClasses"]); } function RequireAutoloadClass($className) { $className = Trim($className); if (StrLen($className) <= 0) return False; $className = strtolower($className); if (array_key_exists($className, $GLOBALS["arBitrixModuleClasses"])) { require_once($_SERVER["DOCUMENT_ROOT"].((StrLen($GLOBALS["arBitrixModuleClasses"][$className]["module"]) > 0) ? BX_ROOT."/modules/".$GLOBALS["arBitrixModuleClasses"][$className]["module"]."/" : "").$GLOBALS["arBitrixModuleClasses"][$className]["file"]); return True; } return False; } function _GetCache() { global $DB,$CACHE_MANAGER; if($CACHE_MANAGER->Read(3600, "b_module")) $arModules = $CACHE_MANAGER->Get("b_module"); else { $arModules = array(); $rs = $DB->Query("SELECT m.* FROM b_module m ORDER BY m.ID"); while($ar = $rs->Fetch()) $arModules[$ar['ID']] = $ar; $CACHE_MANAGER->Set("b_module", $arModules); } return $arModules; } function _GetName($arEvent) { $strName = ''; if(array_key_exists("CALLBACK", $arEvent)) { if(is_array($arEvent["CALLBACK"])) $strName .= (is_object($arEvent["CALLBACK"][0]) ? get_class($arEvent["CALLBACK"][0]) : $arEvent["CALLBACK"][0]).'::'.$arEvent["CALLBACK"][1]; else $strName .= $arEvent["CALLBACK"]; } else $strName .= $arEvent["TO_CLASS"].'::'.$arEvent["TO_METHOD"]; if(strlen($arEvent['TO_MODULE_ID'])>0) $strName .= ' ('.$arEvent['TO_MODULE_ID'].')'; return $strName; } function InstallDB() { return false; } function UnInstallDB() { } function InstallEvents() { } function UnInstallEvents() { } function InstallFiles() { } function UnInstallFiles() { } function DoInstall() { } function IsInstalled() { $arModules = CModule::_GetCache(); return array_key_exists($this->MODULE_ID, $arModules); } function DoUninstall() { } function Remove() { global $DB,$CACHE_MANAGER; $CACHE_MANAGER->Clean("b_module"); $DB->Query("DELETE FROM b_module WHERE ID='".$this->MODULE_ID."'"); } function Add() { global $DB, $CACHE_MANAGER, $MAIN_MODULE_INCLUDED, $MAIN_MODULE_INCLUDED_EX; $CACHE_MANAGER->Clean("b_module"); $DB->Query( "INSERT INTO b_module(ID) ". "VALUES('".$this->MODULE_ID."')" ); unset($MAIN_MODULE_INCLUDED[$this->MODULE_ID]); unset($MAIN_MODULE_INCLUDED_EX[$this->MODULE_ID]); } function GetList() { $result = new CDBResult; $result->InitFromArray(CModule::_GetCache()); return $result; } function IncludeModule($module_name) { global $DB, $MAIN_MODULE_INCLUDED, $MESS; if(defined("SM_SAFE_MODE") && SM_SAFE_MODE===true) { if(!in_array($module_name, Array("main", "fileman"))) return false; } if(is_set($MAIN_MODULE_INCLUDED, $module_name)) return $MAIN_MODULE_INCLUDED[$module_name]; $arModules = CModule::_GetCache(); if(!array_key_exists($module_name, $arModules)) { $MAIN_MODULE_INCLUDED[$module_name] = false; return false; } if(!file_exists($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/".$module_name."/include.php")) { $MAIN_MODULE_INCLUDED[$module_name] = false; return false; } //$oldval = ini_set("track_errors", "1"); $aaa = include_once($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/".$module_name."/include.php"); if ($aaa===false) { $MAIN_MODULE_INCLUDED[$module_name] = false; return false; } /* ini_set("track_errors", $oldval); if(strlen($php_errormsg)>0) { $MAIN_MODULE_INCLUDED[$module_name] = false; return false; } */ $MAIN_MODULE_INCLUDED[$module_name] = true; return true; } function IncludeModuleEx($module_name) { global $MAIN_MODULE_INCLUDED_EX; if (is_set($MAIN_MODULE_INCLUDED_EX, $module_name)) return $MAIN_MODULE_INCLUDED_EX[$module_name]; $module_name_tmp = str_replace(".", "_", $module_name); if (CModule::IncludeModule($module_name)) { if (defined($module_name_tmp."_DEMO") && constant($module_name_tmp."_DEMO") == "Y") $MAIN_MODULE_INCLUDED_EX[$module_name] = MODULE_DEMO; else $MAIN_MODULE_INCLUDED_EX[$module_name] = MODULE_INSTALLED; return $MAIN_MODULE_INCLUDED_EX[$module_name]; } if (defined($module_name_tmp."_DEMO") && constant($module_name_tmp."_DEMO") == "Y") { $MAIN_MODULE_INCLUDED_EX[$module_name] = MODULE_DEMO_EXPIRED; return MODULE_DEMO_EXPIRED; } $MAIN_MODULE_INCLUDED_EX[$module_name] = MODULE_NOT_FOUND; return MODULE_NOT_FOUND; } function err_mess() { return "<br>Class: CModule;<br>File: ".__FILE__; } function GetDropDownList($strSqlOrder="ORDER BY ID") { global $DB; $err_mess = (CModule::err_mess())."<br>Function: GetDropDownList<br>Line: "; $strSql = " SELECT ID as REFERENCE_ID, ID as REFERENCE FROM b_module $strSqlOrder "; $res = $DB->Query($strSql, false, $err_mess.__LINE__); return $res; } function CreateModuleObject($moduleId) { $moduleId = trim($moduleId); $moduleId = preg_replace("/[^a-zA-Z0-9_.]+/i", "", $moduleId); if (strlen($moduleId) <= 0) return false; $path = $_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/".$moduleId."/install/index.php"; if (!file_exists($path)) return false; include_once($path); $className = str_replace(".", "_", $moduleId); if (!class_exists($className)) return false; return new $className; } } function RegisterModule($id) { $m = new CModule; $m->MODULE_ID = $id; $m->Add(); } function UnRegisterModule($id) { global $DB; $DB->Query("DELETE FROM b_agent WHERE MODULE_ID='".$DB->ForSQL($id)."'"); CMain::DelGroupRight($id); $m = new CModule; $m->MODULE_ID = $id; $m->Remove(); } function AddEventHandler($FROM_MODULE_ID, $MESSAGE_ID, $CALLBACK, $SORT=100, $FULL_PATH = false) { global $MAIN_MODULE_EVENTS; $arEvent = array("FROM_MODULE_ID"=>$FROM_MODULE_ID, "MESSAGE_ID"=>$MESSAGE_ID, "CALLBACK"=>$CALLBACK, "SORT"=>$SORT, "FULL_PATH"=>$FULL_PATH); $arEvent['TO_NAME'] = CModule::_GetName($arEvent); $FROM_MODULE_ID = strtoupper($FROM_MODULE_ID); $MESSAGE_ID = strtoupper($MESSAGE_ID); if (!is_array($MAIN_MODULE_EVENTS[$FROM_MODULE_ID][$MESSAGE_ID])) $MAIN_MODULE_EVENTS[$FROM_MODULE_ID][$MESSAGE_ID] = array(); $iEventHandlerKey = count($MAIN_MODULE_EVENTS[$FROM_MODULE_ID][$MESSAGE_ID]); $MAIN_MODULE_EVENTS[$FROM_MODULE_ID][$MESSAGE_ID][] = $arEvent; uasort($MAIN_MODULE_EVENTS[$FROM_MODULE_ID][$MESSAGE_ID], create_function('$a, $b', 'if($a["SORT"] == $b["SORT"]) return 0; return ($a["SORT"] < $b["SORT"])? -1 : 1;')); return $iEventHandlerKey; } function RemoveEventHandler($FROM_MODULE_ID, $MESSAGE_ID, $iEventHandlerKey) { global $MAIN_MODULE_EVENTS; $FROM_MODULE_ID = strtoupper($FROM_MODULE_ID); $MESSAGE_ID = strtoupper($MESSAGE_ID); if (is_array($MAIN_MODULE_EVENTS[$FROM_MODULE_ID][$MESSAGE_ID])) { if (is_set($MAIN_MODULE_EVENTS[$FROM_MODULE_ID][$MESSAGE_ID], $iEventHandlerKey)) { unset($MAIN_MODULE_EVENTS[$FROM_MODULE_ID][$MESSAGE_ID][$iEventHandlerKey]); return true; } } return false; } function GetModuleEvents($MODULE_ID, $MESSAGE_ID) { global $DB, $MAIN_MODULE_EVENTS, $MAIN_MODULE_EVENTS_INIT; if($MAIN_MODULE_EVENTS_INIT === false) { global $CACHE_MANAGER; if($CACHE_MANAGER->Read(3600, "b_module_to_module")) $arEvents = $CACHE_MANAGER->Get("b_module_to_module"); else { $arEvents = array(); $rs = $DB->Query(" SELECT * FROM b_module_to_module m2m INNER JOIN b_module m ON (m2m.TO_MODULE_ID = m.ID) ORDER BY SORT "); while($ar = $rs->Fetch()) { $ar['TO_NAME'] = CModule::_GetName($ar); $ar["~FROM_MODULE_ID"]=strtoupper($ar["FROM_MODULE_ID"]); $ar["~MESSAGE_ID"]=strtoupper($ar["MESSAGE_ID"]); if (strlen($ar["TO_METHOD_ARG"]) > 0) $ar["TO_METHOD_ARG"] = unserialize($ar["TO_METHOD_ARG"]); else $ar["TO_METHOD_ARG"] = array(); $arEvents[] = $ar; } $CACHE_MANAGER->Set("b_module_to_module", $arEvents); } if(!is_array($arEvents)) $arEvents = Array(); foreach($arEvents as $ar) $MAIN_MODULE_EVENTS[$ar["~FROM_MODULE_ID"]][$ar["~MESSAGE_ID"]][] = $ar; // need to re-sort because of AddEventHandler() calls $funcSort = create_function('$a, $b', 'if($a["SORT"] == $b["SORT"]) return 0; return ($a["SORT"] < $b["SORT"])? -1 : 1;'); foreach(array_keys($MAIN_MODULE_EVENTS) as $module) foreach(array_keys($MAIN_MODULE_EVENTS[$module]) as $message) uasort($MAIN_MODULE_EVENTS[$module][$message], $funcSort); $MAIN_MODULE_EVENTS_INIT = true; } $MODULE_ID = strtoupper($MODULE_ID); $MESSAGE_ID = strtoupper($MESSAGE_ID); if(array_key_exists($MODULE_ID, $MAIN_MODULE_EVENTS) && array_key_exists($MESSAGE_ID, $MAIN_MODULE_EVENTS[$MODULE_ID])) $arrResult = $MAIN_MODULE_EVENTS[$MODULE_ID][$MESSAGE_ID]; else $arrResult = Array(); $resRS = new CDBResult; $resRS->InitFromArray($arrResult); return $resRS; } function ExecuteModuleEvent($arEvent, $param1=NULL, $param2=NULL, $param3=NULL, $param4=NULL, $param5=NULL, $param6=NULL, $param7=NULL, $param8=NULL, $param9=NULL, $param10=NULL) { $CNT_PREDEF = 10; $r = true; if($arEvent["TO_MODULE_ID"]<>"" && $arEvent["TO_MODULE_ID"]<>"main") { if(!CModule::IncludeModule($arEvent["TO_MODULE_ID"])) return; $r = include_once($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/".$arEvent["TO_MODULE_ID"]."/include.php"); } elseif($arEvent["TO_PATH"]<>"" && file_exists($_SERVER["DOCUMENT_ROOT"].BX_ROOT.$arEvent["TO_PATH"])) $r = include_once($_SERVER["DOCUMENT_ROOT"].BX_ROOT.$arEvent["TO_PATH"]); elseif($arEvent["FULL_PATH"]<>"" && file_exists($arEvent["FULL_PATH"])) $r = include_once($arEvent["FULL_PATH"]); if((strlen($arEvent["TO_CLASS"])<=0 || strlen($arEvent["TO_METHOD"])<=0) && !is_set($arEvent, "CALLBACK")) return $r; UnSet($resmod); $args = Array(); if (is_array($arEvent["TO_METHOD_ARG"]) && count($arEvent["TO_METHOD_ARG"]) > 0) { foreach ($arEvent["TO_METHOD_ARG"] as $v) $args[] = $v; } for($i=1; $i<=$CNT_PREDEF; $i++) { if($i>func_num_args()) break; $args[] = &${"param".$i}; } for($i=$CNT_PREDEF+1; $i<func_num_args(); $i++) $args[] = func_get_arg($i); if(is_set($arEvent, "CALLBACK")) $resmod = call_user_func_array($arEvent["CALLBACK"], $args); else $resmod = call_user_func_array(array($arEvent["TO_CLASS"], $arEvent["TO_METHOD"]), $args); return $resmod; } function ExecuteModuleEventEx($arEvent, $arParams = array()) { $r = true; if($arEvent["TO_MODULE_ID"]<>"" && $arEvent["TO_MODULE_ID"]<>"main") { if(CModule::IncludeModule($arEvent["TO_MODULE_ID"])) $r = include_once($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/".$arEvent["TO_MODULE_ID"]."/include.php"); else return; } elseif($arEvent["TO_PATH"]<>"" && file_exists($_SERVER["DOCUMENT_ROOT"].BX_ROOT.$arEvent["TO_PATH"])) { $r = include_once($_SERVER["DOCUMENT_ROOT"].BX_ROOT.$arEvent["TO_PATH"]); } elseif($arEvent["FULL_PATH"]<>"" && file_exists($arEvent["FULL_PATH"])) { $r = include_once($arEvent["FULL_PATH"]); } if(array_key_exists("CALLBACK", $arEvent)) { if(is_array($arEvent["TO_METHOD_ARG"]) && count($arEvent["TO_METHOD_ARG"])) $args = array_merge($arEvent["TO_METHOD_ARG"], $arParams); else $args = $arParams; return call_user_func_array($arEvent["CALLBACK"], $args); } elseif(strlen($arEvent["TO_CLASS"]) && strlen($arEvent["TO_METHOD"])) { if(is_array($arEvent["TO_METHOD_ARG"]) && count($arEvent["TO_METHOD_ARG"])) $args = array_merge($arEvent["TO_METHOD_ARG"], $arParams); else $args = $arParams; return call_user_func_array(array($arEvent["TO_CLASS"], $arEvent["TO_METHOD"]), $args); } else { return $r; } } function UnRegisterModuleDependences($FROM_MODULE_ID, $MESSAGE_ID, $TO_MODULE_ID, $TO_CLASS="", $TO_METHOD="", $TO_PATH="", $TO_METHOD_ARG = array()) { global $DB,$CACHE_MANAGER; $CACHE_MANAGER->Clean("b_module_to_module"); $TO_METHOD_ARG = ((!is_array($TO_METHOD_ARG) || is_array($TO_METHOD_ARG) && count($TO_METHOD_ARG) <= 0) ? "" : serialize($TO_METHOD_ARG)); $strSql = "DELETE FROM b_module_to_module ". "WHERE FROM_MODULE_ID='".$DB->ForSql($FROM_MODULE_ID)."'". " AND MESSAGE_ID='".$DB->ForSql($MESSAGE_ID)."' ". " AND TO_MODULE_ID='".$DB->ForSql($TO_MODULE_ID)."' ". (strlen($TO_CLASS)>0? " AND TO_CLASS='".$DB->ForSql($TO_CLASS)."' ": " AND (TO_CLASS='' OR TO_CLASS IS NULL) "). (strlen($TO_METHOD)>0? " AND TO_METHOD='".$DB->ForSql($TO_METHOD)."'": " AND (TO_METHOD='' OR TO_METHOD IS NULL) "). (strlen($TO_PATH)>0? " AND TO_PATH='".$DB->ForSql($TO_PATH)."'": " AND (TO_PATH='' OR TO_PATH IS NULL) "). (strlen($TO_METHOD_ARG)>0? " AND TO_METHOD_ARG='".$DB->ForSql($TO_METHOD_ARG)."'": " AND (TO_METHOD_ARG='' OR TO_METHOD_ARG IS NULL) "); $DB->Query($strSql, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__); } function RegisterModuleDependences($FROM_MODULE_ID, $MESSAGE_ID, $TO_MODULE_ID, $TO_CLASS="", $TO_METHOD="", $SORT=100, $TO_PATH="", $TO_METHOD_ARG = array()) { global $DB,$CACHE_MANAGER; $CACHE_MANAGER->Clean("b_module_to_module"); $TO_METHOD_ARG = ((!is_array($TO_METHOD_ARG) || is_array($TO_METHOD_ARG) && count($TO_METHOD_ARG) <= 0) ? "" : serialize($TO_METHOD_ARG)); $r = $DB->Query( "SELECT 'x' ". "FROM b_module_to_module ". "WHERE FROM_MODULE_ID='".$DB->ForSql($FROM_MODULE_ID)."'". " AND MESSAGE_ID='".$DB->ForSql($MESSAGE_ID)."' ". " AND TO_MODULE_ID='".$DB->ForSql($TO_MODULE_ID)."' ". " AND TO_CLASS='".$DB->ForSql($TO_CLASS)."' ". " AND TO_METHOD='".$DB->ForSql($TO_METHOD)."'". (strlen($TO_PATH)<=0? " AND (TO_PATH='' OR TO_PATH IS NULL)" :" AND TO_PATH='".$DB->ForSql($TO_PATH)."'" ). (strlen($TO_METHOD_ARG)<=0? " AND (TO_METHOD_ARG='' OR TO_METHOD_ARG IS NULL)" :" AND TO_METHOD_ARG='".$DB->ForSql($TO_METHOD_ARG)."'" ) ); if(!$r->Fetch()) { $arFields = array( "SORT" => intval($SORT), "FROM_MODULE_ID" => "'".$DB->ForSql($FROM_MODULE_ID)."'", "MESSAGE_ID" => "'".$DB->ForSql($MESSAGE_ID)."'", "TO_MODULE_ID" => "'".$DB->ForSql($TO_MODULE_ID)."'", "TO_CLASS" => "'".$DB->ForSql($TO_CLASS)."'", "TO_METHOD" => "'".$DB->ForSql($TO_METHOD)."'", "TO_PATH" => "'".$DB->ForSql($TO_PATH)."'", "TO_METHOD_ARG" => "'".$DB->ForSql($TO_METHOD_ARG)."'", ); $DB->Insert("b_module_to_module",$arFields, "FILE: ".__FILE__."<br>LINE: ".__LINE__); } } function IsModuleInstalled($module_id) { $m = new CModule; $m->MODULE_ID = $module_id; return $m->IsInstalled(); } function GetModuleID($str) { $arr = explode("/",$str); $i = array_search("modules",$arr); return $arr[$i+1]; } /************************************ return TRUE if version1 >= version2 version1 = "XX.XX.XX" version2 = "XX.XX.XX" ************************************/ function CheckVersion($version1, $version2) { $arr1 = explode(".",$version1); $arr2 = explode(".",$version2); if (intval($arr2[0])>intval($arr1[0])) return false; elseif (intval($arr2[0])<intval($arr1[0])) return true; else { if (intval($arr2[1])>intval($arr1[1])) return false; elseif (intval($arr2[1])<intval($arr1[1])) return true; else { if (intval($arr2[2])>intval($arr1[2])) return false; elseif (intval($arr2[2])<intval($arr1[2])) return true; else return true; } } }?>