ZwiiCMS/core/module/theme/theme.php

1050 lines
33 KiB
PHP
Raw Normal View History

2018-04-02 08:29:19 +02:00
<?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.fr/
2019-01-22 14:36:13 +01:00
* @copyright : Frédéric Tempez <frederic.tempez@outlook.com>
2021-12-18 10:25:33 +01:00
* @copyright Copyright (C) 2018-2022, Frédéric Tempez
2018-04-02 08:29:19 +02:00
*/
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,
2018-12-25 16:24:20 +01:00
'site' => self::GROUP_ADMIN,
2020-06-02 12:03:45 +02:00
'admin' => self::GROUP_ADMIN,
2018-12-25 16:24:20 +01:00
'manage' => self::GROUP_ADMIN,
2018-12-25 18:38:17 +01:00
'export' => self::GROUP_ADMIN,
2021-10-19 19:14:52 +02:00
'import' => self::GROUP_ADMIN,
'save' => self::GROUP_ADMIN,
2022-02-08 17:00:08 +01:00
'fonts' => self::GROUP_ADMIN,
'fontAdd' => self::GROUP_ADMIN,
'fontDelete' => self::GROUP_ADMIN
2018-04-02 08:29:19 +02:00
];
public static $aligns = [
'left' => 'À gauche',
'center' => 'Au centre',
'right' => 'À droite'
];
public static $attachments = [
2019-03-21 19:55:51 +01:00
'scroll' => 'Standard',
2018-04-02 08:29:19 +02:00
'fixed' => 'Fixe'
];
2021-11-15 09:01:08 +01:00
public static $containerWides = [
'container' => 'Limitée au site',
'none' => 'Etendue sur la page'
];
2018-09-09 21:28:05 +02:00
public static $footerblocks = [
2019-06-19 09:35:19 +02:00
1 => [
'hide' => 'Masqué',
2020-06-02 12:03:45 +02:00
'center' => 'Affiché' ],
2019-06-22 19:44:13 +02:00
2 => [
2019-06-19 09:35:19 +02:00
'hide' => 'Masqué',
2020-04-17 17:39:16 +02:00
'left' => 'À gauche',
'right' => 'À droite' ],
2019-06-22 19:44:13 +02:00
3 => [
2019-06-19 09:35:19 +02:00
'hide' => 'Masqué',
2020-04-17 17:39:16 +02:00
'left' => 'À gauche',
'center' => 'Au centre',
2020-04-17 17:39:16 +02:00
'right' => 'À droite' ],
2019-06-22 19:44:13 +02:00
4 => [
'hide' => 'Masqué',
2019-06-23 23:37:12 +02:00
'left' => 'En haut',
'center' => 'Au milieu',
'right' => 'En bas' ]
2018-09-09 21:28:05 +02:00
];
2019-06-19 09:35:19 +02:00
2018-04-02 08:29:19 +02:00
public static $fontWeights = [
2019-03-22 09:53:28 +01:00
'normal' => 'Maigre',
2018-04-02 08:29:19 +02:00
'bold' => 'Gras'
];
public static $footerHeights = [
2019-11-12 18:57:41 +01:00
'0px' => 'Nulles (0px)',
'5px' => 'Très petites (5px)',
'10px' => 'Petites (10px)',
'15px' => 'Moyennes (15px)',
'20px' => 'Grandes (20px)'
2018-04-02 08:29:19 +02:00
];
public static $footerPositions = [
2019-05-02 13:21:48 +02:00
'hide' => 'Caché',
2018-04-02 08:29:19 +02:00
'site' => 'Dans le site',
'body' => 'En dessous du site'
];
2019-03-19 06:59:28 +01:00
public static $footerFontSizes = [
2019-03-20 18:25:17 +01:00
'.8em' => 'Très petite (80%)',
'.9em' => 'Petite (90%)',
2019-03-21 19:55:51 +01:00
'1em' => 'Standard (100%)',
'1.1em' => 'Moyenne (110%)',
'1.2em' => 'Grande (120%)',
'1.3em' => 'Très grande (130%)'
2020-06-02 12:03:45 +02:00
];
2018-04-02 08:29:19 +02:00
public static $headerFontSizes = [
2019-03-20 18:25:17 +01:00
'1.6em' => 'Très petite (160%)',
'1.8em' => 'Petite (180%)',
'2em' => 'Moyenne (200%)',
'2.2em' => 'Grande (220%)',
'2.4vmax' => 'Très grande (240%)'
2018-04-02 08:29:19 +02:00
];
public static $headerHeights = [
2021-11-15 09:01:08 +01:00
'unset' => 'Libre', // texte dynamique cf header.js.php
2019-05-02 13:21:48 +02:00
'100px' => 'Très petite (100px) ',
'150px' => 'Petite (150px)',
'200px' => 'Moyenne (200px)',
'300px' => 'Grande (300px)',
'400px' => 'Très grande (400px)',
2018-04-02 08:29:19 +02:00
];
public static $headerPositions = [
'body' => 'Au dessus du site',
2018-04-02 08:29:19 +02:00
'site' => 'Dans le site',
'hide' => 'Cachée'
2018-04-02 08:29:19 +02:00
];
public static $headerFeatures = [
'wallpaper' => 'Couleur unie ou papier-peint',
'feature' => 'Contenu personnalisé'
];
2018-04-02 08:29:19 +02:00
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 = [
2019-03-20 18:25:17 +01:00
'.8em' => 'Très petite (80%)',
'.9em' => 'Petite (90%)',
2019-03-21 19:55:51 +01:00
'1em' => 'Standard (100%)',
2019-03-20 18:25:17 +01:00
'1.1em' => 'Moyenne (110%)',
'1.2em' => 'Grande (120%)',
'1.3em' => 'Très grande (130%)'
2018-04-02 08:29:19 +02:00
];
public static $menuHeights = [
2019-03-24 14:50:28 +01:00
'5px 10px' => 'Très petite',
'10px' => 'Petite',
'15px 10px' => 'Moyenne',
'20px 15px' => 'Grande',
'25px 15px' => 'Très grande'
2018-04-02 08:29:19 +02:00
];
2019-02-07 17:26:39 +01:00
public static $menuPositionsSite = [
2020-06-02 12:03:45 +02:00
'top' => 'En-dehors du site',
'site-first' => 'Avant la bannière',
'site-second' => 'Après la bannière',
'hide' => 'Caché'
2018-04-02 08:29:19 +02:00
];
public static $menuPositionsBody = [
'top' => 'En-dehors du site',
'body-first' => 'Avant la bannière',
'body-second' => 'Après la bannière',
2019-03-12 09:18:31 +01:00
'site' => 'Dans le site',
'hide' => 'Caché'
2020-06-02 12:03:45 +02:00
];
public static $menuRadius = [
'0px' => 'Aucun',
'3px 3px 0px 0px' => 'Très léger',
'6px 6px 0px 0px' => 'Léger',
'9px 9px 0px 0px' => 'Moyen',
'12px 12px 0px 0px' => 'Important',
'15px 15px 0px 0px' => 'Très important'
];
2018-04-02 08:29:19 +02:00
public static $radius = [
2019-06-01 13:07:38 +02:00
'0px' => 'Aucun',
2018-04-02 08:29:19 +02:00
'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 = [
2019-06-01 13:07:38 +02:00
'0px' => 'Aucune',
2018-04-02 08:29:19 +02:00
'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 = [
2019-03-20 18:25:17 +01:00
'12px' => '12 pixels',
'13px' => '13 pixels',
'14px' => '14 pixels',
'15px' => '15 pixels',
'16px' => '16 pixels'
2018-04-02 08:29:19 +02:00
];
2020-01-31 11:24:00 +01:00
public static $bodySizes = [
2020-06-02 12:03:45 +02:00
'auto' => 'Automatique',
2020-01-31 11:24:00 +01:00
'100% 100%' => 'Image étirée (100% 100%)',
'cover' => 'Responsive (cover)',
'contain' => 'Responsive (contain)'
2018-04-02 08:29:19 +02:00
];
public static $textTransforms = [
'none' => 'Standard',
'lowercase' => 'Minuscules',
'uppercase' => 'Majuscules',
2020-06-02 12:03:45 +02:00
'capitalize' => 'Majuscule à chaque mot'
2018-04-02 08:29:19 +02:00
];
2021-11-15 08:12:43 +01:00
public static $siteWidths = [
2018-04-02 08:29:19 +02:00
'750px' => 'Petite (750 pixels)',
'960px' => 'Moyenne (960 pixels)',
'1170px' => 'Grande (1170 pixels)',
'100%' => 'Fluide (100%)'
];
2020-06-02 12:03:45 +02:00
public static $headerWide = [
'auto auto' => 'Automatique',
'100% 100%' => 'Image étirée (100% 100%)',
'cover' => 'Responsive (cover)',
'contain' => 'Responsive (contain)'
2019-01-02 23:55:43 +01:00
];
2020-06-02 12:03:45 +02:00
public static $footerTemplate = [
'1' => 'Une seule colonne',
'2' => 'Deux colonnes : 1/2 - 1/2',
'3' => 'Trois colonnes : 1/3 - 1/3 - 1/3',
'4' => 'Trois lignes superposées'
2019-06-18 20:08:04 +02:00
];
2021-10-25 09:11:58 +02:00
public static $burgerContent = [
'none' => 'Aucun',
'title' => 'Titre du site',
'logo' => 'Logo du site'
2021-10-25 09:11:58 +02:00
];
2019-01-02 23:55:43 +01:00
// Variable pour construire la liste des pages du site
public static $pagesList = [];
// Variable pour construire la liste des fontes installées
public static $fontsList = [];
/**
* Thème des écrans d'administration
*/
public function admin() {
// Soumission du formulaire
if($this->isPost()) {
$this->setData(['admin', [
2020-05-17 07:41:44 +02:00
'backgroundColor' => $this->getInput('adminBackgroundColor'),
'colorTitle' => $this->getInput('adminColorTitle'),
'colorText' => $this->getInput('adminColorText'),
'colorButtonText' => $this->getInput('adminColorButtonText'),
'backgroundColorButton' => $this->getInput('adminColorButton'),
'backgroundColorButtonGrey' => $this->getInput('adminColorGrey'),
'backgroundColorButtonRed' => $this->getInput('adminColorRed'),
'backgroundColorButtonGreen'=> $this->getInput('adminColorGreen'),
2021-05-09 10:41:19 +02:00
'backgroundColorButtonHelp'=> $this->getInput('adminColorHelp'),
2020-05-17 07:41:44 +02:00
'fontText' => $this->getInput('adminFontText'),
'fontSize' => $this->getInput('adminFontTextSize'),
'fontTitle' => $this->getInput('adminFontTitle'),
'backgroundBlockColor' => $this->getInput('adminBackGroundBlockColor'),
'borderBlockColor' => $this->getInput('adminBorderBlockColor'),
]]);
// Valeurs en sortie
$this->addOutput([
'notification' => 'Modifications enregistrées',
'redirect' => helper::baseUrl() . 'theme/admin',
'state' => true
]);
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Administration',
'view' => 'admin',
'vendor' => [
'tinycolorpicker'
],
2020-06-02 12:03:45 +02:00
]);
}
2018-04-02 08:29:19 +02:00
/**
* Mode avancé
*/
public function advanced() {
// Soumission du formulaire
if($this->isPost()) {
// Enregistre le CSS
file_put_contents(self::DATA_DIR.'custom.css', $this->getInput('themeAdvancedCss', null));
2018-04-02 08:29:19 +02:00
// Valeurs en sortie
$this->addOutput([
'notification' => 'Modifications enregistrées',
'redirect' => helper::baseUrl() . 'theme/advanced',
'state' => true
]);
}
// Valeurs en sortie
$this->addOutput([
2019-01-22 14:36:13 +01:00
'title' => 'Éditeur CSS',
2018-04-02 08:29:19 +02:00
'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'),
2020-02-13 10:48:56 +01:00
'imageSize' => $this->getInput('themeBodyImageSize'),
'toTopbackgroundColor' => $this->getInput('themeBodyToTopBackground'),
'toTopColor' => $this->getInput('themeBodyToTopColor')
2018-04-02 08:29:19 +02:00
]]);
// 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()) {
2020-06-02 12:03:45 +02:00
if ( $this->getInput('themeFooterCopyrightPosition') === 'hide' &&
2019-06-22 08:23:09 +02:00
$this->getInput('themeFooterSocialsPosition') === 'hide' &&
$this->getInput('themeFooterTextPosition') === 'hide' ) {
// Valeurs en sortie
$this->addOutput([
2019-06-27 11:35:33 +02:00
'notification' => 'Sélectionnez au moins un contenu à afficher',
2019-06-22 08:23:09 +02:00
'redirect' => helper::baseUrl() . 'theme/footer',
'state' => false
]);
} else {
$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'),
2020-02-02 19:14:57 +01:00
'fixed' => $this->getInput('themeFooterFixed', helper::FILTER_BOOLEAN),
2019-06-22 08:23:09 +02:00
'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'),
2020-06-02 12:03:45 +02:00
'textTransform' => $this->getInput('themeFooterTextTransform'),
2019-06-22 08:23:09 +02:00
'font' => $this->getInput('themeFooterFont'),
'fontSize' => $this->getInput('themeFooterFontSize'),
'fontWeight' => $this->getInput('themeFooterFontWeight'),
'displayVersion' => $this->getInput('themefooterDisplayVersion', helper::FILTER_BOOLEAN),
'displaySiteMap' => $this->getInput('themefooterDisplaySiteMap', helper::FILTER_BOOLEAN),
'displayCopyright' => $this->getInput('themefooterDisplayCopyright', helper::FILTER_BOOLEAN),
'displayCookie' => $this->getInput('themefooterDisplayCookie', helper::FILTER_BOOLEAN),
'displayLegal' => $this->getInput('themeFooterDisplayLegal', helper::FILTER_BOOLEAN),
'displaySearch' => $this->getInput('themeFooterDisplaySearch', helper::FILTER_BOOLEAN),
'displayMemberBar'=> $this->getInput('themeFooterDisplayMemberBar', helper::FILTER_BOOLEAN),
'template' => $this->getInput('themeFooterTemplate')
2019-06-22 08:23:09 +02:00
]]);
2021-10-02 14:15:27 +02:00
// Sauvegarder la configuration localisée
$this->setData(['locale','legalPageId', $this->getInput('configLegalPageId')]);
$this->setData(['locale','searchPageId', $this->getInput('configSearchPageId')]);
2019-06-22 08:23:09 +02:00
// Valeurs en sortie
$this->addOutput([
'notification' => 'Modifications enregistrées',
'redirect' => helper::baseUrl() . 'theme',
'state' => true
]);
}
2018-04-02 08:29:19 +02:00
}
// Liste des pages
self::$pagesList = $this->getData(['page']);
foreach(self::$pagesList as $page => $pageId) {
if ($this->getData(['page',$page,'block']) === 'bar' ||
$this->getData(['page',$page,'disable']) === true) {
unset(self::$pagesList[$page]);
}
}
2018-04-02 08:29:19 +02:00
// Valeurs en sortie
$this->addOutput([
'title' => 'Personnalisation du pied de page',
'vendor' => [
2019-06-18 20:08:04 +02:00
'tinycolorpicker',
'tinymce'
2018-04-02 08:29:19 +02:00
],
'view' => 'footer'
]);
}
/**
* Options de la bannière
*/
public function header() {
// Soumission du formulaire
if($this->isPost()) {
// Modification des URL des images dans la bannière perso
$featureContent = $this->getInput('themeHeaderText', null);
$featureContent = str_replace(helper::baseUrl(false,false), './', $featureContent);
2021-12-14 18:26:28 +01:00
/**
2021-12-15 19:03:52 +01:00
* Stocker les images incluses dans la bannière perso dans un tableau
*/
preg_match_all('/<img[^>]+>/i',$featureContent, $results);
foreach($results[0] as $value) {
2021-12-15 19:03:52 +01:00
// Lire le contenu XML
$sx = simplexml_load_string($value);
// Élément à remplacer
2021-12-15 19:03:52 +01:00
$files [] = str_replace('./site/file/source/','',(string) $sx[0]['src']);
}
2021-12-14 18:26:28 +01:00
// Sauvegarder
2018-04-02 08:29:19 +02:00
$this->setData(['theme', 'header', [
'backgroundColor' => $this->getInput('themeHeaderBackgroundColor'),
2018-04-02 08:29:19 +02:00
'font' => $this->getInput('themeHeaderFont'),
'fontSize' => $this->getInput('themeHeaderFontSize'),
'fontWeight' => $this->getInput('themeHeaderFontWeight'),
'height' => $this->getInput('themeHeaderHeight'),
2021-11-15 09:01:08 +01:00
'wide' => $this->getInput('themeHeaderWide'),
2018-04-02 08:29:19 +02:00
'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'),
2020-06-02 12:03:45 +02:00
'textHide' => $this->getInput('themeHeaderTextHide', helper::FILTER_BOOLEAN),
2020-11-03 12:02:59 +01:00
'textTransform' => $this->getInput('themeHeaderTextTransform'),
2019-11-09 19:03:03 +01:00
'linkHomePage' => $this->getInput('themeHeaderlinkHomePage',helper::FILTER_BOOLEAN),
'imageContainer' => $this->getInput('themeHeaderImageContainer'),
'tinyHidden' => $this->getInput('themeHeaderTinyHidden', helper::FILTER_BOOLEAN),
'feature' => $this->getInput('themeHeaderFeature'),
2021-12-15 19:03:52 +01:00
'featureContent' => $featureContent,
'featureFiles' => $files
2018-04-02 08:29:19 +02:00
]]);
2019-01-22 13:46:35 +01:00
// Modification de la position du menu selon la position de la bannière
if ( $this->getData(['theme','header','position']) == 'site' )
2021-03-22 11:30:34 +01:00
{
$this->setData(['theme', 'menu', 'position',str_replace ('body-','site-',$this->getData(['theme','menu','position']))]);
}
if ( $this->getData(['theme','header','position']) == 'body')
{
$this->setData(['theme', 'menu', 'position',str_replace ('site-','body-',$this->getData(['theme','menu','position']))]);
}
// Menu accroché à la bannière qui devient cachée
if ( $this->getData(['theme','header','position']) == 'hide' &&
in_array( $this->getData(['theme','menu','position']) , ['body-first', 'site-first', 'body-first' , 'site-second'])
) {
$this->setData(['theme', 'menu', 'position','site']);
2019-01-22 13:46:35 +01:00
}
2018-04-02 08:29:19 +02:00
// 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',
'tinymce'
2018-04-02 08:29:19 +02:00
],
'view' => 'header'
]);
}
/**
* Accueil de la personnalisation
*/
public function index() {
// Valeurs en sortie
$this->addOutput([
2020-06-02 12:03:45 +02:00
'title' => 'Personnalisation des thèmes',
2018-04-02 08:29:19 +02:00
'view' => 'index'
]);
}
/**
* Options du menu
*/
public function menu() {
// Soumission du formulaire
if($this->isPost()) {
$this->setData(['theme', 'menu', [
'backgroundColor' => $this->getInput('themeMenuBackgroundColor'),
2020-11-01 20:19:02 +01:00
'backgroundColorSub' => $this->getInput('themeMenuBackgroundColorSub'),
2020-06-02 12:03:45 +02:00
'font' => $this->getInput('themeMenuFont'),
2018-04-02 08:29:19 +02:00
'fontSize' => $this->getInput('themeMenuFontSize'),
'fontWeight' => $this->getInput('themeMenuFontWeight'),
'height' => $this->getInput('themeMenuHeight'),
2021-11-15 09:01:08 +01:00
'wide' => $this->getInput('themeMenuWide'),
2019-02-22 22:53:51 +01:00
'loginLink' => $this->getInput('themeMenuLoginLink', helper::FILTER_BOOLEAN),
2018-04-02 08:29:19 +02:00
'margin' => $this->getInput('themeMenuMargin', helper::FILTER_BOOLEAN),
'position' => $this->getInput('themeMenuPosition'),
'textAlign' => $this->getInput('themeMenuTextAlign'),
'textColor' => $this->getInput('themeMenuTextColor'),
2018-04-07 23:31:15 +02:00
'textTransform' => $this->getInput('themeMenuTextTransform'),
'fixed' => $this->getInput('themeMenuFixed', helper::FILTER_BOOLEAN),
'activeColorAuto' => $this->getInput('themeMenuActiveColorAuto', helper::FILTER_BOOLEAN),
'activeColor' => $this->getInput('themeMenuActiveColor'),
'activeTextColor' => $this->getInput('themeMenuActiveTextColor'),
'radius' => $this->getInput('themeMenuRadius'),
'burgerTitle' => $this->getInput('themeMenuBurgerTitle', helper::FILTER_BOOLEAN),
2021-10-25 09:11:58 +02:00
'memberBar' => $this->getInput('themeMenuMemberBar', helper::FILTER_BOOLEAN),
'burgerLogo' => $this->getInput('themeMenuBurgerLogo'),
2021-10-25 09:11:58 +02:00
'burgerContent' => $this->getInput('themeMenuBurgerContent')
2018-04-02 08:29:19 +02:00
]]);
// 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'
]);
}
/**
* Options des fontes
*/
public function fonts() {
2022-02-09 12:56:59 +01:00
// Polices trouvées dans la configuration
2022-02-08 17:00:08 +01:00
$fonts = $this->getData(['fonts']);
2022-02-09 12:56:59 +01:00
// Polices liées au thème
$used = [
2022-02-09 15:21:44 +01:00
'Bannière' => $this->getData (['theme', 'header', 'font']),
'Menu' => $this->getData (['theme', 'menu', 'font']),
'Titre ' => $this->getData (['theme', 'title', 'font']),
'Texte' => $this->getData (['theme', 'text', 'font']),
'Pied de page' => $this->getData (['theme', 'footer', 'font']),
'Titre (admin)' => $this->getData (['admin', 'fontTitle' ]),
'Admin (texte)' => $this->getData (['admin', 'fontText' ])
2022-02-09 12:56:59 +01:00
];
2022-02-09 15:21:44 +01:00
// Parcourir les fontes installées et construire le tableau pour le formulaire
2022-02-09 12:56:59 +01:00
foreach (self::$fonts as $fontId => $fontName) {
2022-02-09 15:21:44 +01:00
// Fontes utilisées par le thème
$fontUsed[$fontId] = '';
2022-02-09 12:56:59 +01:00
foreach ($used as $key => $value) {
2022-02-09 15:21:44 +01:00
if ( $value === $fontId) {
$fontUsed[$fontId] .= $key . '<br/>';
2022-02-09 12:56:59 +01:00
}
}
2022-02-08 17:00:08 +01:00
self::$fontsList [] = [
'<span style="font-family:' . $fontName . '">' . $fontName . '</span>' ,
2022-02-08 17:00:08 +01:00
$fontId,
2022-02-09 12:56:59 +01:00
$fontUsed[$fontId],
2022-02-10 10:44:35 +01:00
//array_key_exists($fontId, $fonts['imported']) ? 'Importée' : '',
array_key_exists($fontId, $fonts['files']) ?
$fonts['files'][$fontId] :
(array_key_exists($fontId, self::$fontsWebSafe) ? 'WebSafe' : 'CDN Fonts'),
2022-02-08 17:00:08 +01:00
array_key_exists($fontId, $fonts['imported']) || array_key_exists($fontId, $fonts['files'])
? template::button('themeFontDelete' . $fontId, [
'class' => 'themeFontDelete buttonRed',
2022-02-08 19:34:37 +01:00
'href' => helper::baseUrl() . $this->getUrl(0) . '/fontDelete/' . $fontId . '/' . $_SESSION['csrf'],
2022-02-09 12:56:59 +01:00
'value' => template::ico('cancel'),
'disabled' => !empty($fontUsed[$fontId])
2022-02-08 17:00:08 +01:00
])
: ''
];
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Gestion des fontes',
'view' => 'fonts'
]);
}
2022-02-08 17:00:08 +01:00
/**
* Ajouter une fonte
*/
public function fontAdd() {
// Soumission du formulaire
if ($this->isPost()) {
2022-02-10 13:34:33 +01:00
2022-02-08 17:00:08 +01:00
$fontId = $this->getInput('fontAddFontId', null, true);
$fontName = $this->getInput('fontAddFontName', null, true);
2022-02-09 16:19:17 +01:00
$filePath = $this->getInput('fontAddFile', null);
2022-02-08 21:19:39 +01:00
$e = explode ('/', $filePath);
2022-02-08 19:34:37 +01:00
$file = $e[count($e) - 1 ];
2022-02-08 17:00:08 +01:00
2022-02-09 15:59:11 +01:00
// Vérifier l'existence de fontId et validité de family namesi usage en ligne de cdnFonts
$data = helper::getUrlContents('https://www.cdnfonts.com/' . $fontId . '.font');
2022-02-08 21:19:39 +01:00
if ( $filePath === ''
2022-02-10 13:34:33 +01:00
&& $fontName !== ''
&& strpos($data, $fontName) === false
2022-02-09 10:43:04 +01:00
) {
2022-02-09 10:43:04 +01:00
// Valeurs en sortie
$this->addOutput([
2022-02-10 08:29:28 +01:00
'notification' => 'Erreur de nom de fonte ou d\'identifiant',
2022-02-09 10:43:04 +01:00
'redirect' => helper::baseUrl() . 'theme/fontAdd',
'state' => false
]);
2022-02-10 08:29:28 +01:00
2022-02-09 10:43:04 +01:00
} else {
// Charger les données des fontes
2022-02-09 10:43:04 +01:00
$files = $this->getData(['fonts', 'files']);
$imported = $this->getData(['fonts', 'imported']);
2022-02-08 21:19:39 +01:00
2022-02-09 10:43:04 +01:00
// Concaténation dans les tableaux existants
$imported = array_merge([$fontId => $fontName], $imported);
$files = array_merge([$fontId => $file], $files);
2022-02-08 21:19:39 +01:00
2022-02-09 10:43:04 +01:00
// Copier la fonte si le nom du fichier est fourni
if (!empty($filePath)) {
copy ( self::FILE_DIR . 'source/' . $filePath, self::DATA_DIR . 'fonts/' . $file );
}
2022-02-08 21:19:39 +01:00
2022-02-09 10:43:04 +01:00
// Mettre à jour le fichier des fontes
$this->setData(['fonts', 'imported', $imported ]);
2022-02-09 16:33:03 +01:00
if (!empty($filePath) ) {
$this->setData(['fonts', 'files', $files ]);
}
2022-02-09 10:43:04 +01:00
// Valeurs en sortie
$this->addOutput([
'notification' => 'La fonte a été importée',
'redirect' => helper::baseUrl() . 'theme/fonts',
'state' => true
]);
}
2022-02-08 17:00:08 +01:00
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Ajouter une fonte',
'view' => 'fontAdd'
]);
}
/**
* Effacer une fonte
*/
public function fontDelete() {
// Jeton incorrect
if ($this->getUrl(3) !== $_SESSION['csrf']) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'theme/fonts',
'notification' => 'Action non autorisée'
]);
}
// Suppression
else {
// Charger les données des fontes
$files = $this->getData(['fonts', 'files']);
$imported = $this->getData(['fonts', 'imported']);
// Effacer le fichier existant
if ( file_exists(self::DATA_DIR . $files[$this->getUrl(2)]) ) {
unlink(self::DATA_DIR . $files[$this->getUrl(2)]);
}
// Supprimer les entrées
2022-02-09 10:43:04 +01:00
unset($files[$this->getUrl(2)]);
2022-02-08 17:00:08 +01:00
unset($imported[$this->getUrl(2)]);
// Mettre à jour le fichier des fontes
$this->setData(['fonts', 'files', $files ]);
$this->setData(['fonts', 'imported', $imported ]);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'theme/fonts',
'notification' => 'Fonte supprimée',
'state' => true
]);
}
}
2018-04-02 08:29:19 +02:00
/**
* Réinitialisation de la personnalisation avancée
*/
public function reset() {
// $url prend l'adresse sans le token
$url = explode('&',$this->getUrl(2));
2018-04-02 08:29:19 +02:00
if ( isset($_GET['csrf'])
AND $_GET['csrf'] === $_SESSION['csrf']
) {
// Réinitialisation
$redirect ='';
switch ($url[0]) {
case 'admin':
$this->initData('admin');
$redirect = helper::baseUrl() . 'theme/admin';
break;
case 'manage':
$this->initData('theme');
$redirect = helper::baseUrl() . 'theme/manage';
break;
case 'custom':
unlink(self::DATA_DIR.'custom.css');
$redirect = helper::baseUrl() . 'theme/advanced';
break;
default :
$redirect = helper::baseUrl() . 'theme';
}
// Valeurs en sortie
$this->addOutput([
'notification' => 'Réinitialisation effectuée',
'redirect' => $redirect,
'state' => true
]);
} else {
// Valeurs en sortie
$this->addOutput([
'notification' => 'Jeton incorrect'
]);
}
}
2020-11-07 17:48:10 +01:00
2018-04-02 08:29:19 +02:00
/**
* 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', 'text', [
'font' => $this->getInput('themeTextFont'),
'fontSize' => $this->getInput('themeTextFontSize'),
'textColor' => $this->getInput('themeTextTextColor'),
2020-05-18 10:50:43 +02:00
'linkColor'=> $this->getInput('themeTextLinkColor')
2018-04-02 08:29:19 +02:00
]]);
$this->setData(['theme', 'site', [
'backgroundColor' => $this->getInput('themeSiteBackgroundColor'),
'radius' => $this->getInput('themeSiteRadius'),
'shadow' => $this->getInput('themeSiteShadow'),
'width' => $this->getInput('themeSiteWidth'),
2020-05-18 10:50:43 +02:00
'margin' => $this->getInput('themeSiteMargin',helper::FILTER_BOOLEAN)
]]);
2020-06-02 12:03:45 +02:00
$this->setData(['theme', 'button', [
2020-05-18 10:50:43 +02:00
'backgroundColor' => $this->getInput('themeButtonBackgroundColor')
]]);
2020-06-02 12:03:45 +02:00
$this->setData(['theme', 'block', [
2020-05-18 10:50:43 +02:00
'backgroundColor' => $this->getInput('themeBlockBackgroundColor'),
'borderColor' => $this->getInput('themeBlockBorderColor')
]]);
2018-04-02 08:29:19 +02:00
// 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' => [
2019-01-02 23:55:43 +01:00
'tinycolorpicker',
'tinymce'
2018-04-02 08:29:19 +02:00
],
'view' => 'site'
]);
}
2018-12-25 16:24:20 +01:00
/**
* Import du thème
*/
public function manage() {
2018-12-27 20:06:03 +01:00
if($this->isPost() ) {
2021-10-19 19:14:52 +02:00
2018-12-28 17:13:26 +01:00
$zipFilename = $this->getInput('themeManageImport', helper::FILTER_STRING_SHORT, true);
2021-10-19 19:14:52 +02:00
$data = $this->import(self::FILE_DIR.'source/' . $zipFilename);
if ($data['success']) {
header("Refresh:0");
2021-11-22 09:48:54 +01:00
} else {
// Valeurs en sortie
$this->addOutput([
'notification' => $data['notification'],
'state' => $data['success'],
'title' => 'Gestion des thèmes',
'view' => 'manage'
]);;
}
2021-10-19 19:14:52 +02:00
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Gestion des thèmes',
'view' => 'manage'
]);
}
/**
* Importe un thème
* @param string Url du thème à télécharger
* @param @return array contenant $success = true ou false ; $ notification string message à afficher
*/
public function import($zipName = '') {
if ($zipName !== '' &&
file_exists($zipName)) {
// Init variables de retour
$success = false;
$notification = '';
// Dossier temporaire
$tempFolder = uniqid();
2021-10-19 19:14:52 +02:00
// Ouvrir le zip
2018-12-28 17:13:26 +01:00
$zip = new ZipArchive();
2021-10-19 19:14:52 +02:00
if ($zip->open($zipName) === TRUE) {
mkdir (self::TEMP_DIR . $tempFolder, 0755);
$zip->extractTo(self::TEMP_DIR . $tempFolder );
$modele = '';
// Archive de thème ?
if (
2021-10-19 19:14:52 +02:00
file_exists(self::TEMP_DIR . $tempFolder . '/site/data/custom.css')
AND file_exists(self::TEMP_DIR . $tempFolder . '/site/data/theme.css')
AND file_exists(self::TEMP_DIR . $tempFolder . '/site/data/theme.json')
) {
$modele = 'theme';
}
if(
file_exists(self::TEMP_DIR . $tempFolder . '/site/data/admin.json')
AND file_exists(self::TEMP_DIR . $tempFolder . '/site/data/admin.css')
) {
$modele = 'admin';
}
2020-11-07 17:48:10 +01:00
if (!empty($modele)
) {
// traiter l'archive
$success = $zip->extractTo('.');
// Substitution des fontes Google
if ($modele = 'theme') {
$c = $this->subFonts(self::DATA_DIR . 'theme.json');
// Un remplacement nécessite la régénération de la feuille de style
if ($c > 0
AND file_exists(self::DATA_DIR . 'theme.css')
) {
unlink(self::DATA_DIR . 'theme.css');
}
}
if ($modele = 'admin') {
$c = $this->subFonts(self::DATA_DIR . 'admin.json');
// Un remplacement nécessite la régénération de la feuille de style
if ($c > 0
AND file_exists(self::DATA_DIR . 'admin.css')
) {
unlink(self::DATA_DIR . 'admin.css');
}
}
// traitement d'erreur
$notification = $success ? 'Le thème a été importé' : 'Erreur lors de l\'extraction, vérifiez les permissions.';
} else {
// pas une archive de thème
$success = false;
$notification = 'Ce n\'est pas l\'archive d\'un thème !';
}
// Supprimer le dossier temporaire même si le thème est invalide
$this->removeDir(self::TEMP_DIR . $tempFolder);
2018-12-28 17:13:26 +01:00
$zip->close();
2018-12-29 17:49:48 +01:00
} else {
// erreur à l'ouverture
$success = false;
$notification = 'Impossible d\'ouvrir l\'archive';
2018-12-29 17:49:48 +01:00
}
2021-10-19 19:14:52 +02:00
return (['success' => $success, 'notification' => $notification]);
2018-12-27 20:06:03 +01:00
}
2021-10-19 19:14:52 +02:00
return (['success' => false, 'notification' => 'Archive non spécifiée ou introuvable']);
2018-12-25 18:38:17 +01:00
}
2020-06-02 12:03:45 +02:00
2018-12-25 16:24:20 +01:00
2018-12-25 16:24:20 +01:00
/**
* Export du thème
*/
2018-12-25 18:38:17 +01:00
public function export() {
// Make zip
$zipFilename = $this->zipTheme($this->getUrl(2));
2018-12-28 16:52:58 +01:00
// 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(self::TEMP_DIR . $zipFilename));
readfile(self::TEMP_DIR . $zipFilename);
2018-12-28 16:52:58 +01:00
// Nettoyage du dossier
unlink (self::TEMP_DIR . $zipFilename);
exit();
2018-12-28 16:52:58 +01:00
}
/**
* Export du thème
*/
public function save() {
// Make zip
$zipFilename = $this->zipTheme($this->getUrl(2));
// Téléchargement du ZIP
if (!is_dir(self::FILE_DIR.'source/theme')) {
mkdir(self::FILE_DIR.'source/theme', 0755);
}
copy (self::TEMP_DIR . $zipFilename , self::FILE_DIR.'source/theme/' . $zipFilename);
// Nettoyage du dossier
unlink (self::TEMP_DIR . $zipFilename);
// Valeurs en sortie
$this->addOutput([
'notification' => 'Archive <b>'.$zipFilename.'</b> sauvegardée avec succès',
'redirect' => helper::baseUrl() . 'theme/manage',
'state' => true
]);
}
/**
2021-12-15 19:03:52 +01:00
* construction du zip Fonction appelée par export() et save()
2020-05-18 18:26:21 +02:00
* @param string $modele theme ou admin
*/
private function zipTheme($modele) {
2018-12-26 12:00:30 +01:00
// Creation du dossier
2021-03-21 18:12:25 +01:00
$zipFilename = $modele . date('Y-m-d-H-i-s', time()) . '.zip';
$zip = new ZipArchive();
if ($zip->open(self::TEMP_DIR . $zipFilename, ZipArchive::CREATE | ZipArchive::OVERWRITE ) === TRUE) {
2020-05-18 18:26:21 +02:00
switch ($modele) {
case 'admin':
$zip->addFile(self::DATA_DIR.'admin.json',self::DATA_DIR.'admin.json');
$zip->addFile(self::DATA_DIR.'admin.css',self::DATA_DIR.'admin.css');
break;
case 'theme':
$zip->addFile(self::DATA_DIR.'theme.json',self::DATA_DIR.'theme.json');
$zip->addFile(self::DATA_DIR.'theme.css',self::DATA_DIR.'theme.css');
2020-06-02 12:03:45 +02:00
$zip->addFile(self::DATA_DIR.'custom.css',self::DATA_DIR.'custom.css');
2021-12-15 19:03:52 +01:00
// Traite l'image dans le body
2020-05-18 18:26:21 +02:00
if ($this->getData(['theme','body','image']) !== '' ) {
$zip->addFile(self::FILE_DIR.'source/'.$this->getData(['theme','body','image']),
self::FILE_DIR.'source/'.$this->getData(['theme','body','image'])
);
}
2021-12-15 19:03:52 +01:00
// Traite l'image dans le header
2020-06-02 12:03:45 +02:00
if ($this->getData(['theme','header','image']) !== '' ) {
2020-05-18 18:26:21 +02:00
$zip->addFile(self::FILE_DIR.'source/'.$this->getData(['theme','header','image']),
self::FILE_DIR.'source/'.$this->getData(['theme','header','image'])
);
}
2021-12-15 19:03:52 +01:00
// Traite les images du header perso
if (!empty($this->getData(['theme','header','featureFiles'])) ) {
foreach($this->getData(['theme','header','featureFiles']) as $value) {
$zip->addFile(self::FILE_DIR . 'source/' . $value,
2021-12-15 19:03:52 +01:00
self::FILE_DIR . 'source/' . $value );
}
}
2020-05-18 18:26:21 +02:00
break;
}
2018-12-28 15:03:23 +01:00
$ret = $zip->close();
}
return ($zipFilename);
}
/**
* Subsitution des fontes de Google Fonts vers CdnFont grâce à un tableau de conversion
* @param string $file, nom du fichier json à convertir
* @return int nombre de substitution effectuées
*/
private function subFonts($file) {
// Tableau de substitution des fontes
$fonts = [
'Abril+Fatface' => 'abril-fatface',
'Arimo' => 'arimo',
'Arvo' => 'arvo',
'Berkshire+Swash' => 'berkshire-swash',
'Cabin' => 'genera',
'Dancing+Script' => 'dancing-script',
'Droid+Sans' => 'droid-sans-2',
'Droid+Serif' => 'droid-serif-2',
'Fira+Sans' => 'fira-sans',
'Inconsolata' => 'inconsolata-2',
'Indie+Flower' =>'indie-flower',
'Josefin+Slab' => 'josefin-sans-std',
'Lobster' => 'lobster-2',
'Lora' => 'lora',
'Lato' =>'lato',
'Marvel' => 'montserrat-ace',
'Old+Standard+TT' => 'old-standard-tt-3',
'Open+Sans' =>'open-sans',
// Corriger l'erreur de nom de police installée par défaut, il manquait un O en majuscule
'open+Sans' =>'open-sans',
'Oswald' =>'oswald-4',
'PT+Mono' => 'pt-mono',
'PT+Serif' =>'pt-serif',
'Raleway' => 'raleway-5',
'Rancho' => 'rancho',
'Roboto' => 'Roboto',
'Signika' => 'signika',
'Ubuntu' => 'ubuntu',
'Vollkorn' => 'vollkorn'
];
$data = file_get_contents($file);
$count = 0;
foreach ($fonts as $oldId => $newId){
$data = str_replace($oldId, $newId, $data, $c);
$count = $count + (int) $c;
}
// Sauvegarder la chaîne modifiée
if ($count > 0) {
file_put_contents($file, $data);
}
// Retourner le nombre d'occurrences
return ($count);
}
2019-05-02 13:21:48 +02:00
}