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

namespace XF\Repository;

use
XF\Mvc\Entity\Finder;
use
XF\Mvc\Entity\Repository;

use function
count;

class
Widget extends Repository
{
   
/**
     * @return Finder
     */
   
public function findWidgetsForList()
    {
        return
$this->finder('XF:Widget')
            ->
with('WidgetDefinition', true)
            ->
whereAddOnActive([
               
'relation' => 'WidgetDefinition.AddOn',
               
'column' => 'WidgetDefinition.addon_id'
           
])
            ->
order('widget_id');
    }

    public function
groupWidgetsByPositions(\XF\Mvc\Entity\ArrayCollection $widgets, &$total = 0)
    {
       
$positionMap = [];
       
$groupedWidgets = [];

        foreach (
$widgets AS $widgetId => $widget)
        {
            if (!
$widget->positions)
            {
               
$groupedWidgets[''][$widgetId] = $widget;
                continue;
            }
            foreach (
$widget->positions AS $positionId => $displayOrder)
            {
               
$positionMap[$positionId][$widgetId] = $displayOrder;
            }
        }

        foreach (
array_keys($positionMap) AS $positionId)
        {
           
asort($positionMap[$positionId]);
           
$total += count($positionMap[$positionId]);

            foreach (
$positionMap[$positionId] AS $widgetId => $displayOrder)
            {
               
$groupedWidgets[$positionId][$widgetId] = $widgets[$widgetId];
            }
        }

        return
$groupedWidgets;
    }

   
/**
     * @return Finder
     */
   
public function findWidgetDefinitionsForList($activeOnly = false)
    {
       
$finder = $this->finder('XF:WidgetDefinition')->order('definition_id');
        if (
$activeOnly)
        {
           
$finder->with('AddOn')
                ->
whereAddOnActive();
        }
        return
$finder;
    }

    public function
getWidgetDefinitionTitlePairs($activeOnly = false)
    {
        return
$this->findWidgetDefinitionsForList($activeOnly)->fetch()->pluckNamed('title', 'definition_id');
    }

   
/**
     * @return Finder
     */
   
public function findWidgetPositionsForList($activeOnly = false)
    {
       
$finder = $this->finder('XF:WidgetPosition')->order('position_id');
        if (
$activeOnly)
        {
           
$finder->with('AddOn')
                ->
whereAddOnActive()
                ->
where('active', 1);
        }
        return
$finder;
    }

    public function
getWidgetCache()
    {
       
$output = [];

       
$widgets = $this->finder('XF:Widget')
            ->
with('WidgetDefinition', true)
            ->
with('WidgetDefinition.AddOn')
            ->
whereAddOnActive([
               
'relation' => 'WidgetDefinition.AddOn',
               
'column' => 'WidgetDefinition.addon_id'
           
]);

        foreach (
$widgets->fetch() AS $widget)
        {
            if (
$widget['positions'])
            {
                foreach (
$widget['positions'] AS $positionId => $displayOrder)
                {
                   
$output[$positionId][$widget->widget_id] = [
                       
'widget_id' => $widget->widget_id,
                       
'widget_key' => $widget->widget_key,
                       
'definition_id' => $widget->WidgetDefinition->definition_id,
                       
'definition_class' => $widget->WidgetDefinition->definition_class,
                       
'options' => $widget->options,
                       
'display_order' => $displayOrder
                   
];
                }
            }
            else
            {
               
$output[''][$widget->widget_id] = [
                   
'widget_id' => $widget->widget_id,
                   
'widget_key' => $widget->widget_key,
                   
'definition_id' => $widget->WidgetDefinition->definition_id,
                   
'definition_class' => $widget->WidgetDefinition->definition_class,
                   
'options' => $widget->options,
                   
'display_order' => 0
               
];
            }
        }

        foreach (
array_keys($output) AS $positionId)
        {
            if (!
$positionId)
            {
                continue;
            }

           
uasort($output[$positionId], function($a, $b)
            {
                return
$a['display_order'] - $b['display_order'];
            });
        }

        return
$output;
    }

    public function
rebuildWidgetCache()
    {
       
$cache = $this->getWidgetCache();
        \
XF::registry()->set('widgetCache', $cache);
        return
$cache;
    }

    public function
recompileWidgets()
    {
       
$widgets = $this->finder('XF:Widget')->order('widget_id')->fetch();

        if (
$widgets)
        {
            foreach (
$widgets AS $widget)
            {
               
/** @var \XF\Service\Widget\Compile $compileService */
               
$compileService = $this->app()->service('XF:Widget\Compile', $widget);
               
$compileService->compile();
            }
        }
    }

    public function
getWidgetDefinitionCache()
    {
       
$output = [];

       
$widgetDefinitions = $this->finder('XF:WidgetDefinition')
            ->
with('AddOn')
            ->
whereAddOnActive()
            ->
order('definition_id');

        foreach (
$widgetDefinitions->fetch() AS $widgetDefinition)
        {
           
$output[$widgetDefinition->definition_id] = [
               
'definition_id' => $widgetDefinition->definition_id,
               
'definition_class' => $widgetDefinition->definition_class,
               
'addon_id' => $widgetDefinition->addon_id
           
];
        }

        return
$output;
    }

    public function
rebuildWidgetDefinitionCache()
    {
       
$cache = $this->getWidgetDefinitionCache();
        \
XF::registry()->set('widgetDefinition', $cache);

        \
XF::runOnce('widgetCacheRebuild', function()
        {
           
$this->rebuildWidgetCache();
        });

        return
$cache;
    }

    public function
getWidgetPositionCache()
    {
       
$output = [];

       
$widgetPositions = $this->finder('XF:WidgetPosition')
            ->
with('AddOn')
            ->
whereAddOnActive()
            ->
where('active', 1)
            ->
order('position_id');

        foreach (
$widgetPositions->fetch() AS $widgetPosition)
        {
           
$output[$widgetPosition->position_id] = [
               
'position_id' => $widgetPosition->position_id,
               
'addon_id' => $widgetPosition->addon_id
           
];
        }

        return
$output;
    }

    public function
rebuildWidgetPositionCache()
    {
       
$cache = $this->getWidgetPositionCache();
        \
XF::registry()->set('widgetPosition', $cache);
        return
$cache;
    }
}