示例#1
0
文件: Core.php 项目: Sywooch/forums
 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;
 }