310 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			310 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
 | 
						|
namespace Nextend\SmartSlider3\BackupSlider;
 | 
						|
 | 
						|
 | 
						|
use Nextend\Framework\Cache\StoreImage;
 | 
						|
use Nextend\Framework\Data\Data;
 | 
						|
use Nextend\Framework\Filesystem\Filesystem;
 | 
						|
use Nextend\Framework\Image\ImageManager;
 | 
						|
use Nextend\Framework\Misc\Zip\Reader;
 | 
						|
use Nextend\Framework\Model\StorageSectionManager;
 | 
						|
use Nextend\Framework\Notification\Notification;
 | 
						|
use Nextend\Framework\Pattern\MVCHelperTrait;
 | 
						|
use Nextend\Framework\ResourceTranslator\ResourceTranslator;
 | 
						|
use Nextend\Framework\Url\Url;
 | 
						|
use Nextend\SmartSlider3\Application\Model\ModelGenerator;
 | 
						|
use Nextend\SmartSlider3\Application\Model\ModelSliders;
 | 
						|
use Nextend\SmartSlider3\Application\Model\ModelSlides;
 | 
						|
use Nextend\SmartSlider3\Renderable\Component\ComponentCol;
 | 
						|
use Nextend\SmartSlider3\Renderable\Component\ComponentContent;
 | 
						|
use Nextend\SmartSlider3\Renderable\Component\ComponentLayer;
 | 
						|
use Nextend\SmartSlider3\Renderable\Component\ComponentRow;
 | 
						|
use Nextend\SmartSlider3\Slider\SliderType\SliderTypeFactory;
 | 
						|
use Nextend\SmartSlider3\Widget\WidgetGroupFactory;
 | 
						|
 | 
						|
class ImportSlider {
 | 
						|
 | 
						|
    use MVCHelperTrait;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var BackupData
 | 
						|
     */
 | 
						|
    private $backup;
 | 
						|
    private $imageTranslation = array();
 | 
						|
    private $sectionTranslation = array();
 | 
						|
 | 
						|
    private $sliderId = 0;
 | 
						|
 | 
						|
    private $replace = false;
 | 
						|
 | 
						|
    public function __construct($MVCHelper) {
 | 
						|
 | 
						|
        $this->setMVCHelper($MVCHelper);
 | 
						|
    }
 | 
						|
 | 
						|
    public function enableReplace() {
 | 
						|
        $this->replace = true;
 | 
						|
    }
 | 
						|
 | 
						|
    public function import($filePathOrData, $groupID = 0, $imageImportMode = 'clone', $linkedVisuals = 1, $isFilePath = true) {
 | 
						|
        if (!$isFilePath) {
 | 
						|
            $tmp = Filesystem::tempnam();
 | 
						|
            file_put_contents($tmp, $filePathOrData);
 | 
						|
            $filePathOrData = $tmp;
 | 
						|
        }
 | 
						|
        $importData = Reader::read($filePathOrData);
 | 
						|
        if (!$isFilePath) {
 | 
						|
            @unlink($tmp);
 | 
						|
        }
 | 
						|
        if (!is_array($importData)) {
 | 
						|
            Notification::error(n2_('The importing failed at the unzipping part.'));
 | 
						|
 | 
						|
            return false;
 | 
						|
        } else if (!isset($importData['data'])) {
 | 
						|
            if (array_key_exists("slider.ss2", $importData)) {
 | 
						|
                Notification::error(n2_('You can\'t import sliders from Smart Slider 2.'));
 | 
						|
            } else if (empty($importData)) {
 | 
						|
                Notification::error(n2_('Export file corrupted! Slider data is missing.'));
 | 
						|
            }
 | 
						|
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        $parser = new Serialize\Parser;
 | 
						|
        if (!$parser->isValidData($importData['data'])) {
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        $this->backup = unserialize($importData['data']);
 | 
						|
 | 
						|
        if (!empty($this->backup->slider['type']) && $this->backup->slider['type'] == 'group') {
 | 
						|
            // Groups can not be imported into groups
 | 
						|
            $groupID = 0;
 | 
						|
        }
 | 
						|
 | 
						|
        $this->sectionTranslation = array();
 | 
						|
        $this->importVisuals($this->backup->visuals, $linkedVisuals);
 | 
						|
 | 
						|
 | 
						|
        $sliderModel = new ModelSliders($this);
 | 
						|
 | 
						|
 | 
						|
        if ($this->replace) {
 | 
						|
            $this->sliderId = $sliderModel->replace($this->backup->slider, $groupID);
 | 
						|
        } else {
 | 
						|
            $this->sliderId = $sliderModel->import($this->backup->slider, $groupID);
 | 
						|
        }
 | 
						|
 | 
						|
        if (!$this->sliderId) {
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        switch ($imageImportMode) {
 | 
						|
            case 'clone':
 | 
						|
                $images     = isset($importData['images']) ? $importData['images'] : array();
 | 
						|
                $imageStore = new StoreImage('slider' . $this->sliderId, true);
 | 
						|
                foreach ($images as $file => $content) {
 | 
						|
                    $localImage = $imageStore->makeCache($file, $content);
 | 
						|
                    if ($localImage) {
 | 
						|
                        $this->imageTranslation[$file] = ResourceTranslator::urlToResource(Url::pathToUri($localImage));
 | 
						|
                    } else {
 | 
						|
                        $this->imageTranslation[$file] = $file;
 | 
						|
                    }
 | 
						|
                    if (!$this->imageTranslation[$file]) {
 | 
						|
                        $this->imageTranslation[$file] = array_search($file, $this->backup->imageTranslation);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                break;
 | 
						|
            case 'update':
 | 
						|
                $keys   = array_keys($this->backup->NextendImageHelper_Export);
 | 
						|
                $values = array_values($this->backup->NextendImageHelper_Export);
 | 
						|
                foreach ($this->backup->imageTranslation as $image => $value) {
 | 
						|
                    $this->imageTranslation[$value] = str_replace($keys, $values, $image);
 | 
						|
                }
 | 
						|
                break;
 | 
						|
            default:
 | 
						|
                break;
 | 
						|
        }
 | 
						|
        if (!empty($this->backup->slider['thumbnail'])) {
 | 
						|
            $sliderModel->setThumbnail($this->sliderId, $this->fixImage($this->backup->slider['thumbnail']));
 | 
						|
        }
 | 
						|
 | 
						|
        foreach ($this->backup->NextendImageManager_ImageData as $image => $data) {
 | 
						|
            $data['tablet']['image'] = $this->fixImage($data['tablet']['image']);
 | 
						|
            $data['mobile']['image'] = $this->fixImage($data['mobile']['image']);
 | 
						|
            $fixedImage              = $this->fixImage($image);
 | 
						|
            if (!ImageManager::hasImageData($fixedImage)) {
 | 
						|
                ImageManager::addImageData($this->fixImage($image), $data);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        if (empty($this->backup->slider['type'])) {
 | 
						|
            $this->backup->slider['type'] = 'simple';
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        if ($this->backup->slider['type'] == 'group') {
 | 
						|
            /**
 | 
						|
             * Import the sliders for the group!
 | 
						|
             */
 | 
						|
            foreach ($importData['sliders'] as $k => $slider) {
 | 
						|
                $import = new self($this);
 | 
						|
                if ($this->replace) {
 | 
						|
                    $import->enableReplace();
 | 
						|
                }
 | 
						|
                $import->import($slider, $this->sliderId, $imageImportMode, $linkedVisuals, false);
 | 
						|
            }
 | 
						|
        } else {
 | 
						|
 | 
						|
            unset($importData);
 | 
						|
 | 
						|
            $sliderType = SliderTypeFactory::getType($this->backup->slider['type']);
 | 
						|
            $sliderType->import($this, $this->backup->slider);
 | 
						|
 | 
						|
 | 
						|
            $enabledWidgets = array();
 | 
						|
            $widgetGroups   = WidgetGroupFactory::getGroups();
 | 
						|
 | 
						|
            $params = $this->backup->slider['params'];
 | 
						|
            foreach ($widgetGroups as $groupName => $group) {
 | 
						|
                $widgetName = $params->get('widget' . $groupName);
 | 
						|
                if ($widgetName && $widgetName != 'disabled') {
 | 
						|
                    $widget = $group->getWidget($widgetName);
 | 
						|
                    if ($widget) {
 | 
						|
                        $enabledWidgets[$groupName] = $widget;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            foreach ($enabledWidgets as $k => $widget) {
 | 
						|
                $params->fillDefault($widget->getDefaults());
 | 
						|
 | 
						|
                $widget->prepareImport($this, $params);
 | 
						|
            }
 | 
						|
 | 
						|
 | 
						|
            $sliderModel->importUpdate($this->sliderId, $params);
 | 
						|
 | 
						|
            $generatorTranslation = array();
 | 
						|
            $generatorModel       = new ModelGenerator($this);
 | 
						|
            foreach ($this->backup->generators as $generator) {
 | 
						|
                $generatorTranslation[$generator['id']] = $generatorModel->import($generator);
 | 
						|
            }
 | 
						|
 | 
						|
 | 
						|
            $slidesModel = new ModelSlides($this);
 | 
						|
            for ($i = 0; $i < count($this->backup->slides); $i++) {
 | 
						|
                $slide              = $this->backup->slides[$i];
 | 
						|
                $slide['params']    = new Data($slide['params'], true);
 | 
						|
                $slide['thumbnail'] = $this->fixImage($slide['thumbnail']);
 | 
						|
                $slide['params']->set('backgroundImage', $this->fixImage($slide['params']->get('backgroundImage')));
 | 
						|
                $slide['params']->set('ligthboxImage', $this->fixImage($slide['params']->get('ligthboxImage')));
 | 
						|
 | 
						|
                if ($slide['params']->has('link')) {
 | 
						|
                    // Compatibility fix for the old SS3 import files
 | 
						|
                    $slide['params']->set('link', $this->fixLightbox($slide['params']->get('link')));
 | 
						|
                }
 | 
						|
                if ($slide['params']->has('href')) {
 | 
						|
                    $slide['params']->set('href', $this->fixLightbox($slide['params']->get('href')));
 | 
						|
                }
 | 
						|
 | 
						|
                $layers = json_decode($slide['slide'], true);
 | 
						|
 | 
						|
                $this->prepareLayers($layers);
 | 
						|
 | 
						|
                $slide['slide'] = $layers;
 | 
						|
 | 
						|
                if (isset($generatorTranslation[$slide['generator_id']])) {
 | 
						|
                    $slide['generator_id'] = $generatorTranslation[$slide['generator_id']];
 | 
						|
                }
 | 
						|
                $slidesModel->import($slide, $this->sliderId);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        return $this->sliderId;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param array $layers
 | 
						|
     */
 | 
						|
    public function prepareLayers(&$layers) {
 | 
						|
        for ($i = 0; $i < count($layers); $i++) {
 | 
						|
 | 
						|
            if (isset($layers[$i]['type'])) {
 | 
						|
                switch ($layers[$i]['type']) {
 | 
						|
                    case 'content':
 | 
						|
                        ComponentContent::prepareImport($this, $layers[$i]);
 | 
						|
                        break;
 | 
						|
                    case 'row':
 | 
						|
                        ComponentRow::prepareImport($this, $layers[$i]);
 | 
						|
                        break;
 | 
						|
                    case 'col':
 | 
						|
                        ComponentCol::prepareImport($this, $layers[$i]);
 | 
						|
                        break;
 | 
						|
                    case 'group':
 | 
						|
                        $this->prepareLayers($layers[$i]['layers']);
 | 
						|
                        break;
 | 
						|
                    default:
 | 
						|
                        ComponentLayer::prepareImport($this, $layers[$i]);
 | 
						|
                }
 | 
						|
            } else {
 | 
						|
                ComponentLayer::prepareImport($this, $layers[$i]);
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public function fixImage($image) {
 | 
						|
        if (isset($this->backup->imageTranslation[$image]) && isset($this->imageTranslation[$this->backup->imageTranslation[$image]])) {
 | 
						|
            return $this->imageTranslation[$this->backup->imageTranslation[$image]];
 | 
						|
        }
 | 
						|
 | 
						|
        return $image;
 | 
						|
    }
 | 
						|
 | 
						|
    public function fixSection($idOrRaw) {
 | 
						|
        if (isset($this->sectionTranslation[$idOrRaw])) {
 | 
						|
            return $this->sectionTranslation[$idOrRaw];
 | 
						|
        }
 | 
						|
 | 
						|
        return $idOrRaw;
 | 
						|
    }
 | 
						|
 | 
						|
    public function fixLightbox($url) {
 | 
						|
        preg_match('/^([a-zA-Z]+)\[(.*)]/', $url, $matches);
 | 
						|
        if (!empty($matches) && $matches[1] == 'lightbox') {
 | 
						|
            $data = json_decode($matches[2]);
 | 
						|
            if ($data) {
 | 
						|
                $newImages = array();
 | 
						|
                foreach ($data->urls as $image) {
 | 
						|
                    $newImages[] = $this->fixImage($image);
 | 
						|
                }
 | 
						|
                $data->urls = $newImages;
 | 
						|
                $url        = 'lightbox[' . json_encode($data) . ']';
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        return $url;
 | 
						|
    }
 | 
						|
 | 
						|
    private function importVisuals($records, $linkedVisuals) {
 | 
						|
        if (count($records)) {
 | 
						|
            if (!$linkedVisuals) {
 | 
						|
                foreach ($records as $record) {
 | 
						|
                    $this->sectionTranslation[$record['id']] = $record['value'];
 | 
						|
                }
 | 
						|
            } else {
 | 
						|
                $sets = array();
 | 
						|
                foreach ($records as $record) {
 | 
						|
                    $storage = StorageSectionManager::getStorage($record['application']);
 | 
						|
                    if (!isset($sets[$record['application'] . '_' . $record['section']])) {
 | 
						|
                        $sets[$record['application'] . '_' . $record['section']] = $storage->add($record['section'] . 'set', '', $this->backup->slider['title']);
 | 
						|
                    }
 | 
						|
                    $this->sectionTranslation[$record['id']] = $storage->add($record['section'], $sets[$record['application'] . '_' . $record['section']], $record['value']);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
} |