]> git.mxchange.org Git - mailer.git/blobdiff - inc/expression-functions.php
New template helper function doTemplateExtensionRegistrationLink() introduced
[mailer.git] / inc / expression-functions.php
index 485e6195857e3e9d51e9fcf0ecb6161a2f03f051..9f309b9d86ab1308b8d190cb315e1aedf82e828d 100644 (file)
@@ -18,6 +18,7 @@
  * svn:keywords Date Revision" (autoprobset!) at least!!!!!!            *
  * -------------------------------------------------------------------- *
  * Copyright (c) 2003 - 2009 by Roland Haeder                           *
+ * Copyright (c) 2009, 2010 by Mailer Developer Team                    *
  * For more information visit: http://www.mxchange.org                  *
  *                                                                      *
  * This program is free software; you can redistribute it and/or modify *
@@ -41,10 +42,67 @@ if (!defined('__SECURITY')) {
        die();
 } // END - if
 
+// Private function to replace the code
+function replaceExpressionCode ($data, $replacer) {
+       // Replace the code
+       // @TODO is escapeQuotes() enougth for strings with single/double quotes?
+       return str_replace($data['matches'][0][$data['key']], $replacer, escapeQuotes($data['code']));
+}
+
+// Private function to determine wether we have a special expression function avaible
+// (mostly located in wrapper-functions.php)
+function isExpressionFunctionAvaiable ($data) {
+       // Get the enty we need
+       $entry = $data['matches'][4][$data['key']];
+
+       // Do we have cache?
+       if (!isset($GLOBALS['expression_function_available'][$entry])) {
+               // Init function name
+               $functionName = 'get';
+
+               // Explode it in an array
+               foreach (explode('_', $entry) as $piece) {
+                       // Add non-empty parts
+                       if (!empty($piece)) {
+                               // Add it
+                               $functionName .= ucfirst(strtolower($piece));
+                       } // END - if
+               } // END - foreach
+
+               // Is that function there?
+               if (function_exists($functionName)) {
+                       // Cache it all
+                       $GLOBALS['expression_function_name'][$entry] = $functionName;
+                       $GLOBALS['expression_function_available'][$entry] = true;
+               } else {
+                       // Not avaiable
+                       logDebugMessage(__FUNCTION__, __LINE__, 'Expression function ' . $functionName . ' not found. Please consider adding it to improve execution speed.');
+
+                       // And cache it
+                       $GLOBALS['expression_function_available'][$entry] = false;
+               }
+       } elseif ($GLOBALS['expression_function_available'][$entry] == false) {
+               // Debug message
+               logDebugMessage(__FUNCTION__, __LINE__, 'Expression function for entry ' . $entry . ' requested but not found.');
+       }
+
+       // Return cache
+       return $GLOBALS['expression_function_available'][$entry];
+}
+
+// Getter for above expression function
+function getExpressionFunction ($data) {
+       // Get the enty we need
+       $entry = $data['matches'][4][$data['key']];
+
+       // Return it
+       return $GLOBALS['expression_function_name'][$entry];
+}
+
 // Expression call-back function for getCode() calls
 function doExpressionCode ($data) {
        // Replace the code
-       $code = str_replace($data['matches'][0][$data['key']], "\" . getCode('" . $data['matches'][4][$data['key']] . "') . \"", $data['code']);
+       $code = str_replace($data['matches'][0][$data['key']], "{DQUOTE} . getCode('" . $data['matches'][4][$data['key']] . "') . {DQUOTE}", $data['code']);
 
        // Return replaced code
        return $code;
@@ -56,10 +114,10 @@ function doExpressionUrl ($data) {
        if ($data['callback'] == 'js') $data['mode'] = 1;
 
        // Handle an URL here
-       $replacer = "\" . encodeUrl(\"" . $data['matches'][4][$data['key']] . "\", " . $data['mode'] . ") . \"";
+       $replacer = "{DQUOTE} . encodeUrl('" . $data['matches'][4][$data['key']] . "', " . $data['mode'] . ') . {DQUOTE}';
 
        // Replace it
-       $code = str_replace($data['matches'][0][$data['key']], $replacer, $data['code']);
+       $code = replaceExpressionCode($data, $replacer);
 
        // Return replaced code
        return $code;
@@ -70,8 +128,11 @@ function doExpressionServer ($data) {
        // This will make 'foo_bar' to detectFooBar()
        $functionName = "'detect' . implode('', array_map('ucfirst', explode('_', '" . $data['callback'] . "')))";
 
+       // Generate replacer
+       $replacer = '{DQUOTE} . call_user_func(' . $functionName . ') . {DQUOTE}';
+
        // Replace it
-       $code = str_replace($data['matches'][0][$data['key']], "\" . call_user_func(" . $functionName . ") . \"", $data['code']);
+       $code = replaceExpressionCode($data, $replacer);
 
        // Return replaced code
        return $code;
@@ -88,9 +149,9 @@ function doExpressionUser ($data) {
                if ($data['matches'][4][$data['key']] == '$userid') {
                        // Use dynamic call
                        $functionName = "getFetchedUserData('userid', \$userid, '" . $data['callback'] . "')";
-               } elseif ($data['matches'][4][$data['key']] > 0) {
+               } elseif (!empty($data['matches'][4][$data['key']])) {
                        // User data found
-                       $functionName = "getFetchedUserData('userid', " . $data['matches'][4][$data['key']] . ", " . $data['callback'] . "')";
+                       $functionName = "getFetchedUserData('userid', " . $data['matches'][4][$data['key']] . ", '" . $data['callback'] . "')";
                }
        } elseif ((!empty($data['callback'])) && (isUserDataValid())) {
                // "Call-back" alias column for current logged in user's data
@@ -98,13 +159,16 @@ function doExpressionUser ($data) {
        }
 
        // Do we have another function to run (e.g. translations)
-       if (!empty($extraFunction)) {
+       if (!empty($data['extra_func'])) {
                // Surround the original function call with it
-               $functionName = $extraFunction . '(' . $functionName . ')';
+               $functionName = $data['extra_func'] . '(' . $functionName . ')';
        } // END - if
 
+       // Generate replacer
+       $replacer = '{DQUOTE} . ' . $functionName . ' . {DQUOTE}';
+
        // Now replace the code
-       $code = str_replace($data['matches'][0][$data['key']], "\" . " . $functionName . " . \"", $data['code']);
+       $code = replaceExpressionCode($data, $replacer);
 
        // Return replaced code
        return $code;
@@ -121,29 +185,58 @@ function doExpressionExt ($data) {
                $functionName = 'getExtension' . ucfirst(strtolower($data['callback']));
 
                // Construct call of the function
-               $replacer = "\" . call_user_func_array('" . $functionName . "', array('" . $data['matches'][4][$data['key']] . "', true)) . \"";
+               $replacer = "{DQUOTE} . call_user_func_array('" . $functionName . "', array('" . $data['matches'][4][$data['key']] . "', true)) . {DQUOTE}";
        } // END - if
 
+       // Generate replacer
+       $replacer = sprintf("&ext=%s&ver=%s&rev={?CURR_SVN_REVISION?}", $data['matches'][4][$data['key']], $replacer);
+
        // Replace it and insert parameter for GET request
-       $code = str_replace($data['matches'][0][$data['key']], sprintf("&ext=%s&ver=%s&rev=\" . getConfig('CURR_SVN_REVISION') . \"", $data['matches'][4][$data['key']], $replacer), $data['code']);
+       $code = replaceExpressionCode($data, $replacer);
 
        // Return replaced code
        return $code;
 }
 
 // Expression call-back function for getting configuration data
+// @TODO FILTER_COMPILE_CONFIG does not handle call-back functions so we handle it here again
 function doExpressionConfig ($data) {
-       // Read configuration
-       $configValue = getConfig($data['matches'][4][$data['key']]);
+       // Do we have a special expression function for it?
+       if (isExpressionFunctionAvaiable($data)) {
+               // Then use it
+               $replacer = '{DQUOTE}  . ' . $data['callback'] . '('.getExpressionFunction($data).'(' . "'" . $data['matches'][4][$data['key']] . "'" . ')) . {DQUOTE}';
+       } else {
+               // Default replacer is the config value itself
+               $replacer = '{DQUOTE}  . ' . $data['callback'] . '(getConfig(' . "'" . $data['matches'][4][$data['key']] . "'" . ')) . {DQUOTE}';
+       }
+
+       // Replace the config entry
+       $code = replaceExpressionCode($data, $replacer);
 
-       // Do we have a call-back?
+       // Return replaced code
+       return $code;
+}
+
+// Expression call-back function for piping data through functions
+function doExpressionPipe ($data) {
+       // We need callback and extra_func: callback is really the call-back function, extra_func is our value
+       $replacer = $data['extra_func'];
+
+       // Do we have a call-back? Should always be there!
        if (!empty($data['callback'])) {
-               // Parse it through this function
-               $configValue = call_user_func_array($data['callback'], array($configValue));
+               //if ($data['callback'] == 'getMemberId') die('<pre>'.encodeEntities(print_r($data, true)).'</pre>');
+               // If the value is empty, we don't add it
+               if (empty($data['value'])) {
+                       // No value is set
+                       $replacer = '{DQUOTE} . ' . $data['extra_func2'] . '(' . $data['extra_func'] . '(' . $data['callback'] . '())) . {DQUOTE}';
+               } else {
+                       // Some value is set
+                       $replacer = '{DQUOTE} . ' . $data['extra_func2'] . '(' . $data['extra_func'] . '(' . $data['callback'] . "('" . $data['value'] . "'))) . {DQUOTE}";
+               }
        } // END - if
 
        // Replace the config entry
-       $code = str_replace($data['matches'][0][$data['key']], $configValue, $data['code']);
+       $code = replaceExpressionCode($data, $replacer);
 
        // Return replaced code
        return $code;
@@ -152,14 +245,81 @@ function doExpressionConfig ($data) {
 // Expression call-back function for calling filters
 function doExpressionFilter ($data) {
        // Construct replacement
-       $replacer = "\" . runFilterChain('" . $data['matches'][4][$data['key']] . "') . \"";
+       $replacer = "{DQUOTE} . runFilterChain('" . $data['matches'][4][$data['key']] . "') . {DQUOTE}";
 
        // Run the filter and insert result
-       $code = str_replace($data['matches'][0][$data['key']], $replacer, $data['code']);
+       $code = replaceExpressionCode($data, $replacer);
 
        // Return replaced code
        return $code;
 }
 
+// Expression call-back function for validator links
+function doExpressionValidatorLinks ($data) {
+       // Default is nothing
+       $replacer = '';
+
+       // Get the code from data array for replacement/pipe-through
+       $code = $data['code'];
+
+       // Should we generally include validator links?
+       if ((isExtensionInstalled('validator')) && (getConfig('enable_validator') == 'Y') && (!in_array(getModule(), array('admin', 'login')))) {
+               // Load the validator template
+               $replacer = escapeQuotes(loadTemplate('validator_links', true));
+       } // END - if
+
+       // Replace the code
+       $code = replaceExpressionCode($data, $replacer);
+
+       // Return the (maybe) replaced code
+       return $code;
+}
+
+// Expression call-back for dynamic messages
+function doExpressionMessage ($data) {
+       // Debug message
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'callback=' . $data['callback'] . ',extra_func=' . $data['extra_func'] . ',value=' . $data['value']);
+
+       // Message string replacement depends on if message is masked
+       if ((isMessageMasked($data['callback'])) && ((!empty($data['extra_func'])) || ($data['extra_func'] == '0'))) {
+               // Message should be masked
+               $replacer = "{DQUOTE} . getMaskedMessage('" . $data['callback'] . "', '" . $data['extra_func'] . "') . {DQUOTE}";
+       } elseif (!empty($data['value'])) {
+               // value is set, so it is masked message
+               $replacer = "{DQUOTE} . getMaskedMessage('" . $data['callback'] . "', '" . $data['value'] . "') . {DQUOTE}";
+       } else {
+               // Regular message
+               $replacer = "{DQUOTE} . getMessage('" . $data['callback'] . "') . {DQUOTE}";
+       }
+
+       // Replace the code
+       $code = replaceExpressionCode($data, $replacer);
+
+       // Return the (maybe) replaced code
+       return $code;
+}
+
+// Expression call-back for template functions
+function doExpressionTemplate ($data) {
+       // Do the replacement
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'template='.$GLOBALS['current_template']);
+       $replacer = '{DQUOTE} . doTemplate' . $data['callback'] . "('" . $GLOBALS['current_template'] . "', true";
+
+       // Is 'value' set?
+       if (!empty($data['value'])) {
+               // Then include it as well
+               $replacer .= ", '" . $data['value'] . "'";
+       } // END - if
+
+       // Replacer is ready
+       $replacer .= ') . {DQUOTE}';
+
+       // Replace the code
+       $code = replaceExpressionCode($data, $replacer);
+
+       // Return the (maybe) replaced code
+       return $code;
+}
+
 // [EOF]
 ?>