%PDF- %PDF-
| Direktori : /home/lightco1/www/quoizel.com.au/libraries/nextend2/smartslider/smartslider/libraries/ |
| Current File : /home/lightco1/www/quoizel.com.au/libraries/nextend2/smartslider/smartslider/libraries/export.php |
<?php
N2Loader::import('libraries.zip.zip_lib');
N2Loader::import('libraries.backup', 'smartslider');
class N2SmartSliderExport {
private $uniqueCounter = 1;
/**
* @var N2SmartSliderBackup
*/
private $backup;
private $sliderId = 0;
public $images = array(), $visuals = array();
private $files, $usedNames = array(), $imageTranslation = array();
public function __construct($sliderId) {
$this->sliderId = $sliderId;
}
public function create($saveAsFile = false) {
$this->backup = new N2SmartSliderBackup();
$slidersModel = new N2SmartsliderSlidersModel();
if ($this->backup->slider = $slidersModel->get($this->sliderId)) {
$this->backup->slider['params'] = new N2Data($this->backup->slider['params'], true);
$slidesModel = new N2SmartsliderSlidesModel();
$this->backup->slides = $slidesModel->getAll($this->backup->slider['id']);
if (empty($this->backup->slider['type'])) {
$this->backup->slider['type'] = 'simple';
}
$class = 'N2SSPluginType' . $this->backup->slider['type'];
N2Loader::importPath(call_user_func(array(
$class,
"getPath"
)) . NDS . 'backup');
$class = 'N2SmartSliderBackup' . $this->backup->slider['type'];
call_user_func_array(array(
$class,
'export'
), array(
$this,
$this->backup->slider
));
$enabledWidgets = array();
$plugins = array();
N2Plugin::callPlugin('sswidget', 'onWidgetList', array(&$plugins));
self::addImage($this->backup->slider['thumbnail']);
$params = $this->backup->slider['params'];
foreach ($plugins AS $k => $v) {
$widget = $params->get('widget' . $k);
if ($widget && $widget != 'disabled') {
$enabledWidgets[$k] = $widget;
}
}
foreach ($enabledWidgets AS $k => $v) {
$class = 'N2SSPluginWidget' . $k . $v;
if (class_exists($class, false)) {
$params->fillDefault(call_user_func(array(
$class,
'getDefaults'
)));
call_user_func_array(array(
$class,
'prepareExport'
), array(
$this,
&$params
));
} else {
unset($enabledWidgets);
}
}
for ($i = 0; $i < count($this->backup->slides); $i++) {
$slide = $this->backup->slides[$i];
self::addImage($slide['thumbnail']);
$slide['params'] = new N2Data($slide['params'], true);
self::addImage($slide['params']->get('backgroundImage'));
self::addImage($slide['params']->get('ligthboxImage'));
self::addLightbox($slide['params']->get('link'));
N2SmartSliderLayer::prepareExport($this, $slide['slide']);
if (!empty($slide['generator_id'])) {
N2Loader::import("models.generator", "smartslider");
$generatorModel = new N2SmartsliderGeneratorModel();
$this->backup->generators[] = $generatorModel->get($slide['generator_id']);
}
}
$zip = new N2ZipFile();
$this->images = array_unique($this->images);
$this->visuals = array_unique($this->visuals);
foreach ($this->images AS $image) {
$this->backup->NextendImageManager_ImageData[$image] = N2ImageManager::getImageData($image, true);
if ($this->backup->NextendImageManager_ImageData[$image]) {
self::addImage($this->backup->NextendImageManager_ImageData[$image]['tablet']['image']);
self::addImage($this->backup->NextendImageManager_ImageData[$image]['mobile']['image']);
} else {
unset($this->backup->NextendImageManager_ImageData[$image]);
}
}
$this->images = array_unique($this->images);
$usedNames = array();
foreach ($this->images AS $image) {
$file = N2ImageHelper::fixed($image, true);
if (N2Filesystem::fileexists($file)) {
$fileName = strtolower(basename($file));
while (in_array($fileName, $usedNames)) {
$fileName = $this->uniqueCounter . $fileName;
$this->uniqueCounter++;
}
$usedNames[] = $fileName;
$this->backup->imageTranslation[$image] = $fileName;
$zip->addFile(file_get_contents($file), 'images/' . $fileName);
}
}
foreach ($this->visuals AS $visual) {
$this->backup->visuals[] = N2StorageSectionAdmin::getById($visual);
}
$zip->addFile(serialize($this->backup), 'data');
if (!$saveAsFile) {
ob_end_clean();
header('Content-disposition: attachment; filename*=UTF-8\'\'' . rawurlencode($this->backup->slider['title'] . '.ss3'));
header('Content-type: application/zip');
echo $zip->file();
n2_exit(true);
} else {
$file = preg_replace('/[^a-zA-Z0-9_-]/', '', $this->backup->slider['title']) . '.ss3';
$folder = N2Platform::getPublicDir();
$folder .= '/export/';
if (!N2Filesystem::existsFolder($folder)) {
N2Filesystem::createFolder($folder);
}
N2Filesystem::createFile($folder . $file, $zip->file());
return $folder . $file;
}
}
}
public function createHTML($isZIP = true) {
$this->files = array();
ob_end_clean();
N2AssetsManager::createStack();
N2AssetsPredefined::frontend(true);
ob_start();
N2Base::getApplication("smartslider")
->getApplicationType('widget')
->render(array(
"controller" => 'home',
"action" => N2Platform::getPlatform(),
"useRequest" => false
), array(
$this->sliderId,
'Export as HTML'
));
$slidersModel = new N2SmartsliderSlidersModel();
$slider = $slidersModel->get($this->sliderId);
$sliderHTML = ob_get_clean();
$headHTML = '';
$css = N2AssetsManager::getCSS(true);
foreach ($css['url'] AS $url) {
$headHTML .= N2Html::style($url, true, array(
'media' => 'screen, print'
)) . "\n";
}
array_unshift($css['files'], N2LIBRARYASSETS . '/normalize.min.css');
foreach ($css['files'] AS $file) {
$path = 'css/' . basename($file);
$this->basePath = dirname($file);
$this->baseUrl = N2Filesystem::pathToAbsoluteURL($this->basePath);
$this->files[$path] = preg_replace_callback('#url\([\'"]?([^"\'\)]+)[\'"]?\)#', array(
$this,
'replaceCSSImage'
), file_get_contents($file));
$headHTML .= N2Html::style($path, true, array(
'media' => 'screen, print'
)) . "\n";
}
if ($css['inline'] != '') {
$headHTML .= N2Html::style($css['inline']) . "\n";
}
$js = N2AssetsManager::getJs(true);
if ($js['globalInline'] != '') {
$headHTML .= N2Html::script($js['globalInline']) . "\n";
}
foreach ($js['url'] AS $url) {
$headHTML .= N2Html::script($url, true) . "\n";
}
foreach ($js['files'] AS $file) {
$path = 'js/' . basename($file);
$this->files[$path] = file_get_contents($file);
$headHTML .= N2Html::script($path, true) . "\n";
}
if ($js['inline'] != '') {
$headHTML .= N2Html::script($js['inline']) . "\n";
}
$sliderHTML = preg_replace_callback('/(src|data-desktop|data-tablet|data-mobile)=["|\'](.*?)["|\']/i', array(
$this,
'replaceHTMLImage'
), $sliderHTML);
$sliderHTML = preg_replace_callback('/url\(\s*([\'"]|('))?(\S*\.(?:jpe?g|gif|png))([\'"]|('))?\s*\)[^;}]*?/i', array(
$this,
'replaceHTMLBGImage'
), $sliderHTML);
$sliderHTML = preg_replace_callback('/(data-href)=["|\'](.*?)["|\']/i', array(
$this,
'replaceHTMLImage'
), $sliderHTML);
$sliderHTML = preg_replace_callback('/(n2-lightbox-urls)=["|\'](.*?)["|\']/i', array(
$this,
'replaceLightboxImages'
), $sliderHTML);
$sliderHTML = preg_replace_callback('/n2\-lightbox=[^<>]*?(href)=["|\'](.*?)["|\']/i', array(
$this,
'replaceHTMLImageHrefLightbox'
), $sliderHTML);
$headHTML = preg_replace_callback('/"([^"]*?\.(jpg|png|gif|jpeg))"/i', array(
$this,
'replaceJSON'
), $headHTML);
$this->files['index.html'] = "<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge, chrome=1\">\n<title>" . $slider['title'] . "</title>\n" . $headHTML . "</head>\n<body>\n" . $sliderHTML . "</body>\n</html>";
if (!$isZIP) {
return $this->files;
}
$zip = new N2ZipFile();
foreach ($this->files AS $path => $content) {
$zip->addFile($content, $path);
}
if (ob_get_length()) ob_end_clean();
header('Content-disposition: attachment; filename*=UTF-8\'\'' . rawurlencode($slider['title'] . '.zip'));
header('Content-type: application/zip');
echo $zip->file();
n2_exit(true);
}
private static function addProtocol($image) {
if (substr($image, 0, 2) == '//') {
return N2Uri::$scheme . ':' . $image;
}
return $image;
}
public function replaceHTMLImage($found) {
$path = N2Filesystem::absoluteURLToPath(self::addProtocol($found[2]));
if ($path == $found[2]) {
return $found[0];
}
if (N2Filesystem::fileexists($path)) {
if (!isset($this->imageTranslation[$path])) {
$fileName = strtolower(basename($path));
while (in_array($fileName, $this->usedNames)) {
$fileName = $this->uniqueCounter . $fileName;
$this->uniqueCounter++;
}
$this->usedNames[] = $fileName;
$this->files['images/' . $fileName] = file_get_contents($path);
$this->imageTranslation[$path] = $fileName;
} else {
$fileName = $this->imageTranslation[$path];
}
return str_replace($found[2], 'images/' . $fileName, $found[0]);
} else {
return $found[0];
}
}
public function replaceHTMLImageHrefLightbox($found) {
return $this->replaceHTMLImage($found);
}
public function replaceCSSImage($matches) {
if (substr($matches[1], 0, 5) == 'data:') return $matches[0];
if (substr($matches[1], 0, 4) == 'http') return $matches[0];
if (substr($matches[1], 0, 2) == '//') return $matches[0];
$exploded = explode('?', $matches[1]);
$path = realpath($this->basePath . '/' . $exploded[0]);
if ($path === false) {
return 'url(' . str_replace(array(
'http://',
'https://'
), '//', $this->baseUrl) . '/' . $matches[1] . ')';
}
$path = N2Filesystem::fixPathSeparator($path);
if (!isset($this->imageTranslation[$path])) {
$fileName = strtolower(basename($path));
while (in_array($fileName, $this->usedNames)) {
$fileName = $this->uniqueCounter . $fileName;
$this->uniqueCounter++;
}
$this->usedNames[] = $fileName;
$this->files['images/' . $fileName] = file_get_contents($path);
$this->imageTranslation[$path] = $fileName;
} else {
$fileName = $this->imageTranslation[$path];
}
return str_replace($matches[1], '../images/' . $fileName, $matches[0]);
}
public function replaceLightboxImages($found) {
$images = explode(',', $found[2]);
foreach ($images AS $k => $image) {
$images[$k] = $this->replaceHTMLImage(array(
$image,
'',
$image
));
}
return 'n2-lightbox-urls="' . implode(',', $images) . '"';
}
public function replaceHTMLBGImage($found) {
$path = $this->replaceHTMLImage(array(
$found[3],
'',
$found[3]
));
return str_replace($found[3], $path, $found[0]);
}
public function replaceJSON($found) {
$image = str_replace('\\/', '/', $found[1]);
$path = $this->replaceHTMLImage(array(
$image,
'',
$image
));
return str_replace($found[1], str_replace('/', '\\/', $path), $found[0]);
}
public function addImage($image) {
if (!empty($image)) {
$this->images[] = $image;
}
}
public function addLightbox($url) {
preg_match('/^([a-zA-Z]+)\[(.*)]/', $url, $matches);
if (!empty($matches)) {
if ($matches[1] == 'lightbox') {
$images = explode(',', $matches[2]);
foreach ($images AS $image) {
$this->addImage($image);
}
}
}
}
public function addVisual($id) {
if (is_numeric($id) && $id > 10000) {
$this->visuals[] = $id;
}
}
}