$iMaxLen) { $s = mb_substr($s, 0, $iMaxLen); $sTail = $sEllipsisSign; } return htmlspecialchars_adv($s) . $sTail; } function html2txt($content, $tags = "") { while($content != strip_tags($content, $tags)) { $content = strip_tags($content, $tags); } return $content; } function html_encode($text) { $searcharray = array( "'([-_\w\d.]+@[-_\w\d.]+)'", "'((?:(?!://).{3}|^.{0,2}))(www\.[-\d\w\.\/]+)'", "'(http[s]?:\/\/[-_~\w\d\.\/]+)'"); $replacearray = array( "\\1", "\\1http://\\2", "\\1"); return preg_replace($searcharray, $replacearray, stripslashes($text)); } /** * Functions to process user input. * DON'T use to process data before passing to SQL query - use db prepare instead @see BxDolDb::prepare. * It is ok to use bx_process_input and then db prepare. * @param $mixedData data to process * @param $iDataType how to handle data, possible valies: * BX_DATA_INT - integer value * BX_DATA_FLOAT - float values * BX_DATA_CHECKBOX - 'on' or empty string * BX_DATA_TEXT - text data, single line (default) * BX_DATA_TEXT_MULTILINE - text data, multiple lines * BX_DATA_HTML - HTML data * BX_DATA_DATE - date data type stored as yyyy-mm-dd * BX_DATA_DATE_TS' - date data type stored as unixtimestamp * BX_DATA_DATETIME_TS - date/time data type stored as unixtimestamp * @param $mixedParams optional parameters to pass for validation * @return the filtered data, or FALSE if the filter fails. */ function bx_process_input ($mixedData, $iDataType = BX_DATA_TEXT, $mixedParams = false, $isCheckMagicQuotes = true) { if (is_array($mixedData)) { foreach ($mixedData as $k => $v) $mixedData[$k] = bx_process_input($v, $iDataType, $mixedParams); return $mixedData; } if (get_magic_quotes_gpc() && $isCheckMagicQuotes) $mixedData = stripslashes($mixedData); switch ($iDataType) { case BX_DATA_INT: return filter_var(trim($mixedData), FILTER_VALIDATE_INT); case BX_DATA_FLOAT: return filter_var(trim($mixedData), FILTER_VALIDATE_FLOAT); case BX_DATA_CHECKBOX: return 'on' == trim($mixedData) ? 'on' : ''; case BX_DATA_DATE: // maybe consider using strtotime $mixedData = trim($mixedData); if (!preg_match('/^\d{4}-\d{1,2}-\d{1,2}$/', $mixedData)) return false; list($iYear, $iMonth, $iDay) = explode('-', $mixedData); // 1985-10-28 $iDay = intval($iDay); $iMonth = intval($iMonth); $iYear = intval($iYear); return sprintf("%04d-%02d-%02d", $iYear, $iMonth, $iDay); case BX_DATA_DATE_TS: $mixedData = trim($mixedData); if (!preg_match('/^\d{4}-\d{1,2}-\d{1,2}$/', $mixedData)) return false; list($iYear, $iMonth, $iDay) = explode('-', $mixedData); $iDay = intval($iDay); $iMonth = intval($iMonth); $iYear = intval($iYear); $iRet = mktime (0, 0, 0, $iMonth, $iDay, $iYear); return $iRet > 0 ? $iRet : false; case BX_DATA_DATETIME_TS: if (!preg_match('#(\d+)\-(\d+)\-(\d+)[\sT]{1}(\d+):(\d+):(\d+)#', $mixedData, $m) && !preg_match('#(\d+)\-(\d+)\-(\d+)[\sT]{1}(\d+):(\d+)#', $mixedData, $m)) return bx_process_input ($mixedData, BX_DATA_DATE_TS, $mixedParams, $isCheckMagicQuotes); $iDay = $m[3]; $iMonth = $m[2]; $iYear = $m[1]; $iH = $m[4]; $iM = $m[5]; $iS = isset($m[6]) ? $m[6] : 0; $iRet = mktime ($iH, $iM, $iS, $iMonth, $iDay, $iYear); return $iRet > 0 ? $iRet : false; case BX_DATA_HTML: return clear_xss($mixedData); case BX_DATA_TEXT_MULTILINE: return nl2br(htmlspecialchars_adv($mixedData)); case BX_DATA_TEXT: default: return $mixedData; } } /* * Functions to process user output. * Always use this function before output data which was entered by user before. * @param $mixedData string to process * @param $iDataType how to handle data, possible valies the same as in bx_process_input function, see bx_process_input. * @param $mixedParams optional parameters to pass for validation * @return the filtered data, or FALSE if the filter fails. */ function bx_process_output ($mixedData, $iDataType = BX_DATA_TEXT, $mixedParams = false) { if (is_array($mixedData)) { foreach ($mixedData as $k => $v) $mixedData[$k] = bx_process_output($v, $iDataType, $mixedParams); return $mixedData; } switch ($iDataType) { case BX_DATA_INT: return filter_var($mixedData, FILTER_VALIDATE_INT); case BX_DATA_FLOAT: return filter_var($mixedData, FILTER_VALIDATE_FLOAT); case BX_DATA_CHECKBOX: return 'on' == trim($mixedData) ? 'on' : ''; case BX_DATA_DATE: return $mixedData; case BX_DATA_DATE_TS: return empty($mixedData) ? '' : date("Y-m-d", $mixedData); case BX_DATA_DATETIME_TS: return empty($mixedData) ? '' : date("Y-m-d H:i", $mixedData); case BX_DATA_HTML: return $mixedData; case BX_DATA_TEXT_MULTILINE: return $mixedData; case BX_DATA_TEXT: default: return htmlspecialchars_adv($mixedData); } } /* * This function apply bx_process_input and then bx_process_output. * Use this function to output data immediately after receiving, without saving to database. * Patams are the same as bx_process_input function - @see bx_process_input */ function bx_process_pass ($mixedData, $iDataType = BX_DATA_TEXT, $mixedParams = false, $isCheckMagicQuotes = true) { return bx_process_output(bx_process_input ($mixedData, $iDataType, $mixedParams, $isCheckMagicQuotes), $iDataType, $mixedParams); } /** * DEPRECATED * use bx_process_input + bx_process_output instead * -------- * function for processing pass data * * This function cleans the GET/POST/COOKIE data if magic_quotes_gpc() is on * for data which should be outputed immediately after submit */ /* function process_pass_data( $text, $strip_tags = 0 ) { if ( $strip_tags ) $text = strip_tags($text); if ( !get_magic_quotes_gpc() ) return $text; else return stripslashes($text); } */ /* * function for output data from database into html */ function htmlspecialchars_adv( $string ) { return htmlspecialchars($string, ENT_COMPAT, 'UTF-8'); } /** * Send mail to user by parsing email template */ function sendMailTemplate($sTemplateName, $iAccountId = 0, $iProfileId = 0, $aReplaceVars = array(), $iEmailType = BX_EMAIL_NOTIFY) { bx_import('BxDolAccount'); $oAccount = BxDolAccount::getInstance($iAccountId); bx_import('BxDolProfile'); $oProfile = BxDolProfile::getInstance($iProfileId); bx_import('BxDolEmailTemplates'); $oEmailTemplates = BxDolEmailTemplates::getInstance(); if (!$oAccount || !$oProfile || !$oEmailTemplates) return false; $aTemplate = $oEmailTemplates->parseTemplate($sTemplateName, $aReplaceVars, $iAccountId, $iProfileId); if (!$aTemplate) return false; return sendMail($oAccount->getEmail(), $aTemplate['Subject'], $aTemplate['Body'], 0, array(), $iEmailType); } /** * Send email function * * @param $sRecipientEmail - Email where email should be send * @param $sMailSubject - subject of the message * @param $sMailBody - Body of the message * @param $iRecipientID - ID of recipient profile * @param $aPlus - Array of additional information * @param $iEmailType - email message type: BX_EMAIL_SYSTEM, BX_EMAIL_NOTIFY or BX_EMAIL_MASS * @return true if message was send or false otherwise */ function sendMail($sRecipientEmail, $sMailSubject, $sMailBody, $iRecipientID = 0, $aPlus = array(), $iEmailType = BX_EMAIL_NOTIFY, $sEmailFlag = 'html', $isDisableAlert = false) { // make sure that recipient's email is valid and message isn't empty if (!$sMailBody || !$sRecipientEmail || preg_match('/\(2\)$/', $sRecipientEmail)) return false; // get recipient account bx_import('BxDolAccount'); $oAccount = BxDolAccount::getInstance($sRecipientEmail); $aAccountInfo = $oAccount ? $oAccount->getInfo() : false; // don't send bulk emails if user didn't subscribed to site news or email is unconfirmed if ($aAccountInfo && BX_EMAIL_MASS == $iEmailType && (!$aAccountInfo['email_confirmed'] || !$aAccountInfo['receive_news'])) return false; // don't send email notifications if user didn't subscribed to notifications or email is unconfirmed if ($aAccountInfo && BX_EMAIL_NOTIFY == $iEmailType && (!$aAccountInfo['email_confirmed'] || !$aAccountInfo['receive_updates'])) return false; // if profile id is provided - get profile's info $aRecipientInfo = false; if ($iRecipientID) { bx_import('BxDolProfile'); $oProfile = BxDolProfile::getInstance($iRecipientID); if ($oProfile) $aRecipientInfo = $oProfile->getInfo(); } // get site vars $sEmailNotify = getParam('site_email_notify'); $sSiteTitle = getParam('site_title'); // add unsubscribe link if (empty($aPlus['unsubscribe'])) { $aPlus['unsubscribe'] = ''; if ($oAccount && (BX_EMAIL_MASS == $iEmailType || BX_EMAIL_NOTIFY == $iEmailType)) $aPlus['unsubscribe'] = ($sLink = $oAccount->getUnsubscribeLink($iEmailType)) ? '' . _t('_sys_et_txt_unsubscribe') . '' : ''; } // parse template if ($aPlus || $iRecipientID) { if(!is_array($aPlus)) $aPlus = array(); bx_import('BxDolEmailTemplates'); $oEmailTemplates = BxDolEmailTemplates::getInstance(); $sMailSubject = $oEmailTemplates->parseContent($sMailSubject, $aPlus, $iRecipientID); $sMailBody = $oEmailTemplates->parseContent($sMailBody, $aPlus, $iRecipientID); } // email message headers $sMailHeader = "From: =?UTF-8?B?" . base64_encode( $sSiteTitle ) . "?= <{$sEmailNotify}>"; $sMailParameters = "-f{$sEmailNotify}"; $sMailSubject = '=?UTF-8?B?' . base64_encode( $sMailSubject ) . '?='; $sMailHeader = "MIME-Version: 1.0\r\n" . $sMailHeader; // build data for alert handler $bResult = null; $aAlert = array( 'email' => $sRecipientEmail, 'subject' => $sMailSubject, 'body' => $sMailBody, 'header' => $sMailHeader, 'params' => $sMailParameters, 'recipient' => $aRecipientInfo, 'html' => 'html' == $sEmailFlag ? true : false, 'override_result' => &$bResult, ); // system alert if (!$isDisableAlert) { bx_alert('system', 'before_send_mail', (isset($aRecipientInfo['ID']) ? $aRecipientInfo['ID'] : 0), '', $aAlert); if ($bResult !== null) return $bResult; unset($aAlert['override_result']); } // send mail if( 'html' == $sEmailFlag) { $sMailHeader = "Content-type: text/html; charset=UTF-8\r\n" . $sMailHeader; $iSendingResult = mail( $sRecipientEmail, $sMailSubject, $sMailBody, $sMailHeader, $sMailParameters ); } else { $sMailHeader = "Content-type: text/plain; charset=UTF-8\r\n" . $sMailHeader; $sMailBody = html2txt($sMailBody); $iSendingResult = mail( $sRecipientEmail, $sMailSubject, html2txt($sMailBody), $sMailHeader, $sMailParameters ); } // system alert if (!$isDisableAlert) bx_alert('system', 'send_mail', (isset($aRecipientInfo['ID']) ? $aRecipientInfo['ID'] : 0), '', $aAlert); return $iSendingResult; } /* * Getting an array with Templates' Names */ function get_templates_array($bEnabledOnly = true, $bShortInfo = true) { bx_import('BxDolDb'); $oDb = BxDolDb::getInstance(); $sWhereAddon = $bEnabledOnly ? " AND `enabled`='1'" : ""; if($bShortInfo) return $oDb->getPairs("SELECT `uri`, `title` FROM `sys_modules` WHERE 1 AND `type`='" . BX_DOL_MODULE_TYPE_TEMPLATE . "'" . $sWhereAddon, "uri", "title"); else return $oDb->getAllWithKey("SELECT * FROM `sys_modules` WHERE 1 AND `type`='" . BX_DOL_MODULE_TYPE_TEMPLATE . "'" . $sWhereAddon, "uri"); } /* * The Function Show a Line with Templates Names */ function templates_select_txt() { $templ_choices = get_templates_array(); $current_template = ( strlen( $_GET['skin'] ) ) ? $_GET['skin'] : $_COOKIE['skin']; foreach ($templ_choices as $tmpl_key => $tmpl_value) { if ($current_template == $tmpl_key) { $ReturnResult .= $tmpl_value . ' | '; } else { $sGetTransfer = bx_encode_url_params($_GET, array('skin')); $ReturnResult .= '' . $tmpl_value . ' | '; } } return $ReturnResult; } function extFileExists( $sFileSrc ) { return (file_exists( $sFileSrc ) && is_file( $sFileSrc )) ? true : false; } function getVisitorIP() { $ip = "0.0.0.0"; if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } elseif (isset( $_SERVER['HTTP_CLIENT_IP']) && !empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = explode(".",$_SERVER['HTTP_CLIENT_IP']); $ip = $ip[3].".".$ip[2].".".$ip[1].".".$ip[0]; } elseif (!isset( $_SERVER['HTTP_X_FORWARDED_FOR']) || empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { if (!isset( $_SERVER['HTTP_CLIENT_IP']) && empty($_SERVER['HTTP_CLIENT_IP']) && isset($_SERVER['REMOTE_ADDR'])) $ip = $_SERVER['REMOTE_ADDR']; } return $ip; } function genFlag( $country ) { return ''; } function genFlagUrl($country) { bx_import('BxDolTemplate'); return BxDolTemplate::getInstance()->getIconUrl('sys_fl_' . strtolower($country) . '.gif'); } // print debug information ( e.g. arrays ) function echoDbg( $what, $desc = '' ) { if ( $desc ) echo "$desc: "; echo "
";
        print_r( $what );
    echo "
\n"; } function echoDbgLog($mWhat, $sDesc = '', $sFileName = 'debug.log') { $sCont = '--- ' . date('r') . ' (' . BX_DOL_START_TIME . ") ---\n" . $sDesc . "\n" . print_r($mWhat, true) . "\n\n\n"; $rFile = fopen(BxDolConfig::getInstance()->get('path_dynamic', 'tmp') . $sFileName, 'a'); fwrite($rFile, $sCont); fclose($rFile); } function clear_xss($val) { if ($GLOBALS['logged']['admin']) return $val; // HTML Purifier plugin global $oHtmlPurifier; require_once( BX_DIRECTORY_PATH_PLUGINS . 'htmlpurifier/HTMLPurifier.standalone.php' ); if (!isset($oHtmlPurifier)) { HTMLPurifier_Bootstrap::registerAutoload(); $oConfig = HTMLPurifier_Config::createDefault(); $oConfig->set('Cache.SerializerPath', rtrim(BX_DIRECTORY_PATH_CACHE, '/')); $oConfig->set('HTML.SafeObject', 'true'); $oConfig->set('Output.FlashCompat', 'true'); $oConfig->set('HTML.FlashAllowFullScreen', 'true'); if (getParam('sys_add_nofollow')) { // TODO: add to "Security" settings $sHost = parse_url(BX_DOL_URL_ROOT, PHP_URL_HOST); $oConfig->set('URI.Host', $sHost); $oConfig->set('HTML.Nofollow', 'true'); } $oConfig->set('Filter.Custom', array (new HTMLPurifier_Filter_YouTube(), new HTMLPurifier_Filter_YoutubeIframe())); $oDef = $oConfig->getHTMLDefinition(true); $oDef->addAttribute('a', 'target', 'Enum#_blank,_self,_target,_top'); $oHtmlPurifier = new HTMLPurifier($oConfig); } return $oHtmlPurifier->purify($val); } //--------------------------------------- friendly permalinks --------------------------------------// //------------------------------------------- main functions ---------------------------------------// function uriGenerate ($s, $sTable, $sField, $sEmpty = '-') { $s = uriFilter($s, $sEmpty); if(uriCheckUniq($s, $sTable, $sField)) return $s; // cut off redundant part if(get_mb_len($s) > 240) $s = get_mb_substr($s, 0, 240); // try to add date $s .= '-' . date('Y-m-d'); if(uriCheckUniq($s, $sTable, $sField)) return $s; // try to add number for($i = 0 ; $i < 999 ; ++$i) if(uriCheckUniq($s . '-' . $i, $sTable, $sField)) return ($s . '-' . $i); return rand(0, 999999999); } function uriFilter ($s, $sEmpty = '-') { bx_import('BxTemplConfig'); if (BxTemplConfig::getInstance()->bAllowUnicodeInPreg) $s = get_mb_replace ('/[^\pL^\pN]+/u', '-', $s); // unicode characters else $s = get_mb_replace ('/([^\d^\w]+)/u', '-', $s); // latin characters only $s = get_mb_replace ('/([-^]+)/', '-', $s); $s = get_mb_replace ('/([-]+)$/', '', $s); // remove trailing dash if (!$s) $s = $sEmpty; return $s; } function uriCheckUniq ($s, $sTable, $sField) { bx_import('BxDolDb'); $oDb = BxDolDb::getInstance(); $sSql = $oDb->prepare("SELECT 1 FROM `$sTable` WHERE `$sField`=? LIMIT 1", $s); return !$oDb->query($sSql); } function get_mb_replace ($sPattern, $sReplace, $s) { return preg_replace ($sPattern, $sReplace, $s); } function get_mb_len ($s) { return (function_exists('mb_strlen')) ? mb_strlen($s) : strlen($s); } function get_mb_substr ($s, $iStart, $iLen) { return (function_exists('mb_substr')) ? mb_substr ($s, $iStart, $iLen) : substr ($s, $iStart, $iLen); } function bx_mb_substr_replace($s, $sReplace, $iPosStart, $iLength) { return mb_substr($s, 0, $iPosStart) . $sReplace . mb_substr($s, $iPosStart + $iLength); } function bx_mb_strpos ($s, $sReplacement, $iStart = 0) { return mb_strpos($s, $sReplacement, $iStart); } /** * Import class file, it automatically detects class path by its prefix or module array/name * * @param $sClassName - full class name or class postfix(withoit prefix) in the case of module class * @param $mixedModule - module array or module name in the case of module class */ function bx_import($sClassName, $mixedModule = array()) { if (class_exists($sClassName)) return; $aModule = false; if ($mixedModule) { if (is_array($mixedModule)) { $aModule = $mixedModule; } elseif (is_string($mixedModule)) { bx_import('BxDolModule'); $o = BxDolModule::getInstance($mixedModule); $aModule = $o->_aModule; } elseif (is_bool($mixedModule) && true === $mixedModule) { $aModule = $GLOBALS['aModule']; } } if ($aModule) { if (class_exists($aModule['class_prefix'] . $sClassName)) return; require_once (BX_DIRECTORY_PATH_MODULES . $aModule['path'] . 'classes/' . $aModule['class_prefix'] . $sClassName . '.php'); return; } if (0 == strncmp($sClassName, 'BxDol', 5)) { if (0 == strncmp($sClassName, 'BxDolStudio', 11)) require_once(BX_DOL_DIR_STUDIO_CLASSES . $sClassName . '.php'); else require_once(BX_DIRECTORY_PATH_CLASSES . $sClassName . '.php'); return; } if (0 == strncmp($sClassName, 'BxBase', 6)) { if (0 == strncmp($sClassName, 'BxBaseMod', 9)) { $aMatches = array(); if (preg_match('/BxBaseMod([A-Z][a-z]+)/', $sClassName, $aMatches)) { require_once(BX_DIRECTORY_PATH_MODULES . 'base/' . strtolower($aMatches[1]) . '/classes/' . $sClassName . '.php'); return; } } if (0 == strncmp($sClassName, 'BxBaseStudio', 12)) { require_once(BX_DOL_DIR_STUDIO_BASE . 'scripts/' . $sClassName . '.php'); return; } else { require_once(BX_DIRECTORY_PATH_BASE . 'scripts/' . $sClassName . '.php'); return; } } if (0 == strncmp($sClassName, 'BxTempl', 7) && !class_exists($sClassName)) { if(0 == strncmp($sClassName, 'BxTemplStudio', 13)) { bx_import('BxDolStudioTemplate'); $sPath = BX_DIRECTORY_PATH_MODULES . BxDolStudioTemplate::getInstance()->getPath() . 'data/template/studio/scripts/' . $sClassName . '.php'; } else { bx_import('BxDolTemplate'); $sPath = BX_DIRECTORY_PATH_MODULES . BxDolTemplate::getInstance()->getPath() . 'data/template/system/scripts/' . $sClassName . '.php'; } if (file_exists($sPath)) { require_once($sPath); return; } trigger_error ("bx_import fatal error: class (" . $sClassName . ") wasn't found", E_USER_ERROR); } } /** * Gets an instance of class pathing necessary parameters if it's necessary. * * @param string $sClassName class name. * @param array $aParams an array of parameters to be pathed to the constructor of the class. * @param array $aModule an array with module description. Is used when the requested class is located in some module. * @return unknown */ function bx_instance($sClassName, $aParams = array(), $aModule = array()) { if(isset($GLOBALS['bxDolClasses'][$sClassName])) return $GLOBALS['bxDolClasses'][$sClassName]; bx_import((empty($aModule) ? $sClassName : str_replace($aModule['class_prefix'], '', $sClassName)), $aModule); $oClass = new ReflectionClass($sClassName); $GLOBALS['bxDolClasses'][$sClassName] = empty($aParams) ? $oClass->newInstance() : $oClass->newInstanceArgs($aParams); return $GLOBALS['bxDolClasses'][$sClassName]; } /** * Escapes string/array ready to pass to js script with filtered symbols like ', " etc * * @param $mixedInput - string/array which should be filtered * @param $iQuoteType - string escaping method: BX_ESCAPE_STR_AUTO(default), BX_ESCAPE_STR_APOS or BX_ESCAPE_STR_QUOTE * @return converted string / array */ function bx_js_string ($mixedInput, $iQuoteType = BX_ESCAPE_STR_AUTO) { $aUnits = array( "\n" => "\\n", "\r" => "", ); if (BX_ESCAPE_STR_APOS == $iQuoteType) { $aUnits["'"] = "\\'"; $aUnits[''] = ""; } elseif (BX_ESCAPE_STR_QUOTE == $iQuoteType) { $aUnits['"'] = '\\"'; $aUnits[''] = ''; } else { $aUnits['"'] = '"e;'; $aUnits["'"] = '''; $aUnits["<"] = '<'; $aUnits[">"] = '>'; } return str_replace(array_keys($aUnits), array_values($aUnits), $mixedInput); } /** * Return input string/array ready to pass to html attribute with filtered symbols like ', " etc * * @param mixed $mixedInput - string/array which should be filtered * @return converted string / array */ function bx_html_attribute ($mixedInput, $iQuoteType = BX_ESCAPE_STR_AUTO) { $aUnits = array (); if (BX_ESCAPE_STR_APOS == $iQuoteType) $aUnits["'"] = "\\'"; elseif (BX_ESCAPE_STR_QUOTE == $iQuoteType) $aUnits['"'] = '"'; else $aUnits = array("\"" => """, "'" => "'"); return str_replace(array_keys($aUnits), array_values($aUnits), $mixedInput); } /** * Escapes string/array ready to pass to php script with filtered symbols like ', " etc * * @param mixed $mixedInput - string/array which should be filtered * @return converted string / array */ function bx_php_string_apos ($mixedInput) { return str_replace("'", "\\'", $mixedInput); } function bx_php_string_quot ($mixedInput) { return str_replace('"', '\\"', $mixedInput); } /** * Gets file contents by URL. * * @param string $sFileUrl - file URL to be read. * @param array $aParams - an array of parameters to be pathed with URL. * @return string the file's contents. */ function bx_file_get_contents($sFileUrl, $aParams = array(), $bChangeTimeout = false) { if ($aParams) $sFileUrl = bx_append_url_params($sFileUrl, $aParams); $sResult = ''; if(function_exists('curl_init')) { $rConnect = curl_init(); curl_setopt($rConnect, CURLOPT_URL, $sFileUrl); curl_setopt($rConnect, CURLOPT_HEADER, 0); curl_setopt($rConnect, CURLOPT_RETURNTRANSFER, 1); curl_setopt($rConnect, CURLOPT_FOLLOWLOCATION, 1); if ($bChangeTimeout) { curl_setopt($rConnect, CURLOPT_CONNECTTIMEOUT, 3); curl_setopt($rConnect, CURLOPT_TIMEOUT, 3); } $sAllCookies = ''; foreach($_COOKIE as $sKey=>$sValue){ $sAllCookies .= $sKey."=".$sValue.";"; } curl_setopt($rConnect, CURLOPT_COOKIE, $sAllCookies); $sResult = curl_exec($rConnect); curl_close($rConnect); } else { $iSaveTimeout = false; if ($bChangeTimeout) { $iSaveTimeout = ini_get('default_socket_timeout'); ini_set('default_socket_timeout', 3); } $sResult = @file_get_contents($sFileUrl); if ($bChangeTimeout && false !== $iSaveTimeout) { ini_set('default_socket_timeout', $iSaveTimeout); } } return $sResult; } // calculation ini_get('upload_max_filesize') in bytes as example function return_bytes($val) { $val = trim($val); $last = strtolower($val{strlen($val)-1}); $val = (int)$val; switch($last) { // The 'G' modifier is available since PHP 5.1.0 case 'k': $val *= 1024; break; case 'm': $val *= 1024 * 1024; break; case 'g': $val *= 1024 * 1024 * 1024; break; } return $val; } // Generate Random Password function genRndPwd($iLength = 8, $bSpecialCharacters = true) { $sPassword = ''; $sChars = "abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789"; if($bSpecialCharacters === true) $sChars .= "!?=/&+,."; srand((double)microtime()*1000000); for($i = 0; $i < $iLength; $i++) { $x = mt_rand(0, strlen($sChars) -1); $sPassword .= $sChars{$x}; } return $sPassword; } // Generate Random Salt for Password encryption function genRndSalt() { return genRndPwd(8, true); } // Encrypt User Password function encryptUserPwd($sPwd, $sSalt) { return sha1(md5($sPwd) . $sSalt); } function bx_get ($sName) { if (isset($_GET[$sName])) return $_GET[$sName]; elseif (isset($_POST[$sName])) return $_POST[$sName]; else return false; } function bx_encode_url_params ($a, $aExcludeKeys = array (), $aOnlyKeys = false) { $s = ''; foreach ($a as $sKey => $sVal) { if (in_array($sKey, $aExcludeKeys)) continue; if (false !== $aOnlyKeys && !in_array($sKey, $aOnlyKeys)) continue; if (is_array($sVal)) { foreach ($sVal as $sSubVal) { $s .= rawurlencode($sKey) . '[]=' . rawurlencode(is_array($sSubVal) ? 'array' : $sSubVal) . '&'; } } else { $s .= rawurlencode($sKey) . '=' . rawurlencode($sVal) . '&'; } } return $s; } function bx_append_url_params ($sUrl, $mixedParams) { if (!$mixedParams) return $sUrl; $sParams = false == strpos($sUrl, '?') ? '?' : '&'; if (is_array($mixedParams)) { foreach($mixedParams as $sKey => $sValue) $sParams .= $sKey . '=' . $sValue . '&'; $sParams = substr($sParams, 0, -1); } else { $sParams .= $mixedParams; } return $sUrl . $sParams; } function bx_rrmdir($directory) { if (substr($directory,-1) == "/") $directory = substr($directory,0,-1); if (!file_exists($directory) || !is_dir($directory)) return false; elseif (!is_readable($directory)) return false; if (!($directoryHandle = opendir($directory))) return false; while ($contents = readdir($directoryHandle)) { if ($contents != '.' && $contents != '..') { $path = $directory . "/" . $contents; if (is_dir($path)) bx_rrmdir($path); else unlink($path); } } closedir($directoryHandle); if (!rmdir($directory)) return false; return true; } function bx_clear_folder ($sPath, $aExts = array ()) { if (substr($$sPath,-1) == "/") $sPath = substr($sPath,0,-1); if (!file_exists($sPath) || !is_dir($sPath)) return false; elseif (!is_readable($sPath)) return false; if (!($h = opendir($sPath))) return false; while ($sFile = readdir($h)) { if ('.' == $sFile || '..' == $sFile) continue; $sFullPath = $sPath . '/' . $sFile; if (is_dir($sFullPath)) continue; if (!$aExts || (($sExt = pathinfo($sFullPath, PATHINFO_EXTENSION)) && in_array($sExt, $aExts))) @unlink($sFullPath); } closedir($h); return true; } function bx_ltrim_str ($sString, $sPrefix, $sReplace = '') { if ($sReplace && substr($sString, 0, strlen($sReplace)) == $sReplace) return $sString; if (substr($sString, 0, strlen($sPrefix)) == $sPrefix) return $sReplace . substr($sString, strlen($sPrefix)); return $sString; } /** * Convert array to attributes string * * Example: * @code * $a = array('name' => 'test', 'value' => 5); * $s = bx_convert_array2attrs($a); * echo $s; // outputs: name="test" value="5" * @endcode * * @param $a - array of attributes * @param $sClasses - classes to merge with 'class' attribute * @param $sStyles - styles to merge with 'style' attribute * @return string */ function bx_convert_array2attrs ($a, $sClasses = false, $sStyles = false) { $sRet = ''; if (!$a || !is_array($a)) $a = array(); if ($sClasses) { $sClasses = trim($sClasses); $a['class'] = $sClasses . (!empty($a['class']) ? ' ' . $a['class'] : ''); } if ($sStyles) { $sStyles = trim($sStyles); if (';' != $sStyles[strlen($sStyles)-1]) $sStyles .= ';'; $a['style'] = $sStyles . (!empty($a['style']) ? ' ' . $a['style'] : ''); } foreach ($a as $sKey => $sValue) { if(is_null($sValue)) // pass NULL values continue; $sValueC = bx_html_attribute($sValue, BX_ESCAPE_STR_QUOTE); $sRet .= " $sKey=\"$sValueC\""; } return $sRet; } function bx_unicode_urldecode($s) { preg_match_all('/%u([[:alnum:]]{4})/', $s, $a); foreach ($a[1] as $uniord) { $dec = hexdec($uniord); $utf = ''; if ($dec < 128) { $utf = chr($dec); } else if ($dec < 2048) { $utf = chr(192 + (($dec - ($dec % 64)) / 64)); $utf .= chr(128 + ($dec % 64)); } else { $utf = chr(224 + (($dec - ($dec % 4096)) / 4096)); $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64)); $utf .= chr(128 + ($dec % 64)); } $s = str_replace('%u'.$uniord, $utf, $s); } return urldecode($s); } /** * Raise an alert * @param string $sType - system type * @param string $sAction - system action * @param int $iObjectId - object id * @param int $iSenderId - sender (action's author) profile id, if it is false - then currectly logged in profile id is used */ function bx_alert($sUnit, $sAction, $iObjectId, $iSender = false, $aExtras = array()) { $o = new BxDolAlerts($sUnit, $sAction, $iObjectId, $iSender, $aExtras); $o->alert(); } function bx_replace_markers($mixed, $aMarkers) { if (empty($aMarkers)) return $mixed; if (is_array($mixed)) { foreach ($mixed as $sKey => $sValue) $mixed[$sKey] = bx_replace_markers ($sValue, $aMarkers); } else { foreach ($aMarkers as $sKey => $sValue) $mixed = str_replace('{' . $sKey . '}', $sValue, $mixed); } return $mixed; } function bx_site_hash($sSalt = '', $isSkipVersion = false) { return md5($sSalt . ($isSkipVersion ? '' : getParam('sys_version')) . BX_DOL_SECRET . BX_DOL_URL_ROOT); } /** * Transform string to method name string, for example it changes 'some_method' string to 'SomeMethod' string * @param string where words are separated with underscore * @return string where every word begins with capital letter */ function bx_gen_method_name ($s, $sWordsDelimiter = '_') { return str_replace(' ', '', ucwords(str_replace($sWordsDelimiter, ' ', $s))); } /** * Trigger user error * @param $sMsg message to display * @param $iNumLevelsBack add additional debug backtracing N levels back */ function bx_trigger_error ($sMsg, $iNumLevelsBack = 0) { $a = debug_backtrace(); $sMsgAdd = "
\n related code in {$a[$iNumLevelsBack]['file']} on line {$a[$iNumLevelsBack]['line']}
\n"; trigger_error ($sMsg . $sMsgAdd, E_USER_ERROR); } /** @} */