Merge branch '114_dev' into 12_dev

This commit is contained in:
Fred Tempez 2022-04-27 20:11:34 +02:00
commit d24379e1cf
19 changed files with 247 additions and 243 deletions

View File

@ -1,6 +1,6 @@
<?php <?php
class template { class template {
/** /**
* Crée un bouton * Crée un bouton
@ -120,7 +120,7 @@ class template {
copy ('core/vendor/zwiico/png/' . $attributes['type'] . '/' . $letters[$firstNumber] . '.png', 'site/tmp/' . $firstLetter . '.png'); copy ('core/vendor/zwiico/png/' . $attributes['type'] . '/' . $letters[$firstNumber] . '.png', 'site/tmp/' . $firstLetter . '.png');
copy ('core/vendor/zwiico/png/' . $attributes['type'] . '/' . $letters[$secondNumber] . '.png', 'site/tmp/' . $secondLetter . '.png'); copy ('core/vendor/zwiico/png/' . $attributes['type'] . '/' . $letters[$secondNumber] . '.png', 'site/tmp/' . $secondLetter . '.png');
// Début du wrapper // Début du wrapper
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="captcha inputWrapper ' . $attributes['classWrapper'] . '">'; $html = '<div id="' . $attributes['id'] . 'Wrapper" class="captcha inputWrapper ' . $attributes['classWrapper'] . '">';
// Label // Label
@ -449,7 +449,7 @@ class template {
$lang = 'fr'; $lang = 'fr';
} }
} }
return '<img class="flag" src="' . helper::baseUrl(false) . 'core/vendor/i18n/png/' . $lang . '.png" return '<img class="flag" src="' . helper::baseUrl(false) . 'core/vendor/i18n/png/' . $lang . '.png"
width="' . $size .'" width="' . $size .'"
height="' . $size .'" height="' . $size .'"
title="' . $lang .'" title="' . $lang .'"
@ -614,8 +614,13 @@ class template {
'label' => '', 'label' => '',
'name' => $nameId, 'name' => $nameId,
'selected' => '', 'selected' => '',
'fonts' => false 'fonts' => []
], $attributes); ], $attributes);
// Stocker les fontes et remettre à zéro le tableau des fontes transmis pour éviter une erreur de sprintAttributes
if (empty($attributes['fonts']) === false) {
$fonts = $attributes['fonts'];
$attributes['fonts'] = [];
}
// Sauvegarde des données en cas d'erreur // Sauvegarde des données en cas d'erreur
if($attributes['before'] AND array_key_exists($attributes['id'], common::$inputBefore)) { if($attributes['before'] AND array_key_exists($attributes['id'], common::$inputBefore)) {
$attributes['selected'] = common::$inputBefore[$attributes['id']]; $attributes['selected'] = common::$inputBefore[$attributes['id']];
@ -628,7 +633,7 @@ class template {
'help' => $attributes['help'] 'help' => $attributes['help']
]); ]);
} }
// Notice // Notice
$notice = ''; $notice = '';
if(array_key_exists($attributes['id'], common::$inputNotices)) { if(array_key_exists($attributes['id'], common::$inputNotices)) {
$notice = common::$inputNotices[$attributes['id']]; $notice = common::$inputNotices[$attributes['id']];
@ -640,12 +645,14 @@ class template {
helper::sprintAttributes($attributes) helper::sprintAttributes($attributes)
); );
foreach($options as $value => $text) { foreach($options as $value => $text) {
$html .= $attributes['fonts'] === true ? sprintf( // Select des liste de fontes
$html .= isset($fonts) ? sprintf(
'<option value="%s"%s style="font-family: %s;">%s</option>', '<option value="%s"%s style="font-family: %s;">%s</option>',
$value, $value,
$attributes['selected'] == $value ? ' selected' : '', // Double == pour ignorer le type de variable car $_POST change les types en string $attributes['selected'] == $value ? ' selected' : '', // Double == pour ignorer le type de variable car $_POST change les types en string
$text, $fonts[$value],
$text $text
// Select standard
) : sprintf( ) : sprintf(
'<option value="%s"%s>%s</option>', '<option value="%s"%s>%s</option>',
$value, $value,

View File

@ -183,14 +183,9 @@ class common {
'font-family' => 'Arial, Helvetica, sans-serif', 'font-family' => 'Arial, Helvetica, sans-serif',
'resource' => 'websafe' 'resource' => 'websafe'
], ],
'arial-black' => [ 'arvo'=> [
'name' => 'Arial Black', 'name' => 'Arvo',
'font-family' => '\'Arial Black\', Gadget, sans-serif', 'font-family' => 'Arvo, sans-serif',
'resource' => 'websafe'
],
'courrier' => [
'name' => 'Courier',
'font-family' => 'Courier, \'Liberation Mono\', monospace',
'resource' => 'websafe' 'resource' => 'websafe'
], ],
'courrier-new' => [ 'courrier-new' => [
@ -213,11 +208,21 @@ class common {
'font-family' => 'Impact, Charcoal, sans-serif', 'font-family' => 'Impact, Charcoal, sans-serif',
'resource' => 'websafe' 'resource' => 'websafe'
], ],
'lora'=> [
'name' => 'Lora',
'font-family' => 'Lora, serif',
'resource' => 'websafe'
],
'lucida' => [ 'lucida' => [
'name' => 'Lucida', 'name' => 'Lucida',
'font-family' => '\'Lucida Sans Unicode\', \'Lucida Grande\', sans-serif', 'font-family' => '\'Lucida Sans Unicode\', \'Lucida Grande\', sans-serif',
'resource' => 'websafe' 'resource' => 'websafe'
], ],
'roboto'=> [
'name' => 'Roboto',
'font-family' => 'Roboto, sans-serif',
'resource' => 'websafe'
],
'tahoma' => [ 'tahoma' => [
'name' => 'Tahoma', 'name' => 'Tahoma',
'font-family' => 'Tahoma, Geneva, sans-serif', 'font-family' => 'Tahoma, Geneva, sans-serif',
@ -1321,9 +1326,6 @@ class common {
*/ */
echo '<div class="'. $content . '" id="contentSite">'; echo '<div class="'. $content . '" id="contentSite">';
$this->showContent(); $this->showContent();
if (file_exists(self::DATA_DIR . 'body.inc.html')) {
include(self::DATA_DIR . 'body.inc.html');
}
echo '</div>'; echo '</div>';
/** /**
* Barre droite * Barre droite
@ -2105,14 +2107,18 @@ class common {
// Import des styles liés à la page // Import des styles liés à la page
if($this->output['style']) { if($this->output['style']) {
echo '<base href="' . helper::baseUrl(true) .'">'; echo '<base href="' . helper::baseUrl(true) .'">';
// Import de la feuille de style des pages admin
if (strpos($this->output['style'], 'admin.css') >= 1 ) { if (strpos($this->output['style'], 'admin.css') >= 1 ) {
echo '<link rel="stylesheet" href="' . self::DATA_DIR . 'admin.css?' . md5_file(self::DATA_DIR .'admin.css') . '">'; echo '<link rel="stylesheet" href="' . self::DATA_DIR . 'admin.css?' . md5_file(self::DATA_DIR .'admin.css') . '">';
} }
echo '<style type="text/css">' . helper::minifyCss($this->output['style']) . '</style>'; echo '<style type="text/css">' . helper::minifyCss($this->output['style']) . '</style>';
} }
// Import des fontes liées au thème // Import des fontes
if (file_exists(self::DATA_DIR.'fonts/fonts.html')) { if ( file_exists(self::DATA_DIR . 'fonts/fonts.html') ){
include_once(self::DATA_DIR.'fonts/fonts.html'); include_once(self::DATA_DIR . 'fonts/fonts.html');
}
if ( file_exists(self::DATA_DIR . 'fonts/fonts.css') ){
echo '<link rel="stylesheet" href="' . helper::baseUrl(false) . self::DATA_DIR . 'fonts/fonts.css?' . md5_file(self::DATA_DIR .'fonts/fonts.css') . '">';
} }
} }
@ -2283,73 +2289,18 @@ class core extends common {
// Version // Version
$css = '/*' . md5(json_encode($this->getData(['theme']))) . '*/'; $css = '/*' . md5(json_encode($this->getData(['theme']))) . '*/';
/** /**
* Import des polices de caractères * Import des polices de caractères
* A partir du CDN
* ou dans le dossier site/file/source/fonts
* ou pas du tout si fonte webSafe
*/ */
// Fonts disponibles $f ['files'] = $this->getData(['fonts', 'files']);
$fontsAvailable ['files'] = $this->getData(['fonts', 'files']); $f ['imported'] = $this->getData(['fonts', 'imported']);
$fontsAvailable ['imported'] = $this->getData(['fonts', 'imported']); $f ['websafe'] = self::$fontsWebSafe;
$fontsAvailable ['websafe'] = self::$fontsWebSafe; // Construit un tableau avec leur ID et leur famille
foreach(['websafe', 'imported', 'files'] as $type) {
// Fontes installées if (is_array($f[$type])) {
$fonts = [ $this->getData(['theme', 'text', 'font']), foreach ($f[$type] as $fontId => $fontValue ) {
$this->getData(['theme', 'title', 'font']), $fonts[$fontId] = $fontValue['font-family'];
$this->getData(['theme', 'header', 'font']),
$this->getData(['theme', 'menu', 'font']),
$this->getData(['theme', 'footer', 'font'])
];
// Suppression des polices identiques
$fonts = array_unique($fonts);
/**
* Charge les fontes websafe
*/
foreach ($fonts as $fontId) {
if ( isset($fontsAvailable['websafe'][$fontId])) {
$fonts [$fontId] = $fontsAvailable['websafe'][$fontId]['font-family'];
}
}
/**
* Chargement des polices en ligne dans un fichier fonts.html inclus dans main.php
*/
$fontFile = '';
$gf = false;
foreach ($fonts as $fontId) {
if ( isset($fontsAvailable['imported'][$fontId])) {
$fontFile .= '<link href="' . $fontsAvailable['imported'][$fontId]['resource'] .'" rel="stylesheet">';
// Tableau pour la construction de la feuille de style
$fonts [$fontId] = $fontsAvailable['imported'][$fontId]['font-family'];
$gf = strpos($fontsAvailable['imported'][$fontId]['resource'], 'fonts.googleapis.com') === false ? $gf || false : $gf || true;
}
}
// Ajoute le préconnect des fontes Google.
$fontFile = $gf ? '<link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>' . $fontFile
: $fontFile;
// Enregistre la personnalisation
file_put_contents(self::DATA_DIR.'fonts/fonts.html', $fontFile);
/**
* Fontes installées localement
*/
foreach ($fonts as $fontId) {
// Validité du tableau :
if ( isset($fontsAvailable['files'][$fontId]) ) {
if (file_exists(self::DATA_DIR . 'fonts/' . $fontId) ) {
// Chargement de la police
//$formatFont = explode('.', self::DATA_DIR . 'fonts/' . $fontName);
$css .= '@font-face {font-family:"' . $fontsAvailable['files'][$fontId]['font-family'] . '";';
$css .= 'src: url("' . helper::baseUrl(false) . self::DATA_DIR . 'fonts/' .$fontsAvailable['files'][$fontId]['resource'] . '");}';
// Tableau pour la construction de la feuille de style
$fonts [$fontId] = $fontsAvailable['files'][$fontId]['font-family'];
} else {
// Le fichier de font n'est pas disponible, fonte par défaut
$fonts [$fontId] = 'verdana';
} }
} }
} }
@ -2520,12 +2471,6 @@ class core extends common {
$css .= '#footerText > p {text-align:' . $this->getData(['theme', 'footer', 'textAlign']) . '}'; $css .= '#footerText > p {text-align:' . $this->getData(['theme', 'footer', 'textAlign']) . '}';
$css .= '#footerCopyright{text-align:' . $this->getData(['theme', 'footer', 'copyrightAlign']) . '}'; $css .= '#footerCopyright{text-align:' . $this->getData(['theme', 'footer', 'copyrightAlign']) . '}';
// Enregistre les fontes
if (!is_dir(self::DATA_DIR . 'fonts')) {
mkdir(self::DATA_DIR . 'fonts');
}
file_put_contents(self::DATA_DIR . 'fonts/fonts.html', $fontFile);
// Enregistre la personnalisation // Enregistre la personnalisation
file_put_contents(self::DATA_DIR.'theme.css', $css); file_put_contents(self::DATA_DIR.'theme.css', $css);
@ -2544,60 +2489,18 @@ class core extends common {
// Version // Version
$css = '/*' . md5(json_encode($this->getData(['admin']))) . '*/'; $css = '/*' . md5(json_encode($this->getData(['admin']))) . '*/';
// Fonts disponibles
$fontsAvailable ['files'] = $this->getData(['fonts', 'files']);
$fontsAvailable ['imported'] = $this->getData(['fonts', 'imported']);
$fontsAvailable ['websafe'] = self::$fontsWebSafe;
/** /**
* Import des polices de caractères * Import des polices de caractères
* A partir du CDN ou dans le dossier site/file/source/fonts
*/ */
$fonts = [ $this->getData(['admin', 'fontText']),
$this->getData(['admin', 'fontTitle']),
];
// Suppression des polices identiques
$fonts = array_unique($fonts);
/** $f ['files'] = $this->getData(['fonts', 'files']);
* Charge les fontes websafe $f ['imported'] = $this->getData(['fonts', 'imported']);
*/ $f ['websafe'] = self::$fontsWebSafe;
foreach ($fonts as $fontId) { // Construit un tableau avec leur ID et leur famille
if ( isset($fontsAvailable['websafe'][$fontId])) { foreach(['websafe', 'imported', 'files'] as $type) {
$fonts [$fontId] = $fontsAvailable['websafe'][$fontId]['font-family']; if (is_array($f[$type])) {
} foreach ($f[$type] as $fontId => $fontValue ) {
} $fonts[$fontId] = $fontValue['font-family'];
/**
* Chargement des polices en ligne dans un fichier fonts.html inclus dans main.php
*/
$fontFile = '';
foreach ($fonts as $fontId) {
if ( isset($fontsAvailable['imported'][$fontId])) {
$fontFile .= '<link href="' . $fontsAvailable['imported'][$fontId]['resource'] .'" rel="stylesheet">';
// Tableau pour la construction de la feuille de style
$fonts [$fontId] = $fontsAvailable['imported'][$fontId]['font-family'];
}
}
// Enregistre la personnalisation
file_put_contents(self::DATA_DIR.'fonts/fonts.html', $fontFile);
/**
* Fontes installées localement
*/
foreach ($fonts as $fontId) {
// Validité du tableau :
if ( isset($fontsAvailable['files'][$fontId]) ) {
if (file_exists(self::DATA_DIR . 'fonts/' . $fontId) ) {
// Chargement de la police
//$formatFont = explode('.', self::DATA_DIR . 'fonts/' . $fontName);
$css .= '@font-face {font-family:"' . $fontsAvailable['files'][$fontId]['font-family'] . '";';
$css .= 'src: url("' . helper::baseUrl(false) . self::DATA_DIR . 'fonts/' .$fontsAvailable['files'][$fontId]['resource'] . '");}';
// Tableau pour la construction de la feuille de style
$fonts [$fontId] = $fontsAvailable['files'][$fontId]['font-family'];
} else {
// Le fichier de font n'est pas disponible, fonte par défaut
$fonts [$fontId] = 'verdana';
} }
} }
} }

View File

@ -705,11 +705,6 @@ if ($this->getData(['core', 'dataVersion']) < 11400) {
'font-family' => 'Arimo, sans-serif', 'font-family' => 'Arimo, sans-serif',
'resource' => 'https://fonts.cdnfonts.com/css/arimo' 'resource' => 'https://fonts.cdnfonts.com/css/arimo'
], ],
'arvo'=> [
'name' => 'Arvo',
'font-family' => 'Arvo, sans-serif',
'resource' => 'https://fonts.cdnfonts.com/css/arvo'
],
'dancing-script' => [ 'dancing-script' => [
'name' => 'Dancing Script', 'name' => 'Dancing Script',
'font-family' => '\'Dancing Script\', sans-serif', 'font-family' => '\'Dancing Script\', sans-serif',
@ -733,7 +728,7 @@ if ($this->getData(['core', 'dataVersion']) < 11400) {
'fira-sans' => [ 'fira-sans' => [
'name' => 'Fira Sans', 'name' => 'Fira Sans',
'font-family' => '\'Fira Sans\', sans-serif', 'font-family' => '\'Fira Sans\', sans-serif',
'resource' => 'https://fonts.cdnfonts.com/css/fira' 'resource' => 'https://fonts.cdnfonts.com/css/fira-sans'
], ],
'liberation-sans'=> [ 'liberation-sans'=> [
'name' => 'Liberation Sans', 'name' => 'Liberation Sans',
@ -755,11 +750,6 @@ if ($this->getData(['core', 'dataVersion']) < 11400) {
'font-family' => 'Lato, sans-serif', 'font-family' => 'Lato, sans-serif',
'resource' => 'https://fonts.cdnfonts.com/css/lato' 'resource' => 'https://fonts.cdnfonts.com/css/lato'
], ],
'lora'=> [
'name' => 'Lora',
'font-family' => 'Lora, serif',
'resource' => 'https://fonts.cdnfonts.com/css/lora'
],
'old-standard-tt-3'=> [ 'old-standard-tt-3'=> [
'name' => 'Old Standard TT', 'name' => 'Old Standard TT',
'font-family' => '\'Old Standard TT\', serif', 'font-family' => '\'Old Standard TT\', serif',
@ -790,11 +780,6 @@ if ($this->getData(['core', 'dataVersion']) < 11400) {
'font-family' => 'Rancho, sans-serif', 'font-family' => 'Rancho, sans-serif',
'resource' => 'https://fonts.cdnfonts.com/css/rancho' 'resource' => 'https://fonts.cdnfonts.com/css/rancho'
], ],
'roboto'=> [
'name' => 'Roboto',
'font-family' => 'Roboto, sans-serif',
'resource' => 'https://fonts.cdnfonts.com/css/roboto'
],
'ubuntu'=> [ 'ubuntu'=> [
'name' => 'Ubuntu', 'name' => 'Ubuntu',
'font-family' => 'Ubuntu, sans-serif', 'font-family' => 'Ubuntu, sans-serif',
@ -811,7 +796,8 @@ if ($this->getData(['core', 'dataVersion']) < 11400) {
$files = $this->getData(['fonts', 'files']); $files = $this->getData(['fonts', 'files']);
if (is_array($files)) { if (is_array($files)) {
foreach ($files as $fontId => $fontName) { foreach ($files as $fontId => $fontName) {
if (file_exists(self::DATA_DIR . 'fonts/' . $fontName)) { if ( gettype($fontName) === 'string'
&& file_exists(self::DATA_DIR . 'fonts/' . $fontName)) {
$this->setData(['fonts', 'files', $fontId, [ $this->setData(['fonts', 'files', $fontId, [
'name' => ucfirst($fontId), 'name' => ucfirst($fontId),
'font-family'=> '\'' . ucfirst($fontId) . '\', sans-serif', 'font-family'=> '\'' . ucfirst($fontId) . '\', sans-serif',
@ -825,11 +811,13 @@ if ($this->getData(['core', 'dataVersion']) < 11400) {
$imported = $this->getData(['fonts', 'imported']); $imported = $this->getData(['fonts', 'imported']);
if (is_array($imported)) { if (is_array($imported)) {
foreach ($imported as $fontId => $fontUrl) { foreach ($imported as $fontId => $fontUrl) {
$this->setData(['fonts', 'imported', $fontId, [ if ( gettype($fontUrl) === 'string' ) {
'name' => ucfirst($fontId), $this->setData(['fonts', 'imported', $fontId, [
'font-family'=> '\'' . ucfirst($fontId) . '\', sans-serif', 'name' => ucfirst($fontId),
'resource' => 'https:\\fonts.cdnfonts.com\css' . $fontUrl 'font-family'=> '\'' . ucfirst($fontId) . '\', sans-serif',
]]); 'resource' => 'https:\\fonts.cdnfonts.com\css' . $fontUrl
]]);
}
} }
} }
// Importation des fontes exemples // Importation des fontes exemples
@ -861,7 +849,7 @@ if ($this->getData(['core', 'dataVersion']) < 11400) {
*/ */
// Suppression de la variable URL dans core // Suppression de la variable URL dans core
//$this->deleteData(['core', 'baseUrl']); $this->deleteData(['core', 'baseUrl']);
// Mise à jour // Mise à jour
$this->setData(['core', 'dataVersion', 11400]); $this->setData(['core', 'dataVersion', 11400]);

View File

@ -13,7 +13,8 @@
<link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/common.css"> <link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/common.css">
<link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/blank.css"> <link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/blank.css">
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>theme.css?<?php echo md5_file(self::DATA_DIR.'theme.css'); ?>"> <link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>theme.css?<?php echo md5_file(self::DATA_DIR.'theme.css'); ?>">
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>custom.css?<?php echo md5_file(self::DATA_DIR.'custom.css'); ?>"></head> <link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>custom.css?<?php echo md5_file(self::DATA_DIR.'custom.css'); ?>">
</head>
<body> <body>
<?php $this->showContent(); ?> <?php $this->showContent(); ?>
<?php $this->showScript(); ?> <?php $this->showScript(); ?>

View File

@ -13,6 +13,7 @@
<link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/common.css?<?php echo md5_file('core/layout/common.css');?>"> <link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/common.css?<?php echo md5_file('core/layout/common.css');?>">
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>theme.css?<?php echo md5_file(self::DATA_DIR.'theme.css'); ?>"> <link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>theme.css?<?php echo md5_file(self::DATA_DIR.'theme.css'); ?>">
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>custom.css?<?php echo md5_file(self::DATA_DIR.'custom.css'); ?>"> <link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>custom.css?<?php echo md5_file(self::DATA_DIR.'custom.css'); ?>">
<!-- Détection RSS --> <!-- Détection RSS -->
<?php if ( ( $this->getData(['page', $this->getUrl(0), 'moduleId']) === 'blog' <?php if ( ( $this->getData(['page', $this->getUrl(0), 'moduleId']) === 'blog'
OR $this->getData(['page', $this->getUrl(0), 'moduleId']) === 'news' ) OR $this->getData(['page', $this->getUrl(0), 'moduleId']) === 'news' )
@ -20,6 +21,7 @@
<link rel="alternate" type="application/rss+xml" href="'<?php echo helper::baseUrl(). $this->getUrl(0) . '/rss';?>" title="fLUX rss"> <link rel="alternate" type="application/rss+xml" href="'<?php echo helper::baseUrl(). $this->getUrl(0) . '/rss';?>" title="fLUX rss">
<?php endif; ?> <?php endif; ?>
<?php $this->showStyle(); ?> <?php $this->showStyle(); ?>
<!-- Script perso dans le header -->
<?php if (file_exists(self::DATA_DIR .'head.inc.html')) { <?php if (file_exists(self::DATA_DIR .'head.inc.html')) {
include(self::DATA_DIR .'head.inc.html'); include(self::DATA_DIR .'head.inc.html');
}?> }?>
@ -186,6 +188,10 @@
<?php $this->showCookies(); ?> <?php $this->showCookies(); ?>
<!-- Les scripts --> <!-- Les scripts -->
<?php $this->showScript();?> <?php $this->showScript();?>
<!-- Script perso dans body -->
<?php if (file_exists(self::DATA_DIR . 'body.inc.html')) {
include(self::DATA_DIR . 'body.inc.html');
}
?>
</body> </body>
</html> </html>

View File

@ -583,8 +583,6 @@ class config extends common {
// Change le statut de la réécriture d'URL (pour le helper::baseUrl() de la redirection) // Change le statut de la réécriture d'URL (pour le helper::baseUrl() de la redirection)
helper::$rewriteStatus = false; helper::$rewriteStatus = false;
} }
// Met à jour la baseUrl
$this->setData(['core', 'baseUrl', helper::baseUrl(true,false) ]);
} }
// Générer robots.txt et sitemap // Générer robots.txt et sitemap
$this->siteMap(); $this->siteMap();

View File

@ -122,9 +122,6 @@ class install extends common {
mkdir(self::DATA_DIR . 'fonts'); mkdir(self::DATA_DIR . 'fonts');
} }
// Stocker le dossier d'installation
$this->setData(['core', 'baseUrl', helper::baseUrl(false,false) ]);
// Installation du thème sélectionné // Installation du thème sélectionné
$dataThemes = file_get_contents('core/module/install/ressource/themes/themes.json'); $dataThemes = file_get_contents('core/module/install/ressource/themes/themes.json');
$dataThemes = json_decode($dataThemes, true); $dataThemes = json_decode($dataThemes, true);

View File

@ -57,12 +57,11 @@ class init extends common {
] ]
], ],
'core' => [ 'core' => [
'dataVersion' => 11300, 'dataVersion' => 11400,
'lastBackup' => 0, 'lastBackup' => 0,
'lastClearTmp' => 0, 'lastClearTmp' => 0,
'lastAutoUpdate' => 0, 'lastAutoUpdate' => 0,
'updateAvailable' => false, 'updateAvailable' => false
'baseUrl' => ''
], ],
'locale' => [ 'locale' => [
'homePageId' => 'accueil', 'homePageId' => 'accueil',

View File

@ -232,7 +232,8 @@ class theme extends common {
// Variable pour construire la liste des pages du site // Variable pour construire la liste des pages du site
public static $pagesList = []; public static $pagesList = [];
// Variable pour construire la liste des fontes installées // Variable pour construire la liste des fontes installées
public static $fontsList = []; public static $fontsNames= [];
public static $fonts = [];
// Variable pour détailler les fontes installées // Variable pour détailler les fontes installées
public static $fontsDetail = []; public static $fontsDetail = [];
@ -267,6 +268,8 @@ class theme extends common {
} }
// Lire les fontes installées // Lire les fontes installées
$this->enumFonts(); $this->enumFonts();
// Toutes les fontes installées sont chargées
$this->setFonts('all');
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'title' => 'Administration', 'title' => 'Administration',
@ -403,6 +406,8 @@ class theme extends common {
} }
// Lire les fontes installées // Lire les fontes installées
$this->enumFonts(); $this->enumFonts();
// Toutes les fontes installées sont chargées
$this->setFonts('all');
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'title' => 'Personnalisation du pied de page', 'title' => 'Personnalisation du pied de page',
@ -481,6 +486,8 @@ class theme extends common {
} }
// Lire les fontes installées // Lire les fontes installées
$this->enumFonts(); $this->enumFonts();
// Toutes les fontes installées sont chargées
$this->setFonts('all');
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'title' => 'Personnalisation de la bannière', 'title' => 'Personnalisation de la bannière',
@ -496,6 +503,10 @@ class theme extends common {
* Accueil de la personnalisation * Accueil de la personnalisation
*/ */
public function index() { public function index() {
// Restaurer les fontes utilisateurs
$this->setFonts('user');
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'title' => 'Personnalisation des thèmes', 'title' => 'Personnalisation des thèmes',
@ -542,6 +553,8 @@ class theme extends common {
} }
// Lire les fontes installées // Lire les fontes installées
$this->enumFonts(); $this->enumFonts();
// Toutes les fontes installées sont chargées
$this->setFonts('all');
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'title' => 'Personnalisation du menu', 'title' => 'Personnalisation du menu',
@ -557,6 +570,9 @@ class theme extends common {
*/ */
public function fonts() { public function fonts() {
// Toutes les fontes installées sont chargées
$this->setFonts('all');
// Polices liées au thème // Polices liées au thème
$used = [ $used = [
'Bannière' => $this->getData (['theme', 'header', 'font']), 'Bannière' => $this->getData (['theme', 'header', 'font']),
@ -652,7 +668,7 @@ class theme extends common {
if ( $type === 'files' && if ( $type === 'files' &&
file_exists(self::FILE_DIR . 'source/' . $ressource) file_exists(self::FILE_DIR . 'source/' . $ressource)
) { ) {
copy ( self::FILE_DIR . 'source/' . $ressource, self::DATA_DIR . $ressource ); copy ( self::FILE_DIR . 'source/' . $ressource, self::DATA_DIR . 'fonts/' . $ressource );
} }
// Valeurs en sortie // Valeurs en sortie
@ -703,7 +719,7 @@ class theme extends common {
if ( $type === 'files' && if ( $type === 'files' &&
file_exists(self::FILE_DIR . 'source/' . $ressource) file_exists(self::FILE_DIR . 'source/' . $ressource)
) { ) {
copy ( self::FILE_DIR . 'source/' . $ressource, self::DATA_DIR . $ressource ); copy ( self::FILE_DIR . 'source/' . $ressource, self::DATA_DIR . 'fonts/' . $ressource );
} }
// Valeurs en sortie // Valeurs en sortie
@ -839,6 +855,8 @@ class theme extends common {
} }
// Lire les fontes installées // Lire les fontes installées
$this->enumFonts(); $this->enumFonts();
// Toutes les fontes installées sont chargées
$this->setFonts('all');
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'title' => 'Personnalisation du site', 'title' => 'Personnalisation du site',
@ -1124,7 +1142,11 @@ class theme extends common {
// Retourne un tableau simple des fonts installées idfont avec le nom // Retourne un tableau simple des fonts installées idfont avec le nom
// Cette fonction est utile aux sélecteurs de fonts dans les formulaires. // Cette fonction est utile aux sélecteurs de fonts dans les formulaires.
public function enumFonts() { public function enumFonts() {
// Récupère la liste des fontes installées /**
* Récupère la liste des fontes installées et construit deux tableaux
* id - nom
* id - font-family - resource
*/
$f ['files'] = $this->getData(['fonts', 'files']); $f ['files'] = $this->getData(['fonts', 'files']);
$f ['imported'] = $this->getData(['fonts', 'imported']); $f ['imported'] = $this->getData(['fonts', 'imported']);
$f ['websafe'] = self::$fontsWebSafe; $f ['websafe'] = self::$fontsWebSafe;
@ -1132,12 +1154,87 @@ class theme extends common {
foreach(['websafe', 'imported', 'files'] as $type) { foreach(['websafe', 'imported', 'files'] as $type) {
if (is_array($f[$type])) { if (is_array($f[$type])) {
foreach ($f[$type] as $fontId => $fontValue ) { foreach ($f[$type] as $fontId => $fontValue ) {
$fonts [$fontId] = $fontValue['name']; self::$fonts['name'][$fontId] = $fontValue['name'];
self::$fonts['family'][$fontId] = $fontValue['font-family'];
} }
} }
} }
ksort($fonts); // Liste des fontes pour les sélecteurs
self::$fontsList = $fonts; ksort(self::$fonts['name']);
ksort(self::$fonts['family']);
}
/**
* Création d'un fichier de liens d'appel des fontes
* @param string $scope vaut all pour toutes les fontes ; 'user' pour les fontes utilisateurs
*/
private function setFonts($scope = 'all') {
// Filtrage par fontes installées
$fontsInstalled = [ $this->getData(['theme', 'text', 'font']),
$this->getData(['theme', 'title', 'font']),
$this->getData(['theme', 'header', 'font']),
$this->getData(['theme', 'menu', 'font']),
$this->getData(['theme', 'footer', 'font']),
$this->getData(['admin', 'fontText']),
$this->getData(['admin', 'fontTitle']),
];
// Compression
$fontsInstalled = array_unique($fontsInstalled);
/**
* Chargement des polices en ligne dans un fichier fonts.html inclus dans main.php
*/
$gf = false;
$fileContent = '<!-- Fontes personnalisées -->';
foreach ($this->getData(['fonts', 'imported']) as $fontId => $fontValue) {
if (
( $scope === 'user' && in_array($fontId, $fontsInstalled) )
|| $scope === 'all'
) {
//Pré chargement à revoir
//$fileContent .= '<link rel="preload" href="' . $fontValue['resource'] . '" crossorigin="anonymous" as="style">';
$fileContent .= '<link href="' . $fontValue['resource'] .'" rel="stylesheet">';
// Pré connect pour api.google
$gf = strpos($fontValue['resource'], 'fonts.googleapis.com') === false ? $gf || false : $gf || true;
}
}
// Ajoute le préconnect des fontes Googles.
$fileContent = $gf ? '<link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>' . $fileContent
: $fileContent;
/**
* Fontes installées localement
*/
$fileContentCss = '';
foreach ($this->getData(['fonts', 'files']) as $fontId => $fontValue) {
if (
( $scope === 'user' && in_array($fontId, $fontsInstalled) )
|| $scope === 'all'
) {
if (file_exists(self::DATA_DIR . 'fonts/' . $fontValue['resource']) ) {
// Extension
$path_parts = pathinfo(helper::baseUrl(false) . self::DATA_DIR . 'fonts/' . $fontValue['resource']);
// Chargement de la police
$fileContentCss .= '@font-face {' ;
$fileContentCss .= 'font-family:"' . $fontId . '";';
$fileContentCss .= 'src: url("' . $fontValue['resource'] . '") format("' . $path_parts['extension'] . '");';
$fileContentCss .= '}' ;
// Préchargement
//$fileContent = '<link rel="preload" href="' . self::DATA_DIR . 'fonts/' . $fontValue['resource'] . '" type="font/woff" crossorigin="anonymous" as="font">' . $fileContent;
}
}
}
// Enregistre la personnalisation
file_put_contents(self::DATA_DIR.'fonts/fonts.html', $fileContent);
// Enregistre la personnalisation
file_put_contents(self::DATA_DIR.'fonts/fonts.css', $fileContentCss);
} }
} }

View File

@ -128,10 +128,10 @@
<h4>Mise en forme du texte</h4> <h4>Mise en forme du texte</h4>
<div class="row"> <div class="row">
<div class="col4"> <div class="col4">
<?php echo template::select('adminFontText', $module::$fontsList, [ <?php echo template::select('adminFontText', $module::$fonts['name'], [
'label' => 'Police du texte', 'label' => 'Police du texte',
'selected' => $this->getData(['admin', 'fontText']), 'selected' => $this->getData(['admin', 'fontText']),
'fonts' => true 'fonts' => $module::$fonts['family']
]); ?> ]); ?>
</div> </div>
<div class="col4"> <div class="col4">
@ -141,10 +141,10 @@
]); ?> ]); ?>
</div> </div>
<div class="col4"> <div class="col4">
<?php echo template::select('adminFontTitle', $module::$fontsList, [ <?php echo template::select('adminFontTitle', $module::$fonts['name'], [
'label' => 'Police des titres', 'label' => 'Police des titres',
'selected' => $this->getData(['admin', 'fontTitle']), 'selected' => $this->getData(['admin', 'fontTitle']),
'fonts' => true 'fonts' => $module::$fonts['family']
]); ?> ]); ?>
</div> </div>
</div> </div>

View File

@ -1,23 +1,21 @@
<?php echo template::formOpen('fontAddForm'); ?> <?php echo template::formOpen('fontAddForm'); ?>
<div class="row"> <div class="row">
<div class="col2"> <div class="col1">
<?php echo template::button('fontAddBack', [ <?php echo template::button('fontAddBack', [
'class' => 'buttonGrey', 'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'theme/fonts', 'href' => helper::baseUrl() . 'theme/fonts',
'ico' => 'left', 'value' => template::ico('left')
'value' => 'Retour'
]); ?> ]); ?>
</div> </div>
<div class="col2"> <div class="col1">
<?php echo template::button('fontAddHelp', [ <?php echo template::button('fontAddHelp', [
'href' => 'https://doc.zwiicms.fr/fontes#add', 'href' => 'https://doc.zwiicms.fr/fontes#add',
'target' => '_blank', 'target' => '_blank',
'ico' => 'help', 'value' => template::ico('help'),
'value' => 'Aide',
'class' => 'buttonHelp' 'class' => 'buttonHelp'
]); ?> ]); ?>
</div> </div>
<div class="col2 offset6"> <div class="col2 offset8">
<?php echo template::submit('fontAddPublish', [ <?php echo template::submit('fontAddPublish', [
'value' => 'Valider', 'value' => 'Valider',
'uniqueSubmission' => true 'uniqueSubmission' => true

View File

@ -10,35 +10,50 @@
*/ */
/** /**
* Option par défaut du sélecteur de mode * Option par défaut du sélecteur de mode
*/ */
$(document).ready(function(){ $(document).ready(function(){
$('input[name=fontEditFontImported]').prop('checked', true); if( $('input[name=fontEditFontImported]').is(':checked') ){
$('input[name=fontEditFontUrl]').prop('checked', false); $('#containerfontEditFile').hide();
$('#containerfontEditFile').hide(); $('#containerfontEditUrl').show();
$('#fontEditFontFileWrapper').hide();
$('input[name=fontEditFontImported]').attr('disabled', 'disabled');
}
if( $('input[name=fontEditFontFile]').is(':checked') ){
$('#containerfontEditFile').show();
$('#containerfontEditUrl').hide();
$('#fontEditFontImportedWrapper').hide();
$('input[name=fontEditFontFile]').attr('disabled', 'disabled');
}
}); });
/** /**
* Mode téléchargement en ligne de la fonte ou installation locale * Mode téléchargement en ligne de la fonte ou installation locale
*/
$("input[name=fontEditFontImported]").on("click", function() {
if( $('input[name=fontEditFontImported]').is(':checked') ){
$('input[name=fontEditFontFile]').prop('checked', false);
} else {
$('input[name=fontEditFontFile]').prop('checked', true);
}
$('#containerfontEditFile').hide();
$('#containerfontEditUrl').show();
});
$("input[name=fontEditFontFile]").on("click", function() { $("input, select").on("change", function() {
if( $('input[name=fontEditFontFile]').is(':checked') ){
$('input[name=fontEditFontImported]').prop('checked', false); if( $('input[name=fontEditFontImported]').is(':checked') ){
} else { $('input[name=fontEditFontFile]').prop('checked', false);
$('input[name=fontEditFontImported]').prop('checked', true); $('#containerfontEditFile').hide();
} $('#containerfontEditUrl').show();
$('#containerfontEditFile').show(); } else {
$('#containerfontEditUrl').hide();
}
if( $('input[name=fontEditFontFile]').is(':checked') ){
$('input[name=fontEditFontImported]').prop('checked', false);
$('#containerfontEditFile').show();
$('#containerfontEditUrl').hide();
} else {
$('input[name=fontEditFontImported]').prop('checked', true);
}
}); });
*/

View File

@ -1,23 +1,21 @@
<?php echo template::formOpen('fontEditForm'); ?> <?php echo template::formOpen('fontEditForm'); ?>
<div class="row"> <div class="row">
<div class="col2"> <div class="col1">
<?php echo template::button('fontEditBack', [ <?php echo template::button('fontEditBack', [
'class' => 'buttonGrey', 'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'theme/fonts', 'href' => helper::baseUrl() . 'theme/fonts',
'ico' => 'left', 'value' => template::ico('left')
'value' => 'Retour'
]); ?> ]); ?>
</div> </div>
<div class="col2"> <div class="col1">
<?php echo template::button('fontEditHelp', [ <?php echo template::button('fontEditHelp', [
'href' => 'https://doc.zwiicms.fr/fontes#add', 'href' => 'https://doc.zwiicms.fr/fontes#add',
'target' => '_blank', 'target' => '_blank',
'ico' => 'help', 'value' => template::ico('help'),
'value' => 'Aide',
'class' => 'buttonHelp' 'class' => 'buttonHelp'
]); ?> ]); ?>
</div> </div>
<div class="col2 offset6"> <div class="col2 offset8">
<?php echo template::submit('fontEditPublish', [ <?php echo template::submit('fontEditPublish', [
'value' => 'Valider', 'value' => 'Valider',
'uniqueSubmission' => true 'uniqueSubmission' => true
@ -36,7 +34,7 @@
</div> </div>
<div class="col6"> <div class="col6">
<?php echo template::checkbox('fontEditFontFile', true,'Fonte installée', [ <?php echo template::checkbox('fontEditFontFile', true,'Fonte installée', [
'checked' => $this->getUrl(2) === 'file' ? true : false 'checked' => $this->getUrl(2) === 'files' ? true : false
]); ?> ]); ?>
</div> </div>
</div> </div>
@ -69,7 +67,7 @@
<div class="col12"> <div class="col12">
<?php echo template::file('fontEditFile', [ <?php echo template::file('fontEditFile', [
'label' => 'Fichier de fonte (Format WOFF)', 'label' => 'Fichier de fonte (Format WOFF)',
'value' => $this->getUrl(2) === 'file' ? $this->getData(['fonts', $this->getUrl(2), $this->getUrl(3), 'resource']) : '' 'value' => $this->getUrl(2) === 'files' ? $this->getData(['fonts', $this->getUrl(2), $this->getUrl(3), 'resource']) : ''
]); ?> ]); ?>
</div> </div>
</div> </div>

View File

@ -11,11 +11,10 @@
'href' => 'https://doc.zwiicms.fr/fontes', 'href' => 'https://doc.zwiicms.fr/fontes',
'target' => '_blank', 'target' => '_blank',
'value' => template::ico('help'), 'value' => template::ico('help'),
'class' => 'buttonHelp', 'class' => 'buttonHelp'
'help' => 'Consulter l\'aide en ligne'
]); ?> ]); ?>
</div> </div>
<div class="col1 offset9"> <div class="col2 offset8">
<?php echo template::button('themeFontAdd', [ <?php echo template::button('themeFontAdd', [
'href' => helper::baseUrl() . $this->getUrl(0) . '/fontAdd', 'href' => helper::baseUrl() . $this->getUrl(0) . '/fontAdd',
'value' => template::ico('plus'), 'value' => template::ico('plus'),

View File

@ -171,10 +171,10 @@
<h4>Mise en forme du texte</h4> <h4>Mise en forme du texte</h4>
<div class="row"> <div class="row">
<div class="col3"> <div class="col3">
<?php echo template::select('themeFooterFont', $module::$fontsList, [ <?php echo template::select('themeFooterFont', $module::$fonts['name'], [
'label' => 'Fonte', 'label' => 'Fonte',
'selected' => $this->getData(['theme', 'footer', 'font']), 'selected' => $this->getData(['theme', 'footer', 'font']),
'fonts' => true 'fonts' => $module::$fonts['family']
]); ?> ]); ?>
</div> </div>
<div class="col3"> <div class="col3">

View File

@ -106,10 +106,10 @@
]); ?> ]); ?>
</div> </div>
<div class="col4"> <div class="col4">
<?php echo template::select('themeHeaderFont', $module::$fontsList, [ <?php echo template::select('themeHeaderFont', $module::$fonts['name'], [
'label' => 'Fonte', 'label' => 'Fonte',
'selected' => $this->getData(['theme', 'header', 'font']), 'selected' => $this->getData(['theme', 'header', 'font']),
'fonts' => true 'fonts' => $module::$fonts['family']
]); ?> ]); ?>
</div> </div>
<div class="col4"> <div class="col4">

View File

@ -183,10 +183,10 @@
<h4>Mise en forme du texte</h4> <h4>Mise en forme du texte</h4>
<div class="row"> <div class="row">
<div class="col6"> <div class="col6">
<?php echo template::select('themeMenuFont', $module::$fontsList, [ <?php echo template::select('themeMenuFont', $module::$fonts['name'], [
'label' => 'Fonte', 'label' => 'Fonte',
'selected' => $this->getData(['theme', 'menu', 'font']), 'selected' => $this->getData(['theme', 'menu', 'font']),
'fonts' => true 'fonts' => $module::$fonts['family']
]); ?> ]); ?>
</div> </div>
<div class="col6"> <div class="col6">

View File

@ -11,8 +11,6 @@
* @link http://zwiicms.fr/ * @link http://zwiicms.fr/
*/ */
/** /**
* Aperçu en direct * Aperçu en direct
*/ */
@ -28,20 +26,19 @@ $("input, select").on("change",function() {
$("#themeSiteMarginWrapper").show(); $("#themeSiteMarginWrapper").show();
} }
/** /**
* Aperçu dans la boîte * Aperçu dans la boîte
*/ */
// Import des polices de caractères // Import des polices de caractères pour l'aperçu en temps réel
var titleFont = $("#themeTitleFont :selected").val(); var titleFont = $("#themeTitleFont :selected").val();
var titleFontText = $("#themeTitleFont :selected").text(); var titleFontText = $("#themeTitleFont :selected").text();
var textFont = $("#themeTextFont :selected").val(); var textFont = $("#themeTextFont :selected").val();
var textFontText = $("#themeTextFont :selected").text(); var textFontText = $("#themeTextFont :selected").text();
var css = "@import url('https://fonts.cdnfonts.com/css/" + titleFont + "');";
var css = "@import url('https://fonts.cdnfonts.com/css/" + textFont + "');";
// Couleurs des boutons // Couleurs des boutons
var colors = core.colorVariants($("#themeButtonBackgroundColor").val()); var colors = core.colorVariants($("#themeButtonBackgroundColor").val());
css += ".button.buttonSubmitPreview{background-color:" + colors.normal + ";}"; var css = ".button.buttonSubmitPreview{background-color:" + colors.normal + ";}";
css += ".button.buttonSubmitPreview:hover{background-color:" + colors.darken + "}"; css += ".button.buttonSubmitPreview:hover{background-color:" + colors.darken + "}";
css += ".button.buttonSubmitPreview{color:" + colors.text + ";}"; css += ".button.buttonSubmitPreview{color:" + colors.text + ";}";
@ -113,5 +110,4 @@ $("input, select").on("change",function() {
.attr("id", "themePreview") .attr("id", "themePreview")
.text(css) .text(css)
.appendTo("head"); .appendTo("head");
}).trigger("change"); }).trigger("change");

View File

@ -141,7 +141,8 @@
<div class="row"> <div class="row">
<div class="col12"> <div class="col12">
<div class="block preview"> <div class="block preview">
<h4 class="preview">Bloc</h4> <p class="textPreview">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p> <h4 class="preview">Bloc</h4>
<p class="textPreview">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
<p><a href="#" class="urlPreview">Lorem ipsum dolor sit amet.</a></p> <p><a href="#" class="urlPreview">Lorem ipsum dolor sit amet.</a></p>
</div> </div>
</div> </div>
@ -158,10 +159,11 @@
<h4>Mise en forme du texte</h4> <h4>Mise en forme du texte</h4>
<div class="row"> <div class="row">
<div class="col6"> <div class="col6">
<?php echo template::select('themeTextFont', $module::$fontsList, [ <?php
echo template::select('themeTextFont', $module::$fonts['name'], [
'label' => 'Fonte', 'label' => 'Fonte',
'selected' => $this->getData(['theme', 'text', 'font']), 'selected' => $this->getData(['theme', 'text', 'font']),
'fonts' => true 'fonts' => $module::$fonts['family']
]); ?> ]); ?>
</div> </div>
<div class="col6"> <div class="col6">
@ -179,10 +181,10 @@
<h4>Mise en forme des titres</h4> <h4>Mise en forme des titres</h4>
<div class="row"> <div class="row">
<div class="col4"> <div class="col4">
<?php echo template::select('themeTitleFont', $module::$fontsList, [ <?php echo template::select('themeTitleFont', $module::$fonts['name'] , [
'label' => 'Fonte', 'label' => 'Fonte',
'selected' => $this->getData(['theme', 'title', 'font']), 'selected' => $this->getData(['theme', 'title', 'font']),
'fonts' => true 'fonts' => $module::$fonts['family']
]); ?> ]); ?>
</div> </div>
<div class="col4"> <div class="col4">