]> git.mxchange.org Git - mailer.git/blobdiff - inc/template-functions.php
Major rewrite of template system:
[mailer.git] / inc / template-functions.php
index d840d71f44f012752b305a3e47f224cc2dc94e33..dc13d3e1b95e30d8ae7aaab5dcd45c0c7e74afd1 100644 (file)
@@ -41,8 +41,8 @@ if (!defined('__SECURITY')) {
 } // END - if
 
 // Wrapper until we merged to the EL branch
-function preCompileCode ($code, $template = '', $compiled = FALSE, $full = TRUE, $overwrite = FALSE) {
-       return compileCode($code, FALSE, TRUE, $full);
+function preCompileCode ($code, $full = TRUE) {
+       return compileCode($code, $full);
 }
 
 // Setter for 'is_template_html'
@@ -93,7 +93,7 @@ function getColorSwitchCode ($template) {
 }
 
 // Output HTML code directly or 'render' it. You addionally switch the new-line character off
-function outputHtml ($htmlCode, $newLine = TRUE) {
+function outputHtml ($htmlCode = NULL, $newLine = TRUE) {
        // Init output
        if (!isset($GLOBALS['__output'])) {
                $GLOBALS['__output'] = '';
@@ -101,7 +101,7 @@ function outputHtml ($htmlCode, $newLine = TRUE) {
 
        //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'getOutputMode()=' . getOutputMode() . ',htmlCode(length)=' . strlen($htmlCode) . ',output(length)=' . strlen($GLOBALS['__output']));
        // Is there HTML-Code here?
-       if (!empty($htmlCode)) {
+       if ((!is_null($htmlCode)) && (!empty($htmlCode))) {
                // Yes, so we handle it as you have configured
                switch (getOutputMode()) {
                        case 'render':
@@ -236,7 +236,7 @@ function doFinalCompilation ($code, $insertComments = TRUE, $enableCodes = TRUE)
 
                // Compile it
                //* DEBUG: */ debugOutput('<pre>'.linenumberCode($code).'</pre>');
-               $eval = '$newContent = "' . str_replace('{DQUOTE}', '"', compileCode(escapeQuotes($code), FALSE, TRUE, $enableCodes)) . '";';
+               $eval = '$newContent = "' . str_replace('{DQUOTE}', '"', compileCode(escapeQuotes($code), $enableCodes)) . '";';
                //* DEBUG: */ if (!$insertComments) print('EVAL=<pre>'.linenumberCode($eval).'</pre>');
                eval($eval);
                //* DEBUG: */ if (!$insertComments) print('NEW=<pre>'.linenumberCode($newContent).'</pre>');
@@ -301,9 +301,9 @@ function loadTemplate ($template, $return = FALSE, $content = array(), $compileC
        $GLOBALS['current_template'] = $template;
 
        // Is there cache?
-       if ((!isDebuggingTemplateCache()) && (isTemplateCached('html', $template))) {
+       if ((!isDebugTemplateCacheEnabled()) && (isTemplateCached('html', $template))) {
                // Evaluate the cache
-               eval(readTemplateCache('html', $template));
+               $templateContent = readTemplateCache('html', $template, $content);
        } elseif (!isset($GLOBALS['template_eval']['html'][$template])) {
                // Make all template names lowercase
                $template = strtolower($template);
@@ -339,29 +339,37 @@ function loadTemplate ($template, $return = FALSE, $content = array(), $compileC
 
                                        // Prepare eval() command
                                        //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Reached!');
-                                       $GLOBALS['template_eval']['html'][$template] = '$ret = "' . getColorSwitchCode($template) . compileCode(escapeQuotes($code), FALSE, TRUE, TRUE, $compileCode) . '";';
+                                       $GLOBALS['template_eval']['html'][$template] = '$templateContent = "' . getColorSwitchCode($template) . compileCode(escapeQuotes($code), TRUE, $compileCode) . '";';
                                } elseif (substr($template, 0, 3) == 'js_') {
                                        // JavaScripts don't like entities, dollar signs and timings
                                        //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Reached!');
-                                       $GLOBALS['template_eval']['html'][$template] = '$ret = decodeEntities("' . compileRawCode(escapeJavaScriptQuotes($GLOBALS['template_content']['html'][$template]), FALSE, TRUE, TRUE, $compileCode) . '");';
+                                       $GLOBALS['template_eval']['html'][$template] = '$templateContent = decodeEntities("' . compileRawCode(escapeJavaScriptQuotes($GLOBALS['template_content']['html'][$template]), TRUE, $compileCode) . '");';
+                               } elseif (isAjaxOutputMode()) {
+                                       // AJAX (JSON content)
+                                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Reached!');
+                                       $GLOBALS['template_eval']['html'][$template] = '$templateContent = "' . compileRawCode(escapeJavaScriptQuotes($GLOBALS['template_content']['html'][$template]), TRUE, $compileCode) . '";';
                                } else {
                                        // Prepare eval() command, other output doesn't like entities, maybe
                                        //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Reached!');
-                                       $GLOBALS['template_eval']['html'][$template] = '$ret = decodeEntities("' . compileRawCode(escapeQuotes($GLOBALS['template_content']['html'][$template]), FALSE, TRUE, TRUE, $compileCode) . '");';
+                                       $GLOBALS['template_eval']['html'][$template] = '$templateContent = decodeEntities("' . compileRawCode(escapeQuotes($GLOBALS['template_content']['html'][$template]), TRUE, $compileCode) . '");';
                                }
                        } elseif (isHtmlOutputMode()) {
                                // Add surrounding HTML comments to help finding bugs faster
-                               $ret = '<!-- Template ' . $template . ' - Start //-->' . $GLOBALS['template_content']['html'][$template] . '<!-- Template ' . $template . ' - End //-->';
+                               $templateContent = '<!-- Template ' . $template . ' - Start //-->' . $GLOBALS['template_content']['html'][$template] . '<!-- Template ' . $template . ' - End //-->';
+                               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Reached!');
+                               $GLOBALS['template_eval']['html'][$template] = '$templateContent = "' . getColorSwitchCode($template) . compileRawCode(escapeQuotes($templateContent), TRUE, $compileCode) . '";';
+                       } elseif (isAjaxOutputMode()) {
+                               // AJAX (JSON content)
                                //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Reached!');
-                               $GLOBALS['template_eval']['html'][$template] = '$ret = "' . getColorSwitchCode($template) . compileRawCode(escapeQuotes($ret), FALSE, TRUE, TRUE, $compileCode) . '";';
+                               $GLOBALS['template_eval']['html'][$template] = '$templateContent = "' . compileRawCode(escapeJavaScriptQuotes($GLOBALS['template_content']['html'][$template]), TRUE, $compileCode) . '";';
                        } else {
                                // JavaScript again
                                //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Reached!');
-                               $GLOBALS['template_eval']['html'][$template] = '$ret = decodeEntities("' . compileRawCode(escapeJavaScriptQuotes($GLOBALS['template_content']['html'][$template]), FALSE, TRUE, TRUE, $compileCode) . '");';
+                               $GLOBALS['template_eval']['html'][$template] = '$templateContent = decodeEntities("' . compileRawCode(escapeJavaScriptQuotes($GLOBALS['template_content']['html'][$template]), TRUE, $compileCode) . '");';
                        } // END - if
                } elseif ((isAdmin()) || ((isInstalling()) && (!isInstalled()))) {
                        // Only admins shall see this warning or when installation mode is active
-                       $ret = '<div class="para">
+                       $templateContent = '<div class="para">
        {--TEMPLATE_404--}
 </div>
 <div class="para">
@@ -387,18 +395,18 @@ function loadTemplate ($template, $return = FALSE, $content = array(), $compileC
        } // END - if
 
        // Is there some content to output or return?
-       if (!empty($ret)) {
-               // Not empty so let's put it out! ;)
-               if ($return === TRUE) {
-                       // Return the HTML code
-                       return $ret;
-               } else {
-                       // Output directly
-                       outputHtml($ret);
-               }
-       } elseif (isDebugModeEnabled()) {
+       if ((empty($templateContent)) && (isDebugModeEnabled())) {
                // Warning, empty output!
                return 'E:' . $template . ',content=<pre>' . print_r($content, TRUE) . '</pre>';
+       } // END - if
+
+       // Not empty so let's put it out! ;)
+       if ($return === TRUE) {
+               // Return the HTML code
+               return $templateContent;
+       } else {
+               // Output directly
+               outputHtml($templateContent);
        }
 }
 
@@ -467,7 +475,7 @@ function loadEmailTemplate ($template, $content = array(), $userid = NULL, $load
        // Is content an array?
        if (is_array($content)) {
                // Add expiration to array
-               if ((isExtensionInstalled('autopurge')) && (getAutoPurge() == '0')) {
+               if ((isExtensionInstalled('autopurge')) && (isConfigEntrySet('auto_purge')) && (getAutoPurge() == '0')) {
                        // Will never expire!
                        $content['expiration'] = '{--MAIL_WILL_NEVER_EXPIRE--}';
                } elseif ((isExtensionInstalled('autopurge')) && (isConfigEntrySet('auto_purge'))) {
@@ -480,9 +488,9 @@ function loadEmailTemplate ($template, $content = array(), $userid = NULL, $load
        } // END - if
 
        // Is there cache?
-       if ((!isDebuggingTemplateCache()) && (isTemplateCached('email', $template))) {
+       if ((!isDebugTemplateCacheEnabled()) && (isTemplateCached('email', $template))) {
                // Evaluate the cache
-               eval(readTemplateCache('email', $template));
+               $templateContent = readTemplateCache('email', $template, $content);
        } elseif (!isset($GLOBALS['template_eval']['email'][$template])) {
                // Base directory
                $basePath = sprintf("%stemplates/%s/emails/", getPath(), getLanguage());
@@ -500,16 +508,17 @@ function loadEmailTemplate ($template, $content = array(), $userid = NULL, $load
                } // END - if
 
                // Now does the final template exists?
-               $newContent = '';
+               $templateContent = '';
                if (isFileReadable($FQFN)) {
                        // The local file does exists so we load it. :)
                        $GLOBALS['template_content']['email'][$template] = readFromFile($FQFN);
 
                        // Run code
-                       $GLOBALS['template_eval']['email'][$template] = '$newContent = decodeEntities("' . compileRawCode(escapeQuotes($GLOBALS['template_content']['email'][$template])) . '");';
+                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Reached!');
+                       $GLOBALS['template_eval']['email'][$template] = '$templateContent = decodeEntities("' . compileRawCode(escapeQuotes($GLOBALS['template_content']['email'][$template])) . '");';
                } elseif (!empty($template)) {
                        // Template file not found
-                       $newContent = '<div class="para">
+                       $templateContent = '<div class="para">
        {--TEMPLATE_404--}: ' . $template . '
 </div>
 <div class="para">
@@ -523,11 +532,11 @@ function loadEmailTemplate ($template, $content = array(), $userid = NULL, $load
                        // Debug mode not active? Then remove the HTML tags
                        if (!isDebugModeEnabled()) {
                                // Remove HTML tags
-                               $newContent = secureString($newContent);
+                               $templateContent = secureString($templateContent);
                        } // END - if
                } else {
                        // No template name supplied!
-                       $newContent = '{--NO_TEMPLATE_SUPPLIED--}';
+                       $templateContent = '{--NO_TEMPLATE_SUPPLIED--}';
                        $GLOBALS['template_eval']['email'][$template] = '404';
                }
        }
@@ -536,20 +545,20 @@ function loadEmailTemplate ($template, $content = array(), $userid = NULL, $load
        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('<pre>'.htmlentities($GLOBALS['template_eval']['email'][$template]).'</pre>');
+               //* DEBUG: */ print('<pre>'.htmlentities($GLOBALS['template_eval']['email'][$template]).'</pre>');
                eval($GLOBALS['template_eval']['email'][$template]);
                //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'template=' . $template . ' - AFTER EVAL');
        } // END - if
 
        // Are there some content?
-       if (empty($newContent)) {
+       if (empty($templateContent)) {
                // Compiling failed
-               $newContent = "Compiler error for template " . $template . " !\nUncompiled content:\n" . $GLOBALS['template_eval']['email'][$template];
+               $templateContent = "Compiler error for template " . $template . " !\nUncompiled content:\n" . $GLOBALS['template_eval']['email'][$template];
 
                // Add last error if the required function exists
                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.";
+                       $templateContent .= "\n--------------------------------------\nDebug:\n" . print_r(error_get_last(), TRUE) . "--------------------------------------\nPlease don't alter these informations!\nThanx.";
                } // END - if
        } // END - if
 
@@ -557,7 +566,7 @@ function loadEmailTemplate ($template, $content = array(), $userid = NULL, $load
        unset($content);
 
        // Return content
-       return $newContent;
+       return $templateContent;
 }
 
 // "Getter" for menu CSS classes, mainly used in templates
@@ -595,7 +604,7 @@ function generateCaptchaCode ($code, $type, $urlId, $userid) {
 }
 
 // Compiles the given HTML/mail code
-function compileCode ($code, $simple = FALSE, $constants = TRUE, $full = TRUE, $compileCode = TRUE) {
+function compileCode ($code, $full = TRUE, $compileCode = TRUE) {
        // Is the code a string or should we not compile?
        if ((!is_string($code)) || ($compileCode === FALSE)) {
                // Silently return it
@@ -606,7 +615,7 @@ function compileCode ($code, $simple = FALSE, $constants = TRUE, $full = TRUE, $
        $startCompile = microtime(TRUE);
 
        // Comile the code
-       $code = compileRawCode($code, $simple, $constants, $full);
+       $code = compileRawCode($code, $full, $compileCode);
 
        // Get timing
        $compilationTime = $startCompile - microtime(TRUE);
@@ -622,8 +631,7 @@ function compileCode ($code, $simple = FALSE, $constants = TRUE, $full = TRUE, $
 }
 
 // Compiles the code
-// @TODO $simple/$constants are deprecated
-function compileRawCode ($code, $simple = FALSE, $constants = TRUE, $full = TRUE, $compileCode = TRUE) {
+function compileRawCode ($code, $full = TRUE, $compileCode = TRUE) {
        // Is the code a string or shall we not compile?
        if ((!is_string($code)) || ($compileCode === FALSE)) {
                // Silently return it
@@ -1208,8 +1216,14 @@ function app_exit ($F, $L, $message) {
        // Make sure, that the script realy realy diese here and now
        $GLOBALS['app_died'] = TRUE;
 
-       // Set content type as text/html
-       setContentType('text/html');
+       // Is this AJAX mode?
+       if (isAjaxOutputMode()) {
+               // Set content type as application/json
+               setContentType('application/json');
+       } else {
+               // Set content type as text/html
+               setContentType('text/html');
+       }
 
        // Load header
        loadIncludeOnce('inc/header.php');
@@ -1222,8 +1236,17 @@ function app_exit ($F, $L, $message) {
                $message
        );
 
-       // Load the message template
-       loadTemplate('app_exit_message', FALSE, $message);
+       // Is this AJAX mode again
+       if (isAjaxOutputMode()) {
+               // Load the message template
+               $OUT = loadTemplate('ajax_app_exit_message', TRUE, $message);
+
+               // Output it as JSON encoded
+               outputHtml(encodeJson(array('reply_content' => urlencode(doFinalCompilation($OUT)))));
+       } else {
+               // Load the message template
+               loadTemplate('app_exit_message', FALSE, $message);
+       }
 
        // Load footer
        loadIncludeOnce('inc/footer.php');
@@ -1549,17 +1572,8 @@ function determinePageTitle () {
                        $pageTitle .= ' {%config,trim=title_middle%} {DQUOTE} . getModuleTitle(getModule()) . {DQUOTE}';
                } // END - if
 
-               // Add title from what file
-               $menuMode = '';
-               if (getModule() == 'login') {
-                       $menuMode = 'member';
-               } elseif (getModule() == 'index') {
-                       $menuMode = 'guest';
-               } elseif (getModule() == 'admin') {
-                       $menuMode = 'admin';
-               } elseif (getModule() == 'sponsor') {
-                       $menuMode = 'sponsor';
-               }
+               // Get menu mode from module
+               $menuMode = getMenuModeFromModule();
 
                // Add middle part (always in admin area!)
                if ((!empty($menuMode)) && ((isWhatTitleEnabled()) || ($menuMode == 'admin'))) {
@@ -1612,10 +1626,13 @@ function isTemplateCached ($prefix, $template) {
 // Flushes non-flushed template cache to disk
 function flushTemplateCache ($prefix, $template, $eval) {
        // Is this cache flushed?
-       if ((isDebuggingTemplateCache() === FALSE) && (isTemplateCached($prefix, $template) === FALSE) && ($eval != '404')) {
+       if ((isDebugTemplateCacheEnabled() === FALSE) && (isTemplateCached($prefix, $template) === FALSE) && ($eval != '404')) {
                // Generate FQFN
                $FQFN = generateCacheFqfn($prefix, $template);
 
+               // Compile code another round for better performance and preserve $ signs
+               $eval = str_replace(array(chr(92), '{DOLLAR}', '{BACK}', '{CONTENT}'), array('', '$', chr(92), '$content'), compileCode(str_replace(array('$content', chr(92)), array('{CONTENT}', '{BACK}'), $eval)));
+
                // Is this a XML template?
                if ($prefix == 'xml') {
                        // Compact only XML templates as emails needs new-line characters and HTML may contain required "comments"
@@ -1623,16 +1640,16 @@ function flushTemplateCache ($prefix, $template, $eval) {
                } // END - if
 
                // And flush it
-               writeToFile($FQFN, $eval, TRUE);
+               writeToFile($FQFN, '<?php ' . $eval . ' ?>', TRUE);
        } // END - if
 }
 
 // Reads a template cache
-function readTemplateCache ($prefix, $template) {
+function readTemplateCache ($prefix, $template, $content) {
        // Check it again
-       if ((isDebuggingTemplateCache()) || (!isTemplateCached($prefix, $template))) {
+       if ((isDebugTemplateCacheEnabled()) || (!isTemplateCached($prefix, $template))) {
                // This should not happen
-               reportBug('Wether debugging of template cache is enabled or template ' . $template . ' is not cached while expected.');
+               reportBug(__FUNCTION__, __LINE__, 'Wether debugging of template cache is enabled or template ' . $template . ' is not cached while expected.');
        } // END - if
 
        // Is it cached?
@@ -1640,12 +1657,24 @@ function readTemplateCache ($prefix, $template) {
                // Generate FQFN
                $FQFN = generateCacheFqfn($prefix, $template);
 
-               // And read from it
-               $GLOBALS['template_eval'][$prefix][$template] = readFromFile($FQFN);
+               /*
+                * And read from it.
+                *
+                * WARNING: Do not replace this include() call with loadInclude() as it
+                * would hide local variables away which is here required to make this
+                * work.
+                */
+               include($FQFN);
+
+               // Is the template cache valid?
+               if (!isset($templateContent)) {
+                       // Please clear your cache!
+                       reportBug(__FUNCTION__, __LINE__, 'Template ' . $template . ' uses old structure. Please delete all template cache files and reload.');
+               } // END - if
        } // END - if
 
        // And return it
-       return $GLOBALS['template_eval'][$prefix][$template];
+       return $templateContent;
 }
 
 // Escapes quotes (default is only double-quotes)
@@ -1687,7 +1716,7 @@ function sendModeMails ($mod, $modes) {
                $hash = encodeHashForCookie(getUserData('password'));
 
                // Does the hash match or should we change it?
-               if (($hash == getSession('u_hash')) || (postRequestElement('pass1') == postRequestElement('pass2'))) {
+               if (($hash == getSession('u_hash')) || (postRequestElement('password1') == postRequestElement('password2'))) {
                        // Load the data
                        $content = getUserDataArray();
 
@@ -1910,7 +1939,7 @@ function generateCacheFqfn ($prefix, $template) {
        if (!isset($GLOBALS['template_cache_fqfn'][$prefix][$template])) {
                // Generate the FQFN
                $GLOBALS['template_cache_fqfn'][$prefix][$template] = sprintf(
-                       "%s_compiled/%s/%s.tpl.cache",
+                       '%s_compiled/%s/%s.tpl.cache',
                        getCachePath(),
                        $prefix,
                        $template
@@ -1939,7 +1968,7 @@ function fixNullEmptyToDashes ($str, $num) {
 // Translates the "pool type" into human-readable
 function translatePoolType ($type) {
        // Return "translation"
-       return sprintf("{--POOL_TYPE_%s--}", strtoupper($type));
+       return sprintf('{--POOL_TYPE_%s--}', strtoupper($type));
 }
 
 // "Translates" given time unit
@@ -2141,6 +2170,25 @@ function doTemplateNoYesSelectionBox ($templateName, $clear, $formField) {
        return $OUT;
 }
 
+// Helper function to add extra content for guest area (module=index and others)
+function doTemplateGuestFooterExtras ($templateName, $clear) {
+       // Init filter data
+       $filterData = array(
+               // Name of used template
+               'template' => $templateName,
+               // Target array for gathered data
+               '__data'   => array(),
+               // Where the HTML output will go
+               '__output' => '',
+       );
+
+       // Run the filter chain
+       $filterData = runFilterChain('guest_footer_extras', $filterData);
+
+       // Return output
+       return $filterData['__output'];
+}
+
 // Helper function to add extra content for member area (module=login)
 function doTemplateMemberFooterExtras ($templateName, $clear) {
        // Is a member logged in?