public static function WidgetFramework_mergeExtraContainerData(array $extraData) { if (empty($extraData)) { return; } if (self::$_WidgetFramework_pageContainerTemplate === null or self::$_WidgetFramework_pageContainerTemplate->getParam('contents') === null) { XenForo_Template_Public::$_extraData = XenForo_Application::mapMerge(XenForo_Template_Public::$_extraData, $extraData); } else { // these extra data came too late // page container has already started rendering... self::$_WidgetFramework_lateExtraData = XenForo_Application::mapMerge(self::$_WidgetFramework_lateExtraData, $extraData); } }
public static function template_post_render($templateName, &$output, array &$containerData, XenForo_Template_Abstract $template) { if (defined('WIDGET_FRAMEWORK_LOADED')) { if ($templateName != 'wf_widget_wrapper') { WidgetFramework_Core::getInstance()->renderWidgetsFor($templateName, $template->getParams(), $template, $containerData); // get a copy of container data for widget rendered $positionCode = $template->getParam(WidgetFramework_WidgetRenderer::PARAM_POSITION_CODE); if ($positionCode !== null) { $widget = $template->getParam('widget'); WidgetFramework_WidgetRenderer::setContainerData($template->getParam('widget'), $containerData); } } if ($templateName === 'PAGE_CONTAINER') { WidgetFramework_Template_Extended::WidgetFramework_processLateExtraData($output, $containerData, $template); if (!empty(self::$_navigationTabsForums)) { $output = str_replace('<!-- navigation_tabs_forums for wf_home_navtab_links -->', self::$_navigationTabsForums, $output); } } } }
public function render(array $widget, $positionCode, array $params, XenForo_Template_Abstract $template, &$output) { $html = false; $containerData = array(); $requiredExternals = array(); try { if (!$this->_testConditional($widget, $params)) { // expression failed, stop rendering... if (WidgetFramework_Option::get('layoutEditorEnabled')) { $html = new XenForo_Phrase('wf_layout_editor_widget_conditional_failed'); } else { $html = ''; } } } catch (Exception $e) { // problem while testing conditional, stop rendering... if (WidgetFramework_Core::debugMode() or WidgetFramework_Option::get('layoutEditorEnabled')) { $html = $e->getMessage(); } else { $html = ''; } } // add check for mobile (user agent spoofing) // since 2.2.2 if (!empty($widget['options']['deactivate_for_mobile'])) { if (XenForo_Visitor::isBrowsingWith('mobile')) { $html = ''; } } // check for cache // since 1.2.1 $cacheId = false; $useUserCache = false; $useLiveCache = false; $lockId = ''; if ($html === false and $this->useCache($widget)) { // sondh@2013-04-02 // please keep this block of code in-sync'd with its copycat // implemented in WidgetFramework_WidgetRenderer::prepare $cacheId = $this->_getCacheId($widget, $positionCode, $params); $useUserCache = $this->useUserCache($widget); $useLiveCache = $this->useLiveCache($widget); $cached = WidgetFramework_Core::loadCachedWidget($cacheId, $useUserCache, $useLiveCache); if (!empty($cached) and is_array($cached)) { if ($this->isCacheUsable($cached, $widget)) { // found fresh cached html, use it asap $this->_restoreFromCache($cached, $html, $containerData, $requiredExternals); } else { // cached html has expired: try to acquire lock $lockId = $this->_acquireLock($widget, $positionCode, $params); if ($lockId === false) { // a lock cannot be acquired, an expired cached html is the second best choice $this->_restoreFromCache($cached, $html, $containerData, $requiredExternals); } } } else { // no cache found $lockId = $this->_acquireLock($widget, $positionCode, $params); } } if ($html === false and $lockId === false) { // a lock is required but we failed to acquired it // also, a cached could not be found // stop rendering $html = ''; } // conditional executed just fine if ($html === false) { $renderTemplate = $this->_getRenderTemplate($widget, $positionCode, $params); if (!empty($renderTemplate)) { $renderTemplateObject = $template->create($renderTemplate, array_merge($params, array('widget' => $widget))); // reset required externals $existingRequiredExternals = WidgetFramework_Template_Extended::WidgetFramework_getRequiredExternals(); WidgetFramework_Template_Extended::WidgetFramework_setRequiredExternals(array()); $html = $this->_render($widget, $positionCode, $params, $renderTemplateObject); // get container data (using template_post_render listener) $containerData = self::_getContainerData($widget); // get widget required externals $requiredExternals = WidgetFramework_Template_Extended::WidgetFramework_getRequiredExternals(); WidgetFramework_Template_Extended::WidgetFramework_setRequiredExternals($existingRequiredExternals); } else { $html = $this->_render($widget, $positionCode, $params, $template); } $html = trim($html); if ($cacheId !== false) { $extraData = array(); if (!empty($containerData)) { $extraData[self::EXTRA_CONTAINER_DATA] = $containerData; } if (!empty($requiredExternals)) { $extraData[self::EXTRA_REQUIRED_EXTERNALS] = $requiredExternals; } WidgetFramework_Core::preSaveWidget($widget, $positionCode, $params, $html); WidgetFramework_Core::saveCachedWidget($cacheId, $html, $extraData, $useUserCache, $useLiveCache); } } $this->_releaseLock($lockId); if (!empty($containerData)) { // apply container data WidgetFramework_Template_Extended::WidgetFramework_mergeExtraContainerData($containerData); } if (!empty($requiredExternals)) { // register required external foreach ($requiredExternals as $type => $requirements) { foreach ($requirements as $requirement) { $template->addRequiredExternal($type, $requirement); } } } return $html; }
public static function template_post_render($templateName, &$output, array &$containerData, XenForo_Template_Abstract $template) { if (defined('WIDGET_FRAMEWORK_LOADED')) { if ($templateName != 'wf_widget_wrapper') { $rendered = WidgetFramework_Core::getInstance()->renderWidgetsFor($templateName, $template->getParams(), $template, $containerData); if ($rendered) { // get a copy of container data for widget rendered $positionCode = $template->getParam(WidgetFramework_Core::PARAM_POSITION_CODE); if ($positionCode !== null) { WidgetFramework_WidgetRenderer::setContainerData($template->getParam('widget'), $containerData); } if (!isset($containerData[WidgetFramework_Core::PARAM_TEMPLATE_OBJECTS])) { $containerData[WidgetFramework_Core::PARAM_TEMPLATE_OBJECTS] = array(); } $containerData[WidgetFramework_Core::PARAM_TEMPLATE_OBJECTS][$templateName] = $template; } } if (self::$_saveLayoutEditorRendered) { switch ($templateName) { case 'wf_widget_wrapper': case 'wf_layout_editor_widget_wrapper': $normalizedGroupId = $template->getParam('normalizedGroupId'); if (!empty($normalizedGroupId)) { self::$_layoutEditorRendered[$normalizedGroupId] = $output; } $tabs = $template->getParam('tabs'); foreach ($tabs as $tab) { if (!empty($normalizedGroupId)) { self::$_layoutEditorRendered[$tab['widget_id']] = array('normalizedGroupId' => $normalizedGroupId); } else { self::$_layoutEditorRendered[$tab['widget_id']] = $output; } } break; case 'wf_layout_editor_widget': $widget = $template->getParam('widget'); self::$_layoutEditorRendered[$widget['widget_id']] = $output; break; } } if ($templateName === 'PAGE_CONTAINER') { WidgetFramework_Template_Extended::WidgetFramework_processLateExtraData($output, $containerData, $template); if (!empty(self::$_navigationTabsForums)) { $output = str_replace('<!-- navigation_tabs_forums for wf_home_navtab_links -->', self::$_navigationTabsForums, $output); } } } }