ZwiiCMS/core/module/theme/theme.php
2019-01-04 18:53:24 +01:00

563 lines
16 KiB
PHP
Executable File

<?php
/**
* This file is part of Zwii.
*
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @Edition : 23/9/18 Frédéric Tempez <frederic.tempez@outlook.com>
*/
class theme extends common {
public static $actions = [
'advanced' => self::GROUP_ADMIN,
'body' => self::GROUP_ADMIN,
'footer' => self::GROUP_ADMIN,
'header' => self::GROUP_ADMIN,
'index' => self::GROUP_ADMIN,
'menu' => self::GROUP_ADMIN,
'reset' => self::GROUP_ADMIN,
'site' => self::GROUP_ADMIN,
'manage' => self::GROUP_ADMIN,
'export' => self::GROUP_ADMIN,
'save' => self::GROUP_ADMIN
];
public static $aligns = [
'left' => 'À gauche',
'center' => 'Au centre',
'right' => 'À droite'
];
public static $attachments = [
'scroll' => 'Normale',
'fixed' => 'Fixe'
];
public static $fonts = [
'Abril+Fatface' => 'Abril Fatface',
'Arimo' => 'Arimo',
'Arvo' => 'Arvo',
'Berkshire+Swash' => 'Berkshire Swash',
'Cabin' => 'Cabin',
'Dancing+Script' => 'Dancing Script',
'Droid+Sans' => 'Droid Sans',
'Droid+Serif' => 'Droid Serif',
'Fira+Sans' => 'Fira Sans',
'Inconsolata' => 'Inconsolata',
'Indie+Flower' => 'Indie Flower',
'Josefin+Slab' => 'Josefin Slab',
'Lobster' => 'Lobster',
'Lora' => 'Lora',
'Lato' => 'Lato',
'Marvel' => 'Marvel',
'Old+Standard+TT' => 'Old Standard TT',
'Open+Sans' => 'Open Sans',
'Oswald' => 'Oswald',
'PT+Mono' => 'PT Mono',
'PT+Serif' => 'PT Serif',
'Raleway' => 'Raleway',
'Rancho' => 'Rancho',
'Roboto' => 'Roboto',
'Signika' => 'Signika',
'Ubuntu' => 'Ubuntu',
'Vollkorn' => 'Vollkorn'
];
public static $footerblocks = [
'hide' => 'Masqué',
'left' => 'Bloc Gauche',
'center' => 'Bloc Central',
'right' => 'Bloc Droite'
];
public static $fontWeights = [
'normal' => 'Normal',
'bold' => 'Gras'
];
public static $footerHeights = [
'5px' => 'Très petite',
'10px' => 'Petite',
'20px' => 'Moyenne',
'30px' => 'Grande',
'40px' => 'Très grande'
];
public static $footerPositions = [
'hide' => 'Cachée',
'site' => 'Dans le site',
'body' => 'En dessous du site'
];
public static $headerFontSizes = [
'1.6em' => 'Très petite',
'1.8em' => 'Petite',
'2em' => 'Moyenne',
'2.2em' => 'Grande',
'2.4vmax' => 'Très grande'
];
public static $headerHeights = [
'100px' => 'Très petite (100 pixels)',
'150px' => 'Petite (150 pixels)',
'200px' => 'Moyenne (200 pixels)',
'300px' => 'Grande (300 pixels)',
'400px' => 'Très grande (400 pixels)'
];
public static $headerPositions = [
'hide' => 'Cachée',
'site' => 'Dans le site',
'body' => 'Au dessus du site'
];
public static $imagePositions = [
'top left' => 'En haut à gauche',
'top center' => 'En haut au centre',
'top right' => 'En haut à droite',
'center left' => 'Au milieu à gauche',
'center center' => 'Au milieu au centre',
'center right' => 'Au milieu à droite',
'bottom left' => 'En bas à gauche',
'bottom center' => 'En bas au centre',
'bottom right' => 'En bas à droite'
];
public static $menuFontSizes = [
'.8em' => 'Très petite',
'.9em' => 'Petite',
'1em' => 'Normale',
'1.1em' => 'Moyenne',
'1.2em' => 'Grande',
'1.3em' => 'Très grande'
];
public static $menuHeights = [
'5px 10px' => 'Très petite',
'10px' => 'Petite',
'15px 10px' => 'Moyenne',
'20px 15px' => 'Grande',
'25px 15px' => 'Très grande'
];
public static $menuPositionsSite = [
'site-first' => 'Dans le site avant la bannière',
'site-second' => 'Dans le site après la bannière',
'body-top' => 'Au-dessus et en-dehors du site',
'hide' => 'Caché'
];
public static $menuPositionsBody = [
'body-first' => 'Au dessus du site avant la bannière',
'body-second' => 'Au dessus du site après la bannière',
'body-top' => 'Au-dessus et en-dehors du site',
'hide' => 'Caché'
];
public static $radius = [
'0' => 'Aucun',
'5px' => 'Très léger',
'10px' => 'Léger',
'15px' => 'Moyen',
'25px' => 'Important',
'50px' => 'Très important'
];
public static $repeats = [
'no-repeat' => 'Ne pas répéter',
'repeat-x' => 'Sur l\'axe horizontal',
'repeat-y' => 'Sur l\'axe vertical',
'repeat' => 'Sur les deux axes'
];
public static $shadows = [
'0' => 'Aucune',
'1px 1px 5px' => 'Très légère',
'1px 1px 10px' => 'Légère',
'1px 1px 15px' => 'Moyenne',
'1px 1px 25px' => 'Importante',
'1px 1px 50px' => 'Très importante'
];
public static $siteFontSizes = [
'12px' => '12',
'13px' => '13',
'14px' => '14',
'15px' => '15',
'16px' => '16'
];
public static $sizes = [
'auto' => 'Automatique',
'cover' => 'Largeur adaptée au fond'
];
public static $textTransforms = [
'none' => 'Normaux',
'uppercase' => 'Majuscules'
];
public static $widths = [
'750px' => 'Petite (750 pixels)',
'960px' => 'Moyenne (960 pixels)',
'1170px' => 'Grande (1170 pixels)',
'100%' => 'Fluide (100%)'
];
public static $menuWide = [
'container' => 'sur la largeur du site',
'container-large' => 'sur la largeur de la page'
];
public static $headerWide = [
'auto' => 'Automatique',
'contain' => 'Image entière',
'cover' => 'Largeur adaptée au fond',
'100% 100%' => 'Taille adaptée au fond'
];
public static $siteBlocks = [
'12' => 'Un seul bloc, uniquement le site',
'4-8' => 'Deux blocs : 1/3 - 2/3',
'8-4' => 'Deux blocs : 2/3 - 1/3',
'3-9' => 'Deux blocs : 1/4 - 3/4',
'9-3' => 'Deux blocs : 3/4 - 1/2',
'3-6-3' => 'Trois blocs : 1/4 - 1/2 - 1/4'
];
/**
* Mode avancé
*/
public function advanced() {
// Soumission du formulaire
if($this->isPost()) {
// Enregistre le CSS
file_put_contents('site/data/custom.css', $this->getInput('themeAdvancedCss', null));
// Valeurs en sortie
$this->addOutput([
'notification' => 'Modifications enregistrées',
'redirect' => helper::baseUrl() . 'theme/advanced',
'state' => true
]);
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Personnalisation avancée',
'vendor' => [
'codemirror'
],
'view' => 'advanced'
]);
}
/**
* Options de l'arrière plan
*/
public function body() {
// Soumission du formulaire
if($this->isPost()) {
$this->setData(['theme', 'body', [
'backgroundColor' => $this->getInput('themeBodyBackgroundColor'),
'image' => $this->getInput('themeBodyImage'),
'imageAttachment' => $this->getInput('themeBodyImageAttachment'),
'imagePosition' => $this->getInput('themeBodyImagePosition'),
'imageRepeat' => $this->getInput('themeBodyImageRepeat'),
'imageSize' => $this->getInput('themeBodyImageSize')
]]);
// Valeurs en sortie
$this->addOutput([
'notification' => 'Modifications enregistrées',
'redirect' => helper::baseUrl() . 'theme',
'state' => true
]);
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Personnalisation de l\'arrière plan',
'vendor' => [
'tinycolorpicker'
],
'view' => 'body'
]);
}
/**
* Options du pied de page
*/
public function footer() {
// Soumission du formulaire
if($this->isPost()) {
$this->setData(['theme', 'footer', [
'backgroundColor' => $this->getInput('themeFooterBackgroundColor'),
'copyrightAlign' => $this->getInput('themeFooterCopyrightAlign'),
'height' => $this->getInput('themeFooterHeight'),
'loginLink' => $this->getInput('themeFooterLoginLink'),
'margin' => $this->getInput('themeFooterMargin', helper::FILTER_BOOLEAN),
'position' => $this->getInput('themeFooterPosition'),
'socialsAlign' => $this->getInput('themeFooterSocialsAlign'),
'text' => $this->getInput('themeFooterText', null),
'textAlign' => $this->getInput('themeFooterTextAlign'),
'textColor' => $this->getInput('themeFooterTextColor'),
'copyrightPosition' => $this->getInput('themeFooterCopyrightPosition'),
'textPosition' => $this->getInput('themeFooterTextPosition'),
'socialsPosition' => $this->getInput('themeFooterSocialsPosition')
]]);
// Valeurs en sortie
$this->addOutput([
'notification' => 'Modifications enregistrées',
'redirect' => helper::baseUrl() . 'theme',
'state' => true
]);
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Personnalisation du pied de page',
'vendor' => [
'tinycolorpicker'
],
'view' => 'footer'
]);
}
/**
* Options de la bannière
*/
public function header() {
// Soumission du formulaire
if($this->isPost()) {
$this->setData(['theme', 'header', [
'backgroundColor' => $this->getInput('themeHeaderBackgroundColor'),
'font' => $this->getInput('themeHeaderFont'),
'fontSize' => $this->getInput('themeHeaderFontSize'),
'fontWeight' => $this->getInput('themeHeaderFontWeight'),
'height' => $this->getInput('themeHeaderHeight'),
'image' => $this->getInput('themeHeaderImage'),
'imagePosition' => $this->getInput('themeHeaderImagePosition'),
'imageRepeat' => $this->getInput('themeHeaderImageRepeat'),
'margin' => $this->getInput('themeHeaderMargin', helper::FILTER_BOOLEAN),
'position' => $this->getInput('themeHeaderPosition'),
'textAlign' => $this->getInput('themeHeaderTextAlign'),
'textColor' => $this->getInput('themeHeaderTextColor'),
'textHide' => $this->getInput('themeHeaderTextHide', helper::FILTER_BOOLEAN),
'textTransform' => $this->getInput('themeHeaderTextTransform'),
'linkHome' => $this->getInput('themeHeaderlinkHome',helper::FILTER_BOOLEAN),
'imageContainer' => $this->getInput('themeHeaderImageContainer')
]]);
// Valeurs en sortie
$this->addOutput([
'notification' => 'Modifications enregistrées',
'redirect' => helper::baseUrl() . 'theme',
'state' => true
]);
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Personnalisation de la bannière',
'vendor' => [
'tinycolorpicker'
],
'view' => 'header'
]);
}
/**
* Accueil de la personnalisation
*/
public function index() {
// Valeurs en sortie
$this->addOutput([
'title' => 'Personnalisation du thème',
'view' => 'index'
]);
}
/**
* Options du menu
*/
public function menu() {
// Soumission du formulaire
if($this->isPost()) {
$this->setData(['theme', 'menu', [
'backgroundColor' => $this->getInput('themeMenuBackgroundColor'),
'font' => $this->getInput('themeMenuFont'),
'fontSize' => $this->getInput('themeMenuFontSize'),
'fontWeight' => $this->getInput('themeMenuFontWeight'),
'height' => $this->getInput('themeMenuHeight'),
'loginLink' => $this->getInput('themeMenuLoginLink'),
'margin' => $this->getInput('themeMenuMargin', helper::FILTER_BOOLEAN),
'position' => $this->getInput('themeMenuPosition'),
'textAlign' => $this->getInput('themeMenuTextAlign'),
'textColor' => $this->getInput('themeMenuTextColor'),
'textTransform' => $this->getInput('themeMenuTextTransform'),
]]);
// Valeurs en sortie
$this->addOutput([
'notification' => 'Modifications enregistrées',
'redirect' => helper::baseUrl() . 'theme',
'state' => true
]);
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Personnalisation du menu',
'vendor' => [
'tinycolorpicker'
],
'view' => 'menu'
]);
}
/**
* Réinitialisation de la personnalisation avancée
*/
public function reset() {
// Supprime le fichier de personnalisation avancée
unlink('site/data/custom.css');
// Valeurs en sortie
$this->addOutput([
'notification' => 'Personnalisation avancée réinitialisée',
'redirect' => helper::baseUrl() . 'theme/advanced',
'state' => true
]);
}
/**
* Options du site
*/
public function site() {
// Soumission du formulaire
if($this->isPost()) {
$this->setData(['theme', 'title', [
'font' => $this->getInput('themeTitleFont'),
'textColor' => $this->getInput('themeTitleTextColor'),
'fontWeight' => $this->getInput('themeTitleFontWeight'),
'textTransform' => $this->getInput('themeTitleTextTransform')
]]);
$this->setData(['theme', 'button', 'backgroundColor', $this->getInput('themeButtonBackgroundColor')]);
$this->setData(['theme', 'link', 'textColor', $this->getInput('themeLinkTextColor')]);
$this->setData(['theme', 'text', [
'font' => $this->getInput('themeTextFont'),
'fontSize' => $this->getInput('themeTextFontSize'),
'textColor' => $this->getInput('themeTextTextColor'),
]]);
$this->setData(['theme', 'site', [
'backgroundColor' => $this->getInput('themeSiteBackgroundColor'),
'radius' => $this->getInput('themeSiteRadius'),
'shadow' => $this->getInput('themeSiteShadow'),
'width' => $this->getInput('themeSiteWidth'),
'blocks' => $this->getInput('themeSiteBlocks')
]]);
// Valeurs en sortie
$this->addOutput([
'notification' => 'Modifications enregistrées',
'redirect' => helper::baseUrl() . 'theme',
'state' => true
]);
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Personnalisation du site',
'vendor' => [
'tinycolorpicker',
'tinymce'
],
'view' => 'site'
]);
}
/**
* Import du thème
*/
public function manage() {
if($this->isPost() ) {
$zipFilename = $this->getInput('themeManageImport', helper::FILTER_STRING_SHORT, true);
$zip = new ZipArchive();
if ($zip->open('site/file/source/'.$zipFilename) === TRUE) {
$zip->extractTo('.');
$zip->close();
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'theme'
]);
} else {
$this->addOutput([
'notification' => 'Erreur avec le thème <b>'.$zipFilename,
'redirect' => helper::baseUrl() . 'theme/manage'
]);
}
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Gestion des thèmes',
'view' => 'manage'
]);
}
/**
* Export du thème
*/
public function export() {
// Creation du dossier
$zipFilename = 'theme-'.date('dmYhms').'-'.rand(100,999).'.zip';
$zip = new ZipArchive();
if ($zip->open('site/tmp/' . $zipFilename, ZipArchive::CREATE | ZipArchive::OVERWRITE ) === TRUE) {
$zip->addFile('site/data/theme.json','site/data/theme.json');
$zip->addFile('site/data/theme.json','site/data/theme.css');
$zip->addFile('site/data/theme.json','site/data/custom.css');
if ($this->getData(['theme','body','image']) !== '' ) {
$zip->addFile('site/file/source/'.$this->getData(['theme','body','image']),
'site/file/source/'.$this->getData(['theme','body','image'])
);
}
if ($this->getData(['theme','header','image']) !== '' ) {
$zip->addFile('site/file/source/'.$this->getData(['theme','header','image']),
'site/file/source/'.$this->getData(['theme','header','image'])
);
}
$ret = $zip->close();
}
// Téléchargement du ZIP
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-Disposition: attachment; filename="' . $zipFilename . '"');
header('Content-Length: ' . filesize('site/tmp/' . $zipFilename));
readfile('site/tmp/' . $zipFilename);
// Nettoyage du dossier
unlink ('site/tmp/' . $zipFilename);
// Valeurs en sortie
$this->addOutput([
'display' => self::DISPLAY_RAW
]);
}
/**
* Export du thème
*/
public function save() {
// Creation du dossier
$zipFilename = 'theme-'.date('dmYhms').'-'.rand(100,999).'.zip';
$zip = new ZipArchive();
if ($zip->open('site/tmp/' . $zipFilename, ZipArchive::CREATE | ZipArchive::OVERWRITE ) === TRUE) {
$zip->addFile('site/data/theme.json','site/data/theme.json');
$zip->addFile('site/data/theme.json','site/data/theme.css');
$zip->addFile('site/data/theme.json','site/data/custom.css');
if ($this->getData(['theme','body','image']) !== '' ) {
$zip->addFile('site/file/source/'.$this->getData(['theme','body','image']),
'site/file/source/'.$this->getData(['theme','body','image'])
);
}
if ($this->getData(['theme','header','image']) !== '' ) {
$zip->addFile('site/file/source/'.$this->getData(['theme','header','image']),
'site/file/source/'.$this->getData(['theme','header','image'])
);
}
$ret = $zip->close();
}
// Téléchargement du ZIP
copy ('site/tmp/' . $zipFilename , 'site/file/source/' . $zipFilename);
// Nettoyage du dossier
unlink ('site/tmp/' . $zipFilename);
// Valeurs en sortie
$this->addOutput([
'notification' => 'Archive <b>'.$zipFilename.'</b> sauvegardée dans fichiers',
'redirect' => helper::baseUrl() . 'theme/manage',
'state' => true
]);
}
}