protected function _renderWidgetsFor_renderWidgetsContainer(array &$widgetsContainer, $positionCode, array $widgetParams, XenForo_Template_Abstract $template, &$html) { foreach ($widgetsContainer['widgets'] as &$widgetElement) { $rendered = array(); if (empty($widgetElement['keys'])) { if (!empty($widgetElement['widgets'])) { // the element is a group $widgetElement['keys'] = array_keys($widgetElement['widgets']); } elseif (!empty($widgetElement['widget_id'])) { // the widget element is a widget $widgetElement['keys'] = array($widgetElement['widget_id']); } if (!WidgetFramework_Option::get('layoutEditorEnabled') && $widgetElement['isRandom']) { $randKey = array_rand($widgetElement['keys']); $widgetElement['keys'] = array($widgetElement['keys'][$randKey]); } } $widgetElementName = $widgetElement['name']; if (empty($widgetElementName)) { $widgetElementName = 'widgets-' . substr(md5(implode(',', $widgetElement['keys'])), 0, 5); } foreach ($widgetElement['keys'] as $key) { if (isset($widgetElement['widgets'][$key])) { $widget =& $widgetElement['widgets'][$key]; } elseif (!empty($widgetElement['widget_id']) and $widgetElement['widget_id'] == $key) { $widget =& $widgetElement; } $widgetHtml = ''; $widgetAjaxLoadUrl = null; $renderer = null; if (!empty($widget['widgets'])) { // the sub-element is a group // we do not pass the $html itself but we use $widgetHtml instead // that means Empty renderer will not work if it is a member a group $subWidgetsContainer = array('widgets' => array($key => &$widget)); $subWidgetParams = $widgetParams; $subWidgetParams[self::PARAM_PARENT_GROUP_NAME] = $widgetElementName; $this->_renderWidgetsFor_renderWidgetsContainer($subWidgetsContainer, $positionCode, $subWidgetParams, $template, $widgetHtml); } elseif (!empty($widget['class'])) { $renderer = self::getRenderer($widget['class'], false); if (!empty($renderer)) { if (!WidgetFramework_Option::get('layoutEditorEnabled') && count($rendered) > 0 && $widgetElement['isTabs'] && $renderer->canAjaxLoad($widget)) { $widgetAjaxLoadUrl = $renderer->getAjaxLoadUrl($widget, $positionCode, $widgetParams, $template); $widgetHtml = $widgetAjaxLoadUrl; } else { $widgetHtml = strval($renderer->render($widget, $positionCode, $widgetParams, $template, $html)); // extra-preparation (this will be run every time 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()) $widget['extraData'] = $renderer->extraPrepare($widget, $widgetHtml); } } elseif (WidgetFramework_Option::get('layoutEditorEnabled')) { $widgetHtml = new XenForo_Phrase('wf_layout_editor_widget_no_renderer'); } } if (!empty($widgetHtml) or WidgetFramework_Option::get('layoutEditorEnabled')) { $rendered[$key] = array_merge($widget, array('html' => $widgetHtml, 'ajaxLoadUrl' => $widgetAjaxLoadUrl, 'positionCode' => $positionCode, self::PARAM_IS_HOOK => !empty($params[self::PARAM_IS_HOOK]), self::PARAM_IS_GROUP => !empty($widget['widgets']))); if (!empty($renderer)) { $rendered[$key]['useWrapper'] = $renderer->useWrapper($widget); $rendered[$key]['title'] = WidgetFramework_Helper_String::createWidgetTitleDelayed($renderer, $widget); } } } if (count($rendered) > 0) { $wrapped = $this->_wrapWidgets($rendered, $widgetParams, $template, $widgetElement); if (empty($html)) { $html = $wrapped; } elseif ($widgetElement['display_order'] >= 0) { $html = WidgetFramework_Helper_String::createArrayOfStrings(array($html, $wrapped)); } else { $html = WidgetFramework_Helper_String::createArrayOfStrings(array($wrapped, $html)); } } } }
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; }