X-Git-Url: https://git.mxchange.org/?p=mailer.git;a=blobdiff_plain;f=inc%2Ftemplate-functions.php;h=9c7192ab1a5d40132d25ab1f45c122e2a11e93cf;hp=19d2459be3dd3ef66c99f8b0c25dda9ad6e99ec6;hb=6560179e7c8dc565485503f374d4e31f333ffd0e;hpb=2379934be6a196a54f4155bb8e24c49b20736969 diff --git a/inc/template-functions.php b/inc/template-functions.php index 19d2459be3..9c7192ab1a 100644 --- a/inc/template-functions.php +++ b/inc/template-functions.php @@ -16,8 +16,8 @@ * $Author:: $ * * -------------------------------------------------------------------- * * Copyright (c) 2003 - 2009 by Roland Haeder * - * Copyright (c) 2009 - 2011 by Mailer Developer Team * - * For more information visit: http://www.mxchange.org * + * Copyright (c) 2009 - 2012 by Mailer Developer Team * + * For more information visit: http://mxchange.org * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -50,7 +50,7 @@ function enableTemplateHtml ($enable = true) { $GLOBALS['is_template_html'] = (bool) $enable; } -// Checks wether the template is HTML or not by previously set flag +// Checks whether the template is HTML or not by previously set flag // Default: true function isTemplateHtml () { // Is the output_mode other than 0 (HTML), then no comments are enabled @@ -95,51 +95,62 @@ function getColorSwitchCode ($template) { // Output HTML code directly or 'render' it. You addionally switch the new-line character off function outputHtml ($htmlCode, $newLine = true) { // Init output - if (!isset($GLOBALS['output'])) { - $GLOBALS['output'] = ''; + if (!isset($GLOBALS['__output'])) { + $GLOBALS['__output'] = ''; } // END - if - // Do we have HTML-Code here? + //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'getOutputMode()=' . getOutputMode() . ',htmlCode(length)=' . strlen($htmlCode) . ',output(length)=' . strlen($GLOBALS['__output'])); + // Is there HTML-Code here? if (!empty($htmlCode)) { // Yes, so we handle it as you have configured switch (getOutputMode()) { case 'render': - // That's why you don't need any \n at the end of your HTML code... :-) + // But if PHP is caching, then we don't need to do that if (getPhpCaching() == 'on') { // Output into PHP's internal buffer outputRawCode($htmlCode); // That's why you don't need any \n at the end of your HTML code... :-) - if ($newLine === true) print("\n"); + if ($newLine === true) { + outputRawCode(chr(10)); + } // END - if } else { // Render mode for old or lame servers... - $GLOBALS['output'] .= $htmlCode; + $GLOBALS['__output'] .= $htmlCode; // That's why you don't need any \n at the end of your HTML code... :-) - if ($newLine === true) $GLOBALS['output'] .= "\n"; + if ($newLine === true) { + $GLOBALS['__output'] .= chr(10); + } // END - if } break; case 'direct': - // If we are switching from render to direct output rendered code - if ((!empty($GLOBALS['output'])) && (getPhpCaching() != 'on')) { outputRawCode($GLOBALS['output']); $GLOBALS['output'] = ''; } + // If we are switching from 'render' to 'direct' mode, all data in '__output' must be flushed and cleared + if ((!empty($GLOBALS['__output'])) && (getPhpCaching() != 'on')) { + outputRawCode($GLOBALS['__output']); + $GLOBALS['__output'] = ''; + } // END - if // The same as above... ^ outputRawCode($htmlCode); - if ($newLine === true) print("\n"); + if ($newLine === true) { + outputRawCode(chr(10)); + } // END - if break; default: // Huh, something goes wrong or maybe you have edited config.php ??? - debug_report_bug(__FUNCTION__, __LINE__, '{--FATAL_ERROR--}: {--NO_RENDER_DIRECT--}'); + reportBug(__FUNCTION__, __LINE__, '{--FATAL_ERROR--}: {--NO_RENDER_DIRECT--}'); break; } // END - switch - } elseif ((getPhpCaching() == 'on') && ((!isset($GLOBALS['header'])) || (count($GLOBALS['header']) == 0))) { + } elseif ((getPhpCaching() == 'on') && ((!isset($GLOBALS['http_header'])) || (count($GLOBALS['http_header']) == 0)) && (!isRawOutputMode())) { + //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'getPhpCaching()=' . getPhpCaching() . ',isset(http_header)=' . intval(isset($GLOBALS['http_header'])) . ',getScriptOutputMode()=' . getScriptOutputMode() . ''); // Output cached HTML code - $GLOBALS['output'] = ob_get_contents(); + $GLOBALS['__output'] = ob_get_contents(); // Clear output buffer for later output if output is found - if (!empty($GLOBALS['output'])) { + if (!empty($GLOBALS['__output'])) { clearOutputBuffer(); } // END - if @@ -150,8 +161,8 @@ function outputHtml ($htmlCode, $newLine = true) { compileFinalOutput(); // Output code here, DO NOT REMOVE! ;-) - outputRawCode($GLOBALS['output']); - } elseif ((getOutputMode() == 'render') && (!empty($GLOBALS['output']))) { + outputRawCode($GLOBALS['__output']); + } elseif ((getOutputMode() == 'render') && (!empty($GLOBALS['__output'])) && (!isRawOutputMode())) { // Send all HTTP headers sendHttpHeaders(); @@ -159,24 +170,26 @@ function outputHtml ($htmlCode, $newLine = true) { compileFinalOutput(); // Output code here, DO NOT REMOVE! ;-) - outputRawCode($GLOBALS['output']); + outputRawCode($GLOBALS['__output']); } else { // And flush all headers - flushHeaders(); + flushHttpHeaders(); } } // Compiles the final output function compileFinalOutput () { + //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, '__output(length)=' . strlen($GLOBALS['__output']) . ',getScriptOutputMode()=' . getScriptOutputMode() . ' - ENTERED!'); // Add page header and footer addPageHeaderFooter(); + //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, '__output(length)=' . strlen($GLOBALS['__output']) . ' - After addPageHeaderFooter() call.'); // Do the final compilation - $GLOBALS['output'] = doFinalCompilation($GLOBALS['output']); + $GLOBALS['__output'] = compileUriCode(doFinalCompilation($GLOBALS['__output'])); // Extension 'rewrite' installed? if ((isExtensionActive('rewrite')) && (!isCssOutputMode())) { - $GLOBALS['output'] = rewriteLinksInCode($GLOBALS['output']); + $GLOBALS['__output'] = rewriteLinksInCode($GLOBALS['__output']); } // END - if // Compress it? @@ -184,24 +197,24 @@ function compileFinalOutput () { * @TODO On some pages this is buggy if (!empty($_SERVER['HTTP_ACCEPT_ENCODING']) && (isInStringIgnoreCase('gzip', $_SERVER['HTTP_ACCEPT_ENCODING']))) { // Compress it for HTTP gzip - $GLOBALS['output'] = gzencode($GLOBALS['output'], 9); + $GLOBALS['__output'] = gzencode($GLOBALS['__output'], 9); // Add header - sendHeader('Content-Encoding: gzip'); + addHttpHeader('Content-Encoding: gzip'); } elseif (!empty($_SERVER['HTTP_ACCEPT_ENCODING']) && (isInStringIgnoreCase('deflate', $_SERVER['HTTP_ACCEPT_ENCODING']))) { // Compress it for HTTP deflate - $GLOBALS['output'] = gzcompress($GLOBALS['output'], 9); + $GLOBALS['__output'] = gzcompress($GLOBALS['__output'], 9); // Add header - sendHeader('Content-Encoding: deflate'); + addHttpHeader('Content-Encoding: deflate'); } */ // Add final length - sendHeader('Content-Length: ' . strlen($GLOBALS['output'])); + addHttpHeader('Content-Length: ' . strlen($GLOBALS['__output'])); // Flush all headers - flushHeaders(); + flushHttpHeaders(); } // Main compilation loop @@ -229,7 +242,7 @@ function doFinalCompilation ($code, $insertComments = true, $enableCodes = true) // Was that eval okay? if (empty($newContent)) { // Something went wrong! - debug_report_bug(__FUNCTION__, __LINE__, 'Evaluation error:
' . linenumberCode($eval) . '
', false); + reportBug(__FUNCTION__, __LINE__, 'Evaluation error:
' . linenumberCode($eval) . '
', false); } // END - if // Use it again @@ -246,7 +259,7 @@ function doFinalCompilation ($code, $insertComments = true, $enableCodes = true) } // END - while // Add debugging data in HTML code, if mode is enabled - if ((isDebugModeEnabled()) && ($insertComments === true)) { + if ((isDebugModeEnabled()) && ($insertComments === true) && ((isHtmlOutputMode()) || (isCssOutputMode()))) { // Add loop count $code .= ''; } // END - if @@ -258,7 +271,7 @@ function doFinalCompilation ($code, $insertComments = true, $enableCodes = true) // Output the raw HTML code function outputRawCode ($htmlCode) { // Output stripped HTML code to avoid broken JavaScript code, etc. - print(str_replace('{BACK}', "\\", $htmlCode)); + print(str_replace('{BACK}', chr(92), $htmlCode)); // Flush the output if only getPhpCaching() is not 'on' if (getPhpCaching() != 'on') { @@ -269,34 +282,36 @@ function outputRawCode ($htmlCode) { // Load a template file and return it's content (only it's name; do not use ' or ") function loadTemplate ($template, $return = false, $content = array(), $compileCode = true) { + // @TODO Remove these sanity checks if all is fine if (!is_bool($return)) { - // @TODO Remove this sanity-check if all is fine - debug_report_bug(__FUNCTION__, __LINE__, 'return[] is not bool (' . gettype($return) . ')'); + // $return has to be boolean + reportBug(__FUNCTION__, __LINE__, 'return[] is not bool (' . gettype($return) . ')'); } elseif (!is_string($template)) { // $template has to be string - debug_report_bug(__FUNCTION__, __LINE__, 'template[] is not string (' . gettype($template) . ')'); + reportBug(__FUNCTION__, __LINE__, 'template[] is not string (' . gettype($template) . ')'); } + // Init returned content + $ret = ''; + // Set current template $GLOBALS['current_template'] = $template; - // Do we have cache? - if ((!isDebuggingTemplateCache()) && (isTemplateCached($template))) { + // Is there cache? + if ((!isDebuggingTemplateCache()) && (isTemplateCached('html', $template))) { // Evaluate the cache - eval(readTemplateCache($template)); - } elseif (!isset($GLOBALS['template_eval'][$template])) { + eval(readTemplateCache('html', $template)); + } elseif (!isset($GLOBALS['template_eval']['html'][$template])) { // Make all template names lowercase $template = strtolower($template); - // Init some data - $ret = ''; - // Base directory $basePath = sprintf("%stemplates/%s/html/", getPath(), getLanguage()); - $extraPath = detectExtraTemplatePath($template); + $extraPath = detectExtraTemplatePath('html', $template); // Generate FQFN $FQFN = $basePath . $extraPath . $template . '.tpl'; + //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Template ' . $template . ' is solved to FQFN=' . $FQFN); // Does the special template exists? if (!isFileReadable($FQFN)) { @@ -310,37 +325,36 @@ function loadTemplate ($template, $return = false, $content = array(), $compileC incrementConfigEntry('num_templates'); // The local file does exists so we load it. :) - $GLOBALS['tpl_content'][$template] = readFromFile($FQFN); + $GLOBALS['template_content']['html'][$template] = readFromFile($FQFN); - // Do we have to compile the code? - $ret = ''; - if ((isInString('$', $GLOBALS['tpl_content'][$template])) || (isInString('{--', $GLOBALS['tpl_content'][$template])) || (isInString('{?', $GLOBALS['tpl_content'][$template])) || (isInString('{%', $GLOBALS['tpl_content'][$template]))) { + // Is there to compile the code? + if ((isInString('$', $GLOBALS['template_content']['html'][$template])) || (isInString('{--', $GLOBALS['template_content']['html'][$template])) || (isInString('{?', $GLOBALS['template_content']['html'][$template])) || (isInString('{%', $GLOBALS['template_content']['html'][$template]))) { // Normal HTML output? - if (isHtmlOutputMode()) { + if ((isHtmlOutputMode()) && (substr($template, 0, 3) != 'js_')) { // Add surrounding HTML comments to help finding bugs faster - $ret = '' . $GLOBALS['tpl_content'][$template] . ''; + $code = '' . $GLOBALS['template_content']['html'][$template] . ''; // Prepare eval() command - $GLOBALS['template_eval'][$template] = '$ret = "' . getColorSwitchCode($template) . compileCode(escapeQuotes($ret), false, true, true, $compileCode) . '";'; + $GLOBALS['template_eval']['html'][$template] = '$ret = "' . getColorSwitchCode($template) . compileCode(escapeQuotes($code), false, true, true, $compileCode) . '";'; } elseif (substr($template, 0, 3) == 'js_') { - // JavaScripts don't like entities and timings - $GLOBALS['template_eval'][$template] = '$ret = decodeEntities("' . compileRawCode(escapeJavaScriptQuotes($GLOBALS['tpl_content'][$template]), false, true, true, $compileCode) . '");'; + // JavaScripts don't like entities, dollar signs and timings + $GLOBALS['template_eval']['html'][$template] = '$ret = decodeEntities("' . compileRawCode(escapeJavaScriptQuotes($GLOBALS['template_content']['html'][$template]), false, true, true, $compileCode) . '");'; } else { // Prepare eval() command, other output doesn't like entities, maybe - $GLOBALS['template_eval'][$template] = '$ret = decodeEntities("' . compileRawCode(escapeQuotes($GLOBALS['tpl_content'][$template]), false, true, true, $compileCode) . '");'; + $GLOBALS['template_eval']['html'][$template] = '$ret = decodeEntities("' . compileRawCode(escapeQuotes($GLOBALS['template_content']['html'][$template]), false, true, true, $compileCode) . '");'; } } elseif (isHtmlOutputMode()) { // Add surrounding HTML comments to help finding bugs faster - $ret = '' . $GLOBALS['tpl_content'][$template] . ''; - $GLOBALS['template_eval'][$template] = '$ret = "' . getColorSwitchCode($template) . compileRawCode(escapeQuotes($ret), false, true, true, $compileCode) . '";'; + $ret = '' . $GLOBALS['template_content']['html'][$template] . ''; + $GLOBALS['template_eval']['html'][$template] = '$ret = "' . getColorSwitchCode($template) . compileRawCode(escapeQuotes($ret), false, true, true, $compileCode) . '";'; } else { // JavaScript again - $GLOBALS['template_eval'][$template] = '$ret = decodeEntities("' . compileRawCode(escapeJavaScriptQuotes($GLOBALS['tpl_content'][$template]), false, true, true, $compileCode) . '");'; + $GLOBALS['template_eval']['html'][$template] = '$ret = decodeEntities("' . compileRawCode(escapeJavaScriptQuotes($GLOBALS['template_content']['html'][$template]), false, true, true, $compileCode) . '");'; } // END - if } elseif ((isAdmin()) || ((isInstalling()) && (!isInstalled()))) { // Only admins shall see this warning or when installation mode is active $ret = '
- {--TEMPLATE_404--} + {--TEMPLATE_404--}
(' . $template . ') @@ -351,17 +365,20 @@ function loadTemplate ($template, $return = false, $content = array(), $compileC
'; } else { // No file! - $GLOBALS['template_eval'][$template] = '404'; + $GLOBALS['template_eval']['html'][$template] = '404'; } } // Code set? - if ((isset($GLOBALS['template_eval'][$template])) && ($GLOBALS['template_eval'][$template] != '404')) { + if ((isset($GLOBALS['template_eval']['html'][$template])) && ($GLOBALS['template_eval']['html'][$template] != '404')) { // Eval the code - eval($GLOBALS['template_eval'][$template]); + //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'template=' . $template . ' - BEFORE EVAL'); + ///* DEBUG: */ print('
'.htmlentities($GLOBALS['template_eval']['html'][$template]).'
'); + eval($GLOBALS['template_eval']['html'][$template]); + //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'template=' . $template . ' - AFTER EVAL'); } // END - if - // Do we have some content to output or return? + // Is there some content to output or return? if (!empty($ret)) { // Not empty so let's put it out! ;) if ($return === true) { @@ -378,12 +395,12 @@ function loadTemplate ($template, $return = false, $content = array(), $compileC } // Detects the extra template path from given template name -function detectExtraTemplatePath ($template) { +function detectExtraTemplatePath ($prefix, $template) { // Default is empty $extraPath = ''; - // Do we have cache? - if (!isset($GLOBALS['extra_path'][$template])) { + // Is there cache? + if (!isset($GLOBALS['extra_path'][$prefix][$template])) { // Check for admin/guest/member/etc. templates if (substr($template, 0, 6) == 'admin_') { // Admin template found @@ -424,11 +441,11 @@ function detectExtraTemplatePath ($template) { } // Store it in cache - $GLOBALS['extra_path'][$template] = $extraPath; + $GLOBALS['extra_path'][$prefix][$template] = $extraPath; } // END - if // Return result - return $GLOBALS['extra_path'][$template]; + return $GLOBALS['extra_path'][$prefix][$template]; } // Loads an email template and compiles it @@ -436,6 +453,9 @@ function loadEmailTemplate ($template, $content = array(), $userid = NULL, $load // Make sure all template names are lowercase! $template = strtolower($template); + // Set current template + $GLOBALS['current_template'] = $template; + // Is content an array? if (is_array($content)) { // Add expiration to array @@ -451,63 +471,37 @@ function loadEmailTemplate ($template, $content = array(), $userid = NULL, $load } } // END - if - // Load user's data - //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'UID=' . $userid . ',template=' . $template . ',content[]=' . gettype($content)); - if ((isValidUserId($userid)) && (is_array($content))) { - // If nickname extension is installed, fetch nickname as well - if ((isExtensionActive('nickname')) && (isNicknameUsed($userid))) { - // Load by nickname - //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ' - NICKNAME!'); - fetchUserData($userid, 'nickname'); - } elseif (isNicknameUsed($userid)) { - // Non-number characters entered but no ext-nickname found - debug_report_bug(__FUNCTION__, __LINE__, 'userid=' . $userid . ': is no id number and ext-nickname is gone.'); - } else { - // Load by userid - //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ' - USERID!'); - fetchUserData($userid); - } - - // Merge data if valid - //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'content()=' . count($content) . ' - PRE!'); - if ((isUserDataValid()) && ($loadUserData === true)) { - // It is valid - $content = merge_array($content, getUserDataArray()); - - // But we don't like hashed passwords be mailed - unset($content['password']); - } // END - if - - //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'content()=' . count($content) . ' - AFTER!'); - } // END - if + // Is there cache? + if ((!isDebuggingTemplateCache()) && (isTemplateCached('email', $template))) { + // Evaluate the cache + eval(readTemplateCache('email', $template)); + } elseif (!isset($GLOBALS['template_eval']['email'][$template])) { + // Base directory + $basePath = sprintf("%stemplates/%s/emails/", getPath(), getLanguage()); - // Base directory - $basePath = sprintf("%stemplates/%s/emails/", getPath(), getLanguage()); + // Detect extra path + $extraPath = detectExtraTemplatePath('email', $template); - // Detect extra path - $extraPath = detectExtraTemplatePath($template); + // Generate full FQFN + $FQFN = $basePath . $extraPath . $template . '.tpl'; - // Generate full FQFN - $FQFN = $basePath . $extraPath . $template . '.tpl'; + // Does the special template exists? + if (!isFileReadable($FQFN)) { + // Reset to default template + $FQFN = $basePath . $template . '.tpl'; + } // END - if - // Does the special template exists? - if (!isFileReadable($FQFN)) { - // Reset to default template - $FQFN = $basePath . $template . '.tpl'; - } // END - if + // Now does the final template exists? + $newContent = ''; + if (isFileReadable($FQFN)) { + // The local file does exists so we load it. :) + $GLOBALS['template_content']['email'][$template] = readFromFile($FQFN); - // Now does the final template exists? - $newContent = ''; - if (isFileReadable($FQFN)) { - // The local file does exists so we load it. :) - $GLOBALS['tpl_content'][$template] = readFromFile($FQFN); - - // Run code - $GLOBALS['tpl_content'][$template] = '$newContent = decodeEntities("' . compileRawCode(escapeQuotes($GLOBALS['tpl_content'][$template])) . '");'; - eval($GLOBALS['tpl_content'][$template]); - } elseif (!empty($template)) { - // Template file not found - $newContent = '
+ // Run code + $GLOBALS['template_eval']['email'][$template] = '$newContent = decodeEntities("' . compileRawCode(escapeQuotes($GLOBALS['template_content']['email'][$template])) . '");'; + } elseif (!empty($template)) { + // Template file not found + $newContent = '
{--TEMPLATE_404--}: ' . $template . '
@@ -515,23 +509,40 @@ function loadEmailTemplate ($template, $content = array(), $userid = NULL, $load
' . print_r($content, true) . '
'; - // Debug mode not active? Then remove the HTML tags - if (!isDebugModeEnabled()) { - // Remove HTML tags - $newContent = secureString($newContent); - } // END - if - } else { - // No template name supplied! - $newContent = '{--NO_TEMPLATE_SUPPLIED--}'; + // Don't cache this, as there is no template to cache + $GLOBALS['template_eval']['email'][$template] = '404'; + + // Debug mode not active? Then remove the HTML tags + if (!isDebugModeEnabled()) { + // Remove HTML tags + $newContent = secureString($newContent); + } // END - if + } else { + // No template name supplied! + $newContent = '{--NO_TEMPLATE_SUPPLIED--}'; + $GLOBALS['template_eval']['email'][$template] = '404'; + } } - // Is there some content? + // Is there something to eval? + if ((isset($GLOBALS['template_eval']['email'][$template])) && ($GLOBALS['template_eval']['email'][$template] != '404')) { + // Eval the code + //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'template=' . $template . ' - BEFORE EVAL'); + ///* DEBUG: */ print('
'.htmlentities($GLOBALS['template_eval']['email'][$template]).'
'); + eval($GLOBALS['template_eval']['email'][$template]); + //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'template=' . $template . ' - AFTER EVAL'); + } // END - if + + // Are there some content? if (empty($newContent)) { // Compiling failed - $newContent = "Compiler error for template " . $template . " !\nUncompiled content:\n" . $GLOBALS['tpl_content'][$template]; + $newContent = "Compiler error for template " . $template . " !\nUncompiled content:\n" . $GLOBALS['template_content']['email'][$template]; // Add last error if the required function exists - if (function_exists('error_get_last')) $newContent .= "\n--------------------------------------\nDebug:\n".print_r(error_get_last(), true)."--------------------------------------\nPlease don't alter these informations!\nThanx."; + if (function_exists('error_get_last')) { + // Add last error and some lines for better overview + $newContent .= "\n--------------------------------------\nDebug:\n" . print_r(error_get_last(), true) . "--------------------------------------\nPlease don't alter these informations!\nThanx."; + } // END - if } // END - if // Remove content and data @@ -543,26 +554,36 @@ function loadEmailTemplate ($template, $content = array(), $userid = NULL, $load // "Getter" for menu CSS classes, mainly used in templates function getMenuCssClasses ($data) { - // $data needs to be converted into an array - $content = explode('|', $data); + //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'data=' . $data); + + // Is there cache? + if (!isset($GLOBALS[__FUNCTION__][$data])) { + // $data needs to be converted into an array + $content = explode('|', $data); + + // Non-existent index 2 will happen in menu blocks + if (!isset($content[2])) { + $content[2] = ''; + } // END - if - // Non-existent index 2 will happen in menu blocks - if (!isset($content[2])) $content[2] = ''; + // Re-construct the array: 0=visible,1=locked,2=prefix + $content['visible'] = $content[0]; + $content['locked'] = $content[1]; - // Re-construct the array: 0=visible,1=locked,2=prefix - $content['visible'] = $content[0]; - $content['locked'] = $content[1]; + // Call our "translator" function + $content = translateMenuVisibleLocked($content, $content[2]); - // Call our "translator" function - $content = translateMenuVisibleLocked($content, $content[2]); + // Set it in cache + $GLOBALS[__FUNCTION__][$data] = ($content['visible_css'] . ' ' . $content['locked_css']); + } // END - if - // Return CSS classes - return ($content['visible_css'] . ' ' . $content['locked_css']); + // Return cache + return $GLOBALS[__FUNCTION__][$data]; } // Generate XHTML code for the CAPTCHA -function generateCaptchaCode ($code, $type, $type, $userid) { - return 'Code ' . $code . ''; +function generateCaptchaCode ($code, $type, $urlId, $userid) { + return 'Code ' . $code . ''; } // Compiles the given HTML/mail code @@ -580,12 +601,12 @@ function compileCode ($code, $simple = false, $constants = true, $full = true, $ $code = compileRawCode($code, $simple, $constants, $full); // Get timing - $compiled = microtime(true); + $compilationTime = $startCompile - microtime(true); // Add timing if enabled if (isTemplateHtml()) { // Add timing, this should be disabled in - $code .= ''; + $code .= ''; } // END - if // Return compiled code @@ -612,14 +633,16 @@ function compileRawCode ($code, $simple = false, $constants = true, $full = true // Compile more through a filter $code = runFilterChain('compile_code', $code); - // Compile message strings - $code = str_replace('{--', '{%message,', str_replace('--}', '%}', $code)); + // First compile these chars + array_unshift($secChars['to'] , '{--' , '--}'); + array_unshift($secChars['from'], '{%message,', '%}' ); // Compile QUOT and other non-HTML codes $code = str_replace($secChars['to'], $secChars['from'], $code); // Find $content[bla][blub] entries preg_match_all('/\$content((\[([a-zA-Z0-9-_]+)\])*)/', $code, $matches); + //* NOISY-DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Second regex gave ' . count($matches[0]) . ' matches.'); // Are some matches found? if ((count($matches) > 0) && (count($matches[0]) > 0)) { @@ -635,10 +658,10 @@ function compileRawCode ($code, $simple = false, $constants = true, $full = true $test = substr($found, 0, strlen($match)); // Does this entry exist? - //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'found=' . $found . ',match=' . $match . ',set=' . $set); + //* NOISY-DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'found=' . $found . ',match=' . $match . ',set=' . $set); if ($test == $match) { // Match found - //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'fuzzyFound!'); + //* NOISY-DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'fuzzyFound!'); $fuzzyFound = true; break; } // END - if @@ -651,15 +674,15 @@ function compileRawCode ($code, $simple = false, $constants = true, $full = true // Take all string elements if ((is_string($matches[3][$key])) && (!isset($matchesFound[$match])) && (!isset($matchesFound[$key.'_' . $matches[3][$key]]))) { - // Replace it in the code - //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'key=' . $key . ',match=' . $match); - $newMatch = str_replace('[', "['", str_replace(']', "']", $match)); + // Replace it in the code, replace dollar sign so it won't be detected by next regex (see there) + //* NOISY-DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'key=' . $key . ',match=' . $match); + $newMatch = str_replace(array('[', ']', '$'), array("['", "']", '{COMPILE_DOLLAR}'), $match); $code = str_replace($match, '".' . $newMatch . '."', $code); $matchesFound[$key . '_' . $matches[3][$key]] = 1; $matchesFound[$match] = true; } elseif (!isset($matchesFound[$match])) { // Not yet replaced! - //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'match=' . $match); + //* NOISY-DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'match=' . $match); $code = str_replace($match, '".' . $match . '."', $code); $matchesFound[$match] = 1; } else { @@ -669,7 +692,42 @@ function compileRawCode ($code, $simple = false, $constants = true, $full = true } // END - foreach } // END - if - // Return it + /* + * Find $foobar, $foo_bar and $fooBar entries. This regex would also find + * $content[foo_bar] which would result in {DOLLAR}content[foo_bar] and + * therefore the variable's value won't be inserted. This is why + * {COMPILE_DOLLAR} is being used in above loop and at the end of this + * function being replace with the original dollar sign again. + */ + preg_match_all('/\$([a-z_A-Z\[\]]){0,}/', $code, $matches); + + // Are some matches found? + if ((count($matches) > 0) && (count($matches[0]) > 0)) { + // Scan all matches for not $content + foreach ($matches[0] as $match) { + // Trim match + $match = trim($match); + + // Debug message + //* NOISY-DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'match=' . $match); + + // Is the first part not $content/$userid and not empty? + // @TODO $userid is deprecated and should be removed from loadEmailTemplate() and replaced with $content[userid] in all templates + if ((!empty($match)) && (substr($match, 0, 8) != '$content') && ($match != '$userid')) { + //* NOISY-DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'match=' . $match . ' - SECURED!'); + // Then replace $ with {DOLLAR} + $matchSecured = str_replace('$', '{DOLLAR}', $match); + + // And in $code as well + $code = str_replace($match, $matchSecured, $code); + } // END - if + } // END - if + } // END - if + + // Replace {COMPILE_DOLLAR} back to dollar sign + $code = str_replace('{COMPILE_DOLLAR}', '$', $code); + + // Finally return it return $code; } @@ -758,7 +816,7 @@ function addSelectionBox ($type, $default, $prefix = '', $id = '0', $class = 'fo case 'sec': case 'min': for ($idx = 0; $idx < 60; $idx+=5) { - if (strlen($idx) == 1) $idx = '0' . $idx; + if (strlen($idx) == 1) $idx = 0 . $idx; $OUT .= '