diff --git a/contact.php b/contact.php index 2096986b6..c399bc934 100644 --- a/contact.php +++ b/contact.php @@ -164,8 +164,10 @@ if(SITECONTACTINFO && $CONTACT_INFO) if(isset($pref['sitecontacts']) && $pref['sitecontacts'] != 255) { - // require_once(e_CORE."shortcodes/batch/contact_shortcodes.php"); $contact_shortcodes = e107::getScBatch('contact'); + // Wrapper support + $contact_shortcodes->wrapper('contact/form'); + $text = $tp->parseTemplate($CONTACT_FORM, TRUE, $contact_shortcodes); if(trim($text) != "") diff --git a/e107_core/templates/contact_template.php b/e107_core/templates/contact_template.php index 52a20bfdc..b326f2823 100644 --- a/e107_core/templates/contact_template.php +++ b/e107_core/templates/contact_template.php @@ -40,28 +40,24 @@ $CONTACT_TEMPLATE['menu'] = ' '; - ///XXX This..... + // Option I - new sc style variable and format, global available per shortcode (mode also applied) + // sc_style is uppercased now - distinguished from the legacy $sc_style variable and compatible with the new template standards, we deprecate $sc_style soon - $sc_style['CONTACT_EMAIL_COPY']['pre'] = ""; - $sc_style['CONTACT_EMAIL_COPY']['post'] = LANCONTACT_07.""; - - $sc_style['CONTACT_PERSON']['pre'] = "".LANCONTACT_14."
"; - $sc_style['CONTACT_PERSON']['post'] = ""; - - $sc_style['CONTACT_IMAGECODE']['pre'] = "".LANCONTACT_16."
"; - $sc_style['CONTACT_IMAGECODE']['post'] = ""; - - $sc_style['CONTACT_IMAGECODE_INPUT']['pre'] = ""; - $sc_style['CONTACT_IMAGECODE_INPUT']['post'] = ""; + $SC_STYLE['CONTACT_EMAIL_COPY'] = "{---}".LANCONTACT_07.""; + $SC_STYLE['CONTACT_PERSON'] = "".LANCONTACT_14."
{---}"; + $SC_STYLE['CONTACT_IMAGECODE'] = "".LANCONTACT_16."
{---}"; + $SC_STYLE['CONTACT_IMAGECODE_INPUT'] = "{---}"; -//XXX Becomes This..... ( New Format for v2 - losing the pre/post and using a shortcode 'wildcard' that can be split later) + // Option II - Wrappers, used ONLY with batch objects, requires explicit wrapper registration + // In this case (see contact.php) e107::getScBatch('contact')->wrapper('contact/form') + // Only one Option is used - WRAPPER > SC_STYLE - $CONTACT_WRAPPER['form']['CONTACT_IMAGECODE'] = "".LANCONTACT_16."
{---}"; - $CONTACT_WRAPPER['form']['CONTACT_IMAGECODE_INPUT'] = "{---}"; - - $CONTACT_WRAPPER['form']['CONTACT_EMAIL_COPY'] = "{---}".LANCONTACT_07.""; - $CONTACT_WRAPPER['form']['CONTACT_PERSON'] = "".LANCONTACT_14."
{---}"; + // $CONTACT_WRAPPER['form']['CONTACT_IMAGECODE'] = "".LANCONTACT_16."
{---}"; + // $CONTACT_WRAPPER['form']['CONTACT_IMAGECODE_INPUT'] = "{---}"; +// + // $CONTACT_WRAPPER['form']['CONTACT_EMAIL_COPY'] = "{---}".LANCONTACT_07.""; + // $CONTACT_WRAPPER['form']['CONTACT_PERSON'] = "".LANCONTACT_14."
{---}"; $CONTACT_TEMPLATE['form'] = " diff --git a/e107_handlers/e107_class.php b/e107_handlers/e107_class.php index 38904df5e..08d967e7c 100644 --- a/e107_handlers/e107_class.php +++ b/e107_handlers/e107_class.php @@ -2022,6 +2022,50 @@ class e107 return (is_array($ret_plug) ? array_merge($ret_plug, $ret) : $ret); } + + /** + * Register sc_style registry + * @param string $templateId e.g. 'contact/form' or 'contact' for all contact template wrappers + * @param string $scName [optional] shortcode name - if provided, wrapper (string) for the corresponding code will be returned + * @return array|string + */ + public static function templateWrapper($templateId, $scName = null) + { + if(!$templateId) return array(); + + list($templateId, $templateKey) = explode('/', $templateId, 2); + + $wrapperRegPath = 'templates/wrapper/'.$templateId; + $wrapper = self::getRegistry($wrapperRegPath); + if(empty($wrapper) || !is_array($wrapper)) $wrapper = array(); + + if($templateKey) $wrapper = (isset($wrapper[$templateKey]) ? $wrapper[$templateKey] : array()); + + if(null !== $scName) + { + $scName = strtoupper($scName); + return isset($wrapper[$scName]) ? $wrapper[$scName] : ''; + } + + return $wrapper; + } + + /** + * Retrieve/set sc_style array (global shortcode wrapper) + * @param array $set template defined $sc_style, will be merged with current registry content + * @return array + */ + public static function scStyle($set = null) + { + $_sc_style = self::getRegistry('shortcodes/sc_style'); + if(!is_array($_sc_style)) $_sc_style = array(); + if(is_array($set) && !empty($set)) + { + self::setRegistry('shortcodes/sc_style', array_merge($_sc_style, $set)); + } + + return $_sc_style; + } /** * Get Template Info array. @@ -2132,6 +2176,7 @@ class e107 $var_info = strtoupper($id).'_INFO'; $wrapper = strtoupper($id).'_WRAPPER'; // see contact_template.php + $wrapperRegPath = 'templates/wrapper/'.$id; //FIXME XXX URGENT - Add support for _WRAPPER and $sc_style BC. - save in registry and retrieve in getScBatch()? // Use: list($pre,$post) = explode("{---}",$text,2); @@ -2140,6 +2185,18 @@ class e107 { (deftrue('E107_DEBUG_LEVEL') ? include_once($path) : @include_once($path)); self::setRegistry($regPath, (isset($$var) ? $$var : array())); + + // sc_style not a global anymore and uppercase + if(isset($SC_STYLE)) + { + self::scStyle($SC_STYLE); + } + + // ID_WRAPPER support + if(isset($$wrapper) && !empty($$wrapper) && is_array($$wrapper)) + { + self::setRegistry($wrapperRegPath, $$wrapper); + } } if(null === self::getRegistry($regPathInfo)) { diff --git a/e107_handlers/shortcode_handler.php b/e107_handlers/shortcode_handler.php index 9ee67f0bd..d7c01f60e 100644 --- a/e107_handlers/shortcode_handler.php +++ b/e107_handlers/shortcode_handler.php @@ -73,6 +73,18 @@ class e_parse_shortcode * @var e_vars */ protected $eVars = null; + + /** + * Wrappers array for the current parsing cycle, see contact_template.php and $CONTACT_WRAPPER variable + * @var array + */ + protected $wrappers = array(); + + /** + * Former $sc_style global variable. Internally used - performance reasons + * @var array + */ + protected $sc_style = array(); function __construct() { @@ -665,6 +677,8 @@ class e_parse_shortcode */ function parseCodes($text, $useSCFiles = true, $extraCodes = null, $eVars = null) { + global $sc_style; //legacy, will be removed soon, use the non-global $SC_STYLE instead + $saveParseSCFiles = $this->parseSCFiles; // In case of nested call $this->parseSCFiles = $useSCFiles; $saveVars = $this->eVars; // In case of nested call @@ -672,11 +686,26 @@ class e_parse_shortcode $this->eVars = $eVars; $this->addedCodes = NULL; + // former $sc_style - do it once here and not on every doCode loop - performance + $this->sc_style = e107::scStyle(); + if(isset($sc_style) && is_array($sc_style)) + { + $this->sc_style = array_merge($sc_style, $this->sc_style); + } //object support if (is_object($extraCodes)) { $this->addedCodes = &$extraCodes; + + // TEMPLATEID_WRAPPER support - see contact template + // must be registered in e_shortcode object (batch) via wrapper() method before parsing + // Do it only once per parsing cylcle and not on every doCode() loop - performance + if(method_exists($this->addedCodes, 'wrapper')) + { + $this->wrappers = e107::templateWrapper($this->addedCodes->wrapper()); + } + /* $classname = get_class($extraCodes); @@ -717,8 +746,8 @@ class e_parse_shortcode */ function doCode($matches) { - - global $pref, $e107cache, $menu_pref, $sc_style, $parm, $sql; + // XXX remove all globals, $sc_style removed + global $pref, $e107cache, $menu_pref, $parm, $sql; $parmArray = false; @@ -859,7 +888,8 @@ class e_parse_shortcode // XXX - removal candidate - I really think it should be done manually (outside the parser) // via e107::getScBatch(name)->setParserVars($eVars); // $this->callScFunc($_class, 'setParserVars', $this->eVars); - + $wrapper = $this->callScFunc($_class, 'wrapper', null); + $ret = $this->callScFuncA($_class, $_method, array($parm, $sc_mode)); /*if (method_exists($this->scClasses[$_class], $_method)) @@ -962,20 +992,41 @@ class e_parse_shortcode if (isset($ret) && ($ret != '' || is_numeric($ret))) { - //if $sc_mode exists, we need it to parse $sc_style - if ($sc_mode) + // Wrapper support - see contact_template.php + if(isset($this->wrappers[$code]) && !empty($this->wrappers[$code])) { - $code = $code.'|'.$sc_mode; + list($pre, $post) = explode("{---}", $this->wrappers[$code], 2); + $ret = $pre.$ret.$post; } - if (isset($sc_style) && is_array($sc_style) && array_key_exists($code, $sc_style)) + else { - if (isset($sc_style[$code]['pre'])) + //if $sc_mode exists, we need it to parse $sc_style + if ($sc_mode) { - $ret = $sc_style[$code]['pre'].$ret; + $code = $code.'|'.$sc_mode; } - if (isset($sc_style[$code]['post'])) + if (is_array($this->sc_style) && array_key_exists($code, $this->sc_style)) { - $ret = $ret.$sc_style[$code]['post']; + $pre = $post = ''; + // old way - pre/post keys + if(is_array($this->sc_style[$code])) + { + if (isset($this->sc_style[$code]['pre'])) + { + $pre = $this->sc_style[$code]['pre']; + } + if (isset($this->sc_style[$code]['post'])) + { + $post = $ret.$this->sc_style[$code]['post']; + } + } + // new way - same format as wrapper + else + { + list($pre, $post) = explode("{---}", $this->sc_style[$code], 2); + } + + $ret = $pre.$ret.$post; } } } @@ -1106,7 +1157,7 @@ class e_shortcode protected $mode = 'view'; // or edit. Used within shortcodes for form elements vs values only. - protected $wrapper = array(); // hold values of pre/post styling for each shortcode - see contact_template.php for an example. + protected $wrapper = null; // holds template/key value of the currently used wrapper (if any) - see contact_template.php for an example. /** * Storage for shortcode values @@ -1123,6 +1174,21 @@ class e_shortcode * Startup code for child class */ public function init() {} + + /** + * Sets wrapper id (to be retrieved from the registry while parsing) + * Example e107::getScBatch('contact')->wrapper('contact/form'); + * which results in using the $CONTACT_WRAPPER['form'] wrapper in the parsing phase + */ + public function wrapper($id = null) + { + if(null === $id) return $this->wrapper; + + if(false === $id) $id = null; + $this->wrapper = $id; + + return $this; + } /** * Set external array data to be used in the batch