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));
             }
         }
     }
 }
Exemple #2
0
 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;
 }