protected function _renderWidgetsFor($positionCode, array $params, XenForo_Template_Abstract $template, $html) { if (!isset($this->_positions[$positionCode])) { // stop rendering if no widget configured for this position return $html; } $position =& $this->_positions[$positionCode]; if (empty($position['prepared'])) { // stop rendering if not prepared return $html; } foreach ($position['widgets'] as &$widgetGroup) { $count = 0; $isRandom = strpos($widgetGroup['name'], 'random') === 0; if ($widgetGroup['keys'] === false) { $widgetGroup['keys'] = array_keys($widgetGroup['widgets']); if ($isRandom) { shuffle($widgetGroup['keys']); } } foreach ($widgetGroup['keys'] as $key) { $widget =& $widgetGroup['widgets'][$key]; $widgetHtml = ''; $renderer = self::getRenderer($widget['class'], false); if (!empty($renderer)) { $widgetHtml = strval($renderer->render($widget, $positionCode, $params, $template, $html)); // extra-preparation (this will be run everytime the widget is ready to display) // this method can change the final html in some way if it needs to do that // the changed html won't be store in the cache (caching is processed inside // WidgetFramework_Renderer::render()) $position['extraData'][$widget['widget_id']] = $renderer->extraPrepare($widget, $widgetHtml); } if (!empty($widgetHtml)) { $position['html'][$widget['widget_id']] = $widgetHtml; $count++; } else { $position['html'][$widget['widget_id']] = ''; } if ($isRandom and $count > 0) { // we are in random group // at least 1 widget is rendered // stop the foreach loop now break; } } if ($count > 0) { $tabs = array(); $noWrapper = array(); foreach ($widgetGroup['keys'] as $key) { $widget =& $widgetGroup['widgets'][$key]; $renderer = self::getRenderer($widget['class'], false); if (!empty($position['html'][$widget['widget_id']])) { if ($renderer->useWrapper($widget)) { $widgetClass = $widget['class']; if (!empty($params[WidgetFramework_WidgetRenderer::PARAM_IS_HOOK])) { $widgetClass .= ' non-sidebar-widget'; } $tabs[$widget['widget_id']] = array('widget_id' => $widget['widget_id'], 'title' => WidgetFramework_Helper_String::createWidgetTitleDelayed($renderer, $widget), 'html' => $position['html'][$widget['widget_id']], 'class' => $widgetClass, 'extraData' => $position['extraData'][$widget['widget_id']], 'options' => $widget['options']); } else { $noWrapper[$widget['widget_id']] = $position['html'][$widget['widget_id']]; } } } $htmls = $noWrapper; if (!empty($tabs)) { $htmls[] = WidgetFramework_WidgetRenderer::wrap($tabs, $params, $template, $widgetGroup['name']); } if (count($htmls) > 0) { if ($widgetGroup['display_order'] >= 0) { array_unshift($htmls, $html); } else { $htmls[] = $html; } $html = WidgetFramework_Helper_String::createArrayOfStrings($htmls); } } } return $html; }