Exemplo n.º 1
0
 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);
     }
 }
Exemplo n.º 2
0
 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;
 }
Exemplo n.º 4
0
 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);
             }
         }
     }
 }