FEATURE: add functionality for rendering widgets via shortcode [widget]

This commit is contained in:
Michal Kváček
2016-10-11 19:10:03 +02:00
parent d5f9e1fc2b
commit 625bdbb2e2
14 changed files with 217 additions and 43 deletions
+66
View File
@@ -0,0 +1,66 @@
<?php
namespace App\Shortcodes;
use App\Models\Widget as WidgetModel;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
class Widget
{
protected static $widgets = [];
protected static $initialized = false;
protected function getRenderedWidget(WidgetModel $widget)
{
$widget->settings = json_decode($widget->settings);
$handler = $widget->widget_type_handler;
$presenter = call_user_func([$handler, 'getPresenter']);
return call_user_func([$presenter, 'render'], $widget);
}
protected function loadWidget($containerId)
{
$widget = WidgetModel::where('container_id', $containerId)
->first();
if (!$widget) {
return;
}
$widget->timestamps = false;
$widget->viewed++;
$widget->save();
$widget->timestamps = true;
self::$widgets[$containerId] = $this->getRenderedWidget($widget);
}
protected function initWidgets()
{
if (self::$initialized) {
return;
}
$widgets = WidgetModel::where('viewed', '>=', setting('preloadFrequentedWidgetsTreshold', 10))
->where('language', LaravelLocalization::getCurrentLocale())
->get();
foreach ($widgets as $widget) {
self::$widgets[$widget->container_id] = $this->getRenderedWidget($widget);
}
self::$initialized = true;
}
public function register($shortcode, $containerId, $compiler, $name)
{
$this->initWidgets();
if (!isset(self::$widgets[$containerId])) {
$this->loadWidget($containerId);
}
return self::$widgets[$containerId];
}
}