Merge branch 'dev' into 12-dev

This commit is contained in:
Fred Tempez 2022-03-13 10:20:05 +01:00
commit 3532288fcf
27 changed files with 1819 additions and 1275 deletions

View File

@ -86,7 +86,7 @@ class helper {
* @param string $sort Type de tri à appliquer au tableau (SORT_ASC, SORT_DESC, ou null) * @param string $sort Type de tri à appliquer au tableau (SORT_ASC, SORT_DESC, ou null)
* @return array * @return array
*/ */
public static function arrayCollumn($array, $column, $sort = null) { public static function arrayColumn($array, $column, $sort = null) {
$newArray = []; $newArray = [];
if(empty($array) === false) { if(empty($array) === false) {
$newArray = array_map(function($element) use($column) { $newArray = array_map(function($element) use($column) {

View File

@ -620,13 +620,6 @@ class template {
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']];
} }
// Liste des polices à intégrer
//var_dump(core::$fonts);
if ($attributes['fonts'] === true) {
foreach (core::$fonts as $fontId => $font) {
echo "<link href='https://fonts.cdnfonts.com/css/" . $fontId . "' rel='stylesheet' type='text/css'>\n";
}
}
// Début du wrapper // Début du wrapper
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="inputWrapper ' . $attributes['classWrapper'] . '">'; $html = '<div id="' . $attributes['id'] . 'Wrapper" class="inputWrapper ' . $attributes['classWrapper'] . '">';
// Label // Label

View File

@ -179,22 +179,18 @@ class common {
]; ];
// Fontes
public static $fonts = [
];
public static $fontsWebSafe = [ public static $fontsWebSafe = [
'arial' => 'Arial, Helvetica, sans-serif;', 'arial' => 'Arial, Helvetica, sans-serif;',
'arial-black' => 'Arial Black, Gadget, sans-serif;', 'arial-black' => '"Arial Black", Gadget, sans-serif;',
'courrier' => 'Courier, Liberation Mono, monospace;', 'courrier' => 'Courier, "Liberation Mono", monospace;',
'courrier-new' => 'Courier New, Courier, monospace', 'courrier-new' => '"Courier New", Courier, monospace',
'garamond' => 'Garamond, serif', 'garamond' => 'Garamond, serif',
'georgia' => 'Georgia, serif;', 'georgia' => 'Georgia, serif;',
'impact' => 'Impact, Charcoal, sans-serif;', 'impact' => 'Impact, Charcoal, sans-serif;',
'lucida' => 'Lucida Sans Unicode, Lucida Grande, sans-serif', 'lucida' => '"Lucida Sans Unicode", "Lucida Grande", sans-serif',
'tahoma' => 'Tahoma, Geneva, sans-serif;', 'tahoma' => 'Tahoma, Geneva, sans-serif;',
'times-new-roman' => 'Times New Roman, Liberation Serif, serif;', 'times-new-roman' => '"Times New Roman", "Liberation Serif", serif;',
'trebuchet' => 'Trebuchet MS, Arial, Helvetica, sans-serif;', 'trebuchet' => '"Trebuchet MS", Arial, Helvetica, sans-serif;',
'tahoma' => 'Tahoma, Geneva, sans-serif;', 'tahoma' => 'Tahoma, Geneva, sans-serif;',
'verdana' => 'Verdana, Geneva, sans-serif;', 'verdana' => 'Verdana, Geneva, sans-serif;',
]; ];
@ -294,7 +290,7 @@ class common {
// Construit la liste des pages parents/enfants // Construit la liste des pages parents/enfants
if($this->hierarchy['all'] === []) { if($this->hierarchy['all'] === []) {
$pages = helper::arrayCollumn($this->getData(['page']), 'position', 'SORT_ASC'); $pages = helper::arrayColumn($this->getData(['page']), 'position', 'SORT_ASC');
// Parents // Parents
foreach($pages as $pageId => $pagePosition) { foreach($pages as $pageId => $pagePosition) {
if( if(
@ -407,6 +403,48 @@ class common {
} }
} }
/**
* Construit la liste des fontes dans un tableau
* @return array @fonts
*
*/
public function getFonts() {
// Fusionne la liste des fontes avec les webSafe
foreach (self::$fontsWebSafe as $fontId => $fontValue) {
$fontName = explode (',', $fontValue);
$f ['websafe'] [$fontId] = [
'name' => str_replace('"', '', $fontName[0]),
'font-family'=> $fontValue
];
}
// Ajoute les polices importées
$fontsImported = $this->getData(['fonts', 'imported']);
if (is_array($fontsImported)
) {
foreach ($fontsImported as $fontId => $fontValue) {
$f ['imported'] [$fontId] = [
'name' => $fontValue ['name'],
'font-family'=> $fontValue ['font-family'],
'ressource' => $fontValue ['ressource']
];
}
}
// Ajoute les polices locales
$fontsFiles = $this->getData(['fonts', 'files']);
if (is_array($fontsFiles)
) {
foreach ($fontsFiles as $fontId => $fontValue) {
$f ['files'] [$fontId] = [
'name' => $fontValue ['name'],
'font-family'=> $fontValue ['font-family'],
'ressource' => $fontValue ['ressource']
];
}
}
return $f;
}
/** /**
* Check du token CSRF (true = bo * Check du token CSRF (true = bo
*/ */
@ -2232,27 +2270,6 @@ class core extends common {
} }
} }
/**
* Traitement des polices de caractères
*/
// Fusionne la liste des fontes avec les webSafe
foreach (self::$fontsWebSafe as $fontId => $fontValue) {
$fontName = explode (',', $fontValue);
self::$fonts [$fontId] = $fontName[0];
}
// Importe les polices personnalisées
$fontsImported = $this->getData(['fonts', 'imported']);
if (is_array($fontsImported) &&
!empty ($fontsImported)
) {
// Fusionner avec les fontes installées
self::$fonts = array_merge(self::$fonts, $fontsImported);
}
// Tri Alphabétique
asort(self::$fonts);
// Crée le fichier de personnalisation avancée // Crée le fichier de personnalisation avancée
if(file_exists(self::DATA_DIR.'custom.css') === false) { if(file_exists(self::DATA_DIR.'custom.css') === false) {
file_put_contents(self::DATA_DIR.'custom.css', file_get_contents('core/module/theme/resource/custom.css')); file_put_contents(self::DATA_DIR.'custom.css', file_get_contents('core/module/theme/resource/custom.css'));
@ -2268,18 +2285,24 @@ class core extends common {
file_put_contents(self::DATA_DIR.'admin.css', ''); file_put_contents(self::DATA_DIR.'admin.css', '');
chmod(self::DATA_DIR.'admin.css', 0755); chmod(self::DATA_DIR.'admin.css', 0755);
} }
// Check la version rafraichissement du theme // Check la version rafraichissement du theme
$cssVersion = preg_split('/\*+/', file_get_contents(self::DATA_DIR.'theme.css')); $cssVersion = preg_split('/\*+/', file_get_contents(self::DATA_DIR.'theme.css'));
if(empty($cssVersion[1]) OR $cssVersion[1] !== md5(json_encode($this->getData(['theme'])))) { if(empty($cssVersion[1]) OR $cssVersion[1] !== md5(json_encode($this->getData(['theme'])))) {
// 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 * A partir du CDN
* ou dans le dossier site/file/source/fonts * ou dans le dossier site/file/source/fonts
* ou pas du tout si fonte webSafe * ou pas du tout si fonte webSafe
*/ */
// Fonts disponibles
$fontsAvailable = $this->getFonts();
// Fontes installées
$fonts = [ $this->getData(['theme', 'text', 'font']), $fonts = [ $this->getData(['theme', 'text', 'font']),
$this->getData(['theme', 'title', 'font']), $this->getData(['theme', 'title', 'font']),
$this->getData(['theme', 'header', 'font']), $this->getData(['theme', 'header', 'font']),
@ -2290,51 +2313,50 @@ class core extends common {
$fonts = array_unique($fonts); $fonts = array_unique($fonts);
/** /**
* Fontes Web Safe, ne sont pas chargées. * Charge les fontes websafe
*/ */
$fontFile = '';
foreach ($fonts as $fontId) { foreach ($fonts as $fontId) {
if (array_key_exists($fontId, self::$fontsWebSafe) ) { if ( isset($fontsAvailable['websafe'][$fontId])) {
unset($fonts[$fontId]); $fonts [$fontId] = $fontsAvailable['websafe'][$fontId]['font-family'];
} }
} }
/** /**
* Chargement des polices en ligne dans un fichier séparé * Chargement des polices en ligne dans un fichier fonts.html inclus dans main.php
*/ */
// Lire le fichier des fontes locales
$localFonts = $this->getData(['fonts', 'files']);
$fontFile = ''; $fontFile = '';
foreach ($fonts as $fontId) { foreach ($fonts as $fontId) {
if (!array_key_exists($fontId, $localFonts) ) { if ( isset($fontsAvailable['imported'][$fontId])) {
$fontFile .= '<link href="https://fonts.cdnfonts.com/css/' . $fontId .'" rel="stylesheet">'; $fontFile .= '<link href="' . $fontsAvailable['imported'][$fontId]['ressource'] .'" rel="stylesheet">';
// Supprimer l'élément des fontes chargées en ligne // Tableau pour la construction de la feuille de style
unset($fonts[$fontId]); $fonts [$fontId] = $fontsAvailable['imported'][$fontId]['font-family'];
} }
} }
// Enregistre la personnalisation
file_put_contents(self::DATA_DIR.'fonts/fonts.html', $fontFile);
/** /**
* Fontes installées localement * Fontes installées localement
*/ */
// Validité du format foreach ($fonts as $fontId) {
if ( !empty($localFonts)
) {
foreach ($localFonts as $fontId => $fontName) {
// Validité du tableau : // Validité du tableau :
if ( array_key_exists($fontId, self::$fonts) && if ( isset($fontsAvailable['files'][$fontId]) &&
file_exists(self::DATA_DIR . 'fonts/' . $fontName) ) { file_exists(self::DATA_DIR . 'fonts/' . $f) ) {
// Chargement de la police // Chargement de la police
//$formatFont = explode('.', self::DATA_DIR . 'fonts/' . $fontName); //$formatFont = explode('.', self::DATA_DIR . 'fonts/' . $fontName);
$css .= '@font-face {font-family:"' . self::$fonts[$fontId] . '";'; $css .= '@font-face {font-family:"' . $fontsAvailable['files'][$fontId]['font-family'] . '";';
$css .= 'src: url("' . helper::baseUrl(false) . self::DATA_DIR . 'fonts/' . $fontName . '");}'; $css .= 'src: url("' . helper::baseUrl(false) . self::DATA_DIR . 'fonts/' .$fontsAvailable['files'][$fontId]['ressource'] . '");}';
// Tableau pour la construction de la feuille de style
$fonts [$fontId] = $fontsAvailable['files'][$fontId]['font-family'];
} }
} }
}
// Fond du body // Fond du body
$colors = helper::colorVariants($this->getData(['theme', 'body', 'backgroundColor'])); $colors = helper::colorVariants($this->getData(['theme', 'body', 'backgroundColor']));
// Body // Body
$css .= 'body{font-family:"' . self::$fonts[$this->getData(['theme', 'text', 'font'])] . '",sans-serif}'; $css .= 'body{font-family:' . $fonts[$this->getData(['theme', 'text', 'font'])] . ';}';
if($themeBodyImage = $this->getData(['theme', 'body', 'image'])) { if($themeBodyImage = $this->getData(['theme', 'body', 'image'])) {
// Image dans html pour éviter les déformations. // Image dans html pour éviter les déformations.
$css .= 'html {background-image:url("../file/source/' . $themeBodyImage . '");background-position:' . $this->getData(['theme', 'body', 'imagePosition']) . ';background-attachment:' . $this->getData(['theme', 'body', 'imageAttachment']) . ';background-size:' . $this->getData(['theme', 'body', 'imageSize']) . ';background-repeat:' . $this->getData(['theme', 'body', 'imageRepeat']) . '}'; $css .= 'html {background-image:url("../file/source/' . $themeBodyImage . '");background-position:' . $this->getData(['theme', 'body', 'imagePosition']) . ';background-attachment:' . $this->getData(['theme', 'body', 'imageAttachment']) . ';background-size:' . $this->getData(['theme', 'body', 'imageSize']) . ';background-repeat:' . $this->getData(['theme', 'body', 'imageRepeat']) . '}';
@ -2352,7 +2374,7 @@ class core extends common {
$colors = helper::colorVariants($this->getData(['theme', 'text', 'linkColor'])); $colors = helper::colorVariants($this->getData(['theme', 'text', 'linkColor']));
$css .= 'a{color:' . $colors['normal'] . '}'; $css .= 'a{color:' . $colors['normal'] . '}';
// Couleurs de site dans TinyMCe // Couleurs de site dans TinyMCe
$css .= 'div.mce-edit-area {font-family:"' . self::$fonts[$this->getData(['theme', 'text', 'font'])] . '",sans-serif}'; $css .= 'div.mce-edit-area {font-family:' . $fonts[$this->getData(['theme', 'text', 'font'])] . ';}';
// Site dans TinyMCE // Site dans TinyMCE
$css .= '.editorWysiwyg {background-color:' . $this->getData(['theme', 'site', 'backgroundColor']) . ';}'; $css .= '.editorWysiwyg {background-color:' . $this->getData(['theme', 'site', 'backgroundColor']) . ';}';
$css .= 'span.mce-text{background-color: unset !important;}'; $css .= 'span.mce-text{background-color: unset !important;}';
@ -2393,7 +2415,7 @@ class core extends common {
$css .= '.helpButton span:hover{color:' . $colors['darken'] . '}'; $css .= '.helpButton span:hover{color:' . $colors['darken'] . '}';
$css .= '.button:active,button[type=\'submit\']:active,.pagination a:active{background-color:' . $colors['veryDarken'] . '}'; $css .= '.button:active,button[type=\'submit\']:active,.pagination a:active{background-color:' . $colors['veryDarken'] . '}';
$colors = helper::colorVariants($this->getData(['theme', 'title', 'textColor'])); $colors = helper::colorVariants($this->getData(['theme', 'title', 'textColor']));
$css .= 'h1,h2,h3,h4,h5,h6,h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:' . $colors['normal'] . ';font-family:"' . self::$fonts[$this->getData(['theme', 'title', 'font'])] . '",sans-serif;font-weight:' . $this->getData(['theme', 'title', 'fontWeight']) . ';text-transform:' . $this->getData(['theme', 'title', 'textTransform']) . '}'; $css .= 'h1,h2,h3,h4,h5,h6,h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:' . $colors['normal'] . ';font-family:' . $fonts[$this->getData(['theme', 'title', 'font'])] . ';font-weight:' . $this->getData(['theme', 'title', 'fontWeight']) . ';text-transform:' . $this->getData(['theme', 'title', 'textTransform']) . '}';
$css .= 'h1 a:hover,h2 a:hover,h3 a:hover,h4 a:hover,h5 a:hover,h6 a:hover{color:' . $colors['darken'] . '}'; $css .= 'h1 a:hover,h2 a:hover,h3 a:hover,h4 a:hover,h5 a:hover,h6 a:hover{color:' . $colors['darken'] . '}';
// Les blocs // Les blocs
$colors = helper::colorVariants($this->getData(['theme', 'block', 'backgroundColor'])); $colors = helper::colorVariants($this->getData(['theme', 'block', 'backgroundColor']));
@ -2427,7 +2449,7 @@ class core extends common {
$css .= 'header{background-image:url("../file/source/' . $themeHeaderImage . '");background-position:' . $this->getData(['theme', 'header', 'imagePosition']) . ';background-repeat:' . $this->getData(['theme', 'header', 'imageRepeat']) . '}'; $css .= 'header{background-image:url("../file/source/' . $themeHeaderImage . '");background-position:' . $this->getData(['theme', 'header', 'imagePosition']) . ';background-repeat:' . $this->getData(['theme', 'header', 'imageRepeat']) . '}';
} }
$colors = helper::colorVariants($this->getData(['theme', 'header', 'textColor'])); $colors = helper::colorVariants($this->getData(['theme', 'header', 'textColor']));
$css .= 'header span{color:' . $colors['normal'] . ';font-family:"' . self::$fonts[$this->getData(['theme', 'header', 'font'])] . '",sans-serif;font-weight:' . $this->getData(['theme', 'header', 'fontWeight']) . ';font-size:' . $this->getData(['theme', 'header', 'fontSize']) . ';text-transform:' . $this->getData(['theme', 'header', 'textTransform']) . '}'; $css .= 'header span{color:' . $colors['normal'] . ';font-family:' . $fonts[$this->getData(['theme', 'header', 'font'])] . ';font-weight:' . $this->getData(['theme', 'header', 'fontWeight']) . ';font-size:' . $this->getData(['theme', 'header', 'fontSize']) . ';text-transform:' . $this->getData(['theme', 'header', 'textTransform']) . '}';
} }
// Bannière au contenu personnalisé // Bannière au contenu personnalisé
@ -2476,7 +2498,7 @@ class core extends common {
$css .= 'nav{padding:0 10px;}'; $css .= 'nav{padding:0 10px;}';
} }
$css .= '#toggle span,#menu a{padding:' . $this->getData(['theme', 'menu', 'height']) .';font-family:"' . self::$fonts[$this->getData(['theme', 'menu', 'font'])] . '",sans-serif;font-weight:' . $this->getData(['theme', 'menu', 'fontWeight']) . ';font-size:' . $this->getData(['theme', 'menu', 'fontSize']) . ';text-transform:' . $this->getData(['theme', 'menu', 'textTransform']) . '}'; $css .= '#toggle span,#menu a{padding:' . $this->getData(['theme', 'menu', 'height']) .';font-family:' . $fonts[$this->getData(['theme', 'menu', 'font'])] . ';font-weight:' . $this->getData(['theme', 'menu', 'fontWeight']) . ';font-size:' . $this->getData(['theme', 'menu', 'fontSize']) . ';text-transform:' . $this->getData(['theme', 'menu', 'textTransform']) . '}';
// Pied de page // Pied de page
$colors = helper::colorVariants($this->getData(['theme', 'footer', 'backgroundColor'])); $colors = helper::colorVariants($this->getData(['theme', 'footer', 'backgroundColor']));
@ -2486,7 +2508,7 @@ class core extends common {
$css .= 'footer{padding:0}'; $css .= 'footer{padding:0}';
} }
$css .= 'footer span, #footerText > p {color:' . $this->getData(['theme', 'footer', 'textColor']) . ';font-family:"' . self::$fonts[$this->getData(['theme', 'footer', 'font'])] . '",sans-serif;font-weight:' . $this->getData(['theme', 'footer', 'fontWeight']) . ';font-size:' . $this->getData(['theme', 'footer', 'fontSize']) . ';text-transform:' . $this->getData(['theme', 'footer', 'textTransform']) . '}'; $css .= 'footer span, #footerText > p {color:' . $this->getData(['theme', 'footer', 'textColor']) . ';font-family:' . $fonts[$this->getData(['theme', 'footer', 'font'])] . ';font-weight:' . $this->getData(['theme', 'footer', 'fontWeight']) . ';font-size:' . $this->getData(['theme', 'footer', 'fontSize']) . ';text-transform:' . $this->getData(['theme', 'footer', 'textTransform']) . '}';
$css .= 'footer {background-color:' . $colors['normal'] . ';color:' . $this->getData(['theme', 'footer', 'textColor']) . '}'; $css .= 'footer {background-color:' . $colors['normal'] . ';color:' . $this->getData(['theme', 'footer', 'textColor']) . '}';
$css .= 'footer a{color:' . $this->getData(['theme', 'footer', 'textColor']) . '}'; $css .= 'footer a{color:' . $this->getData(['theme', 'footer', 'textColor']) . '}';
$css .= 'footer #footersite > div {margin:' . $this->getData(['theme', 'footer', 'height']) . ' 0}'; $css .= 'footer #footersite > div {margin:' . $this->getData(['theme', 'footer', 'height']) . ' 0}';
@ -2497,10 +2519,8 @@ 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 la personnalisation // Enregistre la personnalisation
file_put_contents(self::DATA_DIR.'theme.css', $css); file_put_contents(self::DATA_DIR.'theme.css', $css);
file_put_contents(self::DATA_DIR.'fonts/fonts.html', $fontFile);
// Effacer le cache pour tenir compte de la couleur de fond TinyMCE // Effacer le cache pour tenir compte de la couleur de fond TinyMCE
header("Expires: Tue, 01 Jan 2000 00:00:00 GMT"); header("Expires: Tue, 01 Jan 2000 00:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
@ -2527,52 +2547,51 @@ class core extends common {
$fonts = array_unique($fonts); $fonts = array_unique($fonts);
/** /**
* Fontes Web Safe, ne sont pas chargées. * Charge les fontes websafe
*/ */
$fontFile = '';
foreach ($fonts as $fontId) { foreach ($fonts as $fontId) {
if (array_key_exists($fontId, self::$fontsWebSafe) ) { if ( isset($fontsAvailable['websafe'][$fontId])) {
unset($fonts[$fontId]); $fonts [$fontId] = $fontsAvailable['websafe'][$fontId]['font-family'];
} }
} }
// Lire le fichier des fontes locales
$localFonts = $this->getData(['fonts', 'files']);
/** /**
* Chargement des polices en ligne * Chargement des polices en ligne dans un fichier fonts.html inclus dans main.php
*/ */
$fontFile = '';
foreach ($fonts as $fontId) { foreach ($fonts as $fontId) {
if (!array_key_exists($fontId, $localFonts) ) { if ( isset($fontsAvailable['imported'][$fontId])) {
$css .= '@import url("http://fonts.cdnfonts.com/css/' . $fontId . '");'; $fontFile .= '<link href="' . $fontsAvailable['imported'][$fontId]['ressource'] .'" rel="stylesheet">';
// Supprimer l'élément des fontes chargées en ligne // Tableau pour la construction de la feuille de style
unset($fonts[$fontId]); $fonts [$fontId] = $fontsAvailable['imported'][$fontId]['font-family'];
} }
} }
// Enregistre la personnalisation
file_put_contents(self::DATA_DIR.'fonts/fonts.html', $fontFile);
/** /**
* Fontes installées localement * Fontes installées localement
*/ */
// Validité du format foreach ($fonts as $fontId) {
if ( !empty($localFonts)
) {
foreach ($localFonts as $fontId => $fontName) {
// Validité du tableau : // Validité du tableau :
if ( array_key_exists($fontId, self::$fonts) && if ( isset($fontsAvailable['files'][$fontId]) &&
file_exists(self::DATA_DIR . 'fonts/' . $fontName) ) { file_exists(self::DATA_DIR . 'fonts/' . $f) ) {
// Chargement de la police // Chargement de la police
//$formatFont = explode('.', self::DATA_DIR . 'fonts/' . $fontName); //$formatFont = explode('.', self::DATA_DIR . 'fonts/' . $fontName);
$css .= '@font-face {font-family:"' . self::$fonts[$fontId] . '";'; $css .= '@font-face {font-family:"' . $fontsAvailable['files'][$fontId]['font-family'] . '";';
$css .= 'src: url("' . helper::baseUrl(false) . self::DATA_DIR . 'fonts/' . $fontName . '");}'; $css .= 'src: url("' . helper::baseUrl(false) . self::DATA_DIR . 'fonts/' .$fontsAvailable['files'][$fontId]['ressource'] . '");}';
// Tableau pour la construction de la feuille de style
$fonts [$fontId] = $fontsAvailable['files'][$fontId]['font-family'];
} }
} }
}
// Thème Administration // Thème Administration
$colors = helper::colorVariants($this->getData(['admin','backgroundColor'])); $colors = helper::colorVariants($this->getData(['admin','backgroundColor']));
$css .= '#site{background-color:' . $colors['normal']. ';}'; $css .= '#site{background-color:' . $colors['normal']. ';}';
$css .= '.row > div {font:' . $this->getData(['admin','fontSize']) . ' "' . self::$fonts[$this->getData(['admin','fontText'])] . '", sans-serif;}'; $css .= '.row > div {font:' . $fonts[$this->getData(['admin','fontText'])] . ';font-size:' . $this->getData(['admin','fontSize']) .'}';
$css .= 'body h1, h2, h3, h4 a, h5, h6 {font-family:"' . self::$fonts[$this->getData(['admin','fontTitle'])] . '", sans-serif;color:' . $this->getData(['admin','colorTitle' ]) . ';}'; $css .= 'body h1, h2, h3, h4 a, h5, h6 {font-family:' . $fonts[$this->getData(['admin','fontTitle'])] . ';color:' . $this->getData(['admin','colorTitle' ]) . ';}';
// TinyMCE // TinyMCE
$css .= 'body:not(.editorWysiwyg),span .zwiico-help {color:' . $this->getData(['admin','colorText']) . ';}'; $css .= 'body:not(.editorWysiwyg),span .zwiico-help {color:' . $this->getData(['admin','colorText']) . ';}';

View File

@ -481,7 +481,7 @@ if ($this->getData(['core', 'dataVersion']) < 10400) {
foreach ($pageList as $parentKey => $parent) { foreach ($pageList as $parentKey => $parent) {
//La page est un blog //La page est un blog
if ($this->getData(['page',$parent,'moduleId']) === 'blog' ) { if ($this->getData(['page',$parent,'moduleId']) === 'blog' ) {
$articleIds = array_keys(helper::arrayCollumn($this->getData(['module', $parent, 'posts']), 'publishedOn', 'SORT_DESC')); $articleIds = array_keys(helper::arrayColumn($this->getData(['module', $parent, 'posts']), 'publishedOn', 'SORT_DESC'));
foreach ($articleIds as $key => $article) { foreach ($articleIds as $key => $article) {
// Droits les deux groupes // Droits les deux groupes
$this->setData(['module', $parent, 'posts', $article,'editConsent', 3]); $this->setData(['module', $parent, 'posts', $article,'editConsent', 3]);
@ -874,26 +874,106 @@ if ($this->getData(['core', 'dataVersion']) < 11400) {
// Version 12.0.00 // Version 12.0.00
if ($this->getData(['core', 'dataVersion']) < 12000) { if ($this->getData(['core', 'dataVersion']) < 12000) {
$fonts = [ $fonts = [
'arimo' => 'Arimo', 'arimo'=> [
'arvo' => 'Arvo', 'name' => 'Arimo',
'dancing-script' => 'Dancing Script', 'font-family' => 'Arimo, sans-serif',
'droid-sans-2' => 'Droid Sans', 'url' => 'https://fonts.cdnfonts.com/css/arimo'
'droid-serif-2' => 'Droid Serif', ],
'indie-flower' => 'Indie Flower', 'arvo'=> [
'liberation-sans' => 'Liberation Sans', 'name' => 'Arvo',
'liberation-serif' => 'Liberation Serif', 'font-family' => 'Arvo, sans-serif',
'lobster-2' => 'Lobster', 'url' => 'https://fonts.cdnfonts.com/css/arvo'
'lora' => 'Lora', ],
'lato' => 'Lato', 'dancing-script' => [
'old-standard-tt-3' => 'Old Standard TT', 'name' => 'Dancing Script',
'open-sans' => 'Open Sans', 'font-family' => '"Dancing Script", sans-serif',
'oswald-4' => 'Oswald', 'url' => 'https://fonts.cdnfonts.com/css/dancing-script'
'pt-mono' => 'PT Mono', ],
'pt-serif' => 'PT Serif', 'droid-sans-2'=> [
'rancho' => 'Rancho', 'name' => 'Droid Sans',
'roboto' => 'Roboto', 'font-family' => '"Droid Sans", sans-serif',
'ubuntu' => 'Ubuntu', 'url' => 'https://fonts.cdnfonts.com/css/droid-sans-2'
'vollkorn' => 'Vollkorn' ],
'droid-serif-2'=> [
'name' => 'Droid Serif',
'font-family' => '"Droid Serif", serif',
'url' => 'https://fonts.cdnfonts.com/css/droid-serif-2'
],
'indie-flower'=> [
'name' => 'Indie Flower',
'font-family' => '"Indie Flower", sans-serif',
'url' => 'https://fonts.cdnfonts.com/css/indie-flower'
],
'liberation-sans'=> [
'name' => 'Liberation Sans',
'font-family' => '"Liberation Sans", sans-serif',
'url' => 'https://fonts.cdnfonts.com/css/liberation-sans'
],
'liberation-serif'=> [
'name' => 'Liberation Serif',
'font-family' => '"Liberation Serif", serif',
'url' => 'https://fonts.cdnfonts.com/css/liberation-serif'
],
'lobster-2'=> [
'name' => 'Lobster',
'font-family' => 'Lobster, sans-serif',
'url' => 'https://fonts.cdnfonts.com/css/lobster-2'
],
'lato'=> [
'name' => 'lato',
'font-family' => 'Lato, sans-serif',
'url' => 'https://fonts.cdnfonts.com/css/lato'
],
'lora'=> [
'name' => 'Lora',
'font-family' => 'Lora, serif',
'url' => 'https://fonts.cdnfonts.com/css/lora'
],
'old-standard-tt-3'=> [
'name' => 'Old Standard TT',
'font-family' => '"Old Standard TT", serif',
'url' => 'https://fonts.cdnfonts.com/css/old-standard-tt-3'
],
'open-sans' => [
'name' => 'Open Sans',
'font-family' => '"Open Sans", sans-serif',
'url' => 'https://fonts.cdnfonts.com/css/open-sans'
],
'oswald-4'=> [
'name' => 'Oswald',
'font-family' => 'Oswald, sans-serif',
'url' => 'https://fonts.cdnfonts.com/css/oswald-4'
],
'pt-mono'=> [
'name' => 'PT Mono',
'font-family' => '"PT Mono", monospace',
'url' => 'https://fonts.cdnfonts.com/css/pt-mono'
],
'pt-serif'=> [
'name' => "PR Serif",
'font-family' => '"PT Serif", serif',
'url' => 'https://fonts.cdnfonts.com/css/pt-serif'
],
'rancho'=> [
'name' => 'Rancho',
'font-family' => 'Rancho, sans-serif',
'url' => 'https://fonts.cdnfonts.com/css/rancho'
],
'roboto'=> [
'name' => 'Roboto',
'font-family' => 'Roboto, sans-serif',
'url' => 'https://fonts.cdnfonts.com/css/roboto'
],
'ubuntu'=> [
'name' => 'Ubuntu',
'font-family' => 'Ubuntu, sans-serif',
'url' => 'https://fonts.cdnfonts.com/css/ubuntu'
],
'vollkorn'=> [
'name' => 'Vollkorn',
'font-family' => 'Vollkorn, serif',
'url' => 'https://fonts.cdnfonts.com/css/vollkorn'
]
]; ];
$this->setData(['fonts', 'imported', $fonts]); $this->setData(['fonts', 'imported', $fonts]);

View File

@ -9,27 +9,15 @@
</a> </a>
</span> </span>
</h4> </h4>
<div class="row"> <div class="row">
<div class="col3">
<?php echo template::checkbox('connectCaptcha', true, 'Captcha à la connexion', [
'checked' => $this->getData(['config', 'connect','captcha'])
]); ?>
<?php echo template::checkbox('connectCaptchaStrong', true, 'Captcha complexe', [
'checked' => $this->getData(['config', 'connect', 'captchaStrong']),
'help' => 'Option recommandée pour sécuriser la connexion. S\'applique à tous les captchas du site. Le captcha simple se limite à une addition de nombres de 0 à 10. Le captcha complexe utilise quatre opérations de nombres de 0 à 20. Activation recommandée.'
]); ?>
</div>
<div class="col3">
<?php echo template::select('connectCaptchaType', $module::$captchaTypes , [
'label' => 'Type de captcha',
'selected' => $this->getData(['config', 'connect', 'captchaType'])
]); ?>
</div>
<div class="col6"> <div class="col6">
<?php echo template::checkbox('connectAutoDisconnect', true, 'Déconnexion automatique', [ <?php echo template::checkbox('connectAutoDisconnect', true, 'Déconnexion automatique', [
'checked' => $this->getData(['config', 'connect', 'autoDisconnect']), 'checked' => $this->getData(['config', 'connect', 'autoDisconnect']),
'help' => 'Déconnecte les sessions ouvertes précédemment sur d\'autres navigateurs ou terminaux. Activation recommandée.' 'help' => 'Déconnecte les sessions ouvertes précédemment sur d\'autres navigateurs ou terminaux. Activation recommandée.'
]); ?> ]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('connectShowPassword', true, 'Dévoiler le mot de passe', [ <?php echo template::checkbox('connectShowPassword', true, 'Dévoiler le mot de passe', [
'checked' => $this->getData(['config', 'connect', 'showPassword']), 'checked' => $this->getData(['config', 'connect', 'showPassword']),
'help' => 'Dans l\'écran de connexion, active une icône dont le survol affiche temporairement le mot de passe.' 'help' => 'Dans l\'écran de connexion, active une icône dont le survol affiche temporairement le mot de passe.'
@ -39,7 +27,7 @@
<div class="row"> <div class="row">
<div class="col3"> <div class="col3">
<?php echo template::select('connectAttempt', $module::$connectAttempt , [ <?php echo template::select('connectAttempt', $module::$connectAttempt , [
'label' => 'Connexions successives', 'label' => 'Limitation des tentatives',
'selected' => $this->getData(['config', 'connect', 'attempt']) 'selected' => $this->getData(['config', 'connect', 'attempt'])
]); ?> ]); ?>
</div> </div>
@ -71,6 +59,25 @@
]); ?> ]); ?>
</div> </div>
</div> </div>
<div class="row">
<div class="col3">
<?php echo template::checkbox('connectCaptcha', true, 'Captcha à la connexion', [
'checked' => $this->getData(['config', 'connect','captcha'])
]); ?>
</div>
<div class="col3">
<?php echo template::checkbox('connectCaptchaStrong', true, 'Captcha complexe', [
'checked' => $this->getData(['config', 'connect', 'captchaStrong']),
'help' => 'Option recommandée pour sécuriser la connexion. S\'applique à tous les captchas du site. Le captcha simple se limite à une addition de nombres de 0 à 10. Le captcha complexe utilise quatre opérations de nombres de 0 à 20. Activation recommandée.'
]); ?>
</div>
<div class="col3">
<?php echo template::select('connectCaptchaType', $module::$captchaTypes , [
'label' => 'Type de captcha',
'selected' => $this->getData(['config', 'connect', 'captchaType'])
]); ?>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -57,21 +57,21 @@
</h4> </h4>
<div class="row"> <div class="row">
<div class="col4"> <div class="col4">
<?php echo template::select('localeHomePageId', helper::arrayCollumn($module::$pagesList, 'title', 'SORT_ASC'), [ <?php echo template::select('localeHomePageId', helper::arrayColumn($module::$pagesList, 'title', 'SORT_ASC'), [
'label' => 'Accueil du site', 'label' => 'Accueil du site',
'selected' =>$this->getData(['locale', 'homePageId']), 'selected' =>$this->getData(['locale', 'homePageId']),
'help' => 'La première page que vos visiteurs verront.' 'help' => 'La première page que vos visiteurs verront.'
]); ?> ]); ?>
</div> </div>
<div class="col4"> <div class="col4">
<?php echo template::select('localePage403', array_merge(['none' => 'Page par défaut'],helper::arrayCollumn($module::$orphansList, 'title', 'SORT_ASC')), [ <?php echo template::select('localePage403', array_merge(['none' => 'Page par défaut'],helper::arrayColumn($module::$orphansList, 'title', 'SORT_ASC')), [
'label' => 'Accès interdit, erreur 403', 'label' => 'Accès interdit, erreur 403',
'selected' =>$this->getData(['locale', 'page403']), 'selected' =>$this->getData(['locale', 'page403']),
'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.' 'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.'
]); ?> ]); ?>
</div> </div>
<div class="col4"> <div class="col4">
<?php echo template::select('localePage404', array_merge(['none' => 'Page par défaut'],helper::arrayCollumn($module::$orphansList, 'title', 'SORT_ASC')), [ <?php echo template::select('localePage404', array_merge(['none' => 'Page par défaut'],helper::arrayColumn($module::$orphansList, 'title', 'SORT_ASC')), [
'label' => 'Page inexistante, erreur 404', 'label' => 'Page inexistante, erreur 404',
'selected' =>$this->getData(['locale', 'page404']), 'selected' =>$this->getData(['locale', 'page404']),
'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.' 'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.'
@ -80,14 +80,14 @@
</div> </div>
<div class="row"> <div class="row">
<div class="col4"> <div class="col4">
<?php echo template::select('localeLegalPageId', array_merge(['none' => 'Aucune'] , helper::arrayCollumn($module::$pagesList, 'title', 'SORT_ASC') ) , [ <?php echo template::select('localeLegalPageId', array_merge(['none' => 'Aucune'] , helper::arrayColumn($module::$pagesList, 'title', 'SORT_ASC') ) , [
'label' => 'Mentions légales', 'label' => 'Mentions légales',
'selected' => $this->getData(['locale', 'legalPageId']), 'selected' => $this->getData(['locale', 'legalPageId']),
'help' => 'Les mentions légales sont obligatoires en France. Une option du pied de page ajoute un lien discret vers cette page.' 'help' => 'Les mentions légales sont obligatoires en France. Une option du pied de page ajoute un lien discret vers cette page.'
]); ?> ]); ?>
</div> </div>
<div class="col4"> <div class="col4">
<?php echo template::select('localeSearchPageId', array_merge(['none' => 'Aucune'] , helper::arrayCollumn($module::$pagesList, 'title', 'SORT_ASC') ) , [ <?php echo template::select('localeSearchPageId', array_merge(['none' => 'Aucune'] , helper::arrayColumn($module::$pagesList, 'title', 'SORT_ASC') ) , [
'label' => 'Recherche dans le site', 'label' => 'Recherche dans le site',
'selected' => $this->getData(['locale', 'searchPageId']), 'selected' => $this->getData(['locale', 'searchPageId']),
'help' => 'Sélectionnez une page contenant le module \'Recherche\'. Une option du pied de page ajoute un lien discret vers cette page.' 'help' => 'Sélectionnez une page contenant le module \'Recherche\'. Une option du pied de page ajoute un lien discret vers cette page.'
@ -95,7 +95,7 @@
</div> </div>
<div class="col4"> <div class="col4">
<?php <?php
echo template::select('localePage302', array_merge(['none' => 'Page par défaut'],helper::arrayCollumn($module::$orphansList, 'title', 'SORT_ASC')), [ echo template::select('localePage302', array_merge(['none' => 'Page par défaut'],helper::arrayColumn($module::$orphansList, 'title', 'SORT_ASC')), [
'label' => 'Site en maintenance', 'label' => 'Site en maintenance',
'selected' =>$this->getData(['locale', 'page302']), 'selected' =>$this->getData(['locale', 'page302']),
'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.' 'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.'

View File

@ -153,7 +153,7 @@ class install extends common {
// Récupération de la liste des thèmes // Récupération de la liste des thèmes
$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);
self::$themes = helper::arrayCollumn($dataThemes, 'name'); self::$themes = helper::arrayColumn($dataThemes, 'name');
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([

View File

@ -88,26 +88,106 @@ class init extends common {
'fonts' => [ 'fonts' => [
'files' => [], 'files' => [],
'imported'=> [ 'imported'=> [
'arimo'=> 'Arimo', 'arimo'=> [
'arvo'=> 'Arvo', 'name' => 'Arimo',
'dancing-script' => 'Dancing Script', 'font-family' => 'Arimo, sans-serif',
'droid-sans-2'=> 'Droid Sans', 'ressource' => 'https://fonts.cdnfonts.com/css/arimo'
'droid-serif-2'=> 'Droid Serif', ],
'indie-flower'=> 'Indie Flower', 'arvo'=> [
'liberation-sans'=> 'Liberation Sans', 'name' => 'Arvo',
'liberation-serif'=> 'Liberation Serif', 'font-family' => 'Arvo, sans-serif',
'lobster-2'=> 'Lobster', 'ressource' => 'https://fonts.cdnfonts.com/css/arvo'
'lora'=> 'Lora', ],
'lato'=> 'Lato', 'dancing-script' => [
'old-standard-tt-3'=> 'Old Standard TT', 'name' => 'Dancing Script',
'open-sans'=> 'Open Sans', 'font-family' => '"Dancing Script", sans-serif',
'oswald-4'=> 'Oswald', 'ressource' => 'https://fonts.cdnfonts.com/css/dancing-script'
'pt-mono'=> 'PT Mono', ],
'pt-serif'=> 'PT Serif', 'droid-sans-2'=> [
'rancho'=> 'Rancho', 'name' => 'Droid Sans',
'roboto'=> 'Roboto', 'font-family' => '"Droid Sans", sans-serif',
'ubuntu'=> 'Ubuntu', 'ressource' => 'https://fonts.cdnfonts.com/css/droid-sans-2'
'vollkorn'=> 'Vollkorn' ],
'droid-serif-2'=> [
'name' => 'Droid Serif',
'font-family' => '"Droid Serif", serif',
'ressource' => 'https://fonts.cdnfonts.com/css/droid-serif-2'
],
'indie-flower'=> [
'name' => 'Indie Flower',
'font-family' => '"Indie Flower", sans-serif',
'ressource' => 'https://fonts.cdnfonts.com/css/indie-flower'
],
'liberation-sans'=> [
'name' => 'Liberation Sans',
'font-family' => '"Liberation Sans", sans-serif',
'ressource' => 'https://fonts.cdnfonts.com/css/liberation-sans'
],
'liberation-serif'=> [
'name' => 'Liberation Serif',
'font-family' => '"Liberation Serif", serif',
'ressource' => 'https://fonts.cdnfonts.com/css/liberation-serif'
],
'lobster-2'=> [
'name' => 'Lobster',
'font-family' => 'Lobster, sans-serif',
'ressource' => 'https://fonts.cdnfonts.com/css/lobster-2'
],
'lato'=> [
'name' => 'lato',
'font-family' => 'Lato, sans-serif',
'ressource' => 'https://fonts.cdnfonts.com/css/lato'
],
'lora'=> [
'name' => 'Lora',
'font-family' => 'Lora, serif',
'ressource' => 'https://fonts.cdnfonts.com/css/lora'
],
'old-standard-tt-3'=> [
'name' => 'Old Standard TT',
'font-family' => '"Old Standard TT", serif',
'ressource' => 'https://fonts.cdnfonts.com/css/old-standard-tt-3'
],
'open-sans' => [
'name' => 'Open Sans',
'font-family' => '"Open Sans", sans-serif',
'ressource' => 'https://fonts.cdnfonts.com/css/open-sans'
],
'oswald-4'=> [
'name' => 'Oswald',
'font-family' => 'Oswald, sans-serif',
'ressource' => 'https://fonts.cdnfonts.com/css/oswald-4'
],
'pt-mono'=> [
'name' => 'PT Mono',
'font-family' => '"PT Mono", monospace',
'ressource' => 'https://fonts.cdnfonts.com/css/pt-mono'
],
'pt-serif'=> [
'name' => "PR Serif",
'font-family' => '"PT Serif", serif',
'ressource' => 'https://fonts.cdnfonts.com/css/pt-serif'
],
'rancho'=> [
'name' => 'Rancho',
'font-family' => 'Rancho, sans-serif',
'ressource' => 'https://fonts.cdnfonts.com/css/rancho'
],
'roboto'=> [
'name' => 'Roboto',
'font-family' => 'Roboto, sans-serif',
'ressource' => 'https://fonts.cdnfonts.com/css/roboto'
],
'ubuntu'=> [
'name' => 'Ubuntu',
'font-family' => 'Ubuntu, sans-serif',
'ressource' => 'https://fonts.cdnfonts.com/css/ubuntu'
],
'vollkorn'=> [
'name' => 'Vollkorn',
'font-family' => 'Vollkorn, serif',
'ressource' => 'https://fonts.cdnfonts.com/css/vollkorn'
]
] ]
], ],
'page' => [ 'page' => [
@ -153,7 +233,7 @@ class init extends common {
], ],
'footer' => [ 'footer' => [
'backgroundColor' => 'rgba(255, 255, 255, 1)', 'backgroundColor' => 'rgba(255, 255, 255, 1)',
'font' => 'open-sans', 'font' => 'georgia',
'fontSize' => '.8em', 'fontSize' => '.8em',
'fontWeight' => 'normal', 'fontWeight' => 'normal',
'height' => '5px', 'height' => '5px',
@ -180,7 +260,7 @@ class init extends common {
], ],
'header' => [ 'header' => [
'backgroundColor' => 'rgba(32, 59, 82, 1)', 'backgroundColor' => 'rgba(32, 59, 82, 1)',
'font' => 'oswald-4', 'font' => 'arial',
'fontSize' => '2em', 'fontSize' => '2em',
'fontWeight' => 'normal', 'fontWeight' => 'normal',
'height' => '150px', 'height' => '150px',
@ -203,7 +283,7 @@ class init extends common {
'menu' => [ 'menu' => [
'backgroundColor' => 'rgba(32, 59, 82, 1)', 'backgroundColor' => 'rgba(32, 59, 82, 1)',
'backgroundColorSub' => 'rgba(32, 59, 82, 1)', 'backgroundColorSub' => 'rgba(32, 59, 82, 1)',
'font' => 'open-sans', 'font' => 'georgia',
'fontSize' => '1em', 'fontSize' => '1em',
'fontWeight' => 'normal', 'fontWeight' => 'normal',
'height' => '15px 10px', 'height' => '15px 10px',
@ -234,13 +314,13 @@ class init extends common {
'borderColor' => 'rgba(236, 239, 241, 1)' 'borderColor' => 'rgba(236, 239, 241, 1)'
], ],
'text' => [ 'text' => [
'font' => 'open-sans', 'font' => 'georgia',
'fontSize' => '13px', 'fontSize' => '13px',
'textColor' => 'rgba(33, 34, 35, 1)', 'textColor' => 'rgba(33, 34, 35, 1)',
'linkColor' => 'rgba(74, 105, 189, 1)' 'linkColor' => 'rgba(74, 105, 189, 1)'
], ],
'title' => [ 'title' => [
'font' => 'oswald-4', 'font' => 'arial',
'fontWeight' => 'normal', 'fontWeight' => 'normal',
'textColor' => 'rgba(74, 105, 189, 1)', 'textColor' => 'rgba(74, 105, 189, 1)',
'textTransform' => 'none' 'textTransform' => 'none'
@ -252,9 +332,9 @@ class init extends common {
], ],
'admin' => [ 'admin' => [
'backgroundColor' => 'rgba(255, 255, 255, 1)', 'backgroundColor' => 'rgba(255, 255, 255, 1)',
'fontText' => 'open-sans', 'fontText' => 'georgia',
'fontSize' => '13px', 'fontSize' => '13px',
'fontTitle' => 'oswald-4', 'fontTitle' => 'arial',
'colorText' => 'rgba(33, 34, 35, 1)', 'colorText' => 'rgba(33, 34, 35, 1)',
'colorTitle' => 'rgba(74, 105, 189, 1)', 'colorTitle' => 'rgba(74, 105, 189, 1)',
'backgroundColorButton' => 'rgba(63, 125, 250, 1)', 'backgroundColorButton' => 'rgba(63, 125, 250, 1)',

View File

@ -392,7 +392,11 @@ class page extends common {
$lastPosition = 1; $lastPosition = 1;
$hierarchy = $this->getInput('pageEditParentPageId') ? $this->getHierarchy($this->getInput('pageEditParentPageId')) : array_keys($this->getHierarchy()); $hierarchy = $this->getInput('pageEditParentPageId') ? $this->getHierarchy($this->getInput('pageEditParentPageId')) : array_keys($this->getHierarchy());
$position = $this->getInput('pageEditPosition', helper::FILTER_INT); $position = $this->getInput('pageEditPosition', helper::FILTER_INT);
$extraPosition = $this->getinput('pageEditExtraPosition', helper::FILTER_BOOLEAN);
foreach($hierarchy as $hierarchyPageId) { foreach($hierarchy as $hierarchyPageId) {
// Ne traite que les pages du menu sélectionné
if ($this->getData(['page', $hierarchyPageId, 'extraPosition']) === $extraPosition ) {
// Ignore la page en cours de modification // Ignore la page en cours de modification
if($hierarchyPageId === $this->getUrl(2) ) { if($hierarchyPageId === $this->getUrl(2) ) {
continue; continue;
@ -406,6 +410,8 @@ class page extends common {
// Incrémente pour la prochaine position // Incrémente pour la prochaine position
$lastPosition++; $lastPosition++;
} }
}
if ($this->getinput('pageEditBlock') !== 'bar') { if ($this->getinput('pageEditBlock') !== 'bar') {
$barLeft = $this->getinput('pageEditBarLeft'); $barLeft = $this->getinput('pageEditBarLeft');
$barRight = $this->getinput('pageEditBarRight'); $barRight = $this->getinput('pageEditBarRight');
@ -516,7 +522,7 @@ class page extends common {
} }
} }
} }
self::$moduleIds = array_merge( ['' => 'Aucun'] , helper::arrayCollumn(helper::getModules(),'realName','SORT_ASC')); // Pages sans parent self::$moduleIds = array_merge( ['' => 'Aucun'] , helper::arrayColumn(helper::getModules(),'realName','SORT_ASC')); // Pages sans parent
foreach($this->getHierarchy() as $parentPageId => $childrenPageIds) { foreach($this->getHierarchy() as $parentPageId => $childrenPageIds) {
if($parentPageId !== $this->getUrl(2)) { if($parentPageId !== $this->getUrl(2)) {
self::$pagesNoParentId[$parentPageId] = $this->getData(['page', $parentPageId, 'title']); self::$pagesNoParentId[$parentPageId] = $this->getData(['page', $parentPageId, 'title']);

View File

@ -42,8 +42,8 @@ class sitemap extends common
!empty($this->getData(['module',$parentId, 'posts' ]))) { !empty($this->getData(['module',$parentId, 'posts' ]))) {
$items .= '<ul>'; $items .= '<ul>';
// Ids des articles par ordre de publication // Ids des articles par ordre de publication
$articleIdsPublishedOns = helper::arrayCollumn($this->getData(['module', $parentId,'posts']), 'publishedOn', 'SORT_DESC'); $articleIdsPublishedOns = helper::arrayColumn($this->getData(['module', $parentId,'posts']), 'publishedOn', 'SORT_DESC');
$articleIdsStates = helper::arrayCollumn($this->getData(['module', $parentId, 'posts']), 'state', 'SORT_DESC'); $articleIdsStates = helper::arrayColumn($this->getData(['module', $parentId, 'posts']), 'state', 'SORT_DESC');
$articleIds = []; $articleIds = [];
foreach ($articleIdsPublishedOns as $articleId => $articlePublishedOn) { foreach ($articleIdsPublishedOns as $articleId => $articlePublishedOn) {
if ($articlePublishedOn <= time() and $articleIdsStates[$articleId]) { if ($articlePublishedOn <= time() and $articleIdsStates[$articleId]) {
@ -78,8 +78,8 @@ class sitemap extends common
!empty($this->getData(['module', $childId, 'posts' ]))) { !empty($this->getData(['module', $childId, 'posts' ]))) {
$items .= '<ul>'; $items .= '<ul>';
// Ids des articles par ordre de publication // Ids des articles par ordre de publication
$articleIdsPublishedOns = helper::arrayCollumn($this->getData(['module', $childId,'posts']), 'publishedOn', 'SORT_DESC'); $articleIdsPublishedOns = helper::arrayColumn($this->getData(['module', $childId,'posts']), 'publishedOn', 'SORT_DESC');
$articleIdsStates = helper::arrayCollumn($this->getData(['module', $childId, 'posts']), 'state', 'SORT_DESC'); $articleIdsStates = helper::arrayColumn($this->getData(['module', $childId, 'posts']), 'state', 'SORT_DESC');
$articleIds = []; $articleIds = [];
foreach ($articleIdsPublishedOns as $articleId => $articlePublishedOn) { foreach ($articleIdsPublishedOns as $articleId => $articlePublishedOn) {
if ($articlePublishedOn <= time() and $articleIdsStates[$articleId]) { if ($articlePublishedOn <= time() and $articleIdsStates[$articleId]) {

View File

@ -32,6 +32,7 @@ class theme extends common {
'save' => self::GROUP_ADMIN, 'save' => self::GROUP_ADMIN,
'fonts' => self::GROUP_ADMIN, 'fonts' => self::GROUP_ADMIN,
'fontAdd' => self::GROUP_ADMIN, 'fontAdd' => self::GROUP_ADMIN,
'fontEdit' => self::GROUP_ADMIN,
'fontDelete' => self::GROUP_ADMIN 'fontDelete' => self::GROUP_ADMIN
]; ];
public static $aligns = [ public static $aligns = [
@ -232,6 +233,8 @@ class theme extends common {
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 $fontsList = [];
// Variable pour détailler les fontes installées
public static $fontsDetail = [];
/** /**
* Thème des écrans d'administration * Thème des écrans d'administration
@ -396,7 +399,8 @@ class theme extends common {
unset(self::$pagesList[$page]); unset(self::$pagesList[$page]);
} }
} }
// Lire les fontes installées
$this->enumFonts();
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'title' => 'Personnalisation du pied de page', 'title' => 'Personnalisation du pied de page',
@ -475,6 +479,8 @@ class theme extends common {
'state' => true 'state' => true
]); ]);
} }
// Lire les fontes installées
$this->enumFonts();
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'title' => 'Personnalisation de la bannière', 'title' => 'Personnalisation de la bannière',
@ -534,6 +540,8 @@ class theme extends common {
'state' => true 'state' => true
]); ]);
} }
// Lire les fontes installées
$this->enumFonts();
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'title' => 'Personnalisation du menu', 'title' => 'Personnalisation du menu',
@ -549,9 +557,6 @@ class theme extends common {
*/ */
public function fonts() { public function fonts() {
// Polices trouvées dans la configuration
$fonts = $this->getData(['fonts']);
// 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']),
@ -563,34 +568,44 @@ class theme extends common {
'Admin (texte)' => $this->getData (['admin', 'fontText' ]) 'Admin (texte)' => $this->getData (['admin', 'fontText' ])
]; ];
// Parcourir les fontes installées et construire le tableau pour le formulaire // Récupérer le détail des fontes installées
foreach (self::$fonts as $fontId => $fontName) { $f = $this->getFonts();
// Fontes utilisées par le thème // Parcourir les fontes disponibles et construire le tableau pour le formulaire
foreach ($f as $type => $typeValue) {
foreach ($typeValue as $fontId => $fontValue) {
// Fontes utilisées par les thèmes
$fontUsed[$fontId] = ''; $fontUsed[$fontId] = '';
foreach ($used as $key => $value) { foreach ($used as $key => $value) {
if ( $value === $fontId) { if ( $value === $fontId) {
$fontUsed[$fontId] .= $key . '<br/>'; $fontUsed[$fontId] .= $key . '<br/>';
} }
} }
self::$fontsList [] = [ self::$fontsDetail [] = [
'<span style="font-family:' . $fontName . '">' . $fontName . '</span>' ,
$fontId, $fontId,
'<span style="font-family:' . $f[$type][$fontId]['font-family'] . '">' . $f[$type][$fontId]['name'] . '</span>' ,
$f[$type][$fontId]['font-family'],
$fontUsed[$fontId], $fontUsed[$fontId],
//array_key_exists($fontId, $fonts['imported']) ? 'Importée' : '', $type,
array_key_exists($fontId, $fonts['files']) ? $type !== 'websafe' ? template::button('themeFontEdit' . $fontId, [
$fonts['files'][$fontId] : 'class' => 'themeFontEdit',
(array_key_exists($fontId, self::$fontsWebSafe) ? 'WebSafe' : 'CDN Fonts'), 'href' => helper::baseUrl() . $this->getUrl(0) . '/fontEdit/' . $type . '/' . $fontId . '/' . $_SESSION['csrf'],
array_key_exists($fontId, $fonts['imported']) || array_key_exists($fontId, $fonts['files']) 'value' => template::ico('pencil'),
? template::button('themeFontDelete' . $fontId, [ 'disabled' => !empty($fontUsed[$fontId])
])
: '',
$type !== 'websafe' ? template::button('themeFontDelete' . $fontId, [
'class' => 'themeFontDelete buttonRed', 'class' => 'themeFontDelete buttonRed',
'href' => helper::baseUrl() . $this->getUrl(0) . '/fontDelete/' . $fontId . '/' . $_SESSION['csrf'], 'href' => helper::baseUrl() . $this->getUrl(0) . '/fontDelete/' . $type . '/' . $fontId . '/' . $_SESSION['csrf'],
'value' => template::ico('trash'), 'value' => template::ico('cancel'),
'disabled' => !empty($fontUsed[$fontId]) 'disabled' => !empty($fontUsed[$fontId])
]) ])
: '' : ''
]; ];
} }
}
sort(self::$fontsDetail);
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'title' => 'Gestion des fontes', 'title' => 'Gestion des fontes',
@ -604,57 +619,48 @@ class theme extends common {
public function fontAdd() { public function fontAdd() {
// Soumission du formulaire // Soumission du formulaire
if ($this->isPost()) { if ($this->isPost()) {
// Type d'import en ligne ou local
$fontId = $this->getInput('fontAddFontId', null, true); $type = $this->getInput('fontAddFontImported', helper::FILTER_BOOLEAN) ? 'imported' : 'files';
$fontName = $this->getInput('fontAddFontName', null, true); $ressource = $type === 'imported' ? $this->getInput('fontAddUrl', helper::FILTER_STRING_SHORT) : $this->getInput('fontAddFile', helper::FILTER__SHORT_STRING);
$filePath = $this->getInput('fontAddFile', null); $fontId = $this->getInput('fontAddFontId', helper::FILTER_STRING_SHORT, true);
$e = explode ('/', $filePath); $fontName = $this->getInput('fontAddFontName', helper::FILTER_STRING_SHORT, true);
$file = $e[count($e) - 1 ]; $fontFamilyName = $this->getInput('fontAddFontFamilyName', helper::FILTER_STRING_SHORT, true);
// Vérifier l'existence de fontId et validité de family name si usage en ligne de cdnFonts // Vérifier l'existence de fontId et validité de family name si usage en ligne de cdnFonts
$data = helper::getUrlContents('https://www.cdnfonts.com/' . $fontId . '.font');
if ( $filePath === ''
&& $fontName !== ''
&& strpos($data, $fontName) === false
) {
// Valeurs en sortie
$this->addOutput([
'notification' => 'Erreur de nom de fonte ou d\'identifiant',
'redirect' => helper::baseUrl() . 'theme/fontAdd',
'state' => false
]);
} else {
// Charger les données des fontes // Charger les données des fontes
$files = $this->getData(['fonts', 'files']); $fonts = $this->getData(['fonts']);
$imported = $this->getData(['fonts', 'imported']);
// Concaténation dans les tableaux existants // Concaténation dans les tableaux existants
$imported = array_merge([$fontId => $fontName], $imported); $t = [ $fontId => [
$files = array_merge([$fontId => $file], $files); 'name' => $fontName,
'font-family' => $fontFamilyName,
'ressource' => $ressource
]];
// Stocker les fontes
$this->setData(['fonts', $type, [ $fontId =>
[
'name' => $fontName,
'font-family' => $fontFamilyName,
'ressource' => $ressource
]]
]);
// Copier la fonte si le nom du fichier est fourni // Copier la fonte si le nom du fichier est fourni
if (!empty($filePath)) { if ( $type === 'files' &&
copy ( self::FILE_DIR . 'source/' . $filePath, self::DATA_DIR . 'fonts/' . $file ); is_file(self::FILE_DIR . 'source/' . $ressource)
} ) {
copy ( self::FILE_DIR . 'source/' . $ressource, self::DATA_DIR . 'fonts/' . $ressource );
// Mettre à jour le fichier des fontes
$this->setData(['fonts', 'imported', $imported ]);
if (!empty($filePath) ) {
$this->setData(['fonts', 'files', $files ]);
} }
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'notification' => 'La fonte a été importée', 'notification' => 'La fonte a été créée',
'redirect' => helper::baseUrl() . 'theme/fonts', 'redirect' => helper::baseUrl() . 'theme/fonts',
'state' => true 'state' => true
]); ]);
} }
}
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'title' => 'Ajouter une fonte', 'title' => 'Ajouter une fonte',
@ -662,12 +668,68 @@ class theme extends common {
]); ]);
} }
/**
* Ajouter une fonte
*/
public function fontEdit() {
// Soumission du formulaire
if ($this->isPost()) {
// Type d'import en ligne ou local
$type = $this->getInput('fontEditFontImported', helper::FILTER_BOOLEAN) ? 'imported' : 'files';
$ressource = $type === 'imported' ? $this->getInput('fontEditUrl', helper::FILTER_STRING_SHORT) : $this->getInput('fontEditFile', helper::FILTER__SHORT_STRING);
$fontId = $this->getInput('fontEditFontId', helper::FILTER_STRING_SHORT, true);
$fontName = $this->getInput('fontEditFontName', helper::FILTER_STRING_SHORT, true);
$fontFamilyName = $this->getInput('fontEditFontFamilyName', helper::FILTER_STRING_SHORT, true);
// Vérifier l'existence de fontId et validité de family name si usage en ligne de cdnFonts
// Charger les données des fontes
$fonts = $this->getData(['fonts']);
// Concaténation dans les tableaux existants
$t = [ $fontId => [
'name' => $fontName,
'font-family' => $fontFamilyName,
'ressource' => $ressource
]];
// Stocker les fontes
$this->setData(['fonts', $type, [ $fontId =>
[
'name' => $fontName,
'font-family' => $fontFamilyName,
'ressource' => $ressource
]]
]);
// Copier la fonte si le nom du fichier est fourni
if ( $type === 'files' &&
is_file(self::FILE_DIR . 'source/' . $ressource)
) {
copy ( self::FILE_DIR . 'source/' . $ressource, self::DATA_DIR . 'fonts/' . $ressource );
}
// Valeurs en sortie
$this->addOutput([
'notification' => 'La fonte a été actualisée',
'redirect' => helper::baseUrl() . 'theme/fonts',
'state' => true
]);
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Editer une fonte',
'view' => 'fontEdit'
]);
}
/** /**
* Effacer une fonte * Effacer une fonte
*/ */
public function fontDelete() { public function fontDelete() {
// Jeton incorrect // Jeton incorrect
if ($this->getUrl(3) !== $_SESSION['csrf']) { if ($this->getUrl(4) !== $_SESSION['csrf']) {
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'redirect' => helper::baseUrl() . 'theme/fonts', 'redirect' => helper::baseUrl() . 'theme/fonts',
@ -677,26 +739,19 @@ class theme extends common {
// Suppression // Suppression
else { else {
// Charger les données des fontes // Effacer la fonte de la base
$files = $this->getData(['fonts', 'files']); $this->deleteData(['fonts', $this->getUrl(2), $this->getUrl(3)]);
$imported = $this->getData(['fonts', 'imported']);
// Effacer le fichier existant // Effacer le fichier existant
if ( file_exists(self::DATA_DIR . $files[$this->getUrl(2)]) ) { if ( $this->getUrl(2) === 'file' &&
unlink(self::DATA_DIR . $files[$this->getUrl(2)]); file_exists(self::DATA_DIR . $this->getUrl(2)) ) {
unlink(self::DATA_DIR . $this->getUrl(2));
} }
// Supprimer les entrées
unset($files[$this->getUrl(2)]);
unset($imported[$this->getUrl(2)]);
// Mettre à jour le fichier des fontes
$this->setData(['fonts', 'files', $files ]);
$this->setData(['fonts', 'imported', $imported ]);
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'redirect' => helper::baseUrl() . 'theme/fonts', 'redirect' => helper::baseUrl() . 'theme/fonts',
'notification' => 'Fonte supprimée', 'notification' => 'La fonte a été supprimée',
'state' => true 'state' => true
]); ]);
} }
@ -786,6 +841,8 @@ class theme extends common {
'state' => true 'state' => true
]); ]);
} }
// Lire les fontes installées
$this->enumFonts();
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'title' => 'Personnalisation du site', 'title' => 'Personnalisation du site',
@ -994,7 +1051,8 @@ class theme extends common {
} }
/** /**
* Subsitution des fontes de Google Fonts vers CdnFont grâce à un tableau de conversion * Substitution des fontes de Google Fonts vers CdnFont grâce à un tableau de conversion
* Cette fonction est utilisée par l'import.
* @param string $file, nom du fichier json à convertir * @param string $file, nom du fichier json à convertir
* @return int nombre de substitution effectuées * @return int nombre de substitution effectuées
*/ */
@ -1046,4 +1104,19 @@ class theme extends common {
return ($count); return ($count);
} }
// Retourne un tableau simple des fonts installées idfont avec le nom
// Cette fonction est utile aux sélecteurs de fonts dans les formulaires.
public function enumFonts() {
// Récupère la liste des fontes installées
$f = $this->getFonts();
// Construit un tableau avec leur ID et leur famille
foreach(['websafe', 'imported', 'files'] as $type) {
foreach ($f[$type] as $fontId => $fontValue ) {
$fonts [$fontId] = $fontValue['name'];
}
}
ksort($fonts);
self::$fontsList = $fonts;
}
} }

View File

@ -15,7 +15,8 @@
*/ */
$(document).ready(function(){ $(document).ready(function(){
$('input[name=fontAddFontImported]').prop('checked', true); $('input[name=fontAddFontImported]').prop('checked', true);
$('#fontAddFileWrapper').hide(); $('input[name=fontAddFontUrl]').prop('checked', false);
$('#containerFontAddFile').hide();
}); });
@ -28,7 +29,8 @@ $("input[name=fontAddFontImported]").on("click", function() {
} else { } else {
$('input[name=fontAddFontFile]').prop('checked', true); $('input[name=fontAddFontFile]').prop('checked', true);
} }
$('#fontAddFileWrapper').hide(); $('#containerFontAddFile').hide();
$('#containerFontAddUrl').show();
}); });
$("input[name=fontAddFontFile]").on("click", function() { $("input[name=fontAddFontFile]").on("click", function() {
@ -37,5 +39,6 @@ $("input[name=fontAddFontFile]").on("click", function() {
} else { } else {
$('input[name=fontAddFontImported]').prop('checked', true); $('input[name=fontAddFontImported]').prop('checked', true);
} }
$('#fontAddFileWrapper').show(); $('#containerFontAddFile').show();
$('#containerFontAddUrl').hide();
}); });

View File

@ -9,7 +9,7 @@
]); ?> ]); ?>
</div> </div>
<div class="col2"> <div class="col2">
<?php echo template::button('pageEditHelp', [ <?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', 'ico' => 'help',
@ -30,14 +30,10 @@
<h4>Identité de la fonte</h4> <h4>Identité de la fonte</h4>
<div class="row"> <div class="row">
<div class="col6"> <div class="col6">
<?php echo template::checkbox('fontAddFontImported', true, 'Fonte téléchargée sur cdnFonts', [ <?php echo template::checkbox('fontAddFontImported', true, 'Fonte en ligne', []); ?>
'help' => 'Police utilisée en ligne, se connecter sur cdnFonts pour récupérer les informations nécessaires.'
]); ?>
</div> </div>
<div class="col6"> <div class="col6">
<?php echo template::checkbox('fontAddFontFile', true,'Fonte installée', [ <?php echo template::checkbox('fontAddFontFile', true,'Fonte installée', []); ?>
'help' => '<br/>Sélectionnez un fichier de fonte au format WOFF.'
]); ?>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
@ -45,23 +41,39 @@
<?php echo template::text('fontAddFontId', [ <?php echo template::text('fontAddFontId', [
'autocomplete' => 'off', 'autocomplete' => 'off',
'label' => 'Identifiant (sans espace ni majuscule)', 'label' => 'Identifiant (sans espace ni majuscule)',
'placeholder' => 'perry-gothic' 'placeholder' => 'big-marker-extrude'
]); ?> ]); ?>
</div> </div>
<div class="col6"> <div class="col6">
<?php echo template::text('fontAddFontName', [ <?php echo template::text('fontAddFontName', [
'autocomplete' => 'off', 'autocomplete' => 'off',
'label' => 'Nom (Font Family)', 'label' => 'Nom',
'placeholder' => 'PerryGothic' 'placeholder' => 'Big Marker Extrude'
]); ?> ]); ?>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col12">
<?php echo template::text('fontAddFontFamilyName', [
'autocomplete' => 'off',
'label' => 'Famille',
'placeholder' => "'Big Marker Extrude', sans-serif"
]); ?>
</div>
</div>
<div class="row" id="containerFontAddFile">
<div class="col12"> <div class="col12">
<?php echo template::file('fontAddFile', [ <?php echo template::file('fontAddFile', [
'label' => 'Fichier de police (Format WOFF)', 'label' => 'Fichier de fonte (Format WOFF)'
'placeholder' => 'https://fonts.cdnfonts.com/s/7896/PERRYGOT.woff' ]); ?>
</div>
</div>
<div class="row" id="containerFontAddUrl">
<div class="col12">
<?php echo template::text('fontAddUrl', [
'label' => 'Url du fichier de fonte',
'placeholder' => 'https://fonts.cdnfonts.com/css/big-marker-extrude'
]); ?> ]); ?>
</div> </div>
</div> </div>

View File

@ -0,0 +1,18 @@
/**
* 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
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2022, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.fr/
*/
/** NE PAS EFFACER
* admin.css
*/

View File

@ -0,0 +1,44 @@
/**
* 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 Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2022, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.fr/
*/
/**
* Option par défaut du sélecteur de mode
*/
$(document).ready(function(){
$('input[name=fontEditFontImported]').prop('checked', true);
$('input[name=fontEditFontUrl]').prop('checked', false);
$('#containerfontEditFile').hide();
});
/**
* 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() {
if( $('input[name=fontEditFontFile]').is(':checked') ){
$('input[name=fontEditFontImported]').prop('checked', false);
} else {
$('input[name=fontEditFontImported]').prop('checked', true);
}
$('#containerfontEditFile').show();
$('#containerfontEditUrl').hide();
});

View File

@ -0,0 +1,87 @@
<?php echo template::formOpen('fontEditForm'); ?>
<div class="row">
<div class="col2">
<?php echo template::button('fontEditBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'theme/fonts',
'ico' => 'left',
'value' => 'Retour'
]); ?>
</div>
<div class="col2">
<?php echo template::button('fontEditHelp', [
'href' => 'https://doc.zwiicms.fr/fontes#add',
'target' => '_blank',
'ico' => 'help',
'value' => 'Aide',
'class' => 'buttonHelp'
]); ?>
</div>
<div class="col2 offset6">
<?php echo template::submit('fontEditPublish', [
'value' => 'Valider',
'uniqueSubmission' => true
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Identité de la fonte</h4>
<div class="row">
<div class="col6">
<?php echo template::checkbox('fontEditFontImported', true, 'Fonte en ligne', [
'checked' => $this->getUrl(2) === 'imported' ? true : false
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('fontEditFontFile', true,'Fonte installée', [
'checked' => $this->getUrl(2) === 'file' ? true : false
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::text('fontEditFontId', [
'autocomplete' => 'off',
'label' => 'Identifiant (sans espace ni majuscule)',
'value' => $this->getUrl(3)
]); ?>
</div>
<div class="col6">
<?php echo template::text('fontEditFontName', [
'autocomplete' => 'off',
'label' => 'Nom',
'value' => $this->getData(['fonts', $this->getUrl(2), $this->getUrl(3), 'name'])
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::text('fontEditFontFamilyName', [
'autocomplete' => 'off',
'label' => 'Famille',
'value' => $this->getData(['fonts', $this->getUrl(2), $this->getUrl(3), 'font-family'])
]); ?>
</div>
</div>
<div class="row" id="containerfontEditFile">
<div class="col12">
<?php echo template::file('fontEditFile', [
'label' => 'Fichier de fonte (Format WOFF)',
'value' => $this->getUrl(2) === 'file' ? $this->getData(['fonts', $this->getUrl(2), $this->getUrl(3), 'ressource']) : ''
]); ?>
</div>
</div>
<div class="row" id="containerfontEditUrl">
<div class="col12">
<?php echo template::text('fontEditUrl', [
'label' => 'Url du fichier de fonte',
'value' => $this->getUrl(2) === 'imported' ? $this->getData(['fonts', $this->getUrl(2), $this->getUrl(3), 'ressource']) : ''
]); ?>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -23,8 +23,8 @@
]); ?> ]); ?>
</div> </div>
</div> </div>
<?php if($module::$fontsList): ?> <?php if($module::$fontsDetail): ?>
<?php echo template::table([3, 3, 3, 3, 1], $module::$fontsList, ['Family Name', 'Font Id', 'Affectation', 'Ressource', 'Effacer']); ?> <?php echo template::table([2, 2, 3, 2, 1, 1, 1], $module::$fontsDetail, ['FontId', 'Nom', 'Famille', 'Affectation', 'Origine', '', '']); ?>
<?php else: ?> <?php else: ?>
<?php echo template::speech('Aucune fonte !'); ?> <?php echo template::speech('Aucune fonte !'); ?>
<?php endif; ?> <?php endif; ?>

View File

@ -133,7 +133,7 @@
]); ?> ]); ?>
</div> </div>
<div class="col3"> <div class="col3">
<?php echo template::select('configLegalPageId', array_merge(['none' => 'Aucune'] , helper::arrayCollumn($module::$pagesList, 'title', 'SORT_ASC') ) , [ <?php echo template::select('configLegalPageId', array_merge(['none' => 'Aucune'] , helper::arrayColumn($module::$pagesList, 'title', 'SORT_ASC') ) , [
'label' => 'Page "Mentions légales" ' . template::flag('site', '20px'), 'label' => 'Page "Mentions légales" ' . template::flag('site', '20px'),
'selected' => $this->getData(['locale', 'legalPageId']) 'selected' => $this->getData(['locale', 'legalPageId'])
]); ?> ]); ?>
@ -147,7 +147,7 @@
]); ?> ]); ?>
</div> </div>
<div class="col3"> <div class="col3">
<?php echo template::select('configSearchPageId', array_merge(['none' => 'Aucune'] , helper::arrayCollumn($module::$pagesList, 'title', 'SORT_ASC') ) , [ <?php echo template::select('configSearchPageId', array_merge(['none' => 'Aucune'] , helper::arrayColumn($module::$pagesList, 'title', 'SORT_ASC') ) , [
'label' => 'Page "Rechercher" ' . template::flag('site', '20px'), 'label' => 'Page "Rechercher" ' . template::flag('site', '20px'),
'selected' => $this->getData(['locale', 'searchPageId']) 'selected' => $this->getData(['locale', 'searchPageId'])
]); ?> ]); ?>
@ -171,7 +171,7 @@
<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', self::$fonts, [ <?php echo template::select('themeFooterFont', $module::$fontsList, [
'label' => 'Police', 'label' => 'Police',
'selected' => $this->getData(['theme', 'footer', 'font']), 'selected' => $this->getData(['theme', 'footer', 'font']),
'fonts' => true 'fonts' => true

View File

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

View File

@ -183,7 +183,7 @@
<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', self::$fonts, [ <?php echo template::select('themeMenuFont', $module::$fontsList, [
'label' => 'Police', 'label' => 'Police',
'selected' => $this->getData(['theme', 'menu', 'font']), 'selected' => $this->getData(['theme', 'menu', 'font']),
'fonts' => true 'fonts' => true

View File

@ -158,7 +158,7 @@
<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', self::$fonts, [ <?php echo template::select('themeTextFont', $module::$fontsList, [
'label' => 'Police', 'label' => 'Police',
'selected' => $this->getData(['theme', 'text', 'font']), 'selected' => $this->getData(['theme', 'text', 'font']),
'fonts' => true 'fonts' => true
@ -179,7 +179,7 @@
<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', self::$fonts, [ <?php echo template::select('themeTitleFont', $module::$fontsList, [
'label' => 'Police', 'label' => 'Police',
'selected' => $this->getData(['theme', 'title', 'font']), 'selected' => $this->getData(['theme', 'title', 'font']),
'fonts' => true 'fonts' => true

View File

@ -336,7 +336,7 @@ class user extends common {
* Liste des utilisateurs * Liste des utilisateurs
*/ */
public function index() { public function index() {
$userIdsFirstnames = helper::arrayCollumn($this->getData(['user']), 'firstname'); $userIdsFirstnames = helper::arrayColumn($this->getData(['user']), 'firstname');
ksort($userIdsFirstnames); ksort($userIdsFirstnames);
foreach($userIdsFirstnames as $userId => $userFirstname) { foreach($userIdsFirstnames as $userId => $userFirstname) {
if ($this->getData(['user', $userId, 'group'])) { if ($this->getData(['user', $userId, 'group'])) {
@ -399,7 +399,7 @@ class user extends common {
] ]
]); ]);
// Verrouillage des IP // Verrouillage des IP
$ipBlackList = helper::arrayCollumn($this->getData(['blacklist']), 'ip'); $ipBlackList = helper::arrayColumn($this->getData(['blacklist']), 'ip');
if ( $this->getData(['blacklist',$userId,'connectFail']) >= $this->getData(['config', 'connect', 'attempt']) if ( $this->getData(['blacklist',$userId,'connectFail']) >= $this->getData(['config', 'connect', 'attempt'])
AND in_array($this->getData(['blacklist',$userId,'ip']),$ipBlackList) ) { AND in_array($this->getData(['blacklist',$userId,'ip']),$ipBlackList) ) {
$logStatus = 'Compte inconnu verrouillé'; $logStatus = 'Compte inconnu verrouillé';

View File

@ -144,8 +144,8 @@ class blog extends common {
$feeds->setDate(date('r',time())); $feeds->setDate(date('r',time()));
$feeds->addGenerator(); $feeds->addGenerator();
// Corps des articles // Corps des articles
$articleIdsPublishedOns = helper::arrayCollumn($this->getData(['module', $this->getUrl(0), 'posts']), 'publishedOn', 'SORT_DESC'); $articleIdsPublishedOns = helper::arrayColumn($this->getData(['module', $this->getUrl(0), 'posts']), 'publishedOn', 'SORT_DESC');
$articleIdsStates = helper::arrayCollumn($this->getData(['module', $this->getUrl(0),'posts']), 'state', 'SORT_DESC'); $articleIdsStates = helper::arrayColumn($this->getData(['module', $this->getUrl(0),'posts']), 'state', 'SORT_DESC');
foreach( $articleIdsPublishedOns as $articleId => $articlePublishedOn ) { foreach( $articleIdsPublishedOns as $articleId => $articlePublishedOn ) {
if( $articlePublishedOn <= time() AND $articleIdsStates[$articleId] ) { if( $articlePublishedOn <= time() AND $articleIdsStates[$articleId] ) {
// Miniature // Miniature
@ -234,7 +234,7 @@ class blog extends common {
]); ]);
} }
// Liste des utilisateurs // Liste des utilisateurs
self::$users = helper::arrayCollumn($this->getData(['user']), 'firstname'); self::$users = helper::arrayColumn($this->getData(['user']), 'firstname');
ksort(self::$users); ksort(self::$users);
foreach(self::$users as $userId => &$userFirstname) { foreach(self::$users as $userId => &$userFirstname) {
$userFirstname = $userFirstname . ' ' . $this->getData(['user', $userId, 'lastname']); $userFirstname = $userFirstname . ' ' . $this->getData(['user', $userId, 'lastname']);
@ -263,7 +263,7 @@ class blog extends common {
'value' => 'Tout effacer' 'value' => 'Tout effacer'
]); ]);
// Ids des commentaires par ordre de création // Ids des commentaires par ordre de création
$commentIds = array_keys(helper::arrayCollumn($comments, 'createdOn', 'SORT_DESC')); $commentIds = array_keys(helper::arrayColumn($comments, 'createdOn', 'SORT_DESC'));
// Pagination // Pagination
$pagination = helper::pagination($commentIds, $this->getUrl(),$this->getData(['module', $this->getUrl(0), 'config', 'itemsperPage']) ); $pagination = helper::pagination($commentIds, $this->getUrl(),$this->getData(['module', $this->getUrl(0), 'config', 'itemsperPage']) );
// Liste des pages // Liste des pages
@ -503,6 +503,78 @@ class blog extends common {
'state' => true 'state' => true
]); ]);
} else { } else {
// Ids des articles par ordre de publication
$articleIds = array_keys(helper::arrayColumn($this->getData(['module', $this->getUrl(0), 'posts']), 'publishedOn', 'SORT_DESC'));
// Gestion des droits d'accès
$filterData=[];
foreach ($articleIds as $key => $value) {
if (
( // Propriétaire
$this->getData(['module', $this->getUrl(0), 'posts', $value,'editConsent']) === self::EDIT_OWNER
AND ( $this->getData(['module', $this->getUrl(0), 'posts', $value,'userId']) === $this->getUser('id')
OR $this->getUser('group') === self::GROUP_ADMIN )
)
OR (
// Groupe
$this->getData(['module', $this->getUrl(0), 'posts', $value,'editConsent']) !== self::EDIT_OWNER
AND $this->getUser('group') >= $this->getData(['module',$this->getUrl(0), 'posts', $value,'editConsent'])
)
OR (
// Tout le monde
$this->getData(['module', $this->getUrl(0), 'posts', $value,'editConsent']) === self::EDIT_ALL
)
) {
$filterData[] = $value;
}
}
$articleIds = $filterData;
// Pagination
$pagination = helper::pagination($articleIds, $this->getUrl(),$this->getData(['module', $this->getUrl(0),'config', 'itemsperPage']));
// Liste des pages
self::$pages = $pagination['pages'];
// Articles en fonction de la pagination
for($i = $pagination['first']; $i < $pagination['last']; $i++) {
// Nombre de commentaires à approuver et approuvés
$approvals = helper::arrayColumn($this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'comment' ]),'approval', 'SORT_DESC');
if ( is_array($approvals) ) {
$a = array_values($approvals);
$toApprove = count(array_keys($a,false));
$approved = count(array_keys($a,true));
} else {
$toApprove = 0;
$approved = count($this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i],'comment']));
}
// Met en forme le tableau
$date = mb_detect_encoding(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn'])), 'UTF-8', true)
? strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn']))
: utf8_encode(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn'])));
$heure = mb_detect_encoding(strftime('%H:%M', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn'])), 'UTF-8', true)
? strftime('%H:%M', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn']))
: utf8_encode(strftime('%H:%M', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn'])));
self::$articles[] = [
'<a href="' . helper::baseurl() . $this->getUrl(0) . '/' . $articleIds[$i] . '" target="_blank" >' .
$this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'title']) .
'</a>',
$date .' à '. $heure,
self::$states[$this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'state'])],
// Bouton pour afficher les commentaires de l'article
template::button('blogConfigComment' . $articleIds[$i], [
'class' => ($toApprove || $approved ) > 0 ? '' : 'buttonGrey' ,
'href' => ($toApprove || $approved ) > 0 ? helper::baseUrl() . $this->getUrl(0) . '/comment/' . $articleIds[$i] : '',
'value' => $toApprove > 0 ? $toApprove . '/' . $approved : $approved
]),
template::button('blogConfigEdit' . $articleIds[$i], [
'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $articleIds[$i] . '/' . $_SESSION['csrf'],
'value' => template::ico('pencil')
]),
template::button('blogConfigDelete' . $articleIds[$i], [
'class' => 'blogConfigDelete buttonRed',
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $articleIds[$i] . '/' . $_SESSION['csrf'],
'value' => template::ico('cancel')
])
];
}
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'title' => 'Options de configuration', 'title' => 'Options de configuration',
@ -612,7 +684,7 @@ class blog extends common {
]); ]);
} }
// Liste des utilisateurs // Liste des utilisateurs
self::$users = helper::arrayCollumn($this->getData(['user']), 'firstname'); self::$users = helper::arrayColumn($this->getData(['user']), 'firstname');
ksort(self::$users); ksort(self::$users);
foreach(self::$users as $userId => &$userFirstname) { foreach(self::$users as $userId => &$userFirstname) {
// Les membres ne sont pas éditeurs, les exclure de la liste // Les membres ne sont pas éditeurs, les exclure de la liste
@ -726,7 +798,7 @@ class blog extends common {
// Ligne suivante si affichage du nombre total de commentaires approuvés sous l'article // Ligne suivante si affichage du nombre total de commentaires approuvés sous l'article
self::$nbCommentsApproved = count($commentsApproved); self::$nbCommentsApproved = count($commentsApproved);
} }
$commentIds = array_keys(helper::arrayCollumn($commentsApproved, 'createdOn', 'SORT_DESC')); $commentIds = array_keys(helper::arrayColumn($commentsApproved, 'createdOn', 'SORT_DESC'));
// Pagination // Pagination
$pagination = helper::pagination($commentIds, $this->getUrl(), $this->getData(['module', $this->getUrl(0),'config', 'itemsperPage']),'#comment'); $pagination = helper::pagination($commentIds, $this->getUrl(), $this->getData(['module', $this->getUrl(0),'config', 'itemsperPage']),'#comment');
// Liste des pages // Liste des pages
@ -766,8 +838,8 @@ class blog extends common {
// Liste des articles // Liste des articles
else { else {
// Ids des articles par ordre de publication // Ids des articles par ordre de publication
$articleIdsPublishedOns = helper::arrayCollumn($this->getData(['module', $this->getUrl(0),'posts']), 'publishedOn', 'SORT_DESC'); $articleIdsPublishedOns = helper::arrayColumn($this->getData(['module', $this->getUrl(0),'posts']), 'publishedOn', 'SORT_DESC');
$articleIdsStates = helper::arrayCollumn($this->getData(['module', $this->getUrl(0), 'posts']), 'state', 'SORT_DESC'); $articleIdsStates = helper::arrayColumn($this->getData(['module', $this->getUrl(0), 'posts']), 'state', 'SORT_DESC');
$articleIds = []; $articleIds = [];
foreach($articleIdsPublishedOns as $articleId => $articlePublishedOn) { foreach($articleIdsPublishedOns as $articleId => $articlePublishedOn) {
if($articlePublishedOn <= time() AND $articleIdsStates[$articleId]) { if($articlePublishedOn <= time() AND $articleIdsStates[$articleId]) {

View File

@ -106,6 +106,13 @@ class form extends common {
* Configuration * Configuration
*/ */
public function config() { public function config() {
// Liste des utilisateurs
$userIdsFirstnames = helper::arrayColumn($this->getData(['user']), 'firstname');
ksort($userIdsFirstnames);
self::$listUsers [] = '';
foreach($userIdsFirstnames as $userId => $userFirstname) {
self::$listUsers [] = $userId;
}
// Soumission du formulaire // Soumission du formulaire
if($this->isPost()) { if($this->isPost()) {
// Génération des données vides // Génération des données vides

View File

@ -78,7 +78,7 @@ function position() {
var inputUid = 0; var inputUid = 0;
var inputs = <?php echo json_encode($this->getData(['module', $this->getUrl(0), 'input'])); ?>; var inputs = <?php echo json_encode($this->getData(['module', $this->getUrl(0), 'input'])); ?>;
if(inputs) { if(inputs) {
var inputsPerPosition = <?php echo json_encode(helper::arrayCollumn($this->getData(['module', $this->getUrl(0), 'input']), 'position', 'SORT_ASC')); ?>; var inputsPerPosition = <?php echo json_encode(helper::arrayColumn($this->getData(['module', $this->getUrl(0), 'input']), 'position', 'SORT_ASC')); ?>;
$.each(inputsPerPosition, function(id) { $.each(inputsPerPosition, function(id) {
add(inputUid, inputs[id]); add(inputUid, inputs[id]);
inputUid++; inputUid++;

View File

@ -320,7 +320,7 @@ class gallery extends common {
//Affichage de la galerie triée //Affichage de la galerie triée
$g = $this->getData(['module', $this->getUrl(0), 'content']); $g = $this->getData(['module', $this->getUrl(0), 'content']);
$p = helper::arrayCollumn(helper::arrayCollumn($g,'config'),'position'); $p = helper::arrayColumn(helper::arrayColumn($g,'config'),'position');
asort($p,SORT_NUMERIC); asort($p,SORT_NUMERIC);
$galleries = []; $galleries = [];
foreach ($p as $positionId => $item) { foreach ($p as $positionId => $item) {
@ -678,7 +678,7 @@ class gallery extends common {
else { else {
// Tri des galeries suivant l'ordre défini // Tri des galeries suivant l'ordre défini
$g = $this->getData(['module', $this->getUrl(0), 'content']); $g = $this->getData(['module', $this->getUrl(0), 'content']);
$p = helper::arrayCollumn(helper::arrayCollumn($g,'config'),'position'); $p = helper::arrayColumn(helper::arrayColumn($g,'config'),'position');
asort($p,SORT_NUMERIC); asort($p,SORT_NUMERIC);
$galleries = []; $galleries = [];
foreach ($p as $positionId => $item) { foreach ($p as $positionId => $item) {

View File

@ -114,8 +114,8 @@ class news extends common {
$feeds->setDate(date('r',time())); $feeds->setDate(date('r',time()));
$feeds->addGenerator(); $feeds->addGenerator();
// Corps des articles // Corps des articles
$newsIdsPublishedOns = helper::arrayCollumn($this->getData(['module', $this->getUrl(0), 'posts']), 'publishedOn', 'SORT_DESC'); $newsIdsPublishedOns = helper::arrayColumn($this->getData(['module', $this->getUrl(0), 'posts']), 'publishedOn', 'SORT_DESC');
$newsIdsStates = helper::arrayCollumn($this->getData(['module', $this->getUrl(0), 'posts']), 'state', 'SORT_DESC'); $newsIdsStates = helper::arrayColumn($this->getData(['module', $this->getUrl(0), 'posts']), 'state', 'SORT_DESC');
foreach($newsIdsPublishedOns as $newsId => $newsPublishedOn) { foreach($newsIdsPublishedOns as $newsId => $newsPublishedOn) {
if($newsPublishedOn <= time() AND $newsIdsStates[$newsId]) { if($newsPublishedOn <= time() AND $newsIdsStates[$newsId]) {
$newsArticle = $feeds->createNewItem(); $newsArticle = $feeds->createNewItem();
@ -166,7 +166,7 @@ class news extends common {
]); ]);
} }
// Liste des utilisateurs // Liste des utilisateurs
self::$users = helper::arrayCollumn($this->getData(['user']), 'firstname'); self::$users = helper::arrayColumn($this->getData(['user']), 'firstname');
ksort(self::$users); ksort(self::$users);
foreach(self::$users as $userId => &$userFirstname) { foreach(self::$users as $userId => &$userFirstname) {
$userFirstname = $userFirstname . ' ' . $this->getData(['user', $userId, 'lastname']); $userFirstname = $userFirstname . ' ' . $this->getData(['user', $userId, 'lastname']);
@ -290,6 +290,49 @@ class news extends common {
'state' => true 'state' => true
]); ]);
} else { } else {
// Ids des news par ordre de publication
$newsIds = array_keys(helper::arrayColumn($this->getData(['module', $this->getUrl(0), 'posts']), 'publishedOn', 'SORT_DESC'));
// Pagination
$pagination = helper::pagination($newsIds, $this->getUrl(),$this->getData(['module', $this->getUrl(0), 'config', 'itemsperPage']) );
// Liste des pages
self::$pages = $pagination['pages'];
// News en fonction de la pagination
for($i = $pagination['first']; $i < $pagination['last']; $i++) {
// Met en forme le tableau
$dateOn = mb_detect_encoding(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn'])), 'UTF-8', true)
? strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn']))
: utf8_encode(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn'])));
$dateOn .= ' à ';
$dateOn .= mb_detect_encoding(strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn'])), 'UTF-8', true)
? strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn']))
: utf8_encode(strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn'])));
if ($this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff'])) {
$dateOff = mb_detect_encoding(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff'])), 'UTF-8', true)
? strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff']))
: utf8_encode(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff'])));
$dateOff .= ' à ';
$dateOff .= mb_detect_encoding(strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff'])), 'UTF-8', true)
? strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff']))
: utf8_encode(strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff'])));
} else {
$dateOff = 'Permanent';
}
self::$news[] = [
$this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'title']),
$dateOn,
$dateOff,
self::$states[$this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'state'])],
template::button('newsConfigEdit' . $newsIds[$i], [
'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $newsIds[$i]. '/' . $_SESSION['csrf'],
'value' => template::ico('pencil')
]),
template::button('newsConfigDelete' . $newsIds[$i], [
'class' => 'newsConfigDelete buttonRed',
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $newsIds[$i] . '/' . $_SESSION['csrf'],
'value' => template::ico('cancel')
])
];
}
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'title' => 'Options de configuration', 'title' => 'Options de configuration',
@ -381,7 +424,7 @@ class news extends common {
]); ]);
} }
// Liste des utilisateurs // Liste des utilisateurs
self::$users = helper::arrayCollumn($this->getData(['user']), 'firstname'); self::$users = helper::arrayColumn($this->getData(['user']), 'firstname');
ksort(self::$users); ksort(self::$users);
foreach(self::$users as $userId => &$userFirstname) { foreach(self::$users as $userId => &$userFirstname) {
$userFirstname = $userFirstname . ' ' . $this->getData(['user', $userId, 'lastname']); $userFirstname = $userFirstname . ' ' . $this->getData(['user', $userId, 'lastname']);
@ -434,8 +477,8 @@ class news extends common {
} else { } else {
// Affichage index // Affichage index
// Ids des news par ordre de publication // Ids des news par ordre de publication
$newsIdsPublishedOns = helper::arrayCollumn($this->getData(['module', $this->getUrl(0), 'posts']), 'publishedOn', 'SORT_DESC'); $newsIdsPublishedOns = helper::arrayColumn($this->getData(['module', $this->getUrl(0), 'posts']), 'publishedOn', 'SORT_DESC');
$newsIdsStates = helper::arrayCollumn($this->getData(['module', $this->getUrl(0), 'posts']), 'state', 'SORT_DESC'); $newsIdsStates = helper::arrayColumn($this->getData(['module', $this->getUrl(0), 'posts']), 'state', 'SORT_DESC');
$newsIds = []; $newsIds = [];
foreach($newsIdsPublishedOns as $newsId => $newsPublishedOn) { foreach($newsIdsPublishedOns as $newsId => $newsPublishedOn) {
$newsIdsPublishedOff = $this->getData(['module', $this->getUrl(0), 'posts', $newsId, 'publishedOff']); $newsIdsPublishedOff = $this->getData(['module', $this->getUrl(0), 'posts', $newsId, 'publishedOff']);