<?php
namespace Nextend\SmartSlider3\Renderable\Item;
use Exception;
use Nextend\Framework\Data\Data;
use Nextend\Framework\Pattern\OrderableTrait;
use Nextend\Framework\Pattern\PluggableTrait;
use Nextend\Framework\Pattern\SingletonTrait;
use Nextend\SmartSlider3\BackupSlider\ExportSlider;
use Nextend\SmartSlider3\BackupSlider\ImportSlider;
use Nextend\SmartSlider3\Renderable\AbstractRenderableOwner;
use Nextend\SmartSlider3\Renderable\Component\ComponentLayer;
use Nextend\SmartSlider3\Renderable\Item\Button\ItemButton;
use Nextend\SmartSlider3\Renderable\Item\Heading\ItemHeading;
use Nextend\SmartSlider3\Renderable\Item\Image\ItemImage;
use Nextend\SmartSlider3\Renderable\Item\Missing\ItemMissing;
use Nextend\SmartSlider3\Renderable\Item\Text\ItemText;
use Nextend\SmartSlider3\Renderable\Item\Vimeo\ItemVimeo;
use Nextend\SmartSlider3\Renderable\Item\YouTube\ItemYouTube;
class ItemFactory {
use SingletonTrait, PluggableTrait, OrderableTrait;
public static $i = array();
/** @var AbstractItem[][] */
private static $itemGroups = array();
/**
* @var AbstractItem[]
*/
private static $items = array();
/**
* @return AbstractItem[]
*/
public static function getItems() {
return self::$items;
}
/**
* @param $type
*
* @return AbstractItem
*/
public static function getItem($type) {
return self::$items[$type];
}
/**
* @return AbstractItem[][]
*/
public static function getItemGroups() {
return self::$itemGroups;
}
/**
* @param ComponentLayer $layer
* @param array $itemData
*
* @return AbstractItemFrontend
* @throws Exception
*/
public static function create($layer, $itemData) {
if (!isset($itemData['type'])) {
throw new Exception('Error with itemData: ' . $itemData);
}
$type = $itemData['type'];
if ($type == 'missing') {
$type = $itemData['values']['type'];
}
if (!isset(self::$items[$type])) {
$itemData['values']['type'] = $type;
$type = 'missing';
}
/** @var AbstractItem $factory */
$factory = self::$items[$type];
$elementID = $layer->getOwner()
->getElementID();
if (!isset(self::$i[$elementID])) {
self::$i[$elementID] = 0;
}
self::$i[$elementID]++;
$id = $elementID . 'item' . self::$i[$elementID];
return $factory->createFrontend($id, $itemData['values'], $layer);
}
/**
* @param AbstractRenderableOwner $slide
* @param array $item
*/
public static function getFilled($slide, &$item) {
$type = $item['type'];
if (isset(self::$items[$type])) {
$item['values'] = self::$items[$type]->getFilled($slide, new Data($item['values']))
->toArray();
}
}
/**
* @param ExportSlider $export
* @param $item
*/
public static function prepareExport($export, $item) {
$type = $item['type'];
if (isset(self::$items[$type])) {
self::$items[$type]->prepareExport($export, new Data($item['values']));
}
}
/**
* @param ImportSlider $import
* @param $item
*
* @return mixed
*/
public static function prepareImport($import, $item) {
$type = $item['type'];
if (isset(self::$items[$type])) {
$item['values'] = self::$items[$type]->prepareImport($import, new Data($item['values']))
->toArray();
}
return $item;
}
public static function prepareSample($item) {
$type = $item['type'];
if (isset(self::$items[$type])) {
$item['values'] = self::$items[$type]->prepareSample(new Data($item['values']))
->toArray();
}
return $item;
}
/**
* @param AbstractItem $item
*/
public function addItem($item) {
self::$items[$item->getType()] = $item;
}
protected function init() {
new ItemHeading($this);
new ItemButton($this);
new ItemImage($this);
new ItemText($this);
new ItemVimeo($this);
new ItemYouTube($this);
$this->makePluggable('RenderableItem');
self::uasort(self::$items);
self::$itemGroups[n2_x('Basic', 'Layer group')] = array();
self::$itemGroups[n2_x('Media', 'Layer group')] = array();
foreach (self::$items as $type => $item) {
$group = $item->getGroup();
if (!isset(self::$itemGroups[$group])) {
self::$itemGroups[$group] = array();
}
self::$itemGroups[$group][$type] = $item;
}
new ItemMissing($this);
}
}
ItemFactory::getInstance();