Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/SubContainer/Widget.php
<?php

namespace XF\SubContainer;

use
XF\Container;

class
Widget extends AbstractSubContainer
{
    public function
initialize()
    {
       
$container = $this->container;

       
$container->factory('position', function($positionId, array $params, Container $c)
        {
           
// TODO: Pass some page related context (selected tab, controller, action, page template etc.)

           
if (!$positionId)
            {
                return [];
            }

           
$widgetCache = $c['widgetCache'];

            if (!isset(
$widgetCache[$positionId]))
            {
                return [];
            }

            return
$widgetCache[$positionId];
        },
false);

       
$container->factory('widget', function($identifier, array $params, Container $c)
        {
            if (
strpos($identifier, '\\') !== false)
            {
               
$definitionCache = $c['widgetDefinition'];

               
$groupedDefinitions = [];
                foreach (
$definitionCache AS $definition)
                {
                    if (isset(
$definition['definition_class']))
                    {
                       
$groupedDefinitions[$definition['definition_class']] = $definition;
                    }
                }

                if (!isset(
$groupedDefinitions[$identifier]))
                {
                    throw new \
InvalidArgumentException(\XF::phrase('no_widget_definition_exists_with_definition_class_of_x', ['identifier' => $identifier]));
                }
               
$widget = $groupedDefinitions[$identifier];

               
// Special case for an option key named _title - not an option, use it to override the title.
               
if (isset($params['_title']))
                {
                   
$widget['title'] = $params['_title'];
                    unset(
$params['_title']);
                }

               
$widget['options'] = [];
            }
            else
            {
               
$widgetCache = $c['widgetCache'];

               
$groupedWidgets = [];
                foreach (
$widgetCache AS $widgets)
                {
                    foreach (
$widgets AS $widget)
                    {
                        if (isset(
$widget['widget_key']))
                        {
                           
$groupedWidgets[$widget['widget_key']] = $widget;
                        }
                    }
                }

                if (!isset(
$groupedWidgets[$identifier]))
                {
                    throw new \
InvalidArgumentException(\XF::phrase('no_widget_defined_with_widget_key_of_x', ['identifier' => $identifier]));
                }

               
$widget = $groupedWidgets[$identifier];
            }

           
$widget['options'] = array_replace($widget['options'], $params);

           
$class = \XF::stringToClass($widget['definition_class'], '%s\Widget\%s');
           
$class = $this->extendClass($class);

           
// TODO: Pass some page related context (selected tab, controller, action, page template etc.)
           
if (isset($params['context']))
            {
               
$contextParams = $params['context'];
                unset(
$params['context']);
            }
            else
            {
               
$contextParams = [];
            }

           
$widgetConfig = \XF\Widget\WidgetConfig::create($widget);
            return
$c->createObject($class, [$this->app, $widgetConfig, $contextParams]);
        },
false);

       
$container['widgetCache'] = $this->fromRegistry('widgetCache',
            function(
Container $c) { return $this->parent['em']->getRepository('XF:Widget')->rebuildWidgetCache(); }
        );

       
$container['widgetDefinition'] = $this->fromRegistry('widgetDefinition',
            function(
Container $c) { return $this->parent['em']->getRepository('XF:Widget')->rebuildWidgetDefinitionCache(); }
        );

       
$container['widgetPosition'] = $this->fromRegistry('widgetPosition',
            function(
Container $c) { return $this->parent['em']->getRepository('XF:Widget')->rebuildWidgetPositionCache(); }
        );

       
$container['widgetCompiler'] = function(Container $c)
        {
            return new \
XF\Widget\WidgetCompiler($this->parent['templateCompiler']);
        };
    }

   
/**
     * @param $positionId
     *
     * @return array|\XF\Widget\AbstractWidget[]
     */
   
public function position($positionId, array $contextParams = [])
    {
        return
$this->container->create('position', $positionId, $contextParams);
    }

   
/**
     * @param $identifier
     * @param array $options
     *
     * @return null|\XF\Widget\AbstractWidget
     */
   
public function widget($identifier, array $options = [])
    {
        return
$this->container->create('widget', $identifier, $options);
    }

   
/**
     * @return \XF\Widget\WidgetCompiler
     */
   
public function getWidgetCompiler()
    {
        return
$this->container['widgetCompiler'];
    }

    public function
getWidgetFilename($widget)
    {
        return
"_{$widget['widget_id']}_{$widget['widget_key']}.php";
    }

    public function
getCompiledWidget($widget, array $options = [])
    {
       
$output = null;

       
$file = \XF\Util\File::getCodeCachePath() . '/widgets/' . $this->getWidgetFilename($widget);
        if (
file_exists($file))
        {
           
$closure = include($file);
            if (
$closure)
            {
               
$output = $this->app->templater()->renderWidgetClosure($closure, $options);
            }
        }

        return
$output;
    }
}