Normalisation + bugs de variables

This commit is contained in:
Fred Tempez 2022-09-29 08:45:59 +02:00
parent 32b4f3b7de
commit 469581e37f
62 changed files with 5060 additions and 4849 deletions

View File

@ -1,22 +1,25 @@
<?php
class template {
class template
{
/**
* retourne un texte traduit
*/
public static function topic($text) {
public static function topic($text)
{
$text = helper::translate($text);
return $text ;
return $text;
}
/**
* Crée un bouton
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function button($nameId, array $attributes = []) {
* Crée un bouton
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function button($nameId, array $attributes = [])
{
// Attributs par défaut
$attributes = array_merge([
'class' => '',
@ -40,18 +43,19 @@ class template {
$attributes['disabled'] ? 'disabled' : '',
$attributes['class'],
$attributes['uniqueSubmission'] ? 'uniqueSubmission' : '',
$attributes['help'] ? ' title="' . $attributes['help'] . '" ': '',
$attributes['help'] ? ' title="' . $attributes['help'] . '" ' : '',
($attributes['ico'] ? template::ico($attributes['ico'], ['margin' => 'right']) : '') . $attributes['value']
);
}
/**
* Crée un champ captcha
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function captcha($nameId, array $attributes = []) {
/**
* Crée un champ captcha
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function captcha($nameId, array $attributes = [])
{
// Attributs par défaut
$attributes = array_merge([
'class' => '',
@ -61,32 +65,32 @@ class template {
'name' => $nameId,
'value' => '',
'limit' => false, // captcha simple
'type'=> 'alpha' // num(érique) ou alpha(bétique)
'type' => 'alpha' // num(érique) ou alpha(bétique)
], $attributes);
// Traduction de l'aide et de l'étiquette
// $attributes['value'] = helper::translate($attributes['value']);
$attributes['help'] = helper::translate($attributes['help']);
// Captcha quatre opérations
// Limite addition et soustraction selon le type de captcha
$numbers = [0,1,2,3,4,5,6,7,8,9,10,12,13,14,15,16,17,18,19,20];
$letters = ['u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','a'];
$limit = $attributes['limit'] ? count($letters)-1 : 10;
$numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20];
$letters = ['u', 't', 's', 'r', 'q', 'p', 'o', 'n', 'm', 'l', 'k', 'j', 'i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a'];
$limit = $attributes['limit'] ? count($letters) - 1 : 10;
// Tirage de l'opération
mt_srand((float) microtime()*1000000);
mt_srand((float) microtime() * 1000000);
// Captcha simple limité à l'addition
$operator = $attributes['limit'] ? mt_rand (1, 4) : 1;
$operator = $attributes['limit'] ? mt_rand(1, 4) : 1;
// Limite si multiplication ou division
if ($operator > 2) {
$limit = 10;
}
}
// Tirage des nombres
mt_srand((float) microtime()*1000000);
$firstNumber = mt_rand (1, $limit);
mt_srand((float) microtime()*1000000);
$secondNumber = mt_rand (1, $limit);
mt_srand((float) microtime() * 1000000);
$firstNumber = mt_rand(1, $limit);
mt_srand((float) microtime() * 1000000);
$secondNumber = mt_rand(1, $limit);
// Permutation si addition ou soustraction
if (($operator < 3) and ($firstNumber < $secondNumber)) {
@ -113,38 +117,41 @@ class template {
$operator = template::ico('divide');
$limit2 = [10, 10, 6, 5, 4, 3, 2, 2, 2, 2];
for ($i = 1; $i <= $firstNumber; $i++) {
$limit = $limit2[$i-1];
}
mt_srand((float) microtime()*1000000);
$limit = $limit2[$i - 1];
}
mt_srand((float) microtime() * 1000000);
$secondNumber = mt_rand(1, $limit);
$firstNumber = $firstNumber * $secondNumber;
$result = $firstNumber / $secondNumber;
break;
}
// Hashage du résultat
// Hashage du résultat
$result = password_hash($result, PASSWORD_BCRYPT);
// Codage des valeurs de l'opération
// Codage des valeurs de l'opération
$firstLetter = uniqid();
$secondLetter = uniqid();
// Masquage image source pour éviter un décodage
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[$firstNumber] . '.png', 'site/tmp/' . $firstLetter . '.png');
copy('core/vendor/zwiico/png/' . $attributes['type'] . '/' . $letters[$secondNumber] . '.png', 'site/tmp/' . $secondLetter . '.png');
// Début du wrapper
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="captcha inputWrapper ' . $attributes['classWrapper'] . '">';
// Label
$html .= self::label($attributes['id'],
'<img class="captcha' . ucFirst($attributes['type']) . '" src="' . helper::baseUrl(false) . 'site/tmp/' . $firstLetter . '.png" />&nbsp;<strong>' . $operator . '</strong>&nbsp;<img class="captcha' . ucFirst($attributes['type']) . '" src="' . helper::baseUrl(false) . 'site/tmp/' . $secondLetter . '.png" /> en chiffres ?', [
'help' => $attributes['help']
]);
$html .= self::label(
$attributes['id'],
'<img class="captcha' . ucFirst($attributes['type']) . '" src="' . helper::baseUrl(false) . 'site/tmp/' . $firstLetter . '.png" />&nbsp;<strong>' . $operator . '</strong>&nbsp;<img class="captcha' . ucFirst($attributes['type']) . '" src="' . helper::baseUrl(false) . 'site/tmp/' . $secondLetter . '.png" /> en chiffres ?',
[
'help' => $attributes['help']
]
);
// Notice
$notice = '';
if(array_key_exists($attributes['id'], common::$inputNotices)) {
if (array_key_exists($attributes['id'], common::$inputNotices)) {
$notice = common::$inputNotices[$attributes['id']];
$attributes['class'] .= ' notice';
}
@ -170,14 +177,15 @@ class template {
}
/**
* Crée une case à cocher à sélection multiple
* @param string $nameId Nom et id du champ
* @param string $value Valeur de la case à cocher
* @param string $label Label de la case à cocher
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function checkbox($nameId, $value, $label, array $attributes = []) {
* Crée une case à cocher à sélection multiple
* @param string $nameId Nom et id du champ
* @param string $value Valeur de la case à cocher
* @param string $label Label de la case à cocher
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function checkbox($nameId, $value, $label, array $attributes = [])
{
// Attributs par défaut
$attributes = array_merge([
'before' => true,
@ -193,14 +201,14 @@ class template {
$label = helper::translate($label);
$attributes['help'] = helper::translate($attributes['help']);
// 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['checked'] = (bool) common::$inputBefore[$attributes['id']];
}
// Début du wrapper
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="inputWrapper ' . $attributes['classWrapper'] . '">';
// Notice
$notice = '';
if(array_key_exists($attributes['id'], common::$inputNotices)) {
if (array_key_exists($attributes['id'], common::$inputNotices)) {
$notice = common::$inputNotices[$attributes['id']];
$attributes['class'] .= ' notice';
}
@ -222,12 +230,13 @@ class template {
}
/**
* Crée un champ date
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function date($nameId, array $attributes = []) {
* Crée un champ date
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function date($nameId, array $attributes = [])
{
// Attributs par défaut
$attributes = array_merge([
'autocomplete' => 'on',
@ -249,23 +258,22 @@ class template {
$attributes['help'] = helper::translate($attributes['help']);
//$attributes['placeholder'] = helper::translate($attributes['placeholder']);
// 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['value'] = common::$inputBefore[$attributes['id']];
}
else {
} else {
$attributes['value'] = ($attributes['value'] ? helper::filter($attributes['value'], helper::FILTER_TIMESTAMP) : '');
}
// Début du wrapper
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="inputWrapper ' . $attributes['classWrapper'] . '">';
// Label
if($attributes['label']) {
if ($attributes['label']) {
$html .= self::label($attributes['id'], $attributes['label'], [
'help' => $attributes['help']
]);
}
// Notice
$notice = '';
if(array_key_exists($attributes['id'], common::$inputNotices)) {
if (array_key_exists($attributes['id'], common::$inputNotices)) {
$notice = common::$inputNotices[$attributes['id']];
$attributes['class'] .= ' notice';
}
@ -290,12 +298,13 @@ class template {
}
/**
* Crée un champ d'upload de fichier
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function file($nameId, array $attributes = []) {
* Crée un champ d'upload de fichier
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function file($nameId, array $attributes = [])
{
// Attributs par défaut
$attributes = array_merge([
'before' => true,
@ -316,20 +325,20 @@ class template {
$attributes['value'] = helper::translate($attributes['value']);
$attributes['help'] = helper::translate($attributes['help']);
// 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['value'] = common::$inputBefore[$attributes['id']];
}
// Début du wrapper
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="inputWrapper ' . $attributes['classWrapper'] . '">';
// Notice
$notice = '';
if(array_key_exists($attributes['id'], common::$inputNotices)) {
if (array_key_exists($attributes['id'], common::$inputNotices)) {
$notice = common::$inputNotices[$attributes['id']];
$attributes['class'] .= ' notice';
}
$html .= self::notice($attributes['id'], $notice);
// Label
if($attributes['label']) {
if ($attributes['label']) {
$html .= self::label($attributes['id'], $attributes['label'], [
'help' => $attributes['help']
]);
@ -346,12 +355,12 @@ class template {
$html .= sprintf(
'<a
href="' .
helper::baseUrl(false) . 'core/vendor/filemanager/dialog.php' .
'?relative_url=1' .
'&field_id=' . $attributes['id'] .
'&type=' . $attributes['type'] .
'&akey=' . md5_file(core::DATA_DIR.'core.json') .
($attributes['extensions'] ? '&extensions=' . $attributes['extensions'] : '')
helper::baseUrl(false) . 'core/vendor/filemanager/dialog.php' .
'?relative_url=1' .
'&field_id=' . $attributes['id'] .
'&type=' . $attributes['type'] .
'&akey=' . md5_file(core::DATA_DIR . 'core.json') .
($attributes['extensions'] ? '&extensions=' . $attributes['extensions'] : '')
. '"
class="inputFile %s %s"
%s
@ -377,19 +386,21 @@ class template {
}
/**
* Ferme un formulaire
* @return string
*/
public static function formClose() {
* Ferme un formulaire
* @return string
*/
public static function formClose()
{
return '</form>';
}
/**
* Ouvre un formulaire protégé par CSRF
* @param string $id Id du formulaire
* @return string
*/
public static function formOpen($id) {
* Ouvre un formulaire protégé par CSRF
* @param string $id Id du formulaire
* @return string
*/
public static function formOpen($id)
{
// Ouverture formulaire
$html = '<form id="' . $id . '" method="post">';
// Stock le token CSRF
@ -403,21 +414,23 @@ class template {
/**
* Crée une aide qui s'affiche au survole
* @param string $text Texte de l'aide
* @return string
*/
public static function help($text) {
* Crée une aide qui s'affiche au survole
* @param string $text Texte de l'aide
* @return string
*/
public static function help($text)
{
return '<span class="helpButton" data-tippy-content="' . $text . '">' . self::ico('help') . '<!----></span>';
}
/**
* Crée un champ caché
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function hidden($nameId, array $attributes = []) {
* Crée un champ caché
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function hidden($nameId, array $attributes = [])
{
// Attributs par défaut
$attributes = array_merge([
'before' => true,
@ -429,7 +442,7 @@ class template {
'value' => ''
], $attributes);
// 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['value'] = common::$inputBefore[$attributes['id']];
}
// Texte
@ -439,19 +452,20 @@ class template {
}
/**
* Crée un icône
* @Array :
* @param string $ico Classe de l'icône
* @param string $margin Ajoute un margin autour de l'icône (choix : left, right, all)
* @param bool $animate Ajoute une animation à l'icône
* @param string $fontSize Taille de la police
* @param string $href lien vers une url
* @param string $help popup d'aide
* @param string $id de l'élement
* @return string
*/
* Crée un icône
* @Array :
* @param string $ico Classe de l'icône
* @param string $margin Ajoute un margin autour de l'icône (choix : left, right, all)
* @param bool $animate Ajoute une animation à l'icône
* @param string $fontSize Taille de la police
* @param string $href lien vers une url
* @param string $help popup d'aide
* @param string $id de l'élement
* @return string
*/
// public static function ico($ico, $margin = '', $animate = false, $fontSize = '1em') {
public static function ico($ico, array $attributes = []) {
public static function ico($ico, array $attributes = [])
{
// Attributs par défaut
$attributes = array_merge([
'margin' => '',
@ -465,62 +479,64 @@ class template {
// Traduction de l'aide
$attributes['help'] = helper::translate($attributes['help']);
// Contenu de l'icône
$item = $attributes['href'] ? '<a id="' . $attributes['id']. '" data-tippy-content="' . $attributes['help'] . '" href="' . $attributes['href'] . '" ' . $attributes['attr']. ' >' : '';
$item = $attributes['href'] ? '<a id="' . $attributes['id'] . '" data-tippy-content="' . $attributes['help'] . '" href="' . $attributes['href'] . '" ' . $attributes['attr'] . ' >' : '';
$item .= '<span class="zwiico-' . $ico . ($attributes['margin'] ? ' zwiico-margin-' . $attributes['margin'] : '') . ($attributes['animate'] ? ' animate-spin' : '') . '" style="font-size:' . $attributes['fontSize'] . '"><!----></span>';
$item .= ($attributes['href']) ? '</a>' : '';
return $item;
}
/**
* Crée un drapeau du site courante
* @param string $langId Id de la langue à affiche ou selected pour la langue courante
* @param string size en pixels ou en rem
* @return string
*/
public static function flag($langId, $size = 'auto') {
* Crée un drapeau du site courante
* @param string $langId Id de la langue à affiche ou selected pour la langue courante
* @param string size en pixels ou en rem
* @return string
*/
public static function flag($langId, $size = 'auto')
{
switch ($langId) {
case '':
$lang = 'fr_FR';
break;
case in_array($langId,core::$languages):
case in_array($langId, core::$languages):
$lang = $langId;
break;
case 'selected':
if ( isset($_COOKIE['ZWII_I18N_SITE'])
) {
if (isset($_COOKIE['ZWII_I18N_SITE'])) {
$lang = $_COOKIE['ZWII_I18N_SITE'];
} else {
$lang = 'fr_FR';
}
}
return '<img class="flag" src="' . helper::baseUrl(false) . 'core/vendor/i18n/png/' . $langId . '.png"
width="' . $size .'"
height="' . $size .'"
title="' . $langId .'"
width="' . $size . '"
height="' . $size . '"
title="' . $langId . '"
alt="(' . $langId . ')"/>';
}
/**
* Crée un label
* @param string $for For du label
* @param array $attributes Attributs ($key => $value)
* @param string $text Texte du label
* @return string
*/
public static function label($for, $text, array $attributes = []) {
* Crée un label
* @param string $for For du label
* @param array $attributes Attributs ($key => $value)
* @param string $text Texte du label
* @return string
*/
public static function label($for, $text, array $attributes = [])
{
// Attributs par défaut
$attributes = array_merge([
'class' => '',
'for' => $for,
'help' => ''
], $attributes);
// Traduction de l'étiquette si déjà appelée par une fonction de template
; if (
// Traduction de l'étiquette si déjà appelée par une fonction de template
;
if (
get_called_class() !== 'template'
) {
$attributes['help'] = helper::translate($attributes['help']);
}
if($attributes['help'] !== '') {
if ($attributes['help'] !== '') {
$text = $text . self::help($attributes['help']);
}
// Retourne le html
@ -532,12 +548,13 @@ class template {
}
/**
* Crée un champ mail
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function mail($nameId, array $attributes = []) {
* Crée un champ mail
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function mail($nameId, array $attributes = [])
{
// Attributs par défaut
$attributes = array_merge([
'autocomplete' => 'on',
@ -560,20 +577,20 @@ class template {
$attributes['help'] = helper::translate($attributes['help']);
//$attributes['placeholder'] = helper::translate($attributes['placeholder']);
// 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['value'] = common::$inputBefore[$attributes['id']];
}
// Début du wrapper
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="inputWrapper ' . $attributes['classWrapper'] . '">';
// Label
if($attributes['label']) {
if ($attributes['label']) {
$html .= self::label($attributes['id'], $attributes['label'], [
'help' => $attributes['help']
]);
}
// Notice
$notice = '';
if(array_key_exists($attributes['id'], common::$inputNotices)) {
if (array_key_exists($attributes['id'], common::$inputNotices)) {
$notice = common::$inputNotices[$attributes['id']];
$attributes['class'] .= ' notice';
}
@ -590,22 +607,24 @@ class template {
}
/**
* Crée une notice
* @param string $id Id du champ
* @param string $notice Notice
* @return string
*/
public static function notice($id, $notice) {
* Crée une notice
* @param string $id Id du champ
* @param string $notice Notice
* @return string
*/
public static function notice($id, $notice)
{
return ' <span id="' . $id . 'Notice" class="notice ' . ($notice ? '' : 'displayNone') . '">' . $notice . '</span>';
}
/**
* Crée un champ mot de passe
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function password($nameId, array $attributes = []) {
* Crée un champ mot de passe
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function password($nameId, array $attributes = [])
{
// Attributs par défaut
$attributes = array_merge([
'autocomplete' => 'on',
@ -628,14 +647,14 @@ class template {
// Début du wrapper
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="inputWrapper ' . $attributes['classWrapper'] . '">';
// Label
if($attributes['label']) {
if ($attributes['label']) {
$html .= self::label($attributes['id'], $attributes['label'], [
'help' => $attributes['help']
]);
}
// Notice
$notice = '';
if(array_key_exists($attributes['id'], common::$inputNotices)) {
if (array_key_exists($attributes['id'], common::$inputNotices)) {
$notice = common::$inputNotices[$attributes['id']];
$attributes['class'] .= ' notice';
}
@ -652,13 +671,14 @@ class template {
}
/**
* Crée un champ sélection
* @param string $nameId Nom et id du champ
* @param array $options Liste des options du champ de sélection ($value => $text)
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function select($nameId, array $options, array $attributes = []) {
* Crée un champ sélection
* @param string $nameId Nom et id du champ
* @param array $options Liste des options du champ de sélection ($value => $text)
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function select($nameId, array $options, array $attributes = [])
{
// Attributs par défaut
$attributes = array_merge([
'before' => true,
@ -682,43 +702,44 @@ class template {
$attributes['fonts'] = [];
}
// 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']];
}
// Début du wrapper
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="inputWrapper ' . $attributes['classWrapper'] . '">';
// Label
if($attributes['label']) {
if ($attributes['label']) {
$html .= self::label($attributes['id'], $attributes['label'], [
'help' => $attributes['help']
]);
}
// Notice
// Notice
$notice = '';
if(array_key_exists($attributes['id'], common::$inputNotices)) {
if (array_key_exists($attributes['id'], common::$inputNotices)) {
$notice = common::$inputNotices[$attributes['id']];
$attributes['class'] .= ' notice';
}
$html .= self::notice($attributes['id'], $notice);
// Début sélection
$html .= sprintf('<select %s>',
$html .= sprintf(
'<select %s>',
helper::sprintAttributes($attributes)
);
foreach($options as $value => $text) {
foreach ($options as $value => $text) {
// Select des liste de fontes
$html .= isset($fonts) ? sprintf(
'<option value="%s"%s style="font-family: %s;">%s</option>',
$value,
$attributes['selected'] == $value ? ' selected' : '', // Double == pour ignorer le type de variable car $_POST change les types en string
$fonts[$value],
$text
'<option value="%s"%s style="font-family: %s;">%s</option>',
$value,
$attributes['selected'] == $value ? ' selected' : '', // Double == pour ignorer le type de variable car $_POST change les types en string
$fonts[$value],
$text
// Select standard
) : sprintf(
'<option value="%s"%s>%s</option>',
$value,
$attributes['selected'] == $value ? ' selected' : '', // Double == pour ignorer le type de variable car $_POST change les types en string
$text
);
) : sprintf(
'<option value="%s"%s>%s</option>',
$value,
$attributes['selected'] == $value ? ' selected' : '', // Double == pour ignorer le type de variable car $_POST change les types en string
$text
);
}
// Fin sélection
$html .= '</select>';
@ -729,21 +750,23 @@ class template {
}
/**
* Crée une bulle de dialogue
* @param string $text Texte de la bulle
* @return string
*/
public static function speech($text) {
return '<div class="speech"><div class="speechBubble">' . $text . '</div>' . template::ico('mimi speechMimi', ['fontSize'=> '7em']) . '</div>';
* Crée une bulle de dialogue
* @param string $text Texte de la bulle
* @return string
*/
public static function speech($text)
{
return '<div class="speech"><div class="speechBubble">' . $text . '</div>' . template::ico('mimi speechMimi', ['fontSize' => '7em']) . '</div>';
}
/**
* Crée un bouton validation
* @param string $nameId Nom & id du bouton validation
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function submit($nameId, array $attributes = []) {
* Crée un bouton validation
* @param string $nameId Nom & id du bouton validation
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function submit($nameId, array $attributes = [])
{
// Attributs par défaut
$attributes = array_merge([
'class' => '',
@ -767,74 +790,76 @@ class template {
}
/**
* Crée un tableau
* @param array $cols Cols des colonnes (format: [col colonne1, col colonne2, etc])
* @param array $body Contenu (format: [[contenu1, contenu2, etc], [contenu1, contenu2, etc]])
* @param array $head Entêtes (format : [[titre colonne1, titre colonne2, etc])
* Crée un tableau
* @param array $cols Cols des colonnes (format: [col colonne1, col colonne2, etc])
* @param array $body Contenu (format: [[contenu1, contenu2, etc], [contenu1, contenu2, etc]])
* @param array $head Entêtes (format : [[titre colonne1, titre colonne2, etc])
* @param array $rowsId Id pour la numérotation des rows (format : [id colonne1, id colonne2, etc])
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function table(array $cols = [], array $body = [], array $head = [], array $attributes = [], array $rowsId = []) {
// Attributs par défaut
$attributes = array_merge([
'class' => '',
'classWrapper' => '',
'id' => ''
], $attributes);
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function table(array $cols = [], array $body = [], array $head = [], array $attributes = [], array $rowsId = [])
{
// Attributs par défaut
$attributes = array_merge([
'class' => '',
'classWrapper' => '',
'id' => ''
], $attributes);
// Traduction de l'aide et de l'étiquette
foreach($head as $value) {
$head[array_search($value,$head)] = helper::translate($value);
foreach ($head as $value) {
$head[array_search($value, $head)] = helper::translate($value);
}
// Début du wrapper
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="tableWrapper ' . $attributes['classWrapper']. '">';
// Début tableau
$html .= '<table id="' . $attributes['id'] . '" class="table ' . $attributes['class']. '">';
// Entêtes
if($head) {
// Début des entêtes
$html .= '<thead>';
$html .= '<tr class="nodrag">';
$i = 0;
foreach($head as $th) {
$html .= '<th class="col' . $cols[$i++] . '">' . $th . '</th>';
}
// Fin des entêtes
$html .= '</tr>';
$html .= '</thead>';
// Début du wrapper
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="tableWrapper ' . $attributes['classWrapper'] . '">';
// Début tableau
$html .= '<table id="' . $attributes['id'] . '" class="table ' . $attributes['class'] . '">';
// Entêtes
if ($head) {
// Début des entêtes
$html .= '<thead>';
$html .= '<tr class="nodrag">';
$i = 0;
foreach ($head as $th) {
$html .= '<th class="col' . $cols[$i++] . '">' . $th . '</th>';
}
// Fin des entêtes
$html .= '</tr>';
$html .= '</thead>';
}
// Pas de tableau d'Id transmis, générer une numérotation
if (empty($rowsId)) {
$rowsId = range(0,count($body));
$rowsId = range(0, count($body));
}
// Début contenu
$j = 0;
foreach($body as $tr) {
// Id de ligne pour les tableaux drag and drop
$html .= '<tr id="' . $rowsId[$j++] . '">';
$i = 0;
foreach($tr as $td) {
$html .= '<td class="col' . $cols[$i++] . '">' . $td . '</td>';
}
$html .= '</tr>';
}
// Fin contenu
$html .= '</tbody>';
// Fin tableau
$html .= '</table>';
// Fin container
$html .= '</div>';
// Retourne le html
return $html;
}
// Début contenu
$j = 0;
foreach ($body as $tr) {
// Id de ligne pour les tableaux drag and drop
$html .= '<tr id="' . $rowsId[$j++] . '">';
$i = 0;
foreach ($tr as $td) {
$html .= '<td class="col' . $cols[$i++] . '">' . $td . '</td>';
}
$html .= '</tr>';
}
// Fin contenu
$html .= '</tbody>';
// Fin tableau
$html .= '</table>';
// Fin container
$html .= '</div>';
// Retourne le html
return $html;
}
/**
* Crée un champ texte court
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function text($nameId, array $attributes = []) {
* Crée un champ texte court
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function text($nameId, array $attributes = [])
{
// Attributs par défaut
$attributes = array_merge([
'autocomplete' => 'on',
@ -857,20 +882,20 @@ class template {
$attributes['help'] = helper::translate($attributes['help']);
//$attributes['placeholder'] = helper::translate($attributes['placeholder']);
// 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['value'] = common::$inputBefore[$attributes['id']];
}
// Début du wrapper
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="inputWrapper ' . $attributes['classWrapper'] . '">';
// Label
if($attributes['label']) {
if ($attributes['label']) {
$html .= self::label($attributes['id'], $attributes['label'], [
'help' => $attributes['help']
]);
}
// Notice
$notice = '';
if(array_key_exists($attributes['id'], common::$inputNotices)) {
if (array_key_exists($attributes['id'], common::$inputNotices)) {
$notice = common::$inputNotices[$attributes['id']];
$attributes['class'] .= ' notice';
}
@ -887,12 +912,13 @@ class template {
}
/**
* Crée un champ texte long
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function textarea($nameId, array $attributes = []) {
* Crée un champ texte long
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function textarea($nameId, array $attributes = [])
{
// Attributs par défaut
$attributes = array_merge([
'before' => true,
@ -912,20 +938,20 @@ class template {
$attributes['label'] = helper::translate($attributes['label']);
$attributes['help'] = helper::translate($attributes['help']);
// 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['value'] = common::$inputBefore[$attributes['id']];
}
// Début du wrapper
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="inputWrapper ' . $attributes['classWrapper'] . '">';
// Label
if($attributes['label']) {
if ($attributes['label']) {
$html .= self::label($attributes['id'], $attributes['label'], [
'help' => $attributes['help']
]);
}
// Notice
$notice = '';
if(array_key_exists($attributes['id'], common::$inputNotices)) {
if (array_key_exists($attributes['id'], common::$inputNotices)) {
$notice = common::$inputNotices[$attributes['id']];
$attributes['class'] .= ' notice';
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -14,12 +14,13 @@
* @link http://zwiicms.fr/
*/
class config extends common {
class config extends common
{
public static $actions = [
'backup' => self::GROUP_ADMIN,
'copyBackups'=> self::GROUP_ADMIN,
'delBackups'=> self::GROUP_ADMIN,
'copyBackups' => self::GROUP_ADMIN,
'delBackups' => self::GROUP_ADMIN,
'configMetaImage' => self::GROUP_ADMIN,
'siteMap' => self::GROUP_ADMIN,
'index' => self::GROUP_ADMIN,
@ -27,7 +28,7 @@ class config extends common {
'updateBaseUrl' => self::GROUP_ADMIN,
'script' => self::GROUP_ADMIN,
'logReset' => self::GROUP_ADMIN,
'logDownload'=> self::GROUP_ADMIN,
'logDownload' => self::GROUP_ADMIN,
'blacklistReset' => self::GROUP_ADMIN,
'blacklistDownload' => self::GROUP_ADMIN
];
@ -201,7 +202,8 @@ class config extends common {
* Sitemap compressé et non compressé
* Robots.txt
*/
public function siteMap() {
public function siteMap()
{
// Mettre à jour le site map
$successSitemap = $this->createSitemap();
@ -218,18 +220,19 @@ class config extends common {
/**
* Sauvegarde des données
*/
public function backup() {
public function backup()
{
// Soumission du formulaire
if($this->isPost()) {
if ($this->isPost()) {
// Creation du ZIP
$filter = $this->getInput('configBackupOption',helper::FILTER_BOOLEAN) === true ? ['backup','tmp'] : ['backup','tmp','file'];
$fileName = helper::autoBackup(self::TEMP_DIR,$filter);
$filter = $this->getInput('configBackupOption', helper::FILTER_BOOLEAN) === true ? ['backup', 'tmp'] : ['backup', 'tmp', 'file'];
$fileName = helper::autoBackup(self::TEMP_DIR, $filter);
// Créer le répertoire manquant
if (!is_dir(self::FILE_DIR.'source/backup')) {
mkdir(self::FILE_DIR.'source/backup', 0755);
if (!is_dir(self::FILE_DIR . 'source/backup')) {
mkdir(self::FILE_DIR . 'source/backup', 0755);
}
// Copie dans les fichiers
$success = copy (self::TEMP_DIR . $fileName , self::FILE_DIR.'source/backup/' . $fileName);
$success = copy(self::TEMP_DIR . $fileName, self::FILE_DIR . 'source/backup/' . $fileName);
// Détruire le temporaire
unlink(self::TEMP_DIR . $fileName);
// Valeurs en sortie
@ -249,9 +252,10 @@ class config extends common {
/**
* Réalise une copie d'écran du site
*/
public function configMetaImage() {
public function configMetaImage()
{
// fonction désactivée pour un site local
if ( strpos(helper::baseUrl(false),'localhost') > 0 OR strpos(helper::baseUrl(false),'127.0.0.1') > 0) {
if (strpos(helper::baseUrl(false), 'localhost') > 0 or strpos(helper::baseUrl(false), '127.0.0.1') > 0) {
$site = 'https://zwiicms.fr/';
} else {
$site = helper::baseUrl(false);
@ -265,9 +269,9 @@ class config extends common {
$data = false;
// lire l'API si le token est fourni
if (!empty($token) ) {
if (!empty($token)) {
// Tente de connecter 5 fois l'API
for ($i=0; $i < 5 ; $i++) {
for ($i = 0; $i < 5; $i++) {
$data = helper::getUrlContents('https://shot.screenshotapi.net/screenshot?token=' . $token . '&url=' . $site . '&width=1200&height=627&output=json&file_type=jpeg&no_cookie_banners=true&wait_for_event=load');
if ($data !== false) {
break;
@ -278,41 +282,42 @@ class config extends common {
// Traitement des données reçues valides.
if ( !empty($token) && $data !== false) {
if (!empty($token) && $data !== false) {
$data = json_decode($data, true);
$img = $data['screenshot'];
// Effacer l'image et la miniature png
if (file_exists(self::FILE_DIR .'thumb/screenshot.jpg')) {
unlink (self::FILE_DIR .'thumb/screenshot.jpg');
if (file_exists(self::FILE_DIR . 'thumb/screenshot.jpg')) {
unlink(self::FILE_DIR . 'thumb/screenshot.jpg');
}
if (file_exists(self::FILE_DIR .'source/screenshot.jpg')) {
unlink (self::FILE_DIR .'source/screenshot.jpg');
if (file_exists(self::FILE_DIR . 'source/screenshot.jpg')) {
unlink(self::FILE_DIR . 'source/screenshot.jpg');
}
$success = copy ($img, self::FILE_DIR .'source/screenshot.jpg');
$success = copy($img, self::FILE_DIR . 'source/screenshot.jpg');
}
$notification = empty($token)
? 'La clé de l\'API ne peut pas être vide'
: ($success === false ? 'Problème avec le service en ligne' : 'Capture d\'écran générée avec succès');
? 'La clé de l\'API ne peut pas être vide'
: ($success === false ? 'Problème avec le service en ligne' : 'Capture d\'écran générée avec succès');
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
'notification' => $notification,
'state' => ($success === false OR empty($token)) ? false : true
'state' => ($success === false or empty($token)) ? false : true
]);
}
/**
* Procédure d'importation
*/
public function restore() {
public function restore()
{
// Soumission du formulaire
if($this->isPost() ) {
if ($this->isPost()) {
$success = false;
if ($this->getInput('configRestoreImportFile', null, true) ) {
if ($this->getInput('configRestoreImportFile', null, true)) {
$fileZip = $this->getInput('configRestoreImportFile');
$file_parts = pathinfo($fileZip);
@ -325,7 +330,7 @@ class config extends common {
'view' => 'restore',
'notification' => 'Le fichier n\'est pas une archive valide',
'state' => false
]);
]);
}
$successOpen = $zip->open(self::FILE_DIR . 'source/' . $fileZip);
if ($successOpen === FALSE) {
@ -335,23 +340,23 @@ class config extends common {
'view' => 'restore',
'notification' => 'Impossible de lire l\'archive',
'state' => false
]);
]);
}
// Lire le contenu de l'archive dans le tableau files
for( $i = 0; $i < $zip->numFiles; $i++ ){
$stat = $zip->statIndex( $i );
$files [] = ( basename( $stat['name'] ));
for ($i = 0; $i < $zip->numFiles; $i++) {
$stat = $zip->statIndex($i);
$files[] = (basename($stat['name']));
}
// Lire la dataversion
$tmpDir = uniqid(4);
$success = $zip->extractTo( self::TEMP_DIR . $tmpDir );
$data = file_get_contents( self::TEMP_DIR . $tmpDir . '/data/core.json');
$success = $zip->extractTo(self::TEMP_DIR . $tmpDir);
$data = file_get_contents(self::TEMP_DIR . $tmpDir . '/data/core.json');
$obj = json_decode($data);
$dataVersion = strval ($obj->core->dataVersion);
$dataVersion = strval($obj->core->dataVersion);
switch (strlen($dataVersion)) {
case 4:
if (substr($dataVersion,0,1) === '9' ) {
if (substr($dataVersion, 0, 1) === '9') {
// Valeurs en sortie erreur
$this->addOutput([
'title' => 'Restaurer',
@ -364,49 +369,53 @@ class config extends common {
}
break;
case 5:
$version = substr($dataVersion,0,2);
$version = substr($dataVersion, 0, 2);
break;
default:
$version = 0;
break;
}
$this->removeDir(self::TEMP_DIR . $tmpDir );
$this->removeDir(self::TEMP_DIR . $tmpDir);
if ($version >= 10 ) {
if ($version >= 10) {
// Option active, les users sont stockées
if ($this->getInput('configRestoreImportUser', helper::FILTER_BOOLEAN) === true ) {
if ($this->getInput('configRestoreImportUser', helper::FILTER_BOOLEAN) === true) {
$users = $this->getData(['user']);
}
} elseif ($version === 0) { // Version invalide
// Valeurs en sortie erreur
$this->addOutput([
'title' => 'Restaurer',
'view' => 'restore',
'notification' => 'Cette archive n\'est pas une sauvegarde valide',
'state' => false
]);
// Valeurs en sortie erreur
$this->addOutput([
'title' => 'Restaurer',
'view' => 'restore',
'notification' => 'Cette archive n\'est pas une sauvegarde valide',
'state' => false
]);
}
// Extraire le zip ou 'site/'
$this->removeDir(self::DATA_DIR);
$success = $zip->extractTo( 'site/' );
$success = $zip->extractTo('site/');
// Fermer l'archive
$zip->close();
// Restaurer les users originaux d'une v10 si option cochée
if (!empty($users) &&
if (
!empty($users) &&
$version >= 10 &&
$this->getInput('configRestoreImportUser', helper::FILTER_BOOLEAN) === true) {
$this->setData(['user',$users]);
$this->getInput('configRestoreImportUser', helper::FILTER_BOOLEAN) === true
) {
$this->setData(['user', $users]);
}
}
// Conversion vers des Url relatives
/*
if ($this->getData(['core', 'baseUrl'])) {
$url = str_replace('?','',$this->getData(['core', 'baseUrl']));
// Suppresion de la base Url
$url = str_replace('?', '', $this->getData(['core', 'baseUrl']));
// Suppression de la base Url
$this->updateBaseUrl($url);
// Effacer la baseUrl
$this->deleteData(['core', 'baseUrl']);
}
}*/
// Message de notification
$notification = $success === true ? 'Restaurer effectuée avec succès' : 'Erreur inconnue';
@ -432,15 +441,18 @@ class config extends common {
/**
* Configuration
*/
public function index() {
public function index()
{
// Soumission du formulaire
if($this->isPost()) {
if ($this->isPost()) {
// Basculement en mise à jour auto, remise à 0 du compteur
if ($this->getData(['config','autoUpdate']) === false &&
$this->getInput('configAutoUpdate', helper::FILTER_BOOLEAN) === true) {
$this->setData(['core','lastAutoUpdate',0]);
}
if (
$this->getData(['config', 'autoUpdate']) === false &&
$this->getInput('configAutoUpdate', helper::FILTER_BOOLEAN) === true
) {
$this->setData(['core', 'lastAutoUpdate', 0]);
}
// Sauvegarder la configuration
@ -457,7 +469,7 @@ class config extends common {
'cookieConsent' => $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN),
'proxyType' => $this->getInput('configProxyType'),
'proxyUrl' => $this->getInput('configProxyUrl'),
'proxyPort' => $this->getInput('configProxyPort',helper::FILTER_INT),
'proxyPort' => $this->getInput('configProxyPort', helper::FILTER_INT),
'social' => [
'facebookId' => $this->getInput('socialFacebookId'),
'linkedinId' => $this->getInput('socialLinkedinId'),
@ -469,30 +481,30 @@ class config extends common {
'githubId' => $this->getInput('socialGithubId')
],
'smtp' => [
'enable' => $this->getInput('smtpEnable',helper::FILTER_BOOLEAN),
'host' => $this->getInput('smtpHost',helper::FILTER_STRING_SHORT,$this->getInput('smtpEnable',helper::FILTER_BOOLEAN)),
'port' => $this->getInput('smtpPort',helper::FILTER_INT,$this->getInput('smtpEnable',helper::FILTER_BOOLEAN)),
'auth' => $this->getInput('smtpAuth',helper::FILTER_BOOLEAN),
'secure' => $this->getInput('smtpSecure',helper::FILTER_BOOLEAN),
'username' => $this->getInput('smtpUsername',helper::FILTER_STRING_SHORT,$this->getInput('smtpAuth',helper::FILTER_BOOLEAN)),
'password' =>helper::encrypt($this->getData(['config','smtp','username']),$this->getInput('smtpPassword',null,$this->getInput('smtpAuth',helper::FILTER_BOOLEAN))),
'sender' => $this->getInput('smtpSender',helper::FILTER_MAIL)
'enable' => $this->getInput('smtpEnable', helper::FILTER_BOOLEAN),
'host' => $this->getInput('smtpHost', helper::FILTER_STRING_SHORT, $this->getInput('smtpEnable', helper::FILTER_BOOLEAN)),
'port' => $this->getInput('smtpPort', helper::FILTER_INT, $this->getInput('smtpEnable', helper::FILTER_BOOLEAN)),
'auth' => $this->getInput('smtpAuth', helper::FILTER_BOOLEAN),
'secure' => $this->getInput('smtpSecure', helper::FILTER_BOOLEAN),
'username' => $this->getInput('smtpUsername', helper::FILTER_STRING_SHORT, $this->getInput('smtpAuth', helper::FILTER_BOOLEAN)),
'password' => helper::encrypt($this->getData(['config', 'smtp', 'username']), $this->getInput('smtpPassword', null, $this->getInput('smtpAuth', helper::FILTER_BOOLEAN))),
'sender' => $this->getInput('smtpSender', helper::FILTER_MAIL)
],
'seo' => [
'robots' => $this->getInput('seoRobots',helper::FILTER_BOOLEAN),
'keyApi' => $this->getInput('seoKeyApi',helper::FILTER_STRING_SHORT),
'robots' => $this->getInput('seoRobots', helper::FILTER_BOOLEAN),
'keyApi' => $this->getInput('seoKeyApi', helper::FILTER_STRING_SHORT),
],
'connect' => [
'attempt' => $this->getInput('connectAttempt',helper::FILTER_INT),
'timeout' => $this->getInput('connectTimeout',helper::FILTER_INT),
'log' => $this->getInput('connectLog',helper::FILTER_BOOLEAN),
'anonymousIp' => $this->getInput('connectAnonymousIp',helper::FILTER_INT),
'captcha' => $this->getInput('connectCaptcha',helper::FILTER_BOOLEAN),
'captchaStrong' => $this->getInput('connectCaptchaStrong',helper::FILTER_BOOLEAN),
'autoDisconnect' => $this->getInput('connectAutoDisconnect',helper::FILTER_BOOLEAN),
'attempt' => $this->getInput('connectAttempt', helper::FILTER_INT),
'timeout' => $this->getInput('connectTimeout', helper::FILTER_INT),
'log' => $this->getInput('connectLog', helper::FILTER_BOOLEAN),
'anonymousIp' => $this->getInput('connectAnonymousIp', helper::FILTER_INT),
'captcha' => $this->getInput('connectCaptcha', helper::FILTER_BOOLEAN),
'captchaStrong' => $this->getInput('connectCaptchaStrong', helper::FILTER_BOOLEAN),
'autoDisconnect' => $this->getInput('connectAutoDisconnect', helper::FILTER_BOOLEAN),
'captchaType' => $this->getInput('connectCaptchaType'),
'showPassword' => $this->getInput('connectShowPassword',helper::FILTER_BOOLEAN),
'redirectLogin' => $this->getInput('connectRedirectLogin',helper::FILTER_BOOLEAN)
'showPassword' => $this->getInput('connectShowPassword', helper::FILTER_BOOLEAN),
'redirectLogin' => $this->getInput('connectRedirectLogin', helper::FILTER_BOOLEAN)
]
]
]);
@ -500,9 +512,8 @@ class config extends common {
// Efface les fichiers de backup lorsque l'option est désactivée
if ($this->getInput('configFileBackup', helper::FILTER_BOOLEAN) === false) {
$path = realpath('site/data');
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename)
{
if (strpos($filename,'backup.json')) {
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename) {
if (strpos($filename, 'backup.json')) {
unlink($filename);
}
}
@ -511,25 +522,25 @@ class config extends common {
touch('site/data/.backup');
}
// Notice
if(self::$inputNotices === []) {
if (self::$inputNotices === []) {
// Active la réécriture d'URL
$rewrite = $this->getInput('configRewrite', helper::FILTER_BOOLEAN);
if(
if (
$rewrite
AND helper::checkRewrite() === false
and helper::checkRewrite() === false
) {
// Ajout des lignes dans le .htaccess
$fileContent = file_get_contents('.htaccess');
$rewriteData = PHP_EOL .
'# URL rewriting' . PHP_EOL .
'<IfModule mod_rewrite.c>' . PHP_EOL .
"\tRewriteEngine on" . PHP_EOL .
"\tRewriteBase " . helper::baseUrl(false, false) . PHP_EOL .
"\tRewriteCond %{REQUEST_FILENAME} !-f" . PHP_EOL .
"\tRewriteCond %{REQUEST_FILENAME} !-d" . PHP_EOL .
"\tRewriteRule ^(.*)$ index.php?$1 [L]" . PHP_EOL .
'</IfModule>'. PHP_EOL .
'# URL rewriting' . PHP_EOL ;
'# URL rewriting' . PHP_EOL .
'<IfModule mod_rewrite.c>' . PHP_EOL .
"\tRewriteEngine on" . PHP_EOL .
"\tRewriteBase " . helper::baseUrl(false, false) . PHP_EOL .
"\tRewriteCond %{REQUEST_FILENAME} !-f" . PHP_EOL .
"\tRewriteCond %{REQUEST_FILENAME} !-d" . PHP_EOL .
"\tRewriteRule ^(.*)$ index.php?$1 [L]" . PHP_EOL .
'</IfModule>' . PHP_EOL .
'# URL rewriting' . PHP_EOL;
$fileContent = str_replace('# URL rewriting', $rewriteData, $fileContent);
file_put_contents(
'.htaccess',
@ -539,9 +550,9 @@ class config extends common {
helper::$rewriteStatus = true;
}
// Désactive la réécriture d'URL
elseif(
elseif (
$rewrite === false
AND helper::checkRewrite()
and helper::checkRewrite()
) {
// Suppression des lignes dans le .htaccess
$fileContent = file_get_contents('.htaccess');
@ -561,7 +572,7 @@ class config extends common {
$this->addOutput([
'title' => 'Configuration du site',
'view' => 'index',
'notification' => 'Modifications enregistrées ' ,
'notification' => 'Modifications enregistrées ',
'state' => true
]);
}
@ -569,7 +580,7 @@ class config extends common {
// Variable de version
self::$onlineVersion = helper::getUrlContents(common::ZWII_UPDATE_URL . common::ZWII_UPDATE_CHANNEL . '/version');
if (self::$onlineVersion > common::ZWII_VERSION) {
self::$updateButtonText = "Mettre à jour" ;
self::$updateButtonText = "Mettre à jour";
}
// Valeurs en sortie
@ -580,19 +591,20 @@ class config extends common {
}
public function script() {
public function script()
{
// Soumission du formulaire
if($this->isPost()) {
if ($this->isPost()) {
// Ecrire les fichiers de script
if ($this->geturl(2) === 'head') {
file_put_contents(self::DATA_DIR . 'head.inc.html',$this->getInput('configScriptHead',null));
file_put_contents(self::DATA_DIR . 'head.inc.html', $this->getInput('configScriptHead', null));
}
if ($this->geturl(2) === 'body') {
file_put_contents(self::DATA_DIR . 'body.inc.html',$this->getInput('configScriptBody',null));
file_put_contents(self::DATA_DIR . 'body.inc.html', $this->getInput('configScriptBody', null));
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Éditeur de script dans ' . ucfirst($this->geturl(2)) ,
'title' => 'Éditeur de script dans ' . ucfirst($this->geturl(2)),
'vendor' => [
'codemirror'
],
@ -602,7 +614,7 @@ class config extends common {
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Éditeur de script dans ' . ucfirst($this->geturl(2)) ,
'title' => 'Éditeur de script dans ' . ucfirst($this->geturl(2)),
'vendor' => [
'codemirror'
],
@ -615,14 +627,15 @@ class config extends common {
* Vider le fichier de log
*/
public function logReset() {
if ( file_exists(self::DATA_DIR . 'journal.log') ) {
public function logReset()
{
if (file_exists(self::DATA_DIR . 'journal.log')) {
unlink(self::DATA_DIR . 'journal.log');
// Créer les en-têtes des journaux
$d = 'Date;Heure;IP;Id;Action' . PHP_EOL;
file_put_contents(self::DATA_DIR . 'journal.log',$d);
file_put_contents(self::DATA_DIR . 'journal.log', $d);
// Valeurs en sortie
$this->addOutput([
$this->addOutput([
'title' => 'Configuration du site',
'view' => 'index',
'notification' => 'Journal réinitialisé avec succès',
@ -637,15 +650,15 @@ class config extends common {
'state' => false
]);
}
}
}
/**
* Télécharger le fichier de log
*/
public function logDownload() {
/**
* Télécharger le fichier de log
*/
public function logDownload()
{
$fileName = self::DATA_DIR . 'journal.log';
if (file_exists($fileName)) {
ob_start();
@ -654,7 +667,7 @@ class config extends common {
header('Content-Length: ' . filesize($fileName));
ob_clean();
ob_end_flush();
readfile( $fileName);
readfile($fileName);
exit();
} else {
// Valeurs en sortie
@ -670,27 +683,28 @@ class config extends common {
/**
* Tableau des IP blacklistés
*/
public function blacklistDownload () {
public function blacklistDownload()
{
ob_start();
$fileName = self::TEMP_DIR . 'blacklist.log';
$d = 'Date dernière tentative;Heure dernière tentative;Id;Adresse IP;Nombre d\'échecs' . PHP_EOL;
file_put_contents($fileName,$d);
if ( file_exists($fileName) ) {
file_put_contents($fileName, $d);
if (file_exists($fileName)) {
$d = $this->getData(['blacklist']);
$data = '';
foreach ($d as $key => $item) {
$data .= mb_detect_encoding(strftime('%d/%m/%y',$item['lastFail']), 'UTF-8', true)
? strftime('%d/%m/%y',$item['lastFail']) . ';' . utf8_encode(strftime('%R',$item['lastFail'])) . ';'
: utf8_encode(strftime('%d/%m/%y',$item['lastFail'])) . ';' . utf8_encode(strftime('%R',$item['lastFail'])) . ';' ;
$data .= mb_detect_encoding(strftime('%d/%m/%y', $item['lastFail']), 'UTF-8', true)
? strftime('%d/%m/%y', $item['lastFail']) . ';' . utf8_encode(strftime('%R', $item['lastFail'])) . ';'
: utf8_encode(strftime('%d/%m/%y', $item['lastFail'])) . ';' . utf8_encode(strftime('%R', $item['lastFail'])) . ';';
$data .= $key . ';' . $item['ip'] . ';' . $item['connectFail'] . PHP_EOL;
}
file_put_contents($fileName,$data,FILE_APPEND);
file_put_contents($fileName, $data, FILE_APPEND);
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $fileName . '"');
header('Content-Length: ' . filesize($fileName));
ob_clean();
ob_end_flush();
readfile( $fileName);
readfile($fileName);
unlink(self::TEMP_DIR . 'blacklist.log');
exit();
} else {
@ -708,11 +722,12 @@ class config extends common {
* Réinitialiser les ip blacklistées
*/
public function blacklistReset() {
if ( file_exists(self::DATA_DIR . 'blacklist.json') ) {
$this->setData(['blacklist',[]]);
public function blacklistReset()
{
if (file_exists(self::DATA_DIR . 'blacklist.json')) {
$this->setData(['blacklist', []]);
// Valeurs en sortie
$this->addOutput([
$this->addOutput([
'title' => 'Configuration du site',
'view' => 'index',
'notification' => 'Liste noire réinitialisée avec succès',
@ -732,9 +747,10 @@ class config extends common {
/**
* Récupération des backups auto dans le gestionnaire de fichiers
*/
public function copyBackups() {
public function copyBackups()
{
$success = $this->copyDir(self::BACKUP_DIR, self::FILE_DIR . 'source/backup' );
$success = $this->copyDir(self::BACKUP_DIR, self::FILE_DIR . 'source/backup');
// Valeurs en sortie
$this->addOutput([
@ -748,15 +764,15 @@ class config extends common {
/**
* Vider le dosser des sauvegardes automatisées
*/
public function delBackups() {
public function delBackups()
{
$path = realpath(self::BACKUP_DIR);
$success = $fail = 0;
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename)
{
if (strpos($filename,'.zip')) {
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename) {
if (strpos($filename, '.zip')) {
$r = unlink($filename);
$success = $r === true ? $succes + 1 : $success;
$success = $r === true ? $success + 1 : $success;
$fail = $r === false ? $fail + 1 : $fail;
}
}
@ -768,7 +784,4 @@ class config extends common {
'state' => true
]);
}
}

View File

@ -10,8 +10,8 @@
* @link http://zwiicms.fr/
*/
$( document).ready(function() {
$("#configBackupForm").submit( function(e){
$(document).ready(function () {
$("#configBackupForm").submit(function (e) {
//$("#configBackupSubmit").addClass("disabled").prop("disabled", true);
e.preventDefault();
var url = "<?php echo helper::baseUrl() . $this->getUrl(0); ?>/backup";
@ -22,15 +22,15 @@ $( document).ready(function() {
type: "POST",
url: url,
data: $("form").serialize(),
success: function(data){
success: function (data) {
$('body, .button').css('cursor', 'default');
core.alert(message_success);
},
error: function(data){
error: function (data) {
$('body, .button').css('cursor', 'default');
core.alert(message_error);
},
complete: function(){
complete: function () {
$("#configBackupSubmit").removeClass("disabled").prop("disabled", false);
$("#configBackupSubmit").removeClass("uniqueSubmission").prop("uniqueSubmission", false);
$("#configBackupSubmit span").removeClass("zwiico-spin animate-spin");
@ -43,10 +43,10 @@ $( document).ready(function() {
/**
* Confirmation de sauvegarde complète
*/
$("#configBackupSubmit").on("click", function() {
$("#configBackupSubmit").on("click", function () {
if ($("input[name=configBackupOption]").is(':checked')) {
var message_warning = "<?php echo template::topic('La sauvegarde des fichiers peut prendre du temps. Continuer ?'); ?>";
return core.confirm(message_warning, function() {
return core.confirm(message_warning, function () {
//$(location).attr("href", _this.attr("href"));
$('body, .button').css('cursor', 'wait');
$('form#configBackupForm').submit();

View File

@ -2,13 +2,13 @@
<div class="row">
<div class="col1">
<?php echo template::button('configBackupBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'config',
'value' => template::ico('left')
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'config',
'value' => template::ico('left')
]); ?>
</div>
<div class="col2 offset9">
<?php echo template::submit('configBackupSubmit',[
<?php echo template::submit('configBackupSubmit', [
'value' => 'Sauvegarder',
'uniqueSubmission' => true
]); ?>
@ -28,7 +28,7 @@
]); ?>
</div>
<div class="col12">
<em>L'archive est générée dans <a href="<?php echo helper::baseUrl(false); ?>core/vendor/filemanager/dialog.php?fldr=backup&type=0&akey=<?php echo md5_file(self::DATA_DIR.'core.json'); ?>" data-lity>le dossier Backup</a> du gestionnaire de fichiers.</em>
<em>L'archive est générée dans <a href="<?php echo helper::baseUrl(false); ?>core/vendor/filemanager/dialog.php?fldr=backup&type=0&akey=<?php echo md5_file(self::DATA_DIR . 'core.json'); ?>" data-lity>le dossier Backup</a> du gestionnaire de fichiers.</em>
</div>
</div>
</div>

View File

@ -2,10 +2,10 @@
<div class="row">
<div class="col12">
<div class="block">
<h4><?php echo template::topic('Sécurité de la connexion');?>
<h4><?php echo template::topic('Sécurité de la connexion'); ?>
<span id="specialeHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/connexion" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']);?>
<?php echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>
</h4>
@ -32,13 +32,13 @@
</div>
<div class="row">
<div class="col3">
<?php echo template::select('connectAttempt', $module::$connectAttempt , [
<?php echo template::select('connectAttempt', $module::$connectAttempt, [
'label' => 'Limitation des tentatives',
'selected' => $this->getData(['config', 'connect', 'attempt'])
]); ?>
</div>
<div class="col3">
<?php echo template::select('connectTimeout', $module::$connectTimeout , [
<?php echo template::select('connectTimeout', $module::$connectTimeout, [
'label' => 'Blocage après échecs',
'selected' => $this->getData(['config', 'connect', 'timeout'])
]); ?>
@ -46,8 +46,9 @@
<div class="col3 verticalAlignBottom">
<label id="helpBlacklist">Liste noire :
<?php echo template::help(
'La liste noire énumère les tentatives de connexion à partir de comptes inexistants. Sont stockés : la date, l\'heure, le nom du compte et l\'IP.
Après le nombre de tentatives autorisées, l\'IP et le compte sont bloqués.');
'La liste noire énumère les tentatives de connexion à partir de comptes inexistants. Sont stockés : la date, l\'heure, le nom du compte et l\'IP.
Après le nombre de tentatives autorisées, l\'IP et le compte sont bloqués.'
);
?>
</label>
<?php echo template::button('ConnectBlackListDownload', [
@ -67,21 +68,21 @@
</div>
<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('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.'
]); ?>
<?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'])
]); ?>
<?php echo template::select('connectCaptchaType', $module::$captchaTypes, [
'label' => 'Type de captcha',
'selected' => $this->getData(['config', 'connect', 'captchaType'])
]); ?>
</div>
</div>
</div>
@ -90,10 +91,10 @@
<div class="row">
<div class="col12">
<div class="block">
<h4><?php echo template::topic('Journalisation');?>
<h4><?php echo template::topic('Journalisation'); ?>
<span id="specialeHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/journalisation" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']);?>
<a href="https://doc.zwiicms.fr/journalisation" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>
</h4>
@ -108,7 +109,7 @@
'label' => 'Anonymat des adresses IP',
'selected' => $this->getData(['config', 'connect', 'anonymousIp']),
'help' => 'La règlementation française impose un anonymat de niveau 2'
]); ?>
]); ?>
</div>
<div class="col3 verticalAlignBottom">
<?php echo template::button('ConfigLogDownload', [

View File

@ -34,7 +34,7 @@
text-align: center;
}
.tab ~ .tabContent {
.tab~.tabContent {
margin-top: -10px;
}

View File

@ -1,24 +1,24 @@
<?php echo template::formOpen('configForm');?>
<?php echo template::formOpen('configForm'); ?>
<div class="row">
<div class="col1">
<?php echo template::button('configBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl(false),
'value' => template::ico('home')
]); ?>
</div>
<div class="col1">
<?php /**echo template::button('configHelp', [
<?php echo template::button('configBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl(false),
'value' => template::ico('home')
]); ?>
</div>
<div class="col1">
<?php /**echo template::button('configHelp', [
'class' => 'buttonHelp',
'href' => 'https://doc.zwiicms.fr/configuration-du-site',
'target' => '_blank',
'value' => template::ico('help'),
'help' => 'Consulter l\'aide en ligne'
]); */?>
</div>
<div class="col2 offset8">
<?php echo template::submit('Submit'); ?>
</div>
]); */ ?>
</div>
<div class="col2 offset8">
<?php echo template::submit('Submit'); ?>
</div>
</div>
<div class="tab">
@ -42,8 +42,8 @@
]); ?>
</div>
<?php include ('core/module/config/view/setup/setup.php') ?>
<?php include ('core/module/config/view/social/social.php') ?>
<?php include ('core/module/config/view/connect/connect.php') ?>
<?php include ('core/module/config/view/network/network.php') ?>
<?php include('core/module/config/view/setup/setup.php') ?>
<?php include('core/module/config/view/social/social.php') ?>
<?php include('core/module/config/view/connect/connect.php') ?>
<?php include('core/module/config/view/network/network.php') ?>
<?php echo template::formClose(); ?>

View File

@ -2,10 +2,10 @@
<div class="row">
<div class="col12">
<div class="block">
<h4><?php echo template::topic('Paramètres');?>
<h4><?php echo template::topic('Paramètres'); ?>
<span id="specialeHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/reseau" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']);?>
<a href="https://doc.zwiicms.fr/reseau" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>
</h4>
@ -14,16 +14,16 @@
<?php echo template::select('configProxyType', $module::$proxyType, [
'label' => 'Type de proxy',
'selected' => $this->getData(['config', 'proxyType'])
]); ?>
</div>
<div class="col8">
]); ?>
</div>
<div class="col8">
<?php echo template::text('configProxyUrl', [
'label' => 'Adresse du proxy',
'placeholder' => 'cache.proxy.fr',
'value' => $this->getData(['config', 'proxyUrl'])
]); ?>
</div>
<div class="col2">
<div class="col2">
<?php echo template::text('configProxyPort', [
'label' => 'Port du proxy',
'placeholder' => '6060',
@ -37,19 +37,19 @@
<div class="row">
<div class="col12">
<div class="block">
<h4><?php echo template::topic('SMTP');?>
<h4><?php echo template::topic('SMTP'); ?>
<span id="specialeHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/smtp" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']);?>
<a href="https://doc.zwiicms.fr/smtp" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>
</h4>
<div class="row">
<div class="col12">
<?php echo template::checkbox('smtpEnable', true, 'Activer SMTP', [
'checked' => $this->getData(['config', 'smtp','enable']),
'help' => 'Paramètres à utiliser lorsque votre hébergeur ne propose pas la fonctionnalité d\'envoi de mail.'
]); ?>
'checked' => $this->getData(['config', 'smtp', 'enable']),
'help' => 'Paramètres à utiliser lorsque votre hébergeur ne propose pas la fonctionnalité d\'envoi de mail.'
]); ?>
</div>
</div>
<div id="smtpParam">
@ -58,42 +58,42 @@
<?php echo template::text('smtpHost', [
'label' => 'Adresse SMTP',
'placeholder' => 'smtp.fr',
'value' => $this->getData(['config', 'smtp','host'])
'value' => $this->getData(['config', 'smtp', 'host'])
]); ?>
</div>
<div class="col2">
<div class="col2">
<?php echo template::text('smtpPort', [
'label' => 'Port SMTP',
'placeholder' => '589',
'value' => $this->getData(['config', 'smtp','port'])
'label' => 'Port SMTP',
'placeholder' => '589',
'value' => $this->getData(['config', 'smtp', 'port'])
]); ?>
</div>
<div class="col2">
<div class="col2">
<?php echo template::select('smtpAuth', $module::$SMTPauth, [
'label' => 'Authentification',
'selected' => $this->getData(['config', 'smtp','auth'])
'selected' => $this->getData(['config', 'smtp', 'auth'])
]); ?>
</div>
</div>
<div id="smtpAuthParam">
<div class="row">
<div class="col5">
<div class="col5">
<?php echo template::text('smtpUsername', [
'label' => 'Nom utilisateur',
'value' => $this->getData(['config', 'smtp','username' ])
'value' => $this->getData(['config', 'smtp', 'username'])
]); ?>
</div>
<div class="col5">
<div class="col5">
<?php echo template::password('smtpPassword', [
'label' => 'Mot de passe',
'autocomplete' => 'off',
'value' => $this->getData(['config', 'smtp','username' ]) ? helper::decrypt ($this->getData(['config', 'smtp','username' ]),$this->getData(['config','smtp','password'])) : ''
'value' => $this->getData(['config', 'smtp', 'username']) ? helper::decrypt($this->getData(['config', 'smtp', 'username']), $this->getData(['config', 'smtp', 'password'])) : ''
]); ?>
</div>
<div class="col2">
<?php echo template::select('smtpSecure', $module::$SMTPEnc , [
<div class="col2">
<?php echo template::select('smtpSecure', $module::$SMTPEnc, [
'label' => 'Sécurité',
'selected' => $this->getData(['config', 'smtp','secure'])
'selected' => $this->getData(['config', 'smtp', 'secure'])
]); ?>
</div>
</div>

View File

@ -9,7 +9,7 @@
]); ?>
</div>
<div class="col2 offset8">
<?php echo template::submit('configRestoreSubmit',[
<?php echo template::submit('configRestoreSubmit', [
'value' => 'Restaurer',
'uniqueSubmission' => true,
]); ?>
@ -19,7 +19,7 @@
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Archive à restaurer');?>
<?php echo template::topic('Archive à restaurer'); ?>
</h4>
<div class="row">
<div class="col10 offset1">

View File

@ -1,38 +1,38 @@
<?php echo template::formOpen('configScript'); ?>
<div class="row">
<div class="col2">
<?php echo template::button('configManageBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'config',
'ico' => 'left',
'value' => 'Retour'
]); ?>
</div>
<div class="col2 offset8">
<?php echo template::submit('configManageSubmit',[
'value' => 'Valider',
'ico' => 'check'
]); ?>
</div>
<div class="row">
<div class="col2">
<?php echo template::button('configManageBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'config',
'ico' => 'left',
'value' => 'Retour'
]); ?>
</div>
<?php if ($this->geturl(2) === 'head'): ?>
<div class="col2 offset8">
<?php echo template::submit('configManageSubmit', [
'value' => 'Valider',
'ico' => 'check'
]); ?>
</div>
</div>
<?php if ($this->geturl(2) === 'head') : ?>
<div class="row">
<div class="col12">
<?php echo template::textarea('configScriptHead', [
'value' => file_exists( self::DATA_DIR . 'head.inc.html') ? file_get_contents (self::DATA_DIR . 'head.inc.html') : '' ,
'value' => file_exists(self::DATA_DIR . 'head.inc.html') ? file_get_contents(self::DATA_DIR . 'head.inc.html') : '',
'class' => 'editor'
]); ?>
</div>
</div>
<?php endif ?>
<?php if ($this->geturl(2) === 'body'): ?>
<?php endif ?>
<?php if ($this->geturl(2) === 'body') : ?>
<div class="row">
<div class="col12">
<?php echo template::textarea('configScriptBody', [
'value' => file_exists( self::DATA_DIR . 'body.inc.html') ? file_get_contents (self::DATA_DIR . 'body.inc.html') : '' ,
'value' => file_exists(self::DATA_DIR . 'body.inc.html') ? file_get_contents(self::DATA_DIR . 'body.inc.html') : '',
'class' => 'editor'
]); ?>
</div>
</div>
<?php endif ?>
<?php endif ?>
<?php echo template::formClose(); ?>

View File

@ -2,10 +2,10 @@
<div class="row">
<div class="col12">
<div class="block">
<h4><?php echo template::topic('Paramétres');?>
<h4><?php echo template::topic('Paramétres'); ?>
<span id="setupHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/parametres" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']);?>
<a href="https://doc.zwiicms.fr/parametres" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>
</h4>
@ -36,10 +36,10 @@
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('configCookieConsent', true, 'Message de consentement aux cookies', [
'checked' => $this->getData(['config', 'cookieConsent']),
'help' => 'Activation obligatoire selon les lois françaises sauf si vous utilisez votre propre système de consentement.'
]); ?>
<?php echo template::checkbox('configCookieConsent', true, 'Message de consentement aux cookies', [
'checked' => $this->getData(['config', 'cookieConsent']),
'help' => 'Activation obligatoire selon les lois françaises sauf si vous utilisez votre propre système de consentement.'
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('configRewrite', true, 'Apache URL intelligentes', [
@ -56,33 +56,33 @@
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Mise à jour automatisée');?>
<?php echo template::topic('Mise à jour automatisée'); ?>
<span id="updateHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/mise-a-jour" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']);?>
<a href="https://doc.zwiicms.fr/mise-a-jour" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>
</h4>
<div class="row">
<div class="col6">
<?php echo template::checkbox('configAutoUpdate', true, 'Rechercher une mise à jour en ligne', [
'checked' => $this->getData(['config', 'autoUpdate']),
'help' => 'La vérification est quotidienne. Option désactivée si la configuration du serveur ne le permet pas.',
'disabled' => !$module::$onlineVersion
]); ?>
'checked' => $this->getData(['config', 'autoUpdate']),
'help' => 'La vérification est quotidienne. Option désactivée si la configuration du serveur ne le permet pas.',
'disabled' => !$module::$onlineVersion
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('configAutoUpdateHtaccess', true, 'Préserver le fichier htaccess racine', [
'checked' => $this->getData(['config', 'autoUpdateHtaccess']),
'help' => 'Lors d\'une mise à jour automatique, conserve le fichier htaccess de la racine du site.',
'disabled' => !$module::$onlineVersion
]); ?>
'checked' => $this->getData(['config', 'autoUpdateHtaccess']),
'help' => 'Lors d\'une mise à jour automatique, conserve le fichier htaccess de la racine du site.',
'disabled' => !$module::$onlineVersion
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo '<pre>Version installée : <strong>' . common::ZWII_VERSION . '</strong></pre>' ; ?>
<?php echo $module::$onlineVersion ? '<pre>Version en ligne : <strong>' . $module::$onlineVersion . '</strong></pre>' : '' ;?>
<?php echo '<pre>Version installée : <strong>' . common::ZWII_VERSION . '</strong></pre>'; ?>
<?php echo $module::$onlineVersion ? '<pre>Version en ligne : <strong>' . $module::$onlineVersion . '</strong></pre>' : ''; ?>
</div>
<div class="col4 verticalAlignBottom">
<?php echo template::button('configUpdateForced', [
@ -102,17 +102,17 @@
<div class="block">
<h4>Maintenance
<span id="maintenanceHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/mode-maintenance" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']);?>
<a href="https://doc.zwiicms.fr/mode-maintenance" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>
</h4>
<div class="row">
<div class="col6">
<?php echo template::checkbox('configAutoBackup', true, 'Sauvegarde automatique quotidienne du site', [
'checked' => $this->getData(['config', 'autoBackup']),
'help' => 'Une archive contenant le dossier /site/data est copiée dans le dossier \'site/backup\'. La sauvegarde est conservée pendant 30 jours.</p><p>Les fichiers du site ne sont pas sauvegardés automatiquement. Activation recommandée.'
]); ?>
'checked' => $this->getData(['config', 'autoBackup']),
'help' => 'Une archive contenant le dossier /site/data est copiée dans le dossier \'site/backup\'. La sauvegarde est conservée pendant 30 jours.</p><p>Les fichiers du site ne sont pas sauvegardés automatiquement. Activation recommandée.'
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('configMaintenance', true, 'Site en maintenance', [
@ -161,8 +161,8 @@
<div class="block">
<h4>Scripts externes
<span id="specialeHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/scripts-externes" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']);?>
<a href="https://doc.zwiicms.fr/scripts-externes" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>
</h4>
@ -179,7 +179,7 @@
'href' => helper::baseUrl() . 'config/script/body',
'value' => 'Script dans body',
'ico' => 'pencil'
]); ?>
]); ?>
</div>
</div>
</div>

View File

@ -3,10 +3,10 @@
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Capture d\'écran Open Graph');?>
<?php echo template::topic('Capture d\'écran Open Graph'); ?>
<span id="specialeHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/referencement" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']);?>
<a href="https://doc.zwiicms.fr/referencement" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>
</h4>
@ -24,20 +24,20 @@
<div class="row">
<div class="col12">
<?php echo template::button('socialMetaImage', [
'href' => helper::baseUrl() . 'config/configMetaImage',
'value' => 'Générer une capture Open Graph'
'href' => helper::baseUrl() . 'config/configMetaImage',
'value' => 'Générer une capture Open Graph'
]); ?>
</div>
</div>
</div>
<div class="col6 offset1">
<?php if (file_exists(self::FILE_DIR.'source/screenshot.jpg')): ?>
<?php if (file_exists(self::FILE_DIR . 'source/screenshot.jpg')) : ?>
<div class="row">
<div class="col8 offset2 textAlignCenter">
<img src="<?php echo helper::baseUrl(false) . self::FILE_DIR.'source/screenshot.jpg';?>" data-tippy-content="Cette capture d'écran est nécessaire aux partages sur les réseaux sociaux. Elle est régénérée lorsque le fichier 'screenshot.jpg' est effacé du gestionnaire de fichiers." />
<img src="<?php echo helper::baseUrl(false) . self::FILE_DIR . 'source/screenshot.jpg'; ?>" data-tippy-content="Cette capture d'écran est nécessaire aux partages sur les réseaux sociaux. Elle est régénérée lorsque le fichier 'screenshot.jpg' est effacé du gestionnaire de fichiers." />
</div>
</div>
<?php endif;?>
</div>
<?php endif; ?>
</div>
</div>
</div>
@ -47,7 +47,7 @@
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Référencement');?>
<?php echo template::topic('Référencement'); ?>
</h4>
<div class="row">
<div class="col4 offset1">
@ -58,7 +58,7 @@
</div>
<div class="col4 offset1">
<?php echo template::checkbox('seoRobots', true, 'Autoriser les robots à référencer le site', [
'checked' => $this->getData(['config', 'seo','robots'])
'checked' => $this->getData(['config', 'seo', 'robots'])
]); ?>
</div>
</div>
@ -69,10 +69,10 @@
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Réseaux sociaux');?>
<?php echo template::topic('Réseaux sociaux'); ?>
<span id="specialeHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/reseaux-sociaux" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']);?>
<a href="https://doc.zwiicms.fr/reseaux-sociaux" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>
</h4>
@ -108,9 +108,9 @@
</div>
<div class="row">
<div class="col3">
<?php echo template::text('socialTwitterId', [
'help' => 'Saisissez votre ID : https://twitter.com/[ID].',
'label' => 'Twitter',
<?php echo template::text('socialTwitterId', [
'help' => 'Saisissez votre ID : https://twitter.com/[ID].',
'label' => 'Twitter',
'value' => $this->getData(['config', 'social', 'twitterId'])
]); ?>
</div>
@ -129,11 +129,11 @@
]); ?>
</div>
<div class="col3">
<?php echo template::text('socialGithubId', [
'help' => 'Saisissez votre ID Github : https://github.com/[ID].',
'label' => 'Github',
'value' => $this->getData(['config', 'social', 'githubId'])
]); ?>
<?php echo template::text('socialGithubId', [
'help' => 'Saisissez votre ID Github : https://github.com/[ID].',
'label' => 'Github',
'value' => $this->getData(['config', 'social', 'githubId'])
]); ?>
</div>
</div>
</div>

View File

@ -14,7 +14,8 @@
*/
class install extends common {
class install extends common
{
public static $actions = [
'index' => self::GROUP_VISITOR,
@ -41,9 +42,10 @@ class install extends common {
/**
* Pré-installation - choix de la langue
*/
public function index() {
public function index()
{
// Accès refusé
if($this->getData(['user']) !== []) {
if ($this->getData(['user']) !== []) {
// Valeurs en sortie
$this->addOutput([
'access' => false
@ -52,7 +54,7 @@ class install extends common {
// Accès autorisé
else {
// Soumission du formulaire
if($this->isPost()) {
if ($this->isPost()) {
self::$i18nUI = $this->getInput('installLanguage');
$this->setData(['config', 'i18n', 'interface', self::$i18nUI]);
// Valeurs en sortie
@ -68,7 +70,7 @@ class install extends common {
chdir(self::I18N_DIR);
$files = glob('*.json');
// Ajouter une clé au tableau avec le code de langue
foreach( $files as $file) {
foreach ($files as $file) {
// La langue est-elle référencée ?
if (array_key_exists(basename($file, '.json'), self::$languages)) {
self::$i18nFiles[basename($file, '.json')] = self::$languages[basename($file, '.json')];
@ -87,9 +89,10 @@ class install extends common {
/**
* post Installation
*/
public function postInstall() {
public function postInstall()
{
// Accès refusé
if($this->getData(['user']) !== []) {
if ($this->getData(['user']) !== []) {
// Valeurs en sortie
$this->addOutput([
'access' => false
@ -98,10 +101,10 @@ class install extends common {
// Accès autorisé
else {
// Soumission du formulaire
if($this->isPost()) {
if ($this->isPost()) {
$success = true;
// Double vérification pour le mot de passe
if($this->getInput('installPassword', helper::FILTER_STRING_SHORT, true) !== $this->getInput('installConfirmPassword', helper::FILTER_STRING_SHORT, true)) {
if ($this->getInput('installPassword', helper::FILTER_STRING_SHORT, true) !== $this->getInput('installConfirmPassword', helper::FILTER_STRING_SHORT, true)) {
self::$inputNotices['installConfirmPassword'] = 'Incorrect';
$success = false;
}
@ -132,92 +135,93 @@ class install extends common {
// Compte créé, envoi du mail et création des données du site
if ($success) { // Formulaire complété envoi du mail
// Envoie le mail
// Sent contient true si réussite sinon code erreur d'envoi en clair
$sent = $this->sendMail(
$userMail,
'Installation de votre site',
'Bonjour' . ' <strong>' . $userFirstname . ' ' . $userLastname . '</strong>,<br><br>' .
'Voici les détails de votre installation.<br><br>' .
'<strong>URL du site :</strong> <a href="' . helper::baseUrl(false) . '" target="_blank">' . helper::baseUrl(false) . '</a><br>' .
'<strong>Identifiant du compte :</strong> ' . $this->getInput('installId') . '<br>',
null
);
// Envoie le mail
// Sent contient true si réussite sinon code erreur d'envoi en clair
$sent = $this->sendMail(
$userMail,
'Installation de votre site',
'Bonjour' . ' <strong>' . $userFirstname . ' ' . $userLastname . '</strong>,<br><br>' .
'Voici les détails de votre installation.<br><br>' .
'<strong>URL du site :</strong> <a href="' . helper::baseUrl(false) . '" target="_blank">' . helper::baseUrl(false) . '</a><br>' .
'<strong>Identifiant du compte :</strong> ' . $this->getInput('installId') . '<br>',
null
);
// Nettoyer les cookies de langue d'une précédente installation
helper::deleteCookie('ZWII_I18N_SITE');
// Nettoyer les cookies de langue d'une précédente installation
helper::deleteCookie('ZWII_I18N_SITE');
// Créer le contenu dans la langue sélectionnée
self::$i18nContent = substr(self::$i18nUI, 0, 2);
// Créer le contenu dans la langue sélectionnée
self::$i18nContent = substr(self::$i18nUI, 0, 2);
// Effacer le dossier de contenu fr créé par défaut si la langue est différente.
// Effacer le dossier de contenu fr créé par défaut si la langue est différente.
if (self::$i18nContent !== 'fr_FR'
&& is_dir('site/data/fr')
) {
$this->removeDir('site/data/fr');
}
// Installation du site de test
if ($this->getInput('installDefaultData',helper::FILTER_BOOLEAN) === FALSE) {
$this->initData('page', self::$i18nContent, true);
$this->initData('module',self::$i18nContent, true);
$this->setData(['module', 'blog', 'posts', 'mon-premier-article', 'userId', $userId]);
$this->setData(['module', 'blog', 'posts', 'mon-deuxieme-article', 'userId', $userId]);
$this->setData(['module', 'blog', 'posts', 'mon-troisieme-article', 'userId', $userId]);
}
// Sauvegarder la configuration du Proxy
$this->setData(['config', 'proxyType', $this->getInput('installProxyType') ]);
$this->setData(['config', 'proxyUrl', $this->getInput('installProxyUrl') ]);
$this->setData(['config', 'proxyPort', $this->getInput('installProxyPort', helper::FILTER_INT)]);
// Images exemples livrées dans tous les cas
try {
// Décompression dans le dossier de fichier temporaires
if (file_exists(self::TEMP_DIR . 'files.tar.gz')) {
unlink(self::TEMP_DIR . 'files.tar.gz');
if (
self::$i18nContent !== 'fr_FR'
&& is_dir('site/data/fr')
) {
$this->removeDir('site/data/fr');
}
if (file_exists(self::TEMP_DIR . 'files.tar')) {
unlink(self::TEMP_DIR . 'files.tar');
}
copy('core/module/install/ressource/files.tar.gz', self::TEMP_DIR . 'files.tar.gz');
$pharData = new PharData(self::TEMP_DIR . 'files.tar.gz');
$pharData->decompress();
// Installation
$pharData->extractTo(__DIR__ . '/../../../', null, true);
} catch (Exception $e) {
$success = $e->getMessage();
}
unlink(self::TEMP_DIR . 'files.tar.gz');
unlink(self::TEMP_DIR . 'files.tar');
// Créer le dossier des fontes
if (!is_dir(self::DATA_DIR . 'fonts')) {
mkdir(self::DATA_DIR . 'fonts');
}
// Installation du thème sélectionné
$dataThemes = file_get_contents('core/module/install/ressource/themes/themes.json');
$dataThemes = json_decode($dataThemes, true);
$themeId = $dataThemes [$this->getInput('installTheme', helper::FILTER_STRING_SHORT)]['filename'];
if ($themeId !== 'default' ) {
// Installation du site de test
if ($this->getInput('installDefaultData', helper::FILTER_BOOLEAN) === FALSE) {
$this->initData('page', self::$i18nContent, true);
$this->initData('module', self::$i18nContent, true);
$this->setData(['module', 'blog', 'posts', 'mon-premier-article', 'userId', $userId]);
$this->setData(['module', 'blog', 'posts', 'mon-deuxieme-article', 'userId', $userId]);
$this->setData(['module', 'blog', 'posts', 'mon-troisieme-article', 'userId', $userId]);
}
// Sauvegarder la configuration du Proxy
$this->setData(['config', 'proxyType', $this->getInput('installProxyType')]);
$this->setData(['config', 'proxyUrl', $this->getInput('installProxyUrl')]);
$this->setData(['config', 'proxyPort', $this->getInput('installProxyPort', helper::FILTER_INT)]);
// Images exemples livrées dans tous les cas
try {
// Décompression dans le dossier de fichier temporaires
if (file_exists(self::TEMP_DIR . 'files.tar.gz')) {
unlink(self::TEMP_DIR . 'files.tar.gz');
}
if (file_exists(self::TEMP_DIR . 'files.tar')) {
unlink(self::TEMP_DIR . 'files.tar');
}
copy('core/module/install/ressource/files.tar.gz', self::TEMP_DIR . 'files.tar.gz');
$pharData = new PharData(self::TEMP_DIR . 'files.tar.gz');
$pharData->decompress();
// Installation
$pharData->extractTo(__DIR__ . '/../../../', null, true);
} catch (Exception $e) {
$success = $e->getMessage();
}
unlink(self::TEMP_DIR . 'files.tar.gz');
unlink(self::TEMP_DIR . 'files.tar');
// Créer le dossier des fontes
if (!is_dir(self::DATA_DIR . 'fonts')) {
mkdir(self::DATA_DIR . 'fonts');
}
// Installation du thème sélectionné
$dataThemes = file_get_contents('core/module/install/ressource/themes/themes.json');
$dataThemes = json_decode($dataThemes, true);
$themeId = $dataThemes[$this->getInput('installTheme', helper::FILTER_STRING_SHORT)]['filename'];
if ($themeId !== 'default') {
$theme = new theme;
$theme->import('core/module/install/ressource/themes/' . $themeId);
}
}
// Copie des thèmes dans les fichiers
if (!is_dir(self::FILE_DIR . 'source/theme' )) {
mkdir(self::FILE_DIR . 'source/theme');
}
$this->copyDir('core/module/install/ressource/themes', self::FILE_DIR . 'source/theme');
unlink(self::FILE_DIR . 'source/theme/themes.json');
// Copie des thèmes dans les fichiers
if (!is_dir(self::FILE_DIR . 'source/theme')) {
mkdir(self::FILE_DIR . 'source/theme');
}
$this->copyDir('core/module/install/ressource/themes', self::FILE_DIR . 'source/theme');
unlink(self::FILE_DIR . 'source/theme/themes.json');
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl(false),
'notification' => $sent === true ? 'Installation terminée' : $sent,
'state' => ($sent === true && $success === true) ? true : null
]);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl(false),
'notification' => $sent === true ? 'Installation terminée' : $sent,
'state' => ($sent === true && $success === true) ? true : null
]);
}
}
@ -245,25 +249,26 @@ class install extends common {
/**
* Étapes de mise à jour
*/
public function steps() {
switch($this->getInput('step', helper::FILTER_INT)) {
// Préparation
public function steps()
{
switch ($this->getInput('step', helper::FILTER_INT)) {
// Préparation
case 1:
$success = true;
// RAZ la mise à jour auto
$this->setData(['core','updateAvailable', false]);
$this->setData(['core', 'updateAvailable', false]);
// Backup du dossier Data
helper::autoBackup(self::BACKUP_DIR,['backup','tmp','file']);
helper::autoBackup(self::BACKUP_DIR, ['backup', 'tmp', 'file']);
// Sauvegarde htaccess
if ($this->getData(['config','autoUpdateHtaccess'])) {
if ($this->getData(['config', 'autoUpdateHtaccess'])) {
$success = copy('.htaccess', '.htaccess' . '.bak');
}
// Nettoyage des fichiers d'installation précédents
if(file_exists(self::TEMP_DIR.'update.tar.gz') && $success) {
$success = unlink(self::TEMP_DIR.'update.tar.gz');
if (file_exists(self::TEMP_DIR . 'update.tar.gz') && $success) {
$success = unlink(self::TEMP_DIR . 'update.tar.gz');
}
if(file_exists(self::TEMP_DIR.'update.tar') && $success) {
$success = unlink(self::TEMP_DIR.'update.tar');
if (file_exists(self::TEMP_DIR . 'update.tar') && $success) {
$success = unlink(self::TEMP_DIR . 'update.tar');
}
// Valeurs en sortie
$this->addOutput([
@ -274,12 +279,12 @@ class install extends common {
]
]);
break;
// Téléchargement
// Téléchargement
case 2:
file_put_contents(self::TEMP_DIR.'update.tar.gz', helper::getUrlContents(common::ZWII_UPDATE_URL . common::ZWII_UPDATE_CHANNEL . '/update.tar.gz'));
file_put_contents(self::TEMP_DIR . 'update.tar.gz', helper::getUrlContents(common::ZWII_UPDATE_URL . common::ZWII_UPDATE_CHANNEL . '/update.tar.gz'));
$md5origin = helper::getUrlContents(common::ZWII_UPDATE_URL . common::ZWII_UPDATE_CHANNEL . '/update.md5');
$md5origin = (explode(' ',$md5origin));
$md5target = md5_file(self::TEMP_DIR.'update.tar.gz');
$md5origin = (explode(' ', $md5origin));
$md5target = md5_file(self::TEMP_DIR . 'update.tar.gz');
// Valeurs en sortie
$this->addOutput([
'display' => self::DISPLAY_JSON,
@ -289,7 +294,7 @@ class install extends common {
]
]);
break;
// Installation
// Installation
case 3:
$success = true;
// Check la réécriture d'URL avant d'écraser les fichiers
@ -297,7 +302,7 @@ class install extends common {
// Décompression et installation
try {
// Décompression dans le dossier de fichier temporaires
$pharData = new PharData(self::TEMP_DIR.'update.tar.gz');
$pharData = new PharData(self::TEMP_DIR . 'update.tar.gz');
$pharData->decompress();
// Installation
$pharData->extractTo(__DIR__ . '/../../../', null, true);
@ -305,11 +310,11 @@ class install extends common {
$success = $e->getMessage();
}
// Nettoyage du dossier
if(file_exists(self::TEMP_DIR.'update.tar.gz')) {
unlink(self::TEMP_DIR.'update.tar.gz');
if (file_exists(self::TEMP_DIR . 'update.tar.gz')) {
unlink(self::TEMP_DIR . 'update.tar.gz');
}
if(file_exists(self::TEMP_DIR.'update.tar')) {
unlink(self::TEMP_DIR.'update.tar');
if (file_exists(self::TEMP_DIR . 'update.tar')) {
unlink(self::TEMP_DIR . 'update.tar');
}
// Valeurs en sortie
$this->addOutput([
@ -320,7 +325,7 @@ class install extends common {
]
]);
break;
// Configuration
// Configuration
case 4:
$success = true;
$rewrite = $this->getInput('data');
@ -328,15 +333,15 @@ class install extends common {
if ($rewrite === "true") { // Ajout des lignes dans le .htaccess
$fileContent = file_get_contents('.htaccess');
$rewriteData = PHP_EOL .
'# URL rewriting' . PHP_EOL .
'<IfModule mod_rewrite.c>' . PHP_EOL .
"\tRewriteEngine on" . PHP_EOL .
"\tRewriteBase " . helper::baseUrl(false, false) . PHP_EOL .
"\tRewriteCond %{REQUEST_FILENAME} !-f" . PHP_EOL .
"\tRewriteCond %{REQUEST_FILENAME} !-d" . PHP_EOL .
"\tRewriteRule ^(.*)$ index.php?$1 [L]" . PHP_EOL .
'</IfModule>'. PHP_EOL .
'# URL rewriting' . PHP_EOL ;
'# URL rewriting' . PHP_EOL .
'<IfModule mod_rewrite.c>' . PHP_EOL .
"\tRewriteEngine on" . PHP_EOL .
"\tRewriteBase " . helper::baseUrl(false, false) . PHP_EOL .
"\tRewriteCond %{REQUEST_FILENAME} !-f" . PHP_EOL .
"\tRewriteCond %{REQUEST_FILENAME} !-d" . PHP_EOL .
"\tRewriteRule ^(.*)$ index.php?$1 [L]" . PHP_EOL .
'</IfModule>' . PHP_EOL .
'# URL rewriting' . PHP_EOL;
$fileContent = str_replace('# URL rewriting', $rewriteData, $fileContent);
file_put_contents(
'.htaccess',
@ -344,13 +349,14 @@ class install extends common {
);
}
// Recopie htaccess
if ($this->getData(['config','autoUpdateHtaccess']) &&
$success && file_exists( '.htaccess.bak')
if (
$this->getData(['config', 'autoUpdateHtaccess']) &&
$success && file_exists('.htaccess.bak')
) {
// L'écraser avec le backup
$success = copy( '.htaccess.bak' ,'.htaccess' );
// Effacer le backup
unlink('.htaccess.bak');
// L'écraser avec le backup
$success = copy('.htaccess.bak', '.htaccess');
// Effacer le backup
unlink('.htaccess.bak');
}
// Valeurs en sortie
$this->addOutput([
@ -367,7 +373,8 @@ class install extends common {
/**
* Mise à jour
*/
public function update() {
public function update()
{
// Nouvelle version
self::$newVersion = helper::getUrlContents(common::ZWII_UPDATE_URL . common::ZWII_UPDATE_CHANNEL . '/version');
// Valeurs en sortie
@ -377,6 +384,4 @@ class install extends common {
'view' => 'update'
]);
}
}

View File

@ -13,7 +13,8 @@
* @link http://zwiicms.fr/
*/
class maintenance extends common {
class maintenance extends common
{
public static $actions = [
'index' => self::GROUP_VISITOR
@ -22,24 +23,27 @@ class maintenance extends common {
/**
* Maintenance
*/
public function index() {
public function index()
{
// Redirection vers l'accueil après rafraîchissement et que la maintenance est terminée.
if($this->getData(['config', 'maintenance']) == False){
if ($this->getData(['config', 'maintenance']) == False) {
header('Location:' . helper::baseUrl());
exit();
}
// Page perso définie et existante
if ($this->getData(['locale','page302']) !== 'none'
AND $this->getData(['page',$this->getData(['locale','page302'])]) ) {
$this->addOutput([
'display' => self::DISPLAY_LAYOUT_LIGHT,
'title' => $this->getData(['page',$this->getData(['locale','page302']),'hideTitle'])
? ''
: $this->getData(['page',$this->getData(['locale','page302']),'title']),
//'content' => $this->getdata(['page',$this->getData(['locale','page302']),'content']),
'content' => $this->getPage($this->getData(['locale','page302']), self::$i18nContent),
'view' => 'index'
]);
if (
$this->getData(['locale', 'page302']) !== 'none'
and $this->getData(['page', $this->getData(['locale', 'page302'])])
) {
$this->addOutput([
'display' => self::DISPLAY_LAYOUT_LIGHT,
'title' => $this->getData(['page', $this->getData(['locale', 'page302']), 'hideTitle'])
? ''
: $this->getData(['page', $this->getData(['locale', 'page302']), 'title']),
//'content' => $this->getdata(['page',$this->getData(['locale','page302']),'content']),
'content' => $this->getPage($this->getData(['locale', 'page302']), self::$i18nContent),
'view' => 'index'
]);
} else {
// Valeurs en sortie
$this->addOutput([
@ -49,5 +53,4 @@ class maintenance extends common {
]);
}
}
}

View File

@ -14,7 +14,8 @@
* @link http://zwiicms.fr/
*/
class page extends common {
class page extends common
{
public static $actions = [
'add' => self::GROUP_MODERATOR,
@ -68,24 +69,24 @@ class page extends common {
/**
* Duplication
*/
public function duplicate() {
public function duplicate()
{
// Adresse sans le token
$url = explode('&',$this->getUrl(2));
$url = explode('&', $this->getUrl(2));
// La page n'existe pas
if($this->getData(['page', $url[0]]) === null) {
if ($this->getData(['page', $url[0]]) === null) {
// Valeurs en sortie
$this->addOutput([
'access' => false
]);
} // Jeton incorrect
elseif(!isset($_GET['csrf'])) {
elseif (!isset($_GET['csrf'])) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'page/edit/' . $url[0],
'notification' => 'Jeton invalide'
]);
}
elseif ($_GET['csrf'] !== $_SESSION['csrf']) {
} elseif ($_GET['csrf'] !== $_SESSION['csrf']) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'page/edit/' . $url[0],
@ -93,7 +94,7 @@ class page extends common {
]);
}
// Duplication de la page
$pageTitle = $this->getData(['page',$url[0],'title']);
$pageTitle = $this->getData(['page', $url[0], 'title']);
$pageId = helper::increment(helper::filter($pageTitle, helper::FILTER_ID), $this->getData(['page']));
$pageId = helper::increment($pageId, self::$coreModuleIds);
$pageId = helper::increment($pageId, self::$moduleIds);
@ -102,16 +103,16 @@ class page extends common {
$url[0]
]);
// Ecriture
$this->setData (['page',$pageId,$data]);
$this->setData(['page', $pageId, $data]);
$notification = 'La page a été dupliquée';
// Duplication du module présent
if ($this->getData(['page',$url[0],'moduleId'])) {
if ($this->getData(['page', $url[0], 'moduleId'])) {
$data = $this->getData([
'module',
$url[0]
]);
// Ecriture
$this->setData (['module',$pageId,$data]);
$this->setData(['module', $pageId, $data]);
$notification = 'La page et son module ont été dupliqués';
}
// Valeurs en sortie
@ -126,7 +127,8 @@ class page extends common {
/**
* Création
*/
public function add() {
public function add()
{
$pageTitle = 'Nouvelle page';
$pageId = helper::increment(helper::filter($pageTitle, helper::FILTER_ID), $this->getData(['page']));
$this->setData([
@ -135,7 +137,7 @@ class page extends common {
[
'typeMenu' => 'text',
'iconUrl' => '',
'disable' => false,
'disable' => false,
'content' => $pageId . '.html',
'hideTitle' => false,
'breadCrumb' => false,
@ -181,24 +183,24 @@ class page extends common {
/**
* Suppression
*/
public function delete() {
public function delete()
{
// $url prend l'adresse sans le token
$url = explode('&',$this->getUrl(2));
$url = explode('&', $this->getUrl(2));
// La page n'existe pas
if($this->getData(['page', $url[0]]) === null) {
if ($this->getData(['page', $url[0]]) === null) {
// Valeurs en sortie
$this->addOutput([
'access' => false
]);
} // Jeton incorrect
elseif(!isset($_GET['csrf'])) {
elseif (!isset($_GET['csrf'])) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'page/edit/' . $url[0],
'notification' => 'Jeton invalide'
]);
}
elseif ($_GET['csrf'] !== $_SESSION['csrf']) {
} elseif ($_GET['csrf'] !== $_SESSION['csrf']) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'page/edit/' . $url[0],
@ -206,7 +208,7 @@ class page extends common {
]);
}
// Impossible de supprimer la page d'accueil
elseif($url[0] === $this->getData(['locale', 'homePageId'])) {
elseif ($url[0] === $this->getData(['locale', 'homePageId'])) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
@ -214,7 +216,7 @@ class page extends common {
]);
}
// Impossible de supprimer la page de recherche affectée
elseif($url[0] === $this->getData(['locale', 'searchPageId'])) {
elseif ($url[0] === $this->getData(['locale', 'searchPageId'])) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
@ -222,7 +224,7 @@ class page extends common {
]);
}
// Impossible de supprimer la page des mentions légales affectée
elseif($url[0] === $this->getData(['locale', 'legalPageId'])) {
elseif ($url[0] === $this->getData(['locale', 'legalPageId'])) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
@ -230,7 +232,7 @@ class page extends common {
]);
}
// Impossible de supprimer la page des mentions légales affectée
elseif($url[0] === $this->getData(['locale', 'page404'])) {
elseif ($url[0] === $this->getData(['locale', 'page404'])) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
@ -238,7 +240,7 @@ class page extends common {
]);
}
// Impossible de supprimer la page des mentions légales affectée
elseif($url[0] === $this->getData(['locale', 'page403'])) {
elseif ($url[0] === $this->getData(['locale', 'page403'])) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
@ -246,7 +248,7 @@ class page extends common {
]);
}
// Impossible de supprimer la page des mentions légales affectée
elseif($url[0] === $this->getData(['locale', 'page302'])) {
elseif ($url[0] === $this->getData(['locale', 'page302'])) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
@ -254,14 +256,13 @@ class page extends common {
]);
}
// Jeton incorrect
elseif(!isset($_GET['csrf'])) {
elseif (!isset($_GET['csrf'])) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'page/edit/' . $url[0],
'notification' => 'Jeton invalide'
]);
}
elseif ($_GET['csrf'] !== $_SESSION['csrf']) {
} elseif ($_GET['csrf'] !== $_SESSION['csrf']) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'page/edit/' . $url[0],
@ -269,7 +270,7 @@ class page extends common {
]);
}
// Impossible de supprimer une page contenant des enfants
elseif($this->getHierarchy($url[0],null)) {
elseif ($this->getHierarchy($url[0], null)) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'page/edit/' . $url[0],
@ -280,12 +281,13 @@ class page extends common {
else {
// Effacer le dossier du module
$moduleId = $this->getData(['page',$url[0],'moduleId']);
$moduleId = $this->getData(['page', $url[0], 'moduleId']);
$modulesData = helper::getModules();
if ( array_key_exists($moduleId, $modulesData)
if (
array_key_exists($moduleId, $modulesData)
&& is_dir($modulesData[$moduleId]['dataDirectory'] . $url[0])
) {
$this->removeDir( $modulesData[$moduleId]['dataDirectory']. $url[0] );
$this->removeDir($modulesData[$moduleId]['dataDirectory'] . $url[0]);
}
// Effacer la page
$this->deleteData(['page', $url[0]]);
@ -310,9 +312,10 @@ class page extends common {
/**
* Édition
*/
public function edit() {
public function edit()
{
// La page n'existe pas
if($this->getData(['page', $this->getUrl(2)]) === null) {
if ($this->getData(['page', $this->getUrl(2)]) === null) {
// Valeurs en sortie
$this->addOutput([
'access' => false
@ -321,11 +324,11 @@ class page extends common {
// La page existe
else {
// Soumission du formulaire
if($this->isPost()) {
if ($this->isPost()) {
// Si le Title n'est pas vide, premier test pour positionner la notification du champ obligatoire
if( $this->getInput('pageEditTitle', helper::FILTER_ID, true) !== null && $this->getInput('pageEditTitle') !== '' ){
if ($this->getInput('pageEditTitle', helper::FILTER_ID, true) !== null && $this->getInput('pageEditTitle') !== '') {
// Génére l'ID si le titre de la page a changé
if ( $this->getInput('pageEditTitle') !== $this->getData(['page',$this->getUrl(2),'title']) ) {
if ($this->getInput('pageEditTitle') !== $this->getData(['page', $this->getUrl(2), 'title'])) {
$pageId = $this->getInput('pageEditTitle', helper::FILTER_ID, true);
} else {
$pageId = $this->getUrl(2);
@ -337,76 +340,76 @@ class page extends common {
// Si l'id a changée
if ($pageId !== $this->getUrl(2)) {
// Incrémente le nouvel id de la page
$pageId = helper::increment($pageId, $this->getData(['page']));
$pageId = helper::increment($pageId, self::$coreModuleIds);
$pageId = helper::increment($pageId, self::$moduleIds);
$pageId = helper::increment($pageId, $this->getData(['page']));
$pageId = helper::increment($pageId, self::$coreModuleIds);
$pageId = helper::increment($pageId, self::$moduleIds);
// Met à jour les enfants
foreach($this->getHierarchy($this->getUrl(2),null) as $childrenPageId) {
foreach ($this->getHierarchy($this->getUrl(2), null) as $childrenPageId) {
$this->setData(['page', $childrenPageId, 'parentPageId', $pageId]);
}
// Change l'id de page dans les données des modules
if ($this->getData(['module', $this->getUrl(2)]) !== null ) {
if ($this->getData(['module', $this->getUrl(2)]) !== null) {
$this->setData(['module', $pageId, $this->getData(['module', $this->getUrl(2)])]);
$this->deleteData(['module', $this->getUrl(2)]);
// Renommer le dossier du module
$moduleId = $this->getData(['page',$this->getUrl(2),'moduleId']);
$moduleId = $this->getData(['page', $this->getUrl(2), 'moduleId']);
$modulesData = helper::getModules();
if (is_dir($modulesData[$moduleId]['dataDirectory']. $this->getUrl(2))) {
if (is_dir($modulesData[$moduleId]['dataDirectory'] . $this->getUrl(2))) {
// Placer la feuille de style dans un dossier au nom de la nouvelle instance
mkdir( $modulesData[$moduleId]['dataDirectory']. $pageId, 0755 );
copy( $modulesData[$moduleId]['dataDirectory']. $this->getUrl(2), $modulesData[$moduleId]['dataDirectory']. $pageId);
$this->removeDir($modulesData[$moduleId]['dataDirectory']. $this->getUrl(2));
mkdir($modulesData[$moduleId]['dataDirectory'] . $pageId, 0755);
copy($modulesData[$moduleId]['dataDirectory'] . $this->getUrl(2), $modulesData[$moduleId]['dataDirectory'] . $pageId);
$this->removeDir($modulesData[$moduleId]['dataDirectory'] . $this->getUrl(2));
// Mettre à jour le nom de la feuille de style
$this->setData(['module',$pageId,'theme','style', $modulesData[$moduleId]['dataDirectory']. $pageId]);
$this->setData(['module', $pageId, 'theme', 'style', $modulesData[$moduleId]['dataDirectory'] . $pageId]);
}
}
// Si la page correspond à la page d'accueil, change l'id dans la configuration du site
if($this->getData(['locale', 'homePageId']) === $this->getUrl(2)) {
if ($this->getData(['locale', 'homePageId']) === $this->getUrl(2)) {
$this->setData(['locale', 'homePageId', $pageId]);
}
}
// Supprime les données du module en cas de changement de module
if($this->getInput('pageEditModuleId') !== $this->getData(['page', $this->getUrl(2), 'moduleId'])) {
if ($this->getInput('pageEditModuleId') !== $this->getData(['page', $this->getUrl(2), 'moduleId'])) {
$this->deleteData(['module', $pageId]);
}
// Supprime l'ancienne page si l'id a changée
if($pageId !== $this->getUrl(2)) {
if ($pageId !== $this->getUrl(2)) {
$this->deleteData(['page', $this->getUrl(2)]);
if (file_exists(self::DATA_DIR . self::$i18nContent . '/content/' . $this->getUrl(2) . '.html')) {
unlink (self::DATA_DIR . self::$i18nContent . '/content/' . $this->getUrl(2) . '.html');
unlink(self::DATA_DIR . self::$i18nContent . '/content/' . $this->getUrl(2) . '.html');
}
}
// Traitement des pages spéciales affectées dans la config :
if ($this->getUrl(2) === $this->getData(['locale', 'legalPageId']) ) {
$this->setData(['locale','legalPageId', $pageId]);
if ($this->getUrl(2) === $this->getData(['locale', 'legalPageId'])) {
$this->setData(['locale', 'legalPageId', $pageId]);
}
if ($this->getUrl(2) === $this->getData(['locale', 'searchPageId']) ) {
$this->setData(['locale','searchPageId', $pageId]);
if ($this->getUrl(2) === $this->getData(['locale', 'searchPageId'])) {
$this->setData(['locale', 'searchPageId', $pageId]);
}
if ($this->getUrl(2) === $this->getData(['locale', 'page404']) ) {
$this->setData(['locale','page404', $pageId]);
if ($this->getUrl(2) === $this->getData(['locale', 'page404'])) {
$this->setData(['locale', 'page404', $pageId]);
}
if ($this->getUrl(2) === $this->getData(['locale', 'page403']) ) {
$this->setData(['locale','page403', $pageId]);
if ($this->getUrl(2) === $this->getData(['locale', 'page403'])) {
$this->setData(['locale', 'page403', $pageId]);
}
if ($this->getUrl(2) === $this->getData(['locale', 'page302']) ) {
$this->setData(['locale','page302', $pageId]);
if ($this->getUrl(2) === $this->getData(['locale', 'page302'])) {
$this->setData(['locale', 'page302', $pageId]);
}
// Si la page est une page enfant, actualise les positions des autres enfants du parent, sinon actualise les pages sans parents
$lastPosition = 1;
$hierarchy = $this->getInput('pageEditParentPageId') ? $this->getHierarchy($this->getInput('pageEditParentPageId')) : array_keys($this->getHierarchy());
$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 ) {
if ($this->getData(['page', $hierarchyPageId, 'extraPosition']) === $extraPosition) {
// Ignore la page en cours de modification
if($hierarchyPageId === $this->getUrl(2) ) {
if ($hierarchyPageId === $this->getUrl(2)) {
continue;
}
// Incrémente de +1 pour laisser la place à la position de la page en cours de modification
if($lastPosition === $position) {
if ($lastPosition === $position) {
$lastPosition++;
}
// Change la position
@ -414,13 +417,11 @@ class page extends common {
// Incrémente pour la prochaine position
$lastPosition++;
}
}
if ($this->getinput('pageEditBlock') !== 'bar') {
$barLeft = $this->getinput('pageEditBarLeft');
$barRight = $this->getinput('pageEditBarRight');
$hideTitle = $this->getInput('pageEditHideTitle', helper::FILTER_BOOLEAN);
} else {
// Une barre ne peut pas avoir de barres
$barLeft = "";
@ -434,29 +435,29 @@ class page extends common {
$position === 0 &&
$position !== $this->getData(['page', $this->getUrl(2), 'position']) &&
$this->getinput('pageEditBlock') !== 'bar'
) {
foreach ($this->getHierarchy($pageId) as $parentId=>$childId) {
if ($this->getData(['page',$childId,'parentPageId']) === $pageId) {
$this->setData(['page',$childId,'position', 0]);
}
) {
foreach ($this->getHierarchy($pageId) as $parentId => $childId) {
if ($this->getData(['page', $childId, 'parentPageId']) === $pageId) {
$this->setData(['page', $childId, 'position', 0]);
}
}
}
// La page est une barre latérale qui a été renommée : changer le nom de la barre dans les pages qui l'utilisent
if ($this->getinput('pageEditBlock') === 'bar') {
foreach ($this->getHierarchy() as $eachPageId=>$parentId) {
if ($this->getData(['page',$eachPageId,'barRight']) === $this->getUrl(2)) {
$this->setData(['page',$eachPageId,'barRight',$pageId]);
foreach ($this->getHierarchy() as $eachPageId => $parentId) {
if ($this->getData(['page', $eachPageId, 'barRight']) === $this->getUrl(2)) {
$this->setData(['page', $eachPageId, 'barRight', $pageId]);
}
if ($this->getData(['page',$eachPageId,'barLeft']) === $this->getUrl(2)) {
$this->setData(['page',$eachPageId,'barLeft',$pageId]);
if ($this->getData(['page', $eachPageId, 'barLeft']) === $this->getUrl(2)) {
$this->setData(['page', $eachPageId, 'barLeft', $pageId]);
}
foreach ($parentId as $childId) {
if ($this->getData(['page',$childId,'barRight']) === $this->getUrl(2)) {
$this->setData(['page',$childId,'barRight',$pageId]);
if ($this->getData(['page', $childId, 'barRight']) === $this->getUrl(2)) {
$this->setData(['page', $childId, 'barRight', $pageId]);
}
if ($this->getData(['page',$childId,'barLeft']) === $this->getUrl(2)) {
$this->setData(['page',$childId,'barLeft',$pageId]);
if ($this->getData(['page', $childId, 'barLeft']) === $this->getUrl(2)) {
$this->setData(['page', $childId, 'barLeft', $pageId]);
}
}
}
@ -468,7 +469,7 @@ class page extends common {
[
'typeMenu' => $this->getinput('pageTypeMenu'),
'iconUrl' => $this->getinput('pageIconUrl'),
'disable'=> $this->getinput('pageEditDisable', helper::FILTER_BOOLEAN),
'disable' => $this->getinput('pageEditDisable', helper::FILTER_BOOLEAN),
'content' => $pageId . '.html',
'hideTitle' => $hideTitle,
'breadCrumb' => $this->getInput('pageEditbreadCrumb', helper::FILTER_BOOLEAN),
@ -500,7 +501,7 @@ class page extends common {
mkdir(self::DATA_DIR . self::$i18nContent . '/content', 0755);
}
$content = empty($this->getInput('pageEditContent', null)) ? '<p></p>' : str_replace('<p></p>', '<p>&nbsp;</p>', $this->getInput('pageEditContent', null));
$this->setPage($pageId , $content, self::$i18nContent);
$this->setPage($pageId, $content, self::$i18nContent);
// Met à jour le site map
$this->createSitemap('all');
@ -508,16 +509,16 @@ class page extends common {
$this->listPages();
// Redirection vers la configuration
if(
if (
$this->getInput('pageEditModuleRedirect', helper::FILTER_BOOLEAN)
) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $pageId . '/config',
'state' => true
]);
) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $pageId . '/config',
'state' => true
]);
// Redirection vers la page
} else {
} else {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $pageId,
@ -527,18 +528,20 @@ class page extends common {
}
}
}
self::$moduleIds = array_merge( ['' => 'Aucun'] , helper::arrayColumn(helper::getModules(),'realName','SORT_ASC')); // Pages sans parent
foreach($this->getHierarchy() as $parentPageId => $childrenPageIds) {
if($parentPageId !== $this->getUrl(2)) {
self::$moduleIds = array_merge(['' => 'Aucun'], helper::arrayColumn(helper::getModules(), 'realName', 'SORT_ASC')); // Pages sans parent
foreach ($this->getHierarchy() as $parentPageId => $childrenPageIds) {
if ($parentPageId !== $this->getUrl(2)) {
self::$pagesNoParentId[$parentPageId] = $this->getData(['page', $parentPageId, 'title']);
}
}
// Pages barre latérales
foreach($this->getHierarchy(null,false,true) as $parentPageId => $childrenPageIds) {
if($parentPageId !== $this->getUrl(2) &&
$this->getData(['page', $parentPageId, 'block']) === 'bar') {
self::$pagesBarId[$parentPageId] = $this->getData(['page', $parentPageId, 'title']);
}
foreach ($this->getHierarchy(null, false, true) as $parentPageId => $childrenPageIds) {
if (
$parentPageId !== $this->getUrl(2) &&
$this->getData(['page', $parentPageId, 'block']) === 'bar'
) {
self::$pagesBarId[$parentPageId] = $this->getData(['page', $parentPageId, 'title']);
}
}
// Valeurs en sortie
$this->addOutput([
@ -554,11 +557,13 @@ class page extends common {
/**
* Éditeur de feuille de style
*/
public function cssEditor() {
public function cssEditor()
{
// Soumission du formulaire
if($this->isPost()) {
if ($this->isPost()) {
// Enregistre le CSS
$this->setData(['page', $this->getUrl(2), 'css',
$this->setData([
'page', $this->getUrl(2), 'css',
$this->getInput('pageCssEditorContent', null)
]);
// Valeurs en sortie
@ -578,15 +583,17 @@ class page extends common {
]);
}
/**
/**
* Éditeur de feuille de style
*/
public function jsEditor() {
public function jsEditor()
{
// Soumission du formulaire
if($this->isPost()) {
if ($this->isPost()) {
// Enregistre le JS
$this->setData(['page', $this->getUrl(2), 'js',
$this->getInput('pageJsEditorContent', null)
$this->setData([
'page', $this->getUrl(2), 'js',
$this->getInput('pageJsEditorContent', null)
]);
// Valeurs en sortie
$this->addOutput([
@ -604,5 +611,4 @@ class page extends common {
'view' => 'jsEditor'
]);
}
}

View File

@ -1,22 +1,22 @@
<?php echo template::formOpen('pageCssEditorForm'); ?>
<div class="row">
<div class="col1">
<?php echo template::button('pageCssEditorBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2),
'value' => template::ico('left')
]); ?>
</div>
<div class="col2 offset9">
<?php echo template::submit('pageCssEditorSubmit'); ?>
</div>
<div class="row">
<div class="col1">
<?php echo template::button('pageCssEditorBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2),
'value' => template::ico('left')
]); ?>
</div>
<div class="row">
<div class="col12">
<?php echo template::textarea('pageCssEditorContent', [
'value' => empty($this->getData(['page', $this->getUrl(2), 'css' ])) ? '' : $this->getData(['page', $this->getUrl(2), 'css' ]),
'class' => 'editor'
]); ?>
</div>
<div class="col2 offset9">
<?php echo template::submit('pageCssEditorSubmit'); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::textarea('pageCssEditorContent', [
'value' => empty($this->getData(['page', $this->getUrl(2), 'css'])) ? '' : $this->getData(['page', $this->getUrl(2), 'css']),
'class' => 'editor'
]); ?>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -1,277 +1,169 @@
<?php echo template::formOpen('pageEditForm'); ?>
<div class="row">
<div class="col1">
<?php $href = helper::baseUrl() . $this->getUrl(2); ?>
<?php if ($this->getData(['page', $this->getUrl(2), 'moduleId']) === 'redirection' || 'code')$href = helper::baseUrl(); ?>
<?php echo template::button('pageEditBack', [
'class' => 'buttonGrey',
'href' => $href,
'value' => template::ico('home')
]); ?>
</div>
<div class="col1">
<?php /**echo template::button('pageEditHelp', [
<div class="row">
<div class="col1">
<?php $href = helper::baseUrl() . $this->getUrl(2); ?>
<?php if ($this->getData(['page', $this->getUrl(2), 'moduleId']) === 'redirection' || 'code') $href = helper::baseUrl(); ?>
<?php echo template::button('pageEditBack', [
'class' => 'buttonGrey',
'href' => $href,
'value' => template::ico('home')
]); ?>
</div>
<div class="col1">
<?php /**echo template::button('pageEditHelp', [
'href' => 'https://doc.zwiicms.fr/edition-des-pages',
'target' => '_blank',
'value' => template::ico('help'),
'class' => 'buttonHelp',
'help' => 'Consulter l\'aide en ligne'
]); */?>
]); */ ?>
</div>
<div class="col1 offset6">
<?php echo template::button('pageEditDelete', [
'class' => 'buttonRed',
'href' => helper::baseUrl() . 'page/delete/' . $this->getUrl(2) . '&csrf=' . $_SESSION['csrf'],
'value' => template::ico('trash'),
'help' => 'Effacer la page'
]); ?>
</div>
<div class="col1">
<?php echo template::button('pageEditDuplicate', [
'href' => helper::baseUrl() . 'page/duplicate/' . $this->getUrl(2) . '&csrf=' . $_SESSION['csrf'],
'value' => template::ico('clone'),
'help' => 'Dupliquer la page'
]); ?>
</div>
<div class="col2">
<?php echo template::submit('pageEditSubmit', [
'uniqueSubmission' => true
]); ?>
</div>
</div>
<div class="tab">
<?php echo template::button('pageEditContentButton', [
'value' => 'Contenu',
'class' => 'buttonTab'
]); ?>
<?php echo template::button('PageEditPositionButton', [
'value' => 'Menu',
'class' => 'buttonTab'
]); ?>
<?php echo template::button('pageEditExtensionButton', [
'value' => 'Extension',
'class' => 'buttonTab'
]); ?>
<?php echo template::button('pageEditLayoutButton', [
'value' => 'Mise en page',
'class' => 'buttonTab'
]); ?>
<?php echo template::button('pageEditPermissionButton', [
'value' => 'Permission',
'class' => 'buttonTab'
]); ?>
</div>
<div id="pageEditContentContainer" class="tabContent">
<div class="row">
<div class="col12">
<div class="block">
<h4>Titres
<span id="infoHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/informations-generales" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>
</h4>
<div class="row">
<div class="col8">
<?php echo template::text('pageEditTitle', [
'label' => 'Titre',
'value' => $this->getData(['page', $this->getUrl(2), 'title'])
]); ?>
</div>
<div class="col4">
<?php echo template::text('pageEditShortTitle', [
'label' => 'Titre court',
'value' => $this->getData(['page', $this->getUrl(2), 'shortTitle']),
'help' => 'Le titre court est affiché dans les menus. Il peut être identique au titre de la page.'
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('pageEditHideTitle', true, 'Titre masqué dans la page', [
'checked' => $this->getData(['page', $this->getUrl(2), 'hideTitle'])
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('pageEditbreadCrumb', true, 'Fil d\'Ariane dans le titre', [
'checked' => $this->getData(['page', $this->getUrl(2), 'breadCrumb']),
'help' => 'Affiche le nom de la page parente suivi du nom de la page, le titre ne doit pas être masqué.'
]); ?>
</div>
</div>
</div>
</div>
<div class="col1 offset6">
<?php echo template::button('pageEditDelete', [
'class' => 'buttonRed',
'href' => helper::baseUrl() . 'page/delete/' . $this->getUrl(2) . '&csrf=' . $_SESSION['csrf'],
'value' => template::ico('trash'),
'help' => 'Effacer la page'
]); ?>
</div>
<div class="col1">
<?php echo template::button('pageEditDuplicate', [
'href' => helper::baseUrl() . 'page/duplicate/' . $this->getUrl(2) . '&csrf=' . $_SESSION['csrf'],
'value' => template::ico('clone'),
'help' => 'Dupliquer la page'
]); ?>
</div>
<div class="col2">
<?php echo template::submit('pageEditSubmit', [
'uniqueSubmission' => true
</div>
<div class="row">
<div class="col12">
<?php echo template::textarea('pageEditContent', [
'class' => 'editorWysiwyg',
'value' => $this->getPage($this->getUrl(2), self::$i18nContent)
]); ?>
</div>
</div>
</div>
<div class="tab">
<?php echo template::button('pageEditContentButton', [
'value' => 'Contenu',
'class' => 'buttonTab'
]); ?>
<?php echo template::button('PageEditPositionButton', [
'value' => 'Menu',
'class' => 'buttonTab'
]); ?>
<?php echo template::button('pageEditExtensionButton', [
'value' => 'Extension',
'class' => 'buttonTab'
]); ?>
<?php echo template::button('pageEditLayoutButton', [
'value' => 'Mise en page',
'class' => 'buttonTab'
]); ?>
<?php echo template::button('pageEditPermissionButton', [
'value' => 'Permission',
'class' => 'buttonTab'
]); ?>
</div>
<div id="pageEditContentContainer" class="tabContent">
<div class="row">
<div class="col12">
<div class="block">
<h4>Titres
<span id="infoHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/informations-generales" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']);?>
</a>
</span>
</h4>
<div id="pageEditPositionContainer" class="tabContent">
<div class="row">
<div class="col12">
<div class="block">
<h4>Emplacement dans le menu
<span id="positionHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/emplacement-dans-le-menu" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col8">
<?php echo template::text('pageEditTitle', [
'label' => 'Titre',
'value' => $this->getData(['page', $this->getUrl(2), 'title'])
<div class="col4">
<?php echo template::select('pageEditPosition', [], [
'label' => 'Position',
'help' => '\'Ne pas afficher\' crée une page orpheline non accessible par le biais des menus.'
]); ?>
</div>
<div class="col4">
<?php echo template::text('pageEditShortTitle', [
'label' => 'Titre court',
'value' => $this->getData(['page', $this->getUrl(2), 'shortTitle']),
'help' => 'Le titre court est affiché dans les menus. Il peut être identique au titre de la page.'
<?php if ($this->getHierarchy($this->getUrl(2), false)) : ?>
<?php echo template::hidden('pageEditParentPageId', [
'value' => $this->getData(['page', $this->getUrl(2), 'parentPageId'])
]); ?>
<?php else : ?>
<?php echo template::select('pageEditParentPageId', $module::$pagesNoParentId, [
'label' => 'Page parent',
'selected' => $this->getData(['page', $this->getUrl(2), 'parentPageId'])
]); ?>
<?php endif; ?>
</div>
<div class="col4">
<?php echo template::select('pageEditExtraPosition', $module::$extraPosition, [
'label' => 'Emplacement :',
'selected' => $this->getData(['page', $this->getUrl(2), 'extraPosition']),
'help' => 'Le petit accessoire est aligné à droite de la barre de menu, c\'est un emplacement réservé aux drapeaux et au bouton de connexion.'
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('pageEditHideTitle', true, 'Titre masqué dans la page', [
'checked' => $this->getData(['page', $this->getUrl(2), 'hideTitle'])
]); ?>
<?php echo template::checkbox('pageEditDisable', true, 'Page non cliquable', [
'checked' => $this->getData(['page', $this->getUrl(2), 'disable']),
'help' => 'Option active en mode déconnecté uniquement, les pages enfants sont visibles et accessibles.'
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('pageEditbreadCrumb', true, 'Fil d\'Ariane dans le titre', [
'checked' => $this->getData(['page', $this->getUrl(2), 'breadCrumb']),
'help' => 'Affiche le nom de la page parente suivi du nom de la page, le titre ne doit pas être masqué.'
]); ?>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::textarea('pageEditContent', [
'class' => 'editorWysiwyg',
'value' => $this->getPage($this->getUrl(2), self::$i18nContent)
]); ?>
</div>
</div>
</div>
<div id="pageEditPositionContainer" class="tabContent">
<div class="row">
<div class="col12">
<div class="block">
<h4>Emplacement dans le menu
<span id="positionHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/emplacement-dans-le-menu" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']);?>
</a>
</span>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col4">
<?php echo template::select('pageEditPosition', [], [
'label' => 'Position',
'help' => '\'Ne pas afficher\' crée une page orpheline non accessible par le biais des menus.'
]); ?>
</div>
<div class="col4">
<?php if($this->getHierarchy($this->getUrl(2), false)): ?>
<?php echo template::hidden('pageEditParentPageId', [
'value' => $this->getData(['page', $this->getUrl(2), 'parentPageId'])
]); ?>
<?php else: ?>
<?php echo template::select('pageEditParentPageId', $module::$pagesNoParentId, [
'label' => 'Page parent',
'selected' => $this->getData(['page', $this->getUrl(2), 'parentPageId'])
]); ?>
<?php endif; ?>
</div>
<div class="col4">
<?php echo template::select('pageEditExtraPosition', $module::$extraPosition, [
'label' => 'Emplacement :',
'selected' => $this->getData(['page', $this->getUrl(2), 'extraPosition']),
'help' => 'Le petit accessoire est aligné à droite de la barre de menu, c\'est un emplacement réservé aux drapeaux et au bouton de connexion.'
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('pageEditDisable', true, 'Page non cliquable', [
'checked' => $this->getData(['page', $this->getUrl(2), 'disable']),
'help' => 'Option active en mode déconnecté uniquement, les pages enfants sont visibles et accessibles.'
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('pageEditTargetBlank', true, 'S\'ouvre dans un nouvel onglet', [
'checked' => $this->getData(['page', $this->getUrl(2), 'targetBlank'])
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Options avancées
<span id="advancedHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/options-d-emplacement-avancee" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']);?>
</a>
</span>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col3">
<?php echo template::select('pageTypeMenu', $module::$typeMenu,[
'label' => 'Apparence',
'selected' => $this->getData(['page', $this->getUrl(2), 'typeMenu'])
]); ?>
</div>
<div class="col9">
<?php echo template::file('pageIconUrl', [
'help' => 'Sélectionnez une image ou une icône de petite dimension',
'label' => 'Icône',
'value' => $this->getData(['page', $this->getUrl(2), 'iconUrl'])
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('pageEditHideMenuChildren', true, 'Masquer les pages enfants dans le menu horizontal', [
'checked' => $this->getData(['page', $this->getUrl(2), 'hideMenuChildren'])
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('pageEditHideMenuSide', true, 'Masquer la page et les pages enfants dans le menu d\'une barre latérale' , [
'checked' => $this->getData(['page', $this->getUrl(2), 'hideMenuSide']),
'help' => 'La page est affichée dans un menu horizontal mais pas dans le menu vertical d\'une barre latérale.'
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="pageEditExtensionContainer" class="tabContent">
<div class="row">
<div class="col6">
<div class="block">
<h4>Module</h4>
<div class="row">
<div class="col10">
<?php echo template::hidden('pageEditModuleRedirect'); ?>
<?php echo template::select('pageEditModuleId', $module::$moduleIds, [
'help' => 'En cas de changement de module, les données du module précédent seront supprimées.',
'label' => 'Module',
'selected' => $this->getData(['page', $this->getUrl(2), 'moduleId'])
]); ?>
<?php echo template::hidden('pageEditModuleIdOld',['value' => $this->getData(['page', $this->getUrl(2), 'moduleId'])]); ?>
<?php echo template::hidden('pageEditModuleIdOldText',[
'value' => array_key_exists($this->getData(['page', $this->getUrl(2), 'moduleId']),$module::$moduleIds)? $module::$moduleIds[$this->getData(['page', $this->getUrl(2), 'moduleId'])] : ucfirst($this->getData(['page', $this->getUrl(2), 'moduleId']))
]); ?>
</div>
<div class="col2 verticalAlignBottom">
<?php echo template::button('pageEditModuleConfig', [
'disabled' => (bool) $this->getData(['page', $this->getUrl(2), 'moduleId']) === false,
'uniqueSubmission' => true,
'value' => template::ico('gear')
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::select('pageModulePosition', $module::$modulePosition,[
'help' => 'En position libre ajoutez le module en plaçant [MODULE] à l\'endroit voulu dans votre page.',
'label' => 'Position du module',
'selected' => $this->getData(['page', $this->getUrl(2), 'modulePosition'])
]); ?>
</div>
</div>
</div>
</div>
<div class="col6">
<div class="block">
<h4>Contenu avancé</h4>
<div class="row">
<div class="col6 offset3">
<?php echo template::button('pageEditCssEditor', [
'href' => helper::baseUrl() . 'page/cssEditor/' . $this->getUrl(2),
'value' => 'Éditeur CSS',
'help' => 'Feuille de style spécifique à la page.'
]); ?>
</div>
</div>
<div class="row">
<div class="col6 offset3">
<?php echo template::button('pageEditJsEditor', [
'href' => helper::baseUrl() . 'page/jsEditor/' . $this->getUrl(2),
'value' => 'Éditeur JS',
'help' => 'Instructions JS ou jquery spécifiques à la page.'
<?php echo template::checkbox('pageEditTargetBlank', true, 'S\'ouvre dans un nouvel onglet', [
'checked' => $this->getData(['page', $this->getUrl(2), 'targetBlank'])
]); ?>
</div>
</div>
@ -279,101 +171,209 @@
</div>
</div>
</div>
<div id="pageEditLayoutContainer" class="tabContent">
<div class="row">
<div class="col12">
<div class="block">
<h4>Mise en page
<span id="layoutHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/mise-en-page-2" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']);?>
</a>
</span>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col6">
<div class="row">
<div class="col12">
<?php echo template::select('pageEditBlock', $module::$pageBlocks, [
'label' => 'Gabarits de page / Barre latérale',
'help' => 'Pour définir la page comme barre latérale, choisissez l\'option dans la liste.',
'selected' => $this->getData(['page', $this->getUrl(2) , 'block'])
]); ?>
</div>
</div>
</div>
<div class="col6">
<!-- Sélection des barres latérales -->
<?php if($this->getHierarchy($this->getUrl(2),false,true)): ?>
<?php echo template::hidden('pageEditBarLeft', [
'value' => $this->getData(['page', $this->getUrl(2), 'barLeft'])
]); ?>
<?php else: ?>
<?php echo template::select('pageEditBarLeft', $module::$pagesBarId, [
'label' => 'Barre latérale gauche :',
'selected' => $this->getData(['page', $this->getUrl(2), 'barLeft'])
]); ?>
<?php endif; ?>
<?php if($this->getHierarchy($this->getUrl(2),false,true)): ?>
<?php echo template::hidden('pageEditBarRight', [
'value' => $this->getData(['page', $this->getUrl(2), 'barRight'])
]); ?>
<?php else: ?>
<?php echo template::select('pageEditBarRight', $module::$pagesBarId, [
'label' => 'Barre latérale droite :',
'selected' => $this->getData(['page', $this->getUrl(2), 'barRight'])
]); ?>
<?php endif; ?>
<?php echo template::select('pageEditDisplayMenu', $module::$displayMenu, [
'label' => 'Contenu du menu vertical',
'selected' => $this->getData(['page', $this->getUrl(2), 'displayMenu']),
'help' => 'Par défaut le menu est affiché APRES le contenu de la page. Pour le positionner à un emplacement précis, insérez [MENU] dans le contenu de la page.'
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="pageEditPermissionContainer" class="tabContent">
<div class="row">
<div class="col12">
<div class="block">
<h4>Permission et référencement
<span id="seoHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/permission-et-referencement" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']);?>
<div class="row">
<div class="col12">
<div class="block">
<h4>Options avancées
<span id="advancedHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/options-d-emplacement-avancee" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>
</h4>
<div class="blockContainer">
<div class="row">
<div class='col6'>
<?php echo template::select('pageEditGroup', self::$groupPublics, [
'label' => 'Groupe requis pour accéder à la page :',
'selected' => $this->getData(['page', $this->getUrl(2), 'group'])
]); ?>
</div>
<div class='col12'>
<?php echo template::text('pageEditMetaTitle', [
'label' => 'Méta-titre',
'value' => $this->getData(['page', $this->getUrl(2), 'metaTitle'])
]); ?>
<?php echo template::textarea('pageEditMetaDescription', [
'label' => 'Méta-description',
//'maxlength' => '500',
'value' => $this->getData(['page', $this->getUrl(2), 'metaDescription'])
]); ?>
</div>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col3">
<?php echo template::select('pageTypeMenu', $module::$typeMenu, [
'label' => 'Apparence',
'selected' => $this->getData(['page', $this->getUrl(2), 'typeMenu'])
]); ?>
</div>
<div class="col9">
<?php echo template::file('pageIconUrl', [
'help' => 'Sélectionnez une image ou une icône de petite dimension',
'label' => 'Icône',
'value' => $this->getData(['page', $this->getUrl(2), 'iconUrl'])
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('pageEditHideMenuChildren', true, 'Masquer les pages enfants dans le menu horizontal', [
'checked' => $this->getData(['page', $this->getUrl(2), 'hideMenuChildren'])
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('pageEditHideMenuSide', true, 'Masquer la page et les pages enfants dans le menu d\'une barre latérale', [
'checked' => $this->getData(['page', $this->getUrl(2), 'hideMenuSide']),
'help' => 'La page est affichée dans un menu horizontal mais pas dans le menu vertical d\'une barre latérale.'
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="pageEditExtensionContainer" class="tabContent">
<div class="row">
<div class="col6">
<div class="block">
<h4>Module</h4>
<div class="row">
<div class="col10">
<?php echo template::hidden('pageEditModuleRedirect'); ?>
<?php echo template::select('pageEditModuleId', $module::$moduleIds, [
'help' => 'En cas de changement de module, les données du module précédent seront supprimées.',
'label' => 'Module',
'selected' => $this->getData(['page', $this->getUrl(2), 'moduleId'])
]); ?>
<?php echo template::hidden('pageEditModuleIdOld', ['value' => $this->getData(['page', $this->getUrl(2), 'moduleId'])]); ?>
<?php echo template::hidden('pageEditModuleIdOldText', [
'value' => array_key_exists($this->getData(['page', $this->getUrl(2), 'moduleId']), $module::$moduleIds) ? $module::$moduleIds[$this->getData(['page', $this->getUrl(2), 'moduleId'])] : ucfirst($this->getData(['page', $this->getUrl(2), 'moduleId']))
]); ?>
</div>
<div class="col2 verticalAlignBottom">
<?php echo template::button('pageEditModuleConfig', [
'disabled' => (bool) $this->getData(['page', $this->getUrl(2), 'moduleId']) === false,
'uniqueSubmission' => true,
'value' => template::ico('gear')
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::select('pageModulePosition', $module::$modulePosition, [
'help' => 'En position libre ajoutez le module en plaçant [MODULE] à l\'endroit voulu dans votre page.',
'label' => 'Position du module',
'selected' => $this->getData(['page', $this->getUrl(2), 'modulePosition'])
]); ?>
</div>
</div>
</div>
</div>
<div class="col6">
<div class="block">
<h4>Contenu avancé</h4>
<div class="row">
<div class="col6 offset3">
<?php echo template::button('pageEditCssEditor', [
'href' => helper::baseUrl() . 'page/cssEditor/' . $this->getUrl(2),
'value' => 'Éditeur CSS',
'help' => 'Feuille de style spécifique à la page.'
]); ?>
</div>
</div>
<div class="row">
<div class="col6 offset3">
<?php echo template::button('pageEditJsEditor', [
'href' => helper::baseUrl() . 'page/jsEditor/' . $this->getUrl(2),
'value' => 'Éditeur JS',
'help' => 'Instructions JS ou jquery spécifiques à la page.'
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="pageEditLayoutContainer" class="tabContent">
<div class="row">
<div class="col12">
<div class="block">
<h4>Mise en page
<span id="layoutHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/mise-en-page-2" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col6">
<div class="row">
<div class="col12">
<?php echo template::select('pageEditBlock', $module::$pageBlocks, [
'label' => 'Gabarits de page / Barre latérale',
'help' => 'Pour définir la page comme barre latérale, choisissez l\'option dans la liste.',
'selected' => $this->getData(['page', $this->getUrl(2), 'block'])
]); ?>
</div>
</div>
</div>
<div class="col6">
<!-- Sélection des barres latérales -->
<?php if ($this->getHierarchy($this->getUrl(2), false, true)) : ?>
<?php echo template::hidden('pageEditBarLeft', [
'value' => $this->getData(['page', $this->getUrl(2), 'barLeft'])
]); ?>
<?php else : ?>
<?php echo template::select('pageEditBarLeft', $module::$pagesBarId, [
'label' => 'Barre latérale gauche :',
'selected' => $this->getData(['page', $this->getUrl(2), 'barLeft'])
]); ?>
<?php endif; ?>
<?php if ($this->getHierarchy($this->getUrl(2), false, true)) : ?>
<?php echo template::hidden('pageEditBarRight', [
'value' => $this->getData(['page', $this->getUrl(2), 'barRight'])
]); ?>
<?php else : ?>
<?php echo template::select('pageEditBarRight', $module::$pagesBarId, [
'label' => 'Barre latérale droite :',
'selected' => $this->getData(['page', $this->getUrl(2), 'barRight'])
]); ?>
<?php endif; ?>
<?php echo template::select('pageEditDisplayMenu', $module::$displayMenu, [
'label' => 'Contenu du menu vertical',
'selected' => $this->getData(['page', $this->getUrl(2), 'displayMenu']),
'help' => 'Par défaut le menu est affiché APRES le contenu de la page. Pour le positionner à un emplacement précis, insérez [MENU] dans le contenu de la page.'
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="pageEditPermissionContainer" class="tabContent">
<div class="row">
<div class="col12">
<div class="block">
<h4>Permission et référencement
<span id="seoHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/permission-et-referencement" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>
</h4>
<div class="blockContainer">
<div class="row">
<div class='col6'>
<?php echo template::select('pageEditGroup', self::$groupPublics, [
'label' => 'Groupe requis pour accéder à la page :',
'selected' => $this->getData(['page', $this->getUrl(2), 'group'])
]); ?>
</div>
<div class='col12'>
<?php echo template::text('pageEditMetaTitle', [
'label' => 'Méta-titre',
'value' => $this->getData(['page', $this->getUrl(2), 'metaTitle'])
]); ?>
<?php echo template::textarea('pageEditMetaDescription', [
'label' => 'Méta-description',
//'maxlength' => '500',
'value' => $this->getData(['page', $this->getUrl(2), 'metaDescription'])
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -1,22 +1,22 @@
<?php echo template::formOpen('pageJsEditorForm'); ?>
<div class="row">
<div class="col1">
<?php echo template::button('pageJsEditorBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2),
'value' => template::ico('left')
]); ?>
</div>
<div class="col2 offset9">
<?php echo template::submit('pageJsEditorSubmit'); ?>
</div>
<div class="row">
<div class="col1">
<?php echo template::button('pageJsEditorBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2),
'value' => template::ico('left')
]); ?>
</div>
<div class="row">
<div class="col12">
<?php echo template::textarea('pageJsEditorContent', [
'value' => empty($this->getData(['page', $this->getUrl(2), 'js' ])) ? '': $this->getData(['page', $this->getUrl(2), 'js' ]),
'class' => 'editor'
]); ?>
</div>
<div class="col2 offset9">
<?php echo template::submit('pageJsEditorSubmit'); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::textarea('pageJsEditorContent', [
'value' => empty($this->getData(['page', $this->getUrl(2), 'js'])) ? '' : $this->getData(['page', $this->getUrl(2), 'js']),
'class' => 'editor'
]); ?>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -9,12 +9,13 @@
* @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
* @copyright Copyright (C) 2018-2022, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.fr/
*/
class plugin extends common {
class plugin extends common
{
public static $actions = [
'index' => self::GROUP_ADMIN,
@ -26,7 +27,7 @@ class plugin extends common {
'store' => self::GROUP_ADMIN,
'item' => self::GROUP_ADMIN, // détail d'un objet
'upload' => self::GROUP_ADMIN, // Téléverser catalogue
'uploadItem'=> self::GROUP_ADMIN // Téléverser par archive
'uploadItem' => self::GROUP_ADMIN // Téléverser par archive
];
// URL des modules
@ -52,7 +53,8 @@ class plugin extends common {
/*
* Effacement d'un module installé et non utilisé
*/
public function delete() {
public function delete()
{
// Jeton incorrect
if ($this->getUrl(3) !== $_SESSION['csrf']) {
@ -62,25 +64,23 @@ class plugin extends common {
'state' => false,
'notification' => 'Action non autorisée'
]);
}
else{
} else {
// Suppression des dossiers
$infoModules = helper::getModules();
$module = $this->getUrl(2);
//Liste des dossiers associés au module non effacés
if( $this->removeDir('./module/'.$module ) === true ){
if ($this->removeDir('./module/' . $module) === true) {
$success = true;
$notification = 'Module '. $module .' désinstallé';
if(($infoModules[$this->getUrl(2)]['dataDirectory']) ) {
$notification = 'Module ' . $module . ' désinstallé';
if (($infoModules[$this->getUrl(2)]['dataDirectory'])) {
if (
is_dir($infoModules[$this->getUrl(2)]['dataDirectory'])
&& !$this->removeDir($infoModules[$this->getUrl(2)]['dataDirectory'])
){
$notification = 'Module '.$module .' désinstallé, il reste des données dans ' . $infoModules[$this->getUrl(2)]['dataDirectory'];
is_dir($infoModules[$this->getUrl(2)]['dataDirectory'])
&& !$this->removeDir($infoModules[$this->getUrl(2)]['dataDirectory'])
) {
$notification = 'Module ' . $module . ' désinstallé, il reste des données dans ' . $infoModules[$this->getUrl(2)]['dataDirectory'];
}
}
}
else{
} else {
$success = false;
$notification = 'La suppression a échouée';
}
@ -98,7 +98,8 @@ class plugin extends common {
* Installation d'un module
* Fonction utilisée par upload et storeUpload
*/
private function install($moduleFileName, $checkValid){
private function install($moduleFileName, $checkValid)
{
// Dossier temporaire
$tempFolder = uniqid() . '/';
@ -112,10 +113,10 @@ class plugin extends common {
//Création du dossier temporaire et extraction
if (!is_dir (self::TEMP_DIR . $tempFolder) ) {
mkdir (self::TEMP_DIR . $tempFolder, 0755);
if (!is_dir(self::TEMP_DIR . $tempFolder)) {
mkdir(self::TEMP_DIR . $tempFolder, 0755);
}
$zip->extractTo(self::TEMP_DIR . $tempFolder );
$zip->extractTo(self::TEMP_DIR . $tempFolder);
/**
* Lecture du descripteur de ressource
@ -127,17 +128,16 @@ class plugin extends common {
* 'download" => 'module/download'
*/
if (file_exists(self::TEMP_DIR . $tempFolder . 'desc.json')
) {
$module = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . 'desc.json'), true);
} else {
// Message de retour
$this->removeDir(self::TEMP_DIR . $tempFolder);
$zip->close();
return([
'success' => false,
'notification'=> 'Archive invalide, le descripteur est absent.'
]);
if (file_exists(self::TEMP_DIR . $tempFolder . 'desc.json')) {
$module = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . 'desc.json'), true);
} else {
// Message de retour
$this->removeDir(self::TEMP_DIR . $tempFolder);
$zip->close();
return ([
'success' => false,
'notification' => 'Archive invalide, le descripteur est absent.'
]);
}
/**
@ -145,23 +145,23 @@ class plugin extends common {
*/
foreach ($module['dirs'] as $src => $dest) {
// Vérification de la présence des dossier décrits
if ( !is_dir (self::TEMP_DIR . $tempFolder . $src )) {
if (!is_dir(self::TEMP_DIR . $tempFolder . $src)) {
// Message de retour
$this->removeDir(self::TEMP_DIR . $tempFolder);
$zip->close();
return([
return ([
'success' => false,
'notification'=> 'Archive invalide, les dossiers ne correspondent pas au descripteur.'
'notification' => 'Archive invalide, les dossiers ne correspondent pas au descripteur.'
]);
}
// Interdire l'écriture dans le dossier core
if ( strstr($dest, 'core') !== false ) {
if (strstr($dest, 'core') !== false) {
// Message de retour
$this->removeDir(self::TEMP_DIR . $tempFolder);
$zip->close();
return([
return ([
'success' => false,
'notification'=> 'Archive invalide, l\'écriture dans le dossier core est interdite'
'notification' => 'Archive invalide, l\'écriture dans le dossier core est interdite'
]);
}
}
@ -169,13 +169,13 @@ class plugin extends common {
/**
* Validation de la présence du fichier de base du module
*/
if ( !file_exists(self::TEMP_DIR . $tempFolder . $module['name'] . '/' . $module['name'] . '.php')) {
if (!file_exists(self::TEMP_DIR . $tempFolder . $module['name'] . '/' . $module['name'] . '.php')) {
// Message de retour
$this->removeDir(self::TEMP_DIR . $tempFolder);
$zip->close();
return([
return ([
'success' => false,
'notification'=> 'Cette archive est invalide, le fichier de classe est absent.'
'notification' => 'Cette archive est invalide, le fichier de classe est absent.'
]);
}
@ -184,7 +184,7 @@ class plugin extends common {
* Le module est-il déjà installé ?
* Si oui lire le numéro de version et le stocker dans $versionInstalled
*/
if (is_file( self::MODULE_DIR . $module['name'] . '/' . $module['name'] . '.php') ) {
if (is_file(self::MODULE_DIR . $module['name'] . '/' . $module['name'] . '.php')) {
$c = helper::getModules();
if (array_key_exists($module['name'], $c)) {
$versionInstalled = $c[$module['name']]['version'];
@ -193,12 +193,12 @@ class plugin extends common {
// Le module est installé, contrôle de la version
$installOk = false;
if ( isset($versionInstalled) === false ) {
if (isset($versionInstalled) === false) {
$installOk = true;
} elseif ( version_compare($module['version'], $versionInstalled) >= 0 ) {
} elseif (version_compare($module['version'], $versionInstalled) >= 0) {
$installOk = true;
} else {
if (version_compare($module['version'], $versionInstalled) === -1 ) {
if (version_compare($module['version'], $versionInstalled) === -1) {
// Contrôle du forçage
if ($this->getInput('configModulesCheck', helper::FILTER_BOOLEAN) === true) {
$installOk = true;
@ -206,9 +206,9 @@ class plugin extends common {
// Message de retour
$this->removeDir(self::TEMP_DIR . $tempFolder);
$zip->close();
return([
return ([
'success' => false,
'notification'=> 'La version installée est plus récente.'
'notification' => 'La version installée est plus récente.'
]);
}
}
@ -218,23 +218,24 @@ class plugin extends common {
if ($installOk) {
// Copie récursive des dossiers
foreach ($module['dirs'] as $src => $dest) {
if (!is_dir (self::TEMP_DIR . $tempFolder . $src)) {
if (!is_dir(self::TEMP_DIR . $tempFolder . $src)) {
mkdir(self::TEMP_DIR . $tempFolder . $src);
}
$success = $this->copyDir( self::TEMP_DIR . $tempFolder . $src, $dest );
$success = $this->copyDir(self::TEMP_DIR . $tempFolder . $src, $dest);
}
// Message de retour
$t = isset($versionInstalled) ? ' actualisé' : 'installé';
$this->removeDir(self::TEMP_DIR . $tempFolder);
$zip->close();
return(['success' => $success,
'notification'=> $success ? 'Le module '.$module['name'].' a été ' . $t
: 'Erreur inconnue, le module n\'est pas installé'
return ([
'success' => $success,
'notification' => $success ? 'Le module ' . $module['name'] . ' a été ' . $t
: 'Erreur inconnue, le module n\'est pas installé'
]);
} else {
return([
return ([
'success' => false,
'notification'=> 'Une erreur inconnue s\est produite !'
'notification' => 'Une erreur inconnue s\est produite !'
]);
// Supprimer le dossier temporaire
$this->removeDir(self::TEMP_DIR . $tempFolder);
@ -242,28 +243,29 @@ class plugin extends common {
}
} else {
// Message de retour
return(['success' => $success,
'notification'=> 'Impossible d\'ouvrir l\'archive'
return ([
'success' => false,
'notification' => 'Impossible d\'ouvrir l\'archive'
]);
}
}
/***
* Installation d'un module à partir du gestionnaire de fichier
*/
public function upload() {
public function upload()
{
// Soumission du formulaire
if($this->isPost()) {
if ($this->isPost()) {
// Installation d'un module
$checkValidMaj = $this->getInput('configModulesCheck', helper::FILTER_BOOLEAN);
$zipFilename = $this->getInput('configModulesInstallation', helper::FILTER_STRING_SHORT);
if( $zipFilename !== ''){
if ($zipFilename !== '') {
$success = [
'success' => false,
'notification'=> ''
'notification' => ''
];
$state = $this->install(self::FILE_DIR.'source/'.$zipFilename, $checkValidMaj);
$state = $this->install(self::FILE_DIR . 'source/' . $zipFilename, $checkValidMaj);
}
$this->addOutput([
'redirect' => helper::baseUrl() . 'plugin',
@ -281,7 +283,8 @@ class plugin extends common {
/***
* Installation d'un module depuis le catalogue
*/
public function uploadItem() {
public function uploadItem()
{
// Jeton incorrect
if ($this->getUrl(3) !== $_SESSION['csrf']) {
// Valeurs en sortie
@ -300,17 +303,17 @@ class plugin extends common {
// Télécharger le fichier
$moduleData = helper::getUrlContents(self::BASEURL_STORE . self::FILE_DIR . 'source/' . $moduleFilePath);
// Extraire de l'arborescence
$d = explode('/',$moduleFilePath);
$moduleFile = $d[count($d)-1];
$d = explode('/', $moduleFilePath);
$moduleFile = $d[count($d) - 1];
// Créer le dossier modules
if (!is_dir(self::FILE_DIR . 'source/modules')) {
mkdir (self::FILE_DIR . 'source/modules', 0755);
mkdir(self::FILE_DIR . 'source/modules', 0755);
}
// Sauver les données du fichiers
file_put_contents(self::FILE_DIR . 'source/modules/' . $moduleFile, $moduleData);
// Installation directe
if ( file_exists(self::FILE_DIR . 'source/modules/' . $moduleFile) ) {
if (file_exists(self::FILE_DIR . 'source/modules/' . $moduleFile)) {
$r = $this->install(self::FILE_DIR . 'source/modules/' . $moduleFile, false);
} else {
$r['notification'] = 'Un problème est survenu, le module n\'est pas installé';
@ -333,48 +336,49 @@ class plugin extends common {
/**
* Catalogue des modules sur le site ZwiiCMS.fr
*/
public function store() {
public function store()
{
$store = json_decode(helper::getUrlContents(self::BASEURL_STORE . self::MODULE_STORE . 'list'), true);
if ($store) {
// Modules installés
$infoModules = helper::getModules();
// Clés moduleIds dans les pages
$inPages = helper::arrayColumn($this->getData(['page']),'moduleId', 'SORT_DESC');
foreach( $inPages as $key=>$value){
$pagesInfos[ $this->getData(['page', $key, 'title' ]) ] = $value;
$inPages = helper::arrayColumn($this->getData(['page']), 'moduleId', 'SORT_DESC');
foreach ($inPages as $key => $value) {
$pagesInfos[$this->getData(['page', $key, 'title'])] = $value;
}
// Parcourir les données des modules
foreach ($store as $key=>$value) {
foreach ($store as $key => $value) {
// Module non installé
$ico = template::ico('download');
$class = '';
$help = 'Télécharger le module dans le gestionnaire de fichiers';
// Le module est installé
if (array_key_exists($key,$infoModules) === true) {
if (array_key_exists($key, $infoModules) === true) {
$class = 'buttonGreen';
$ico = template::ico('update');
$help = 'Mettre à jour le module orphelin';
}
// Le module est installé et utilisé
if (in_array($key,$inPages) === true) {
if (in_array($key, $inPages) === true) {
$class = 'buttonRed';
$ico = template::ico('update');
$help = 'Mettre à jour le module attaché, une sauvegarde des données de module est recommandée !';
}
self::$storeList [] = [
self::$storeList[] = [
$store[$key]['category'],
'<a href="' . self::BASEURL_STORE . self::MODULE_STORE . $key . '" target="_blank" >'.$store[$key]['title'].'</a>',
'<a href="' . self::BASEURL_STORE . self::MODULE_STORE . $key . '" target="_blank" >' . $store[$key]['title'] . '</a>',
$store[$key]['version'],
mb_detect_encoding(strftime('%d %B %Y', $store[$key]['versionDate']), 'UTF-8', true)
? strftime('%d %B %Y', $store[$key]['versionDate'])
: utf8_encode(strftime('%d %B %Y', $store[$key]['versionDate'])),
implode(', ', array_keys($pagesInfos,$key)),
? strftime('%d %B %Y', $store[$key]['versionDate'])
: utf8_encode(strftime('%d %B %Y', $store[$key]['versionDate'])),
implode(', ', array_keys($pagesInfos, $key)),
template::button('moduleExport' . $key, [
'class' => $class,
'href' => helper::baseUrl(). $this->getUrl(0) . '/uploadItem/' . $key.'/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre
'value' => $ico,
'help' => $help
])
'class' => $class,
'href' => helper::baseUrl() . $this->getUrl(0) . '/uploadItem/' . $key . '/' . $_SESSION['csrf'], // appel de fonction vaut exécution, utiliser un paramètre
'value' => $ico,
'help' => $help
])
];
}
}
@ -389,15 +393,16 @@ class plugin extends common {
/**
* Détail d'un objet du catalogue
*/
public function item() {
public function item()
{
$store = json_decode(helper::getUrlContents(self::BASEURL_STORE . self::MODULE_STORE . 'list'), true);
self::$storeItem = $store [$this->getUrl(2)] ;
self::$storeItem ['fileDate'] = mb_detect_encoding(strftime('%d %B %Y',self::$storeItem ['fileDate']), 'UTF-8', true)
? strftime('%d %B %Y', self::$storeItem ['fileDate'])
: utf8_encode(strftime('%d %B %Y', self::$storeItem ['fileDate']));
self::$storeItem = $store[$this->getUrl(2)];
self::$storeItem['fileDate'] = mb_detect_encoding(strftime('%d %B %Y', self::$storeItem['fileDate']), 'UTF-8', true)
? strftime('%d %B %Y', self::$storeItem['fileDate'])
: utf8_encode(strftime('%d %B %Y', self::$storeItem['fileDate']));
// Valeurs en sortie
$this->addOutput([
'title' =>'Module ' . self::$storeItem['title'],
'title' => 'Module ' . self::$storeItem['title'],
'view' => 'item'
]);
}
@ -405,12 +410,15 @@ class plugin extends common {
/**
* Gestion des modules
*/
public function index() {
public function index()
{
// Tableau des langues rédigées
foreach (self::$languages as $key => $value) {
if ($this->getData(['config','i18n', $key]) === 'site' ||
$key === 'fr_FR') {
if (
$this->getData(['config', 'i18n', $key]) === 'site' ||
$key === 'fr_FR'
) {
$i18nSites[$key] = $value;
}
}
@ -418,35 +426,34 @@ class plugin extends common {
$infoModules = helper::getModules();
// Parcourir les langues du site traduit et recherche les modules affectés à des pages
foreach ($i18nSites as $keyi18n=>$valuei18n) {
foreach ($i18nSites as $keyi18n => $valuei18n) {
// Clés moduleIds dans les pages de la langue
$pages = json_decode(file_get_contents(self::DATA_DIR . $keyi18n . '/' . 'page.json'), true);
// Extraire les clés des modules
$pagesModules [$keyi18n] = array_filter(helper::arrayColumn($pages['page'],'moduleId', 'SORT_DESC'), 'strlen');
$pagesModules[$keyi18n] = array_filter(helper::arrayColumn($pages['page'], 'moduleId', 'SORT_DESC'), 'strlen');
// Générer ls liste des pages avec module pour la sauvegarde ou le backup
foreach( $pagesModules [$keyi18n] as $key=>$value ) {
foreach ($pagesModules[$keyi18n] as $key => $value) {
if (!empty($value)) {
$pagesInfos [$keyi18n] [$key] ['pageId'] = $key ;
$pagesInfos [$keyi18n] [$key] ['title'] = $this->getData(['page', $key, 'title' ]) ;
$pagesInfos [$keyi18n] [$key] ['moduleId'] = $value;
$pagesInfos[$keyi18n][$key]['pageId'] = $key;
$pagesInfos[$keyi18n][$key]['title'] = $this->getData(['page', $key, 'title']);
$pagesInfos[$keyi18n][$key]['moduleId'] = $value;
}
}
}
// Recherche des modules orphelins dans toutes les langues
$orphans = $installed = array_flip(array_keys ($infoModules));
foreach ($i18nSites as $keyi18n=>$valuei18n) {
$orphans = $installed = array_flip(array_keys($infoModules));
foreach ($i18nSites as $keyi18n => $valuei18n) {
// Générer la liste des modules orphelins
foreach ($infoModules as $key=>$value) {
foreach ($infoModules as $key => $value) {
// Supprimer les éléments affectés
if (array_search($key, $pagesModules[$keyi18n]) ) {
unset($orphans [$key]);
if (array_search($key, $pagesModules[$keyi18n])) {
unset($orphans[$key]);
}
}
}
$orphans = array_flip($orphans);
@ -455,18 +462,18 @@ class plugin extends common {
if (isset($orphans)) {
foreach ($orphans as $key) {
// Construire le tableau de sortie
self::$modulesOrphan [] = [
$infoModules [$key] ['realName'],
self::$modulesOrphan[] = [
$infoModules[$key]['realName'],
$key,
$infoModules [$key] ['version'],
$infoModules[$key]['version'],
'',
$infoModules[$key] ['delete'] === true
$infoModules[$key]['delete'] === true
? template::button('moduleDelete' . $key, [
'class' => 'moduleDelete buttonRed',
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' .$key . '/' . $_SESSION['csrf'],
'value' => template::ico('trash'),
'help' => 'Supprimer le module'
])
'class' => 'moduleDelete buttonRed',
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $key . '/' . $_SESSION['csrf'],
'value' => template::ico('trash'),
'help' => 'Supprimer le module'
])
: '',
];
@ -478,18 +485,18 @@ class plugin extends common {
if (isset($installed)) {
foreach (array_flip($installed) as $key) {
// Construire le tableau de sortie
self::$modulesInstalled [] = [
$infoModules [$key] ['realName'],
self::$modulesInstalled[] = [
$infoModules[$key]['realName'],
$key,
$infoModules [$key] ['version'],
$infoModules[$key]['version'],
'',
template::button('moduleSave' . $key, [
'href' => helper::baseUrl() . $this->getUrl(0) . '/save/filemanager/' .$key . '/' . $_SESSION['csrf'],
'href' => helper::baseUrl() . $this->getUrl(0) . '/save/filemanager/' . $key . '/' . $_SESSION['csrf'],
'value' => template::ico('download-cloud'),
'help' => 'Sauvegarder le module dans le gestionnaire de fichiers'
]),
template::button('moduleDownload' . $key, [
'href' => helper::baseUrl() . $this->getUrl(0) . '/save/download/' .$key . '/' . $_SESSION['csrf'],
'href' => helper::baseUrl() . $this->getUrl(0) . '/save/download/' . $key . '/' . $_SESSION['csrf'],
'value' => template::ico('download'),
'help' => 'Sauvegarder et télécharger le module'
])
@ -503,30 +510,30 @@ class plugin extends common {
// Avec les commandes de sauvegarde et de restauration
$keyi18n = self::$i18nContent;
if (isset($pagesInfos) &&
is_array($pagesInfos[self::$i18nContent]) )
{
foreach ($pagesInfos[self::$i18nContent] as $keyPage=>$value) {
if (isset($infoModules[$pagesInfos[$keyi18n][$keyPage]['moduleId']]))
{
if (
isset($pagesInfos) &&
is_array($pagesInfos[self::$i18nContent])
) {
foreach ($pagesInfos[self::$i18nContent] as $keyPage => $value) {
if (isset($infoModules[$pagesInfos[$keyi18n][$keyPage]['moduleId']])) {
// Co[nstruire le tableau de sortie
self::$modulesData[] = [
$infoModules[$pagesInfos[$keyi18n][$keyPage]['moduleId']] ['realName'],
$infoModules[$pagesInfos[$keyi18n][$keyPage]['moduleId']]['realName'],
$pagesInfos[$keyi18n][$keyPage]['moduleId'],
$infoModules[$pagesInfos [$keyi18n][$keyPage]['moduleId']] ['version'],
$infoModules[$pagesInfos[$keyi18n][$keyPage]['moduleId']]['version'],
//template::flag($keyi18n, '20px'),
'<a href ="' . helper::baseUrl() . $keyPage . '" target="_blank">' . $pagesInfos [$keyi18n][$keyPage]['title'] . ' (' .$keyPage . ')</a>',
'<a href ="' . helper::baseUrl() . $keyPage . '" target="_blank">' . $pagesInfos[$keyi18n][$keyPage]['title'] . ' (' . $keyPage . ')</a>',
template::button('dataExport' . $keyPage, [
'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre
'value' => template::ico('download'),
'help' => 'Exporter les données du module'
'href' => helper::baseUrl() . $this->getUrl(0) . '/dataExport/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'], // appel de fonction vaut exécution, utiliser un paramètre
'value' => template::ico('download'),
'help' => 'Exporter les données du module'
]),
template::button('dataDelete' . $keyPage, [
'href' => helper::baseUrl(). $this->getUrl(0) . '/dataDelete/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre
'value' => template::ico('trash'),
'class' => 'buttonRed dataDelete',
'help' => 'Détacher le module de la page',
])
'href' => helper::baseUrl() . $this->getUrl(0) . '/dataDelete/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'], // appel de fonction vaut exécution, utiliser un paramètre
'value' => template::ico('trash'),
'class' => 'buttonRed dataDelete',
'help' => 'Détacher le module de la page',
])
];
} else {
self::$modulesData[] = [];
@ -548,7 +555,8 @@ class plugin extends common {
* Sauvegarde un module sans les données
*/
public function save() {
public function save()
{
// Jeton incorrect
if ($this->getUrl(4) !== $_SESSION['csrf']) {
// Valeurs en sortie
@ -567,14 +575,14 @@ class plugin extends common {
//Nom de l'archive
$fileName = $this->getUrl(3) . '.zip';
$this->makeZip ($tmpFolder . '/' . $fileName, self::MODULE_DIR . $this->getUrl(3));
$this->makeZip($tmpFolder . '/' . $fileName, self::MODULE_DIR . $this->getUrl(3));
switch ($this->getUrl(2)) {
case 'filemanager':
if (!file_exists(self::FILE_DIR . 'source/modules')) {
mkdir(self::FILE_DIR . 'source/modules');
}
$success = copy($tmpFolder . '/' . $fileName , self::FILE_DIR . 'source/modules/' . $this->getUrl(3) . '.zip' );
$success = copy($tmpFolder . '/' . $fileName, self::FILE_DIR . 'source/modules/' . $this->getUrl(3) . '.zip');
// Valeurs en sortie
$this->addOutput([
@ -590,7 +598,7 @@ class plugin extends common {
header('Content-Length: ' . filesize($tmpFolder . '/' . $fileName));
ob_clean();
ob_end_flush();
readfile( $tmpFolder . '/' .$fileName);
readfile($tmpFolder . '/' . $fileName);
exit();
break;
}
@ -598,7 +606,7 @@ class plugin extends common {
unlink($tmpFolder . '/' . $fileName);
$this->removeDir($tmpFolder);
}
}
}
/*
@ -608,7 +616,8 @@ class plugin extends common {
* 4 : pageId
* 5 : CSRF
*/
public function dataDelete() {
public function dataDelete()
{
// Jeton incorrect
if ($this->getUrl(5) !== $_SESSION['csrf']) {
// Valeurs en sortie
@ -623,12 +632,10 @@ class plugin extends common {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'plugin',
'notification' => 'Le module ' . $this->getUrl(3) . ' de la page '. $this->getUrl(4) . ' a été supprimé.',
'notification' => 'Le module ' . $this->getUrl(3) . ' de la page ' . $this->getUrl(4) . ' a été supprimé.',
'state' => true
]);
}
}
@ -640,7 +647,8 @@ class plugin extends common {
* 4 : pageId
* 5 : CSRF
*/
public function dataExport() {
public function dataExport()
{
// Jeton incorrect
if ($this->getUrl(5) !== $_SESSION['csrf']) {
// Valeurs en sortie
@ -659,26 +667,25 @@ class plugin extends common {
// Copie des infos sur le module
$modulesData = json_decode(file_get_contents(self::DATA_DIR . $this->getUrl(2) . '/module.json' ), true);
$moduleData = $modulesData['module'] [$this->getUrl(4)];
$success = file_put_contents ($tmpFolder . '/module.json', json_encode($moduleData));
$modulesData = json_decode(file_get_contents(self::DATA_DIR . $this->getUrl(2) . '/module.json'), true);
$moduleData = $modulesData['module'][$this->getUrl(4)];
$success = file_put_contents($tmpFolder . '/module.json', json_encode($moduleData));
// Le dossier du module s'il existe
if (is_dir(self::DATA_DIR . $this->getUrl(3) . '/' . $this->getUrl(4) ) ) {
if (is_dir(self::DATA_DIR . $this->getUrl(3) . '/' . $this->getUrl(4))) {
// Copier le dossier des données
$success .= $this->copyDir(self::DATA_DIR . $this->getUrl(3) . '/' . $this->getUrl(4), $tmpFolder);
}
// Descripteur de l'archive
$infoModule = helper::getModules();
$success .= file_put_contents ($tmpFolder . '/descripteur.json', json_encode( [$this->getUrl(3) => $infoModule [$this->getUrl(3)]] ));
$success .= file_put_contents($tmpFolder . '/descripteur.json', json_encode([$this->getUrl(3) => $infoModule[$this->getUrl(3)]]));
// création du zip
if ($success)
{
if ($success) {
$fileName = $this->getUrl(2) . '-' . $this->getUrl(3) . '-' . $this->getUrl(4) . '.zip';
$this->makeZip ($fileName, $tmpFolder);
$this->makeZip($fileName, $tmpFolder);
if (file_exists($fileName)) {
ob_start();
header('Content-Type: application/octet-stream');
@ -686,7 +693,7 @@ class plugin extends common {
header('Content-Length: ' . filesize($fileName));
ob_clean();
ob_end_flush();
readfile( $fileName);
readfile($fileName);
unlink($fileName);
$this->removeDir($tmpFolder);
exit();
@ -705,31 +712,32 @@ class plugin extends common {
/*
* Importer des données d'un module externes ou interne à module.json
*/
public function dataImport(){
public function dataImport()
{
// Soumission du formulaire d'importation du module dans une page libre
if($this->isPost()) {
if ($this->isPost()) {
// Récupérer le fichier et le décompacter
$zipFilename = $this->getInput('pluginImportFile', helper::FILTER_STRING_SHORT, true);
$targetPage = $this->getInput('pluginImportPage', helper::FILTER_STRING_SHORT, true);
$tempFolder = uniqid();
// Extraction dans un dossier temporaire
mkdir (self::TEMP_DIR . $tempFolder, 0755);
mkdir(self::TEMP_DIR . $tempFolder, 0755);
$zip = new ZipArchive();
if ($zip->open(self::FILE_DIR . 'source/' . $zipFilename) === TRUE) {
$zip->extractTo(self::TEMP_DIR . $tempFolder );
$zip->extractTo(self::TEMP_DIR . $tempFolder);
}
// Lire le descripteur
$descripteur = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . '/descripteur.json'), true);
// Lecture des données du module
$moduleData = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . '/module.json'), true );
$moduleData = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . '/module.json'), true);
// Chargement des données du module importé
$this->setData(['module', $targetPage, $moduleData ]);
$this->setData(['module', $targetPage, $moduleData]);
// Intégration des données du module importé dans la page
$this->setData(['page', $targetPage ,'moduleId', array_key_first($descripteur) ]);
$this->setData(['page', $targetPage, 'moduleId', array_key_first($descripteur)]);
// Supprimer le dossier temporaire
$this->removeDir(self::TEMP_DIR . $tempFolder);
@ -745,16 +753,16 @@ class plugin extends common {
]);
}
// Bouton d'importation des données d'un module spécifique
if (count(explode('/',$this->getUrl())) === 6) {
// Jeton incorrect
if ($this->getUrl(3) !== $_SESSION['csrf']) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'plugin',
'state' => false,
'notification' => 'Action non autorisée'
]);
}
if (count(explode('/', $this->getUrl())) === 6) {
// Jeton incorrect
if ($this->getUrl(3) !== $_SESSION['csrf']) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'plugin',
'state' => false,
'notification' => 'Action non autorisée'
]);
}
// Traitement
@ -772,10 +780,11 @@ class plugin extends common {
* et ne sont pas des barres latérales
*/
self::$pagesList = $this->getHierarchy(null, null, null);
foreach(self::$pagesList as $page => $pageId) {
if ($this->getData(['page',$page,'block']) === 'bar' ||
foreach (self::$pagesList as $page => $pageId) {
if (
$this->getData(['page', $page, 'block']) === 'bar' ||
//$this->getData(['page',$page,'disable']) === true ||
$this->getData(['page',$page,'moduleId']) !== ''
$this->getData(['page', $page, 'moduleId']) !== ''
) {
unset(self::$pagesList[$page]);
}
@ -788,7 +797,4 @@ class plugin extends common {
'view' => 'dataImport'
]);
}
}

View File

@ -4,7 +4,7 @@
<?php echo template::button('pluginImportBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'plugin',
'value' => template::ico('left')
'value' => template::ico('left')
]); ?>
</div>
<div class="col2 offset9">
@ -22,14 +22,14 @@
<div class="row">
<div class="col6">
<?php echo template::file('pluginImportFile', [
'label' => 'Archive ZIP :',
'type' => 2
'label' => 'Archive ZIP :',
'type' => 2
]); ?>
</div>
<div class="col6">
<?php echo template::select('pluginImportPage', $module::$pagesList, [
'label' => 'Importer le module dans la page ' . template::flag('selected', '20px')
]); ?>
'label' => 'Importer le module dans la page ' . template::flag('selected', '20px')
]); ?>
</div>
</div>
</div>

View File

@ -41,63 +41,63 @@
]); ?>
</div>
<div class="tabContent" id="moduleContainer">
<?php if($module::$modulesInstalled): ?>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Sauvegarde'); ?>
</h4>
<?php echo template::table([2, 2, 1, 5, 1, 1], $module::$modulesInstalled, [ 'Module', 'Identifiant', 'Version', '', '', '']); ?>
<?php if ($module::$modulesInstalled) : ?>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Sauvegarde'); ?>
</h4>
<?php echo template::table([2, 2, 1, 5, 1, 1], $module::$modulesInstalled, ['Module', 'Identifiant', 'Version', '', '', '']); ?>
</div>
</div>
</div>
</div>
<?php else: ?>
<?php echo template::speech('Aucun module installé.'); ?>
<?php else : ?>
<?php echo template::speech('Aucun module installé.'); ?>
<?php endif; ?>
<?php if($module::$modulesOrphan): ?>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Modules orphelins'); ?>
</h4>
<?php echo template::table([2, 2, 1, 6, 1], $module::$modulesOrphan, [ 'Module', 'Identifiant', 'Version', '', '']); ?>
<?php if ($module::$modulesOrphan) : ?>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Modules orphelins'); ?>
</h4>
<?php echo template::table([2, 2, 1, 6, 1], $module::$modulesOrphan, ['Module', 'Identifiant', 'Version', '', '']); ?>
</div>
</div>
</div>
</div>
<?php else: ?>
<?php echo template::speech('Aucun module orphelin.'); ?>
<?php else : ?>
<?php echo template::speech('Aucun module orphelin.'); ?>
<?php endif; ?>
</div>
<div class="tabContent displayNone" id="dataContainer">
<?php if($module::$modulesData): ?>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Modules configurés'); ?>
&nbsp;
<?php echo template::flag( self::$i18nContent, '20px'); ?>
</h4>
<div class="row">
<div class="col1 offset11">
<?php echo template::button('configModuledataImport', [
'href' => helper::baseUrl() . 'plugin/dataImport',
'value' => template::ico('upload'),
"help" => 'Importer des données de module dans une page libre'
]); ?>
<?php if ($module::$modulesData) : ?>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Modules configurés'); ?>
&nbsp;
<?php echo template::flag(self::$i18nContent, '20px'); ?>
</h4>
<div class="row">
<div class="col1 offset11">
<?php echo template::button('configModuledataImport', [
'href' => helper::baseUrl() . 'plugin/dataImport',
'value' => template::ico('upload'),
"help" => 'Importer des données de module dans une page libre'
]); ?>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::table([2, 2, 1, 5, 1, 1], $module::$modulesData, [ 'Module', 'Identifiant', 'Version', 'Page', '', '']); ?>
<div class="row">
<div class="col12">
<?php echo template::table([2, 2, 1, 5, 1, 1], $module::$modulesData, ['Module', 'Identifiant', 'Version', 'Page', '', '']); ?>
</div>
</div>
</div>
</div>
</div>
</div>
<?php else: ?>
<?php echo template::speech('Aucune donnée de module.'); ?>
<?php else : ?>
<?php echo template::speech('Aucune donnée de module.'); ?>
<?php endif; ?>
</div>

View File

@ -1,15 +1,15 @@
<div class="row">
<div class="col9">
<div class="row">
<div class="col12">
<?php echo $module::$storeItem['content']; ?>
</div>
</div>
</div>
<div class="col9">
<div class="row">
<div class="col12">
<?php echo $module::$storeItem['content']; ?>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<?php
echo '<img class="downloadItemPicture" src="' . $module::BASEURL_STORE . 'site/file/source/' . $module::$storeItem['picture'] .
echo '<img class="downloadItemPicture" src="' . $module::BASEURL_STORE . 'site/file/source/' . $module::$storeItem['picture'] .
'" alt="' . $module::$storeItem['picture'] . '">';
?>
</div>

View File

@ -7,8 +7,8 @@
]); ?>
</div>
</div>
<?php if($module::$storeList): ?>
<?php if ($module::$storeList) : ?>
<?php echo template::table([2, 2, 1, 2, 2, 1], $module::$storeList, ['Catégorie', 'Module', 'Version', 'Date', 'Page', '']); ?>
<?php else: ?>
<?php else : ?>
<?php echo template::speech('Le catalogue est vide.'); ?>
<?php endif; ?>

View File

@ -1,51 +1,51 @@
<?php echo template::formOpen('configModulesUpload'); ?>
<div class="row">
<div class="col1">
<?php echo template::button('configModulesBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'plugin',
'value' => template::ico('left')
]); ?>
</div>
<div class="col1">
<?php /**echo template::button('pluginIndexHelp', [
<div class="row">
<div class="col1">
<?php echo template::button('configModulesBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'plugin',
'value' => template::ico('left')
]); ?>
</div>
<div class="col1">
<?php /**echo template::button('pluginIndexHelp', [
'href' => 'https://doc.zwiicms.fr/installation-d-un-module',
'target' => '_blank',
'class' => 'buttonHelp',
'value' => template::ico('help'),
'help' => 'Consulter l\'aide en ligne'
]);*/ ?>
</div>
<div class="col2 offset8">
<?php echo template::submit('configModulesSubmit',[
'value' => 'Valider',
'ico' => 'check'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Installer ou mettre à jour un module téléchargé'); ?>
</h4>
<div class="row">
<div class="col6 offset3">
<?php echo template::file('configModulesInstallation', [
'label' => 'Archive ZIP :',
'type' => 2
]); ?>
</div>
</div>
<div class="row">
<div class="col4 offset3">
<?php echo template::checkbox('configModulesCheck', true, 'Mise à jour forcée', [
'checked' => false,
'help' => 'Permet de forcer une mise à jour même si la version du module est inférieure ou égale à celle du module installé.',
]); ?>
</div>
</div>
</div>
</div>
</div>
<div class="col2 offset8">
<?php echo template::submit('configModulesSubmit', [
'value' => 'Valider',
'ico' => 'check'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Installer ou mettre à jour un module téléchargé'); ?>
</h4>
<div class="row">
<div class="col6 offset3">
<?php echo template::file('configModulesInstallation', [
'label' => 'Archive ZIP :',
'type' => 2
]); ?>
</div>
</div>
<div class="row">
<div class="col4 offset3">
<?php echo template::checkbox('configModulesCheck', true, 'Mise à jour forcée', [
'checked' => false,
'help' => 'Permet de forcer une mise à jour même si la version du module est inférieure ou égale à celle du module installé.',
]); ?>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -19,7 +19,7 @@ class sitemap extends common
'index' => self::GROUP_VISITOR
];
public static $siteMap = '';
public static $siteMap = '';
/**
* Plan du site
@ -29,21 +29,61 @@ class sitemap extends common
$items = '<ul>';
foreach ($this->getHierarchy(null, true, null) as $parentId => $childIds) {
$items .= ' <li>';
if ($this->getData(['page', $parentId, 'disable']) === false && $this->getUser('group') >= $this->getData(['page', $parentId, 'group'])) {
$pageUrl = ($parentId !== $this->getData(['locale', 'homePageId'])) ? helper::baseUrl() . $parentId : helper::baseUrl(false);
$items .= '<a href="' . $pageUrl .'">' .$this->getData(['page', $parentId, 'title']) . '</a>';
if ($this->getData(['page', $parentId, 'disable']) === false && $this->getUser('group') >= $this->getData(['page', $parentId, 'group'])) {
$pageUrl = ($parentId !== $this->getData(['locale', 'homePageId'])) ? helper::baseUrl() . $parentId : helper::baseUrl(false);
$items .= '<a href="' . $pageUrl . '">' . $this->getData(['page', $parentId, 'title']) . '</a>';
} else {
// page désactivée
$items .= $this->getData(['page', $parentId, 'title']);
}
// ou articles d'un blog
if (
$this->getData(['page', $parentId, 'moduleId']) === 'blog' &&
!empty($this->getData(['module', $parentId, 'posts']))
) {
$items .= '<ul>';
// Ids des articles par ordre de publication
$articleIdsPublishedOns = helper::arrayColumn($this->getData(['module', $parentId, 'posts']), 'publishedOn', 'SORT_DESC');
$articleIdsStates = helper::arrayColumn($this->getData(['module', $parentId, 'posts']), 'state', 'SORT_DESC');
$articleIds = [];
foreach ($articleIdsPublishedOns as $articleId => $articlePublishedOn) {
if ($articlePublishedOn <= time() and $articleIdsStates[$articleId]) {
$articleIds[] = $articleId;
}
}
foreach ($articleIds as $articleId => $article) {
if ($this->getData(['module', $parentId, 'posts', $article, 'state']) === true) {
$items .= ' <li>';
$items .= '<a href="' . helper::baseUrl() . $parentId . '/' . $article . '">' . $this->getData(['module', $parentId, 'posts', $article, 'title']) . '</a>';
$items .= '</li>';
}
}
$items .= '</ul>';
}
foreach ($childIds as $childId) {
$items .= '<ul>';
// Sous-page
$items .= ' <li>';
if ($this->getData(['page', $childId, 'disable']) === false && $this->getUser('group') >= $this->getData(['page', $parentId, 'group'])) {
$pageUrl = ($childId !== $this->getData(['locale', 'homePageId'])) ? helper::baseUrl() . $childId : helper::baseUrl(false);
$items .= '<a href="' . $pageUrl . '">' . $this->getData(['page', $childId, 'title']) . '</a>';
} else {
// page désactivée
$items .= $this->getData(['page', $parentId, 'title']);
$items .= $this->getData(['page', $childId, 'title']);
}
// ou articles d'un blog
$items .= '</li>';
if ($this->getData(['page', $parentId, 'moduleId']) === 'blog' &&
!empty($this->getData(['module',$parentId, 'posts' ]))) {
// Articles d'une sous-page blog
if (
$this->getData(['page', $childId, 'moduleId']) === 'blog' &&
!empty($this->getData(['module', $childId, 'posts']))
) {
$items .= '<ul>';
// Ids des articles par ordre de publication
$articleIdsPublishedOns = helper::arrayColumn($this->getData(['module', $parentId,'posts']), 'publishedOn', 'SORT_DESC');
$articleIdsStates = helper::arrayColumn($this->getData(['module', $parentId, 'posts']), 'state', 'SORT_DESC');
$articleIdsPublishedOns = helper::arrayColumn($this->getData(['module', $childId, 'posts']), 'publishedOn', 'SORT_DESC');
$articleIdsStates = helper::arrayColumn($this->getData(['module', $childId, 'posts']), 'state', 'SORT_DESC');
$articleIds = [];
foreach ($articleIdsPublishedOns as $articleId => $articlePublishedOn) {
if ($articlePublishedOn <= time() and $articleIdsStates[$articleId]) {
@ -51,57 +91,21 @@ class sitemap extends common
}
}
foreach ($articleIds as $articleId => $article) {
if ($this->getData(['module',$parentId,'posts',$article,'state']) === true) {
if ($this->getData(['module', $childId, 'posts', $article, 'state']) === true) {
$items .= ' <li>';
$items .= '<a href="' . helper::baseUrl() . $parentId. '/' . $article . '">' . $this->getData(['module',$parentId,'posts',$article,'title']) . '</a>';
$items .= '<a href="' . helper::baseUrl() . $childId . '/' . $article . '">' . $this->getData(['module', $childId, 'posts', $article, 'title']) . '</a>';
$items .= '</li>';
}
}
$items .= '</ul>';
}
foreach ($childIds as $childId) {
$items .= '<ul>';
// Sous-page
$items .= ' <li>';
if ($this->getData(['page', $childId, 'disable']) === false && $this->getUser('group') >= $this->getData(['page', $parentId, 'group'])) {
$pageUrl = ($childId !== $this->getData(['locale', 'homePageId'])) ? helper::baseUrl() . $childId : helper::baseUrl(false) ;
$items .= '<a href="' . $pageUrl . '">' . $this->getData(['page', $childId, 'title']) . '</a>';
} else {
// page désactivée
$items .= $this->getData(['page', $childId, 'title']);
}
$items .= '</li>';
// Articles d'une sous-page blog
if ($this->getData(['page', $childId, 'moduleId']) === 'blog' &&
!empty($this->getData(['module', $childId, 'posts' ]))) {
$items .= '<ul>';
// Ids des articles par ordre de publication
$articleIdsPublishedOns = helper::arrayColumn($this->getData(['module', $childId,'posts']), 'publishedOn', 'SORT_DESC');
$articleIdsStates = helper::arrayColumn($this->getData(['module', $childId, 'posts']), 'state', 'SORT_DESC');
$articleIds = [];
foreach ($articleIdsPublishedOns as $articleId => $articlePublishedOn) {
if ($articlePublishedOn <= time() and $articleIdsStates[$articleId]) {
$articleIds[] = $articleId;
}
}
foreach ($articleIds as $articleId => $article) {
if ($this->getData(['module',$childId,'posts',$article,'state']) === true) {
$items .= ' <li>';
$items .= '<a href="' . helper::baseUrl() . $childId . '/' . $article . '">' . $this->getData(['module',$childId,'posts',$article,'title']) . '</a>';
$items .= '</li>';
}
}
$items .= '</ul>';
}
$items .= '</ul>';
}
$items .= '</ul>';
}
$items .= '</li>';
}
// Fin du grand bloc
$items .= '</ul>';
self::$siteMap = $items;
self::$siteMap = $items;
// Valeurs en sortie
$this->addOutput([

View File

@ -1,4 +1,4 @@
<?php
echo "<div id='siteMap'>";
echo $module::$siteMap;
echo "</div>";
echo "<div id='siteMap'>";
echo $module::$siteMap;
echo "</div>";

View File

@ -14,7 +14,8 @@
* @copyright Copyright (C) 2018-2022, Frédéric Tempez
*/
class theme extends common {
class theme extends common
{
public static $actions = [
'advanced' => self::GROUP_ADMIN,
@ -51,21 +52,25 @@ class theme extends common {
public static $footerblocks = [
1 => [
'hide' => 'Masqué',
'center' => 'Affiché' ],
'center' => 'Affiché'
],
2 => [
'hide' => 'Masqué',
'left' => 'À gauche',
'right' => 'À droite' ],
'right' => 'À droite'
],
3 => [
'hide' => 'Masqué',
'left' => 'À gauche',
'center' => 'Au centre',
'right' => 'À droite' ],
'right' => 'À droite'
],
4 => [
'hide' => 'Masqué',
'left' => 'En haut',
'center' => 'Au milieu',
'right' => 'En bas' ]
'right' => 'En bas'
]
];
public static $fontWeights = [
@ -232,7 +237,7 @@ class theme extends common {
// Variable pour construire la liste des pages du site
public static $pagesList = [];
// Variable pour construire la liste des fontes installées
public static $fontsNames= [];
public static $fontsNames = [];
public static $fonts = [];
// Variable pour détailler les fontes installées
public static $fontsDetail = [];
@ -240,9 +245,10 @@ class theme extends common {
/**
* Thème des écrans d'administration
*/
public function admin() {
public function admin()
{
// Soumission du formulaire
if($this->isPost()) {
if ($this->isPost()) {
$this->setData(['admin', [
'backgroundColor' => $this->getInput('adminBackgroundColor'),
'colorTitle' => $this->getInput('adminColorTitle'),
@ -251,8 +257,8 @@ class theme extends common {
'backgroundColorButton' => $this->getInput('adminColorButton'),
'backgroundColorButtonGrey' => $this->getInput('adminColorGrey'),
'backgroundColorButtonRed' => $this->getInput('adminColorRed'),
'backgroundColorButtonGreen'=> $this->getInput('adminColorGreen'),
'backgroundColorButtonHelp'=> $this->getInput('adminColorHelp'),
'backgroundColorButtonGreen' => $this->getInput('adminColorGreen'),
'backgroundColorButtonHelp' => $this->getInput('adminColorHelp'),
'fontText' => $this->getInput('adminFontText'),
'fontSize' => $this->getInput('adminFontTextSize'),
'fontTitle' => $this->getInput('adminFontTitle'),
@ -283,11 +289,12 @@ class theme extends common {
/**
* Mode avancé
*/
public function advanced() {
public function advanced()
{
// Soumission du formulaire
if($this->isPost()) {
if ($this->isPost()) {
// Enregistre le CSS
file_put_contents(self::DATA_DIR.'custom.css', $this->getInput('themeAdvancedCss', null));
file_put_contents(self::DATA_DIR . 'custom.css', $this->getInput('themeAdvancedCss', null));
// Valeurs en sortie
$this->addOutput([
'notification' => 'Modifications enregistrées',
@ -308,9 +315,10 @@ class theme extends common {
/**
* Options de l'arrière plan
*/
public function body() {
public function body()
{
// Soumission du formulaire
if($this->isPost()) {
if ($this->isPost()) {
$this->setData(['theme', 'body', [
'backgroundColor' => $this->getInput('themeBodyBackgroundColor'),
'image' => $this->getInput('themeBodyImage'),
@ -341,12 +349,15 @@ class theme extends common {
/**
* Options du pied de page
*/
public function footer() {
public function footer()
{
// Soumission du formulaire
if($this->isPost()) {
if ( $this->getInput('themeFooterCopyrightPosition') === 'hide' &&
$this->getInput('themeFooterSocialsPosition') === 'hide' &&
$this->getInput('themeFooterTextPosition') === 'hide' ) {
if ($this->isPost()) {
if (
$this->getInput('themeFooterCopyrightPosition') === 'hide' &&
$this->getInput('themeFooterSocialsPosition') === 'hide' &&
$this->getInput('themeFooterTextPosition') === 'hide'
) {
// Valeurs en sortie
$this->addOutput([
'notification' => 'Sélectionnez au moins un contenu à afficher',
@ -379,13 +390,13 @@ class theme extends common {
'displayCookie' => $this->getInput('themefooterDisplayCookie', helper::FILTER_BOOLEAN),
'displayLegal' => $this->getInput('themeFooterDisplayLegal', helper::FILTER_BOOLEAN),
'displaySearch' => $this->getInput('themeFooterDisplaySearch', helper::FILTER_BOOLEAN),
'memberBar'=> $this->getInput('themeFooterMemberBar', helper::FILTER_BOOLEAN),
'memberBar' => $this->getInput('themeFooterMemberBar', helper::FILTER_BOOLEAN),
'template' => $this->getInput('themeFooterTemplate')
]]);
// Sauvegarder la configuration localisée
$this->setData(['locale','legalPageId', $this->getInput('configLegalPageId')]);
$this->setData(['locale','searchPageId', $this->getInput('configSearchPageId')]);
$this->setData(['locale', 'legalPageId', $this->getInput('configLegalPageId')]);
$this->setData(['locale', 'searchPageId', $this->getInput('configSearchPageId')]);
// Valeurs en sortie
$this->addOutput([
@ -398,9 +409,11 @@ class theme extends common {
// Liste des pages
self::$pagesList = $this->getData(['page']);
foreach(self::$pagesList as $page => $pageId) {
if ($this->getData(['page',$page,'block']) === 'bar' ||
$this->getData(['page',$page,'disable']) === true) {
foreach (self::$pagesList as $page => $pageId) {
if (
$this->getData(['page', $page, 'block']) === 'bar' ||
$this->getData(['page', $page, 'disable']) === true
) {
unset(self::$pagesList[$page]);
}
}
@ -422,21 +435,22 @@ class theme extends common {
/**
* Options de la bannière
*/
public function header() {
public function header()
{
// Soumission du formulaire
if($this->isPost()) {
if ($this->isPost()) {
// Modification des URL des images dans la bannière perso
$featureContent = $this->getInput('themeHeaderText', null);
/**
* Stocker les images incluses dans la bannière perso dans un tableau
*/
* Stocker les images incluses dans la bannière perso dans un tableau
*/
$files = [];
preg_match_all('/<img[^>]+>/i',$featureContent, $results);
foreach($results[0] as $value) {
preg_match_all('/<img[^>]+>/i', $featureContent, $results);
foreach ($results[0] as $value) {
// Lire le contenu XML
$sx = simplexml_load_string($value);
// Élément à remplacer
$files [] = str_replace('./site/file/source/','',(string) $sx[0]['src']);
$files[] = str_replace('./site/file/source/', '', (string) $sx[0]['src']);
}
// Sauvegarder
@ -456,7 +470,7 @@ class theme extends common {
'textColor' => $this->getInput('themeHeaderTextColor'),
'textHide' => $this->getInput('themeHeaderTextHide', helper::FILTER_BOOLEAN),
'textTransform' => $this->getInput('themeHeaderTextTransform'),
'linkHomePage' => $this->getInput('themeHeaderlinkHomePage',helper::FILTER_BOOLEAN),
'linkHomePage' => $this->getInput('themeHeaderlinkHomePage', helper::FILTER_BOOLEAN),
'imageContainer' => $this->getInput('themeHeaderImageContainer'),
'tinyHidden' => $this->getInput('themeHeaderTinyHidden', helper::FILTER_BOOLEAN),
'feature' => $this->getInput('themeHeaderFeature'),
@ -464,19 +478,18 @@ class theme extends common {
'featureFiles' => $files
]]);
// Modification de la position du menu selon la position de la bannière
if ( $this->getData(['theme','header','position']) == 'site' )
{
$this->setData(['theme', 'menu', 'position',str_replace ('body-','site-',$this->getData(['theme','menu','position']))]);
if ($this->getData(['theme', 'header', 'position']) == 'site') {
$this->setData(['theme', 'menu', 'position', str_replace('body-', 'site-', $this->getData(['theme', 'menu', 'position']))]);
}
if ( $this->getData(['theme','header','position']) == 'body')
{
$this->setData(['theme', 'menu', 'position',str_replace ('site-','body-',$this->getData(['theme','menu','position']))]);
if ($this->getData(['theme', 'header', 'position']) == 'body') {
$this->setData(['theme', 'menu', 'position', str_replace('site-', 'body-', $this->getData(['theme', 'menu', 'position']))]);
}
// Menu accroché à la bannière qui devient cachée
if ( $this->getData(['theme','header','position']) == 'hide' &&
in_array( $this->getData(['theme','menu','position']) , ['body-first', 'site-first', 'body-first' , 'site-second'])
) {
$this->setData(['theme', 'menu', 'position','site']);
if (
$this->getData(['theme', 'header', 'position']) == 'hide' &&
in_array($this->getData(['theme', 'menu', 'position']), ['body-first', 'site-first', 'body-first', 'site-second'])
) {
$this->setData(['theme', 'menu', 'position', 'site']);
}
// Valeurs en sortie
$this->addOutput([
@ -503,7 +516,8 @@ class theme extends common {
/**
* Accueil de la personnalisation
*/
public function index() {
public function index()
{
// Restaurer les fontes utilisateurs
$this->setFonts('user');
@ -518,9 +532,10 @@ class theme extends common {
/**
* Options du menu
*/
public function menu() {
public function menu()
{
// Soumission du formulaire
if($this->isPost()) {
if ($this->isPost()) {
$this->setData(['theme', 'menu', [
'backgroundColor' => $this->getInput('themeMenuBackgroundColor'),
'backgroundColorSub' => $this->getInput('themeMenuBackgroundColorSub'),
@ -569,27 +584,28 @@ class theme extends common {
/**
* Options des fontes
*/
public function fonts() {
public function fonts()
{
// Toutes les fontes installées sont chargées
$this->setFonts('all');
// Polices liées au thème
$used = [
'Bannière' => $this->getData (['theme', 'header', 'font']),
'Menu' => $this->getData (['theme', 'menu', 'font']),
'Titre ' => $this->getData (['theme', 'title', 'font']),
'Texte' => $this->getData (['theme', 'text', 'font']),
'Pied de page' => $this->getData (['theme', 'footer', 'font']),
'Titre (admin)' => $this->getData (['admin', 'fontTitle' ]),
'Admin (texte)' => $this->getData (['admin', 'fontText' ])
'Bannière' => $this->getData(['theme', 'header', 'font']),
'Menu' => $this->getData(['theme', 'menu', 'font']),
'Titre ' => $this->getData(['theme', 'title', 'font']),
'Texte' => $this->getData(['theme', 'text', 'font']),
'Pied de page' => $this->getData(['theme', 'footer', 'font']),
'Titre (admin)' => $this->getData(['admin', 'fontTitle']),
'Admin (texte)' => $this->getData(['admin', 'fontText'])
];
// Récupérer le détail des fontes installées
//$f = $this->getFonts();
$f ['files'] = $this->getData(['fonts', 'files']);
$f ['imported'] = $this->getData(['fonts', 'imported']);
$f ['websafe'] = self::$fontsWebSafe;
$f['files'] = $this->getData(['fonts', 'files']);
$f['imported'] = $this->getData(['fonts', 'imported']);
$f['websafe'] = self::$fontsWebSafe;
// Parcourir les fontes disponibles et construire le tableau pour le formulaire
foreach ($f as $type => $typeValue) {
@ -598,30 +614,30 @@ class theme extends common {
// Fontes utilisées par les thèmes
$fontUsed[$fontId] = '';
foreach ($used as $key => $value) {
if ( $value === $fontId) {
if ($value === $fontId) {
$fontUsed[$fontId] .= $key . '<br/>';
}
}
self::$fontsDetail [] = [
self::$fontsDetail[] = [
$fontId,
'<span style="font-family:' . $f[$type][$fontId]['font-family'] . '">' . $f[$type][$fontId]['name'] . '</span>' ,
'<span style="font-family:' . $f[$type][$fontId]['font-family'] . '">' . $f[$type][$fontId]['name'] . '</span>',
$f[$type][$fontId]['font-family'],
$fontUsed[$fontId],
$type,
$type !== 'websafe' ? template::button('themeFontEdit' . $fontId, [
'class' => 'themeFontEdit',
'href' => helper::baseUrl() . $this->getUrl(0) . '/fontEdit/' . $type . '/' . $fontId . '/' . $_SESSION['csrf'],
'value' => template::ico('pencil'),
'disabled' => !empty($fontUsed[$fontId])
])
: '',
'class' => 'themeFontEdit',
'href' => helper::baseUrl() . $this->getUrl(0) . '/fontEdit/' . $type . '/' . $fontId . '/' . $_SESSION['csrf'],
'value' => template::ico('pencil'),
'disabled' => !empty($fontUsed[$fontId])
])
: '',
$type !== 'websafe' ? template::button('themeFontDelete' . $fontId, [
'class' => 'themeFontDelete buttonRed',
'href' => helper::baseUrl() . $this->getUrl(0) . '/fontDelete/' . $type . '/' . $fontId . '/' . $_SESSION['csrf'],
'value' => template::ico('cancel'),
'disabled' => !empty($fontUsed[$fontId])
])
: ''
'class' => 'themeFontDelete buttonRed',
'href' => helper::baseUrl() . $this->getUrl(0) . '/fontDelete/' . $type . '/' . $fontId . '/' . $_SESSION['csrf'],
'value' => template::ico('cancel'),
'disabled' => !empty($fontUsed[$fontId])
])
: ''
];
}
}
@ -637,14 +653,15 @@ class theme extends common {
/**
* Ajouter une fonte
*/
public function fontAdd() {
public function fontAdd()
{
// Soumission du formulaire
if ($this->isPost()) {
// Type d'import en ligne ou local
$type = $this->getInput('fontAddFontImported', helper::FILTER_BOOLEAN) ? 'imported' : 'files';
$typeFlip = $type === 'files' ? 'imported' : 'files';
$ressource = $type === 'imported' ? $this->getInput('fontAddUrl', null) : $this->getInput('fontAddFile', null);
if (!empty($ressource) ) {
if (!empty($ressource)) {
$fontId = $this->getInput('fontAddFontId', null, true);
$fontName = $this->getInput('fontAddFontName', null, true);
$fontFamilyName = $this->getInput('fontAddFontFamilyName', null, true);
@ -653,24 +670,27 @@ class theme extends common {
$fontFamilyName = str_replace('"', '\'', $fontFamilyName);
// Supprime la fonte si elle existe dans le type inverse
if (is_array($this->getData(['fonts', $typeFlip, $fontId])) ) {
$this->deleteData(['fonts', $typeFlip, $fontId ]);
if (is_array($this->getData(['fonts', $typeFlip, $fontId]))) {
$this->deleteData(['fonts', $typeFlip, $fontId]);
}
// Stocker la fonte
$this->setData(['fonts',
$type,
$fontId, [
'name' => $fontName,
'font-family' => $fontFamilyName,
'resource' => $ressource
]]);
$this->setData([
'fonts',
$type,
$fontId, [
'name' => $fontName,
'font-family' => $fontFamilyName,
'resource' => $ressource
]
]);
// Copier la fonte si le nom du fichier est fourni
if ( $type === 'files' &&
file_exists(self::FILE_DIR . 'source/' . $ressource)
if (
$type === 'files' &&
file_exists(self::FILE_DIR . 'source/' . $ressource)
) {
copy ( self::FILE_DIR . 'source/' . $ressource, self::DATA_DIR . 'fonts/' . $ressource );
copy(self::FILE_DIR . 'source/' . $ressource, self::DATA_DIR . 'fonts/' . $ressource);
}
// Valeurs en sortie
@ -699,7 +719,8 @@ class theme extends common {
/**
* Ajouter une fonte
*/
public function fontEdit() {
public function fontEdit()
{
// Soumission du formulaire
if ($this->isPost()) {
// Type d'import en ligne ou local
@ -707,29 +728,32 @@ class theme extends common {
$typeFlip = $type === 'files' ? 'imported' : 'files';
$ressource = $type === 'imported' ? $this->getInput('fontEditUrl', null) : $this->getInput('fontEditFile', null);
$fontId = $this->getInput('fontEditFontId', null, true);
$fontName = $this->getInput('fontEditFontName', null , true);
$fontName = $this->getInput('fontEditFontName', null, true);
$fontFamilyName = $this->getInput('fontEditFontFamilyName', null, true);
// Remplace les doubles quotes par des simples quotes
$fontFamilyName = str_replace('"', '\'', $fontFamilyName);
// Supprime la fonte si elle existe dans le type inverse
if (is_array($this->getData(['fonts', $typeFlip, $fontId])) ) {
$this->deleteData(['fonts', $typeFlip, $fontId ]);
if (is_array($this->getData(['fonts', $typeFlip, $fontId]))) {
$this->deleteData(['fonts', $typeFlip, $fontId]);
}
// Stocker les fontes
$this->setData(['fonts',
$type,
$fontId, [
'name' => $fontName,
'font-family' => $fontFamilyName,
'resource' => $ressource
]]);
$this->setData([
'fonts',
$type,
$fontId, [
'name' => $fontName,
'font-family' => $fontFamilyName,
'resource' => $ressource
]
]);
// Copier la fonte si le nom du fichier est fourni
if ( $type === 'files' &&
file_exists(self::FILE_DIR . 'source/' . $ressource)
if (
$type === 'files' &&
file_exists(self::FILE_DIR . 'source/' . $ressource)
) {
copy ( self::FILE_DIR . 'source/' . $ressource, self::DATA_DIR . 'fonts/' . $ressource );
copy(self::FILE_DIR . 'source/' . $ressource, self::DATA_DIR . 'fonts/' . $ressource);
}
// Valeurs en sortie
@ -749,7 +773,8 @@ class theme extends common {
/**
* Effacer une fonte
*/
public function fontDelete() {
public function fontDelete()
{
// Jeton incorrect
if ($this->getUrl(4) !== $_SESSION['csrf']) {
// Valeurs en sortie
@ -765,8 +790,10 @@ class theme extends common {
$this->deleteData(['fonts', $this->getUrl(2), $this->getUrl(3)]);
// Effacer le fichier existant
if ( $this->getUrl(2) === 'file' &&
file_exists(self::DATA_DIR . $this->getUrl(2)) ) {
if (
$this->getUrl(2) === 'file' &&
file_exists(self::DATA_DIR . $this->getUrl(2))
) {
unlink(self::DATA_DIR . $this->getUrl(2));
}
@ -783,15 +810,17 @@ class theme extends common {
/**
* Réinitialisation de la personnalisation avancée
*/
public function reset() {
public function reset()
{
// $url prend l'adresse sans le token
$url = explode('&',$this->getUrl(2));
$url = explode('&', $this->getUrl(2));
if ( isset($_GET['csrf'])
AND $_GET['csrf'] === $_SESSION['csrf']
) {
if (
isset($_GET['csrf'])
and $_GET['csrf'] === $_SESSION['csrf']
) {
// Réinitialisation
$redirect ='';
$redirect = '';
switch ($url[0]) {
case 'admin':
$this->initData('admin', self::$i18nUI);
@ -802,10 +831,10 @@ class theme extends common {
$redirect = helper::baseUrl() . 'theme/manage';
break;
case 'custom':
unlink(self::DATA_DIR.'custom.css');
unlink(self::DATA_DIR . 'custom.css');
$redirect = helper::baseUrl() . 'theme/advanced';
break;
default :
default:
$redirect = helper::baseUrl() . 'theme';
}
@ -827,9 +856,10 @@ class theme extends common {
/**
* Options du site
*/
public function site() {
public function site()
{
// Soumission du formulaire
if($this->isPost()) {
if ($this->isPost()) {
$this->setData(['theme', 'title', [
'font' => $this->getInput('themeTitleFont'),
'textColor' => $this->getInput('themeTitleTextColor'),
@ -840,14 +870,14 @@ class theme extends common {
'font' => $this->getInput('themeTextFont'),
'fontSize' => $this->getInput('themeTextFontSize'),
'textColor' => $this->getInput('themeTextTextColor'),
'linkColor'=> $this->getInput('themeTextLinkColor')
'linkColor' => $this->getInput('themeTextLinkColor')
]]);
$this->setData(['theme', 'site', [
'backgroundColor' => $this->getInput('themeSiteBackgroundColor'),
'radius' => $this->getInput('themeSiteRadius'),
'shadow' => $this->getInput('themeSiteShadow'),
'width' => $this->getInput('themeSiteWidth'),
'margin' => $this->getInput('themeSiteMargin',helper::FILTER_BOOLEAN)
'margin' => $this->getInput('themeSiteMargin', helper::FILTER_BOOLEAN)
]]);
$this->setData(['theme', 'button', [
'backgroundColor' => $this->getInput('themeButtonBackgroundColor')
@ -881,11 +911,12 @@ class theme extends common {
/**
* Import du thème
*/
public function manage() {
if($this->isPost() ) {
public function manage()
{
if ($this->isPost()) {
$zipFilename = $this->getInput('themeManageImport', helper::FILTER_STRING_SHORT, true);
$data = $this->import(self::FILE_DIR.'source/' . $zipFilename);
$data = $this->import(self::FILE_DIR . 'source/' . $zipFilename);
if ($data['success']) {
header("Refresh:0");
} else {
@ -911,10 +942,13 @@ class theme extends common {
* @param @return array contenant $success = true ou false ; $ notification string message à afficher
*/
public function import($zipName = '') {
public function import($zipName = '')
{
if ($zipName !== '' &&
file_exists($zipName)) {
if (
$zipName !== '' &&
file_exists($zipName)
) {
// Init variables de retour
$success = false;
$notification = '';
@ -923,26 +957,24 @@ class theme extends common {
// Ouvrir le zip
$zip = new ZipArchive();
if ($zip->open($zipName) === TRUE) {
mkdir (self::TEMP_DIR . $tempFolder, 0755);
$zip->extractTo(self::TEMP_DIR . $tempFolder );
mkdir(self::TEMP_DIR . $tempFolder, 0755);
$zip->extractTo(self::TEMP_DIR . $tempFolder);
$modele = '';
// Archive de thème ?
if (
file_exists(self::TEMP_DIR . $tempFolder . '/site/data/custom.css')
AND file_exists(self::TEMP_DIR . $tempFolder . '/site/data/theme.css')
AND file_exists(self::TEMP_DIR . $tempFolder . '/site/data/theme.json')
) {
$modele = 'theme';
and file_exists(self::TEMP_DIR . $tempFolder . '/site/data/theme.css')
and file_exists(self::TEMP_DIR . $tempFolder . '/site/data/theme.json')
) {
$modele = 'theme';
}
if(
if (
file_exists(self::TEMP_DIR . $tempFolder . '/site/data/admin.json')
AND file_exists(self::TEMP_DIR . $tempFolder . '/site/data/admin.css')
and file_exists(self::TEMP_DIR . $tempFolder . '/site/data/admin.css')
) {
$modele = 'admin';
$modele = 'admin';
}
if (!empty($modele)
) {
if (!empty($modele)) {
// traiter l'archive
$success = $zip->extractTo('.');
@ -950,26 +982,26 @@ class theme extends common {
if ($modele = 'theme') {
$c = $this->subFonts(self::DATA_DIR . 'theme.json');
// Un remplacement nécessite la régénération de la feuille de style
if ($c > 0
AND file_exists(self::DATA_DIR . 'theme.css')
if (
$c > 0
and file_exists(self::DATA_DIR . 'theme.css')
) {
unlink(self::DATA_DIR . 'theme.css');
unlink(self::DATA_DIR . 'theme.css');
}
}
if ($modele = 'admin') {
$c = $this->subFonts(self::DATA_DIR . 'admin.json');
// Un remplacement nécessite la régénération de la feuille de style
if ($c > 0
AND file_exists(self::DATA_DIR . 'admin.css')
) {
unlink(self::DATA_DIR . 'admin.css');
if (
$c > 0
and file_exists(self::DATA_DIR . 'admin.css')
) {
unlink(self::DATA_DIR . 'admin.css');
}
}
// traitement d'erreur
$notification = $success ? 'Le thème a été importé' : 'Erreur lors de l\'extraction, vérifiez les permissions.';
} else {
// pas une archive de thème
$success = false;
@ -994,37 +1026,39 @@ class theme extends common {
/**
* Export du thème
*/
public function export() {
public function export()
{
// Make zip
$zipFilename = $this->zipTheme($this->getUrl(2));
// Téléchargement du ZIP
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-Disposition: attachment; filename="' . $zipFilename . '"');
header('Content-Length: ' . filesize(self::TEMP_DIR . $zipFilename));
readfile(self::TEMP_DIR . $zipFilename);
// Nettoyage du dossier
unlink (self::TEMP_DIR . $zipFilename);
exit();
$zipFilename = $this->zipTheme($this->getUrl(2));
// Téléchargement du ZIP
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-Disposition: attachment; filename="' . $zipFilename . '"');
header('Content-Length: ' . filesize(self::TEMP_DIR . $zipFilename));
readfile(self::TEMP_DIR . $zipFilename);
// Nettoyage du dossier
unlink(self::TEMP_DIR . $zipFilename);
exit();
}
/**
* Export du thème
*/
public function save() {
public function save()
{
// Make zip
$zipFilename = $this->zipTheme($this->getUrl(2));
// Téléchargement du ZIP
if (!is_dir(self::FILE_DIR.'source/theme')) {
mkdir(self::FILE_DIR.'source/theme', 0755);
if (!is_dir(self::FILE_DIR . 'source/theme')) {
mkdir(self::FILE_DIR . 'source/theme', 0755);
}
copy (self::TEMP_DIR . $zipFilename , self::FILE_DIR.'source/theme/' . $zipFilename);
copy(self::TEMP_DIR . $zipFilename, self::FILE_DIR . 'source/theme/' . $zipFilename);
// Nettoyage du dossier
unlink (self::TEMP_DIR . $zipFilename);
unlink(self::TEMP_DIR . $zipFilename);
// Valeurs en sortie
$this->addOutput([
'notification' => 'Archive <b>'.$zipFilename.'</b> sauvegardée avec succès',
'notification' => 'Archive <b>' . $zipFilename . '</b> sauvegardée avec succès',
'redirect' => helper::baseUrl() . 'theme/manage',
'state' => true
]);
@ -1034,58 +1068,63 @@ class theme extends common {
* construction du zip Fonction appelée par export() et save()
* @param string $modele theme ou admin
*/
private function zipTheme($modele) {
private function zipTheme($modele)
{
// Creation du dossier
$zipFilename = $modele . date('Y-m-d-H-i-s', time()) . '.zip';
$zip = new ZipArchive();
if ($zip->open(self::TEMP_DIR . $zipFilename, ZipArchive::CREATE | ZipArchive::OVERWRITE ) === TRUE) {
if ($zip->open(self::TEMP_DIR . $zipFilename, ZipArchive::CREATE | ZipArchive::OVERWRITE) === TRUE) {
switch ($modele) {
case 'admin':
$zip->addFile(self::DATA_DIR.'admin.json',self::DATA_DIR.'admin.json');
$zip->addFile(self::DATA_DIR.'admin.css',self::DATA_DIR.'admin.css');
$zip->addFile(self::DATA_DIR . 'admin.json', self::DATA_DIR . 'admin.json');
$zip->addFile(self::DATA_DIR . 'admin.css', self::DATA_DIR . 'admin.css');
// Ajoute les fontes
$zip->addEmptyDir(self::DATA_DIR .'fonts');
$zip->addEmptyDir(self::DATA_DIR . 'fonts');
$fonts = $this->getData(['fonts', 'files']);
foreach ($fonts as $fontId => $fontName) {
$zip->addFile(self::DATA_DIR .'fonts/' . $fontName, self::DATA_DIR.'fonts/' . $fontName);
$zip->addFile(self::DATA_DIR . 'fonts/' . $fontName, self::DATA_DIR . 'fonts/' . $fontName);
}
if (file_exists(self::DATA_DIR .'fonts/fonts.html')) {
if (file_exists(self::DATA_DIR . 'fonts/fonts.html')) {
$zip->addFile(self::DATA_DIR .'fonts/fonts.html', self::DATA_DIR .'fonts/fonts.html');
$zip->addFile(self::DATA_DIR . 'fonts/fonts.html', self::DATA_DIR . 'fonts/fonts.html');
}
break;
case 'theme':
$zip->addFile(self::DATA_DIR.'theme.json',self::DATA_DIR.'theme.json');
$zip->addFile(self::DATA_DIR.'theme.css',self::DATA_DIR.'theme.css');
$zip->addFile(self::DATA_DIR.'custom.css',self::DATA_DIR.'custom.css');
$zip->addFile(self::DATA_DIR . 'theme.json', self::DATA_DIR . 'theme.json');
$zip->addFile(self::DATA_DIR . 'theme.css', self::DATA_DIR . 'theme.css');
$zip->addFile(self::DATA_DIR . 'custom.css', self::DATA_DIR . 'custom.css');
// Traite l'image dans le body
if ($this->getData(['theme','body','image']) !== '' ) {
$zip->addFile(self::FILE_DIR.'source/'.$this->getData(['theme','body','image']),
self::FILE_DIR.'source/'.$this->getData(['theme','body','image'])
);
if ($this->getData(['theme', 'body', 'image']) !== '') {
$zip->addFile(
self::FILE_DIR . 'source/' . $this->getData(['theme', 'body', 'image']),
self::FILE_DIR . 'source/' . $this->getData(['theme', 'body', 'image'])
);
}
// Traite l'image dans le header
if ($this->getData(['theme','header','image']) !== '' ) {
$zip->addFile(self::FILE_DIR.'source/'.$this->getData(['theme','header','image']),
self::FILE_DIR.'source/'.$this->getData(['theme','header','image'])
);
if ($this->getData(['theme', 'header', 'image']) !== '') {
$zip->addFile(
self::FILE_DIR . 'source/' . $this->getData(['theme', 'header', 'image']),
self::FILE_DIR . 'source/' . $this->getData(['theme', 'header', 'image'])
);
}
// Traite les images du header perso
if (!empty($this->getData(['theme','header','featureFiles'])) ) {
foreach($this->getData(['theme','header','featureFiles']) as $value) {
$zip->addFile(self::FILE_DIR . 'source/' . $value,
self::FILE_DIR . 'source/' . $value );
if (!empty($this->getData(['theme', 'header', 'featureFiles']))) {
foreach ($this->getData(['theme', 'header', 'featureFiles']) as $value) {
$zip->addFile(
self::FILE_DIR . 'source/' . $value,
self::FILE_DIR . 'source/' . $value
);
}
}
// Ajoute les fontes
$zip->addEmptyDir(self::DATA_DIR .'fonts');
$zip->addEmptyDir(self::DATA_DIR . 'fonts');
$fonts = $this->getData(['fonts', 'files']);
foreach ($fonts as $fontId => $fontName) {
$zip->addFile(self::DATA_DIR .'fonts/' . $fontName, self::DATA_DIR.'fonts/' . $fontName);
$zip->addFile(self::DATA_DIR . 'fonts/' . $fontName, self::DATA_DIR . 'fonts/' . $fontName);
}
if (file_exists(self::DATA_DIR .'fonts/fonts.html')) {
if (file_exists(self::DATA_DIR . 'fonts/fonts.html')) {
$zip->addFile(self::DATA_DIR .'fonts/fonts.html', self::DATA_DIR .'fonts/fonts.html');
$zip->addFile(self::DATA_DIR . 'fonts/fonts.html', self::DATA_DIR . 'fonts/fonts.html');
}
break;
}
@ -1100,7 +1139,8 @@ class theme extends common {
* @param string $file, nom du fichier json à convertir
* @return int nombre de substitution effectuées
*/
private function subFonts($file) {
private function subFonts($file)
{
// Tableau de substitution des fontes
$fonts = [
'Abril+Fatface' => 'abril-fatface',
@ -1113,19 +1153,19 @@ class theme extends common {
'Droid+Serif' => 'droid-serif-2',
'Fira+Sans' => 'fira-sans',
'Inconsolata' => 'inconsolata-2',
'Indie+Flower' =>'indie-flower',
'Indie+Flower' => 'indie-flower',
'Josefin+Slab' => 'josefin-sans-std',
'Lobster' => 'lobster-2',
'Lora' => 'lora',
'Lato' =>'lato',
'Lato' => 'lato',
'Marvel' => 'montserrat-ace',
'Old+Standard+TT' => 'old-standard-tt-3',
'Open+Sans' =>'open-sans',
// Corriger l'erreur de nom de police installée par défaut, il manquait un O en majuscule
'open+Sans' =>'open-sans',
'Oswald' =>'oswald-4',
'Open+Sans' => 'open-sans',
// Corriger l'erreur de nom de police installée par défaut, il manquait un O en majuscule
'open+Sans' => 'open-sans',
'Oswald' => 'oswald-4',
'PT+Mono' => 'pt-mono',
'PT+Serif' =>'pt-serif',
'PT+Serif' => 'pt-serif',
'Raleway' => 'raleway-5',
'Rancho' => 'rancho',
'Roboto' => 'Roboto',
@ -1136,7 +1176,7 @@ class theme extends common {
$data = file_get_contents($file);
$count = 0;
foreach ($fonts as $oldId => $newId){
foreach ($fonts as $oldId => $newId) {
$data = str_replace($oldId, $newId, $data, $c);
$count = $count + (int) $c;
}
@ -1151,19 +1191,20 @@ class theme extends common {
// 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() {
public function enumFonts()
{
/**
* 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 ['imported'] = $this->getData(['fonts', 'imported']);
$f ['websafe'] = self::$fontsWebSafe;
* 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['imported'] = $this->getData(['fonts', 'imported']);
$f['websafe'] = self::$fontsWebSafe;
// Construit un tableau avec leur ID et leur famille
foreach(['websafe', 'imported', 'files'] as $type) {
if (is_array($f[$type])) {
foreach ($f[$type] as $fontId => $fontValue ) {
foreach (['websafe', 'imported', 'files'] as $type) {
if (is_array($f[$type])) {
foreach ($f[$type] as $fontId => $fontValue) {
self::$fonts['name'][$fontId] = $fontValue['name'];
self::$fonts['family'][$fontId] = $fontValue['font-family'];
}
@ -1178,44 +1219,46 @@ class theme extends common {
* 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') {
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']),
];
$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
// Compression
$fontsInstalled = array_unique($fontsInstalled);
/**
* Chargement des polices en ligne dans un fichier fonts.html inclus dans main.php
*/
* Chargement des polices en ligne dans un fichier fonts.html inclus dans main.php
*/
$gf = false;
$fileContent = '<!-- Fontes personnalisées -->';
if ( !empty($this->getData(['fonts', 'imported'])) ) {
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;
}
if (!empty($this->getData(['fonts', 'imported']))) {
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;
: $fileContent;
@ -1223,32 +1266,30 @@ class theme extends common {
* Fontes installées localement
*/
$fileContentCss = '';
if ( !empty($this->getData(['fonts', 'files'])) ) {
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:"' . $fontValue['name'] . '";';
$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;
}
if (!empty($this->getData(['fonts', 'files']))) {
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:"' . $fontValue['name'] . '";';
$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);
file_put_contents(self::DATA_DIR . 'fonts/fonts.html', $fileContent);
// Enregistre la personnalisation
file_put_contents(self::DATA_DIR.'fonts/fonts.css', $fileContentCss);
file_put_contents(self::DATA_DIR . 'fonts/fonts.css', $fileContentCss);
}
}

View File

@ -10,19 +10,19 @@
* @link http://zwiicms.fr/
*/
/**
* Aperçu en direct
*/
$("input, select").on("change", function() {
/**
* Aperçu en direct
*/
$("input, select").on("change", function () {
var titleFont = $("#adminFontTitle").val();
var textFont = $("#adminFontText").val();
var css = "@import url('https://fonts.cdnfonts.com/css/" + titleFont + "');";
var css = "@import url('https://fonts.cdnfonts.com/css/" + titleFont + "');";
var css = "@import url('https://fonts.cdnfonts.com/css/" + textFont + "');";
var colors = core.colorVariants($("#adminBackgroundColor").val());
var css = "#site{background-color:" + colors.normal + ";}";
css += "body, .row > div {font:" + $("#adminFontTextSize").val() + " '" + textFont + "', sans-serif;}";
css += "body h1, h2, h3, h4, h5, h6 {font-family:'" + titleFont + "', sans-serif; color:" + $("#adminColorTitle").val() + ";}";
css += "body, .row > div {font:" + $("#adminFontTextSize").val() + " '" + textFont + "', sans-serif;}";
css += "body h1, h2, h3, h4, h5, h6 {font-family:'" + titleFont + "', sans-serif; color:" + $("#adminColorTitle").val() + ";}";
css += "body:not(.editorWysiwyg),span .zwiico-help {color:" + $("#adminColorText").val() + ";}";
var colors = core.colorVariants($("#adminColorButton").val());
css += "input[type='checkbox']:checked + label::before,.speechBubble{ background-color:" + colors.normal + "; color:" + $("#adminColorButtonText").val() + ";}";
@ -33,27 +33,27 @@ $("input, select").on("change", function() {
var colors = core.colorVariants($("#adminColorRed").val());
css += ".button.buttonRed {background-color: " + colors.normal + ";color:" + colors.text + ";}.button.buttonRed:hover {background-color:" + colors.darken + ";color:" + colors.text + "}.button.buttonRed:active {background-color:" + colors.veryDarken + ";color:" + colors.text + "}";
var colors = core.colorVariants($("#adminColorGreen").val());
css += ".button.buttonGreen, button[type=submit] {background-color: " + colors.normal + ";color: " + ";color:" + colors.text + "}.button.buttonGreen:hover, button[type=submit]:hover {background-color: " + colors.darken + ";color:" + colors.text + ";}.button.buttonGreen:active, button[type=submit]:active {background-color:" + colors.veryDarken + ";color:" + colors.text + "}";
css += ".button.buttonGreen, button[type=submit] {background-color: " + colors.normal + ";color: " + ";color:" + colors.text + "}.button.buttonGreen:hover, button[type=submit]:hover {background-color: " + colors.darken + ";color:" + colors.text + ";}.button.buttonGreen:active, button[type=submit]:active {background-color:" + colors.veryDarken + ";color:" + colors.text + "}";
var colors = core.colorVariants($("#adminBackGroundBlockColor").val());
css += ".block {border: 1px solid " + $("#adminBorderBlockColor").val() + ";}.block h4 {background-color: " + colors.normal + ";color:" + colors.text + ";}";
css += "input[type=email],input[type=text],input[type=password],select:not(#barSelectPage),textarea:not(.editorWysiwyg),.inputFile{background-color: " + colors.normal + ";color:" + colors.text + ";border: 1px solid " + $("#adminBorderBlockColor").val() + ";}";
css += ".block {border: 1px solid " + $("#adminBorderBlockColor").val() + ";}.block h4 {background-color: " + colors.normal + ";color:" + colors.text + ";}";
css += "input[type=email],input[type=text],input[type=password],select:not(#barSelectPage),textarea:not(.editorWysiwyg),.inputFile{background-color: " + colors.normal + ";color:" + colors.text + ";border: 1px solid " + $("#adminBorderBlockColor").val() + ";}";
// Ajout du css au DOM
$("#themePreview").remove();
$("<style>")
.attr("type", "text/css")
.attr("id", "themePreview")
.text(css)
.appendTo("head");
// Ajout du css au DOM
$("#themePreview").remove();
$("<style>")
.attr("type", "text/css")
.attr("id", "themePreview")
.text(css)
.appendTo("head");
});
/**
* Confirmation de réinitialisation
*/
$("#configAdminReset").on("click", function() {
var _this = $(this);
return core.confirm("Êtes-vous sûr de vouloir réinitialiser à son état d'origine le thème de l\'administration ?", function() {
$(location).attr("href", _this.attr("href"));
});
$("#configAdminReset").on("click", function () {
var _this = $(this);
return core.confirm("Êtes-vous sûr de vouloir réinitialiser à son état d'origine le thème de l\'administration ?", function () {
$(location).attr("href", _this.attr("href"));
});
});

View File

@ -1,159 +1,159 @@
<?php echo template::formOpen('configAdminForm'); ?>
<div class="row">
<div class="col1">
<?php echo template::button('configAdminBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'theme',
'value' => template::ico('left')
]); ?>
</div>
<!--
<div class="row">
<div class="col1">
<?php echo template::button('configAdminBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'theme',
'value' => template::ico('left')
]); ?>
</div>
<!--
<div class="col2 offset5">
<?php echo template::button('configAdminTest', [
'value' => 'Bouton Standard'
]); ?>
</div>
-->
<div class="col1 offset8">
<?php echo template::button('configAdminReset', [
'class' => 'buttonRed',
'href' => helper::baseUrl() . 'theme/reset/admin' . '&csrf=' . $_SESSION['csrf'],
'value' => template::ico('cancel'),
'help' => 'Réinitialiser avec le thème par défaut'
]); ?>
</div>
<div class="col2">
<?php echo template::submit('configAdminSubmit',[
'value' => 'Valider',
'ico' => 'check'
]); ?>
</div>
<div class="col1 offset8">
<?php echo template::button('configAdminReset', [
'class' => 'buttonRed',
'href' => helper::baseUrl() . 'theme/reset/admin' . '&csrf=' . $_SESSION['csrf'],
'value' => template::ico('cancel'),
'help' => 'Réinitialiser avec le thème par défaut'
]); ?>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Couleurs'); ?>
</h4>
<div class="row">
<div class="col4">
<?php echo template::text('adminBackgroundColor', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Arrière-plan',
'value' => $this->getData(['admin', 'backgroundColor'])
]); ?>
</div>
<div class="col4">
<?php echo template::text('adminColorTitle', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Titres',
'value' => $this->getData(['admin', 'colorTitle'])
]); ?>
</div>
<div class="col4">
<?php echo template::text('adminColorText', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Texte',
'value' => $this->getData(['admin', 'colorText'])
]); ?>
</div>
<div class="col2">
<?php echo template::submit('configAdminSubmit', [
'value' => 'Valider',
'ico' => 'check'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Couleurs'); ?>
</h4>
<div class="row">
<div class="col4">
<?php echo template::text('adminBackgroundColor', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Arrière-plan',
'value' => $this->getData(['admin', 'backgroundColor'])
]); ?>
</div>
<div class="row">
<div class="col4">
<?php echo template::text('adminBackGroundBlockColor', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence. La couleur du texte est automatique.',
'label' => 'Arrière-plan des champs',
'value' => $this->getData(['admin', 'backgroundBlockColor'])
]); ?>
</div>
<div class="col4">
<?php echo template::text('adminBorderBlockColor', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Bordure des champs',
'value' => $this->getData(['admin', 'borderBlockColor'])
]); ?>
</div>
<div class="col3 offset1">
<?php echo template::text('adminColorHelp', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Bouton Aide',
'value' => $this->getData(['admin', 'backgroundColorButtonHelp'])
]); ?>
</div>
<div class="col4">
<?php echo template::text('adminColorTitle', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Titres',
'value' => $this->getData(['admin', 'colorTitle'])
]); ?>
</div>
<div class="row">
<div class="col3">
<?php echo template::text('adminColorGrey', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Bouton retour',
'value' => $this->getData(['admin', 'backgroundColorButtonGrey'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('adminColorButton', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Bouton standard',
'value' => $this->getData(['admin', 'backgroundColorButton'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('adminColorRed', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Bouton effacement',
'value' => $this->getData(['admin', 'backgroundColorButtonRed'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('adminColorGreen', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Bouton validation',
'value' => $this->getData(['admin', 'backgroundColorButtonGreen'])
]); ?>
</div>
<div class="col4">
<?php echo template::text('adminColorText', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Texte',
'value' => $this->getData(['admin', 'colorText'])
]); ?>
</div>
</div>
<div class="row">
<div class="col4">
<?php echo template::text('adminBackGroundBlockColor', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence. La couleur du texte est automatique.',
'label' => 'Arrière-plan des champs',
'value' => $this->getData(['admin', 'backgroundBlockColor'])
]); ?>
</div>
<div class="col4">
<?php echo template::text('adminBorderBlockColor', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Bordure des champs',
'value' => $this->getData(['admin', 'borderBlockColor'])
]); ?>
</div>
<div class="col3 offset1">
<?php echo template::text('adminColorHelp', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Bouton Aide',
'value' => $this->getData(['admin', 'backgroundColorButtonHelp'])
]); ?>
</div>
</div>
<div class="row">
<div class="col3">
<?php echo template::text('adminColorGrey', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Bouton retour',
'value' => $this->getData(['admin', 'backgroundColorButtonGrey'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('adminColorButton', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Bouton standard',
'value' => $this->getData(['admin', 'backgroundColorButton'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('adminColorRed', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Bouton effacement',
'value' => $this->getData(['admin', 'backgroundColorButtonRed'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('adminColorGreen', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Bouton validation',
'value' => $this->getData(['admin', 'backgroundColorButtonGreen'])
]); ?>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Mise en forme du texte'); ?>
</h4>
<div class="row">
<div class="col4">
<?php echo template::select('adminFontText', $module::$fonts['name'], [
'label' => 'Police du texte',
'selected' => $this->getData(['admin', 'fontText']),
'fonts' => $module::$fonts['family']
]); ?>
</div>
<div class="col4">
<?php echo template::select('adminFontTextSize', $module::$siteFontSizes, [
'label' => 'Taille',
'selected' => $this->getData(['admin', 'fontSize'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('adminFontTitle', $module::$fonts['name'], [
'label' => 'Police des titres',
'selected' => $this->getData(['admin', 'fontTitle']),
'fonts' => $module::$fonts['family']
]); ?>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Mise en forme du texte'); ?>
</h4>
<div class="row">
<div class="col4">
<?php echo template::select('adminFontText', $module::$fonts['name'], [
'label' => 'Police du texte',
'selected' => $this->getData(['admin', 'fontText']),
'fonts' => $module::$fonts['family']
]); ?>
</div>
<div class="col4">
<?php echo template::select('adminFontTextSize', $module::$siteFontSizes, [
'label' => 'Taille',
'selected' => $this->getData(['admin', 'fontSize'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('adminFontTitle', $module::$fonts['name'], [
'label' => 'Police des titres',
'selected' => $this->getData(['admin', 'fontTitle']),
'fonts' => $module::$fonts['family']
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -14,7 +14,7 @@
/**
* Aperçu en direct
*/
$("#themeAdvancedCss").on("change keydown keyup", function() {
$("#themeAdvancedCss").on("change keydown keyup", function () {
// Ajout du css au DOM
$("#themePreview").remove();
$("<style>")
@ -27,9 +27,9 @@ $("#themeAdvancedCss").on("change keydown keyup", function() {
/**
* Confirmation de réinitialisation
*/
$("#themeAdvancedReset").on("click", function() {
$("#themeAdvancedReset").on("click", function () {
var _this = $(this);
return core.confirm("Êtes-vous sûr de vouloir réinitialiser à son état d'origine la personnalisation avancée ?", function() {
return core.confirm("Êtes-vous sûr de vouloir réinitialiser à son état d'origine la personnalisation avancée ?", function () {
$(location).attr("href", _this.attr("href"));
});
});

View File

@ -1,31 +1,31 @@
<?php echo template::formOpen('themeAdvancedForm'); ?>
<div class="row">
<div class="col1">
<?php echo template::button('themeAdvancedBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'theme',
'value' => template::ico('left')
]); ?>
</div>
<div class="col1 offset8">
<?php echo template::button('themeAdvancedReset', [
'href' => helper::baseUrl() . 'theme/reset/custom' . '&csrf=' . $_SESSION['csrf'],
'class' => 'buttonRed',
'value' => template::ico('cancel'),
'help' => 'Réinitialiser la feuille de style'
<div class="row">
<div class="col1">
<?php echo template::button('themeAdvancedBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'theme',
'value' => template::ico('left')
]); ?>
</div>
<div class="col1 offset8">
<?php echo template::button('themeAdvancedReset', [
'href' => helper::baseUrl() . 'theme/reset/custom' . '&csrf=' . $_SESSION['csrf'],
'class' => 'buttonRed',
'value' => template::ico('cancel'),
'help' => 'Réinitialiser la feuille de style'
]); ?>
</div>
<div class="col2">
<?php echo template::submit('themeAdvancedSubmit'); ?>
</div>
]); ?>
</div>
<div class="row">
<div class="col12">
<?php echo template::textarea('themeAdvancedCss', [
'value' => file_get_contents(self::DATA_DIR.'custom.css'),
'class' => 'editor'
]); ?>
</div>
<div class="col2">
<?php echo template::submit('themeAdvancedSubmit'); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::textarea('themeAdvancedCss', [
'value' => file_get_contents(self::DATA_DIR . 'custom.css'),
'class' => 'editor'
]); ?>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -14,20 +14,20 @@
/**
* Affichage de l'icone de remontée et permettre l'aperçu.
*/
$(document).ready(function(){
$("#backToTop").css("display","show");
$(document).ready(function () {
$("#backToTop").css("display", "show");
});
/**
* Aperçu en direct
*/
$("input, select").on("change", function() {
$("input, select").on("change", function () {
// Option fixe pour contain et cover
var themeBodyImageSize = $("#themeBodyImageSize").val();
if(themeBodyImageSize === "cover" ||
themeBodyImageSize === "contain" ) {
if (themeBodyImageSize === "cover" ||
themeBodyImageSize === "contain") {
$("#themeBodyImageAttachment").val("fixed");
}
@ -35,14 +35,14 @@ $("input, select").on("change", function() {
var css = "html{background-color:" + $("#themeBodyBackgroundColor").val() + "}";
// Image du fond
var themeBodyImage = $("#themeBodyImage").val();
if(themeBodyImage) {
if (themeBodyImage) {
css += "html{background-image:url('<?php echo helper::baseUrl(false); ?>site/file/source/" + themeBodyImage + "');background-repeat:" + $("#themeBodyImageRepeat").val() + ";background-position:" + $("#themeBodyImagePosition").val() + ";background-attachment:" + $("#themeBodyImageAttachment").val() + ";background-size:" + $("#themeBodyImageSize").val() + "}";
css += "html{background-color:rgba(0,0,0,0);}";
}
else {
css += "html{background-image:none}";
}
css += '#backToTop {background-color:' + $("#themeBodyToTopBackground").val() + ';color:' + $("#themeBodyToTopColor").val() + ';}';
css += '#backToTop {background-color:' + $("#themeBodyToTopBackground").val() + ';color:' + $("#themeBodyToTopColor").val() + ';}';
// Ajout du css au DOM
$("#themePreview").remove();
@ -53,8 +53,8 @@ $("input, select").on("change", function() {
.appendTo("head");
});
// Affiche / Cache les options de l'image du fond
$("#themeBodyImage").on("change", function() {
if($(this).val()) {
$("#themeBodyImage").on("change", function () {
if ($(this).val()) {
$("#themeBodyImageOptions").slideDown();
}
else {

View File

@ -63,7 +63,7 @@
<div class="row">
<div class="col12">
<?php
$imageFile = file_exists(self::FILE_DIR.'source/'.$this->getData(['theme', 'body', 'image'])) ? $this->getData(['theme', 'body', 'image']) : "";
$imageFile = file_exists(self::FILE_DIR . 'source/' . $this->getData(['theme', 'body', 'image'])) ? $this->getData(['theme', 'body', 'image']) : "";
echo template::file('themeBodyImage', [
'help' => 'Sélectionner une image',
'label' => 'Arrière-plan',

View File

@ -1,85 +1,85 @@
<?php echo template::formOpen('fontAddForm'); ?>
<div class="row">
<div class="col1">
<?php echo template::button('fontAddBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'theme/fonts',
'value' => template::ico('left')
]); ?>
</div>
<div class="col1">
<?php echo template::button('fontAddHelp', [
'href' => 'https://doc.zwiicms.fr/fontes#add',
'target' => '_blank',
'value' => template::ico('help'),
'class' => 'buttonHelp'
]); ?>
</div>
<div class="col2 offset8">
<?php echo template::submit('fontAddPublish', [
'value' => 'Valider',
'uniqueSubmission' => true
]); ?>
</div>
<div class="row">
<div class="col1">
<?php echo template::button('fontAddBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'theme/fonts',
'value' => template::ico('left')
]); ?>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Identité de la fonte'); ?>
</h4>
<div class="row">
<div class="col6">
<?php echo template::checkbox('fontAddFontImported', true, 'Fonte en ligne', [
'checked' => true
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('fontAddFontFile', true,'Fonte installée', []); ?>
</div>
<div class="col1">
<?php echo template::button('fontAddHelp', [
'href' => 'https://doc.zwiicms.fr/fontes#add',
'target' => '_blank',
'value' => template::ico('help'),
'class' => 'buttonHelp'
]); ?>
</div>
<div class="col2 offset8">
<?php echo template::submit('fontAddPublish', [
'value' => 'Valider',
'uniqueSubmission' => true
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Identité de la fonte'); ?>
</h4>
<div class="row">
<div class="col6">
<?php echo template::checkbox('fontAddFontImported', true, 'Fonte en ligne', [
'checked' => true
]); ?>
</div>
<div class="row">
<div class="col6">
<?php echo template::text('fontAddFontId', [
'autocomplete' => 'off',
'label' => 'Identifiant (sans espace ni majuscule)',
'placeholder' => 'big-marker-extrude'
<div class="col6">
<?php echo template::checkbox('fontAddFontFile', true, 'Fonte installée', []); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::text('fontAddFontId', [
'autocomplete' => 'off',
'label' => 'Identifiant (sans espace ni majuscule)',
'placeholder' => 'big-marker-extrude'
]); ?>
</div>
<div class="col6">
<?php echo template::text('fontAddFontName', [
'autocomplete' => 'off',
'label' => 'Nom',
'placeholder' => 'Big Marker Extrude'
]); ?>
</div>
]); ?>
</div>
<div class="row">
<div class="col12">
<div class="col6">
<?php echo template::text('fontAddFontName', [
'autocomplete' => 'off',
'label' => 'Nom',
'placeholder' => 'Big Marker Extrude'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::text('fontAddFontFamilyName', [
'autocomplete' => 'off',
'label' => 'Famille',
'placeholder' => "'Big Marker Extrude', sans-serif"
]); ?>
</div>
'autocomplete' => 'off',
'label' => 'Famille',
'placeholder' => "'Big Marker Extrude', sans-serif"
]); ?>
</div>
<div class="row" id="containerFontAddFile">
<div class="col12">
<?php echo template::file('fontAddFile', [
'label' => 'Fichier de fonte (Format WOFF)'
]); ?>
</div>
</div>
<div class="row" id="containerFontAddFile">
<div class="col12">
<?php echo template::file('fontAddFile', [
'label' => 'Fichier de fonte (Format WOFF)'
]); ?>
</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 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>
</div>
<?php echo template::formClose(); ?>

View File

@ -13,8 +13,8 @@
/**
* Option par défaut du sélecteur de mode
*/
$(document).ready(function(){
if( $('input[name=fontEditFontImported]').is(':checked') ){
$(document).ready(function () {
if ($('input[name=fontEditFontImported]').is(':checked')) {
$('#containerfontEditFile').hide();
$('#containerfontEditUrl').show();
$('#fontEditFontFileWrapper').hide();
@ -23,7 +23,7 @@
}
if( $('input[name=fontEditFontFile]').is(':checked') ){
if ($('input[name=fontEditFontFile]').is(':checked')) {
$('#containerfontEditFile').show();
$('#containerfontEditUrl').hide();
$('#fontEditFontImportedWrapper').hide();

View File

@ -1,88 +1,88 @@
<?php echo template::formOpen('fontEditForm'); ?>
<div class="row">
<div class="col1">
<?php echo template::button('fontEditBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'theme/fonts',
'value' => template::ico('left')
]); ?>
</div>
<div class="col1">
<?php echo template::button('fontEditHelp', [
'href' => 'https://doc.zwiicms.fr/fontes#add',
'target' => '_blank',
'value' => template::ico('help'),
'class' => 'buttonHelp'
]); ?>
</div>
<div class="col2 offset8">
<?php echo template::submit('fontEditPublish', [
'value' => 'Valider',
'uniqueSubmission' => true
]); ?>
</div>
<div class="row">
<div class="col1">
<?php echo template::button('fontEditBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'theme/fonts',
'value' => template::ico('left')
]); ?>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Identité de la fonte'); ?>
<div class="col1">
<?php echo template::button('fontEditHelp', [
'href' => 'https://doc.zwiicms.fr/fontes#add',
'target' => '_blank',
'value' => template::ico('help'),
'class' => 'buttonHelp'
]); ?>
</div>
<div class="col2 offset8">
<?php echo template::submit('fontEditPublish', [
'value' => 'Valider',
'uniqueSubmission' => true
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('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) === 'files' ? true : false
]); ?>
</div>
</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="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 class="col6">
<?php echo template::checkbox('fontEditFontFile', true, 'Fonte installée', [
'checked' => $this->getUrl(2) === 'files' ? true : false
]); ?>
</div>
<div class="row">
<div class="col12">
</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' => stripslashes($this->getData(['fonts', $this->getUrl(2), $this->getUrl(3), 'font-family']))
]); ?>
</div>
'autocomplete' => 'off',
'label' => 'Famille',
'value' => stripslashes($this->getData(['fonts', $this->getUrl(2), $this->getUrl(3), 'font-family']))
]); ?>
</div>
<div class="row" id="containerfontEditFile">
<div class="col12">
<?php echo template::file('fontEditFile', [
'label' => 'Fichier de fonte (Format WOFF)',
'value' => $this->getUrl(2) === 'files' ? $this->getData(['fonts', $this->getUrl(2), $this->getUrl(3), 'resource']) : ''
]); ?>
</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) === 'files' ? $this->getData(['fonts', $this->getUrl(2), $this->getUrl(3), 'resource']) : ''
]); ?>
</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), 'resource']) : ''
]); ?>
</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), 'resource']) : ''
]); ?>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -13,9 +13,9 @@
/**
* Confirmation de suppression
*/
$(".themeFontDelete").on("click", function() {
$(".themeFontDelete").on("click", function () {
var _this = $(this);
return core.confirm("Êtes-vous sûr de vouloir supprimer cette fonte ?", function() {
return core.confirm("Êtes-vous sûr de vouloir supprimer cette fonte ?", function () {
$(location).attr("href", _this.attr("href"));
});
});

View File

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

View File

@ -15,7 +15,7 @@
/**
* Aperçu en direct
*/
$("input, select").on("change", function() {
$("input, select").on("change", function () {
// Import des polices de caractères
var footerFont = $("#themeFooterFont :selected").val();
var footerFontText = $("#themeFooterFont :selected").text();
@ -38,7 +38,7 @@ $("input, select").on("change", function() {
// Taille, couleur, épaisseur et capitalisation du titre de la bannière
css += "footer span, #footerText > p {color:" + $("#themeFooterTextColor").val() + ";font-family:'" + footerFontText + "',sans-serif;font-weight:" + $("#themeFooterFontWeight").val() + ";font-size:" + $("#themeFooterFontSize").val() + ";text-transform:" + $("#themeFooterTextTransform").val() + "}";
// Marge
if($("#themeFooterMargin").is(":checked")) {
if ($("#themeFooterMargin").is(":checked")) {
css += 'footer{padding: 0 20px;}';
}
else {
@ -52,65 +52,65 @@ $("input, select").on("change", function() {
.text(css)
.appendTo("footer");
// Position du pied de page
switch($("#themeFooterPosition").val()) {
switch ($("#themeFooterPosition").val()) {
case 'hide':
$("footer").hide();
break;
case 'site':
$("footer").show().appendTo("#site");
$("footer > div:first-child").removeAttr("class");
$("footer > div:first-child").addClass("container");
$("footer > div:first-child").removeAttr("class");
$("footer > div:first-child").addClass("container");
break;
case 'body':
$("footer").show().appendTo("body");
$("footer > div:first-child").removeAttr("class");
$("footer > div:first-child").addClass("container-large");
$("footer > div:first-child").removeAttr("class");
$("footer > div:first-child").addClass("container-large");
break;
}
// Réduire la marge du paragraphe de la zone de texte enrichie
$("#footerText > p").css("margin-top","0");
$("#footerText > p").css("margin-bottom","0");
// Réduire la marge du paragraphe de la zone de texte enrichie
$("#footerText > p").css("margin-top", "0");
$("#footerText > p").css("margin-bottom", "0");
});
// Position dans les blocs
// Bloc texte personnalisé
$(".themeFooterContent").on("change",function() {
$(".themeFooterContent").on("change", function () {
// Position site ou body
var footerPosition = $("#themeFooterPosition").val();
switch($("#themeFooterTextPosition").val()) {
case "hide":
$("#footerText").hide();
break;
default:
// Choix de la position du bloc
textPosition = $("#themeFooterTextPosition").val();
textPosition = textPosition.substr(0,1).toUpperCase()+textPosition.substr(1);
$("#footerText").show().appendTo("#footer" + footerPosition + textPosition);
break;
switch ($("#themeFooterTextPosition").val()) {
case "hide":
$("#footerText").hide();
break;
default:
// Choix de la position du bloc
textPosition = $("#themeFooterTextPosition").val();
textPosition = textPosition.substr(0, 1).toUpperCase() + textPosition.substr(1);
$("#footerText").show().appendTo("#footer" + footerPosition + textPosition);
break;
}
switch($("#themeFooterSocialsPosition").val()) {
case 'hide':
$("#footerSocials").hide();
break;
default:
// Choix de la position du bloc
socialsPosition = $("#themeFooterSocialsPosition").val();
socialsPosition = socialsPosition.substr(0,1).toUpperCase()+socialsPosition.substr(1);
$("#footerSocials").show().appendTo("#footer" + footerPosition + socialsPosition);
break;
switch ($("#themeFooterSocialsPosition").val()) {
case 'hide':
$("#footerSocials").hide();
break;
default:
// Choix de la position du bloc
socialsPosition = $("#themeFooterSocialsPosition").val();
socialsPosition = socialsPosition.substr(0, 1).toUpperCase() + socialsPosition.substr(1);
$("#footerSocials").show().appendTo("#footer" + footerPosition + socialsPosition);
break;
}
switch($("#themeFooterCopyrightPosition").val()) {
case 'hide':
$("#footerCopyright").hide();
break;
default:
// Choix de la position du bloc
copyrightPosition = $("#themeFooterCopyrightPosition").val();
copyrightPosition = copyrightPosition.substr(0,1).toUpperCase()+copyrightPosition.substr(1);
$("#footerCopyright").show().appendTo("#footer" + footerPosition + copyrightPosition);
break;
switch ($("#themeFooterCopyrightPosition").val()) {
case 'hide':
$("#footerCopyright").hide();
break;
default:
// Choix de la position du bloc
copyrightPosition = $("#themeFooterCopyrightPosition").val();
copyrightPosition = copyrightPosition.substr(0, 1).toUpperCase() + copyrightPosition.substr(1);
$("#footerCopyright").show().appendTo("#footer" + footerPosition + copyrightPosition);
break;
}
@ -119,47 +119,47 @@ $(".themeFooterContent").on("change",function() {
// Fin Position dans les blocs
// Modification dynamique de la mise en page
$("#themeFooterTemplate").on("change",function() {
$("#themeFooterTemplate").on("change", function () {
// Nettoyage des sélecteurs des contenus
var newOptions = {
4: {'hide' : 'Masqué', 'left' : 'En haut', 'center' : 'Au milieu', 'right' : 'En bas'} ,
3: {'hide': 'Masqué', 'left': 'A gauche', 'center': 'Au centre', 'right': 'A droite'} ,
2: {'hide': 'Masqué', 'left': 'A gauche', 'right': 'A droite'} ,
1: {'hide': 'Masqué', 'center': 'Affiché'}
4: { 'hide': 'Masqué', 'left': 'En haut', 'center': 'Au milieu', 'right': 'En bas' },
3: { 'hide': 'Masqué', 'left': 'A gauche', 'center': 'Au centre', 'right': 'A droite' },
2: { 'hide': 'Masqué', 'left': 'A gauche', 'right': 'A droite' },
1: { 'hide': 'Masqué', 'center': 'Affiché' }
};
var $el = $(".themeFooterContent");
$el.empty();
// Eléments des position de contenus
$.each(newOptions[$("#themeFooterTemplate").val()], function(key,value) {
$.each(newOptions[$("#themeFooterTemplate").val()], function (key, value) {
$el.append($("<option></option>")
.attr("value", key).text(value));
});
});
var position = $("#themeFooterPosition").val();
// Masquer les contenus
$("#footerCopyright").hide();
$("#footerText").hide();
$("#footerSocials").hide();
// Dimension des blocs
switch($("#themeFooterTemplate").val()) {
switch ($("#themeFooterTemplate").val()) {
case "1":
$("#footer" + position + "Left").css("display","none");
$("#footer" + position + "Center").removeAttr('class').addClass("col12").css("display","");
$("#footer" + position + "Right").css("display","none");
$("#footer" + position + "Left").css("display", "none");
$("#footer" + position + "Center").removeAttr('class').addClass("col12").css("display", "");
$("#footer" + position + "Right").css("display", "none");
break;
case "2":
$("#footer" + position + "Left").removeAttr('class').addClass('col6').css("display","");
$("#footer" + position + "Center").css("display","none").removeAttr('class');
$("#footer" + position + "Right").removeAttr('class').addClass('col6').css("display","");
$("#footer" + position + "Left").removeAttr('class').addClass('col6').css("display", "");
$("#footer" + position + "Center").css("display", "none").removeAttr('class');
$("#footer" + position + "Right").removeAttr('class').addClass('col6').css("display", "");
break;
case "3":
$("#footer" + position + "Left").removeAttr('class').addClass('col4').css("display","");
$("#footer" + position + "Center").removeAttr('class').addClass('col4').css("display","");
$("#footer" + position + "Right").removeAttr('class').addClass('col4').css("display","");
$("#footer" + position + "Left").removeAttr('class').addClass('col4').css("display", "");
$("#footer" + position + "Center").removeAttr('class').addClass('col4').css("display", "");
$("#footer" + position + "Right").removeAttr('class').addClass('col4').css("display", "");
break;
case "4":
$("#footer" + position + "Left").removeAttr('class').addClass('col12').css("display","");
$("#footer" + position + "Center").removeAttr('class').addClass('col12').css("display","");
$("#footer" + position + "Right").removeAttr('class').addClass('col12').css("display","");
$("#footer" + position + "Left").removeAttr('class').addClass('col12').css("display", "");
$("#footer" + position + "Center").removeAttr('class').addClass('col12').css("display", "");
$("#footer" + position + "Right").removeAttr('class').addClass('col12').css("display", "");
break;
}
@ -167,58 +167,58 @@ $("#themeFooterTemplate").on("change",function() {
// Désactivation des sélections multiples
$("#themeFooterSocialsPosition").on("change", function() {
if ($(this).prop('selectedIndex') >= 1 ) {
if ( $("#themeFooterTextPosition").prop('selectedIndex') === $(this).prop('selectedIndex') ) {
$("#themeFooterTextPosition").prop('selectedIndex',0);
$("#themeFooterSocialsPosition").on("change", function () {
if ($(this).prop('selectedIndex') >= 1) {
if ($("#themeFooterTextPosition").prop('selectedIndex') === $(this).prop('selectedIndex')) {
$("#themeFooterTextPosition").prop('selectedIndex', 0);
$("#footerText").hide();
}
if ( $("#themeFooterCopyrightPosition").prop('selectedIndex') === $(this).prop('selectedIndex') ) {
$("#themeFooterCopyrightPosition").prop('selectedIndex',0);
if ($("#themeFooterCopyrightPosition").prop('selectedIndex') === $(this).prop('selectedIndex')) {
$("#themeFooterCopyrightPosition").prop('selectedIndex', 0);
$("#footerCopyright").hide();
}
}
}).trigger("change");
$("#themeFooterTextPosition").on("change", function() {
if ($(this).prop('selectedIndex') >= 1 ) {
if ( $("#themeFooterSocialsPosition").prop('selectedIndex') === $(this).prop('selectedIndex') ) {
$("#themeFooterSocialsPosition").prop('selectedIndex',0);
$("#themeFooterTextPosition").on("change", function () {
if ($(this).prop('selectedIndex') >= 1) {
if ($("#themeFooterSocialsPosition").prop('selectedIndex') === $(this).prop('selectedIndex')) {
$("#themeFooterSocialsPosition").prop('selectedIndex', 0);
$("#footerSocials").hide();
}
if ( $("#themeFooterCopyrightPosition").prop('selectedIndex') === $(this).prop('selectedIndex') ) {
$("#themeFooterCopyrightPosition").prop('selectedIndex',0);
if ($("#themeFooterCopyrightPosition").prop('selectedIndex') === $(this).prop('selectedIndex')) {
$("#themeFooterCopyrightPosition").prop('selectedIndex', 0);
$("#footerCopyright").hide();
}
}
}).trigger("change");
$("#themeFooterCopyrightPosition").on("change", function() {
if ($(this).prop('selectedIndex') >= 1 ) {
if ( $("#themeFooterTextPosition").prop('selectedIndex') === $(this).prop('selectedIndex') ) {
$("#themeFooterTextPosition").prop('selectedIndex',0);
$("#footerText").hide();
}
if ( $("#themeFooterSocialsPosition").prop('selectedIndex') === $(this).prop('selectedIndex') ) {
$("#themeFooterSocialsPosition").prop('selectedIndex',0);
$("#footerSocials").hide();
}
$("#themeFooterCopyrightPosition").on("change", function () {
if ($(this).prop('selectedIndex') >= 1) {
if ($("#themeFooterTextPosition").prop('selectedIndex') === $(this).prop('selectedIndex')) {
$("#themeFooterTextPosition").prop('selectedIndex', 0);
$("#footerText").hide();
}
if ($("#themeFooterSocialsPosition").prop('selectedIndex') === $(this).prop('selectedIndex')) {
$("#themeFooterSocialsPosition").prop('selectedIndex', 0);
$("#footerSocials").hide();
}
}
}).trigger("change");
// Affiche / Cache les options du footer fixe
$("#themeFooterPosition").on("change", function() {
if($(this).val() === 'body') {
$("#themeFooterPosition").on("change", function () {
if ($(this).val() === 'body') {
$("#themeFooterPositionFixed").slideDown();
}
else {
$("#themeFooterPositionFixed").slideUp(function() {
$("#themeFooterPositionFixed").slideUp(function () {
$("#themeFooterFixed").prop("checked", false).trigger("change");
});
}
}).trigger("change");
// Lien de connexion
$("#themeFooterLoginLink").on("change", function() {
if($(this).is(":checked")) {
$("#themeFooterLoginLink").on("change", function () {
if ($(this).is(":checked")) {
$("#footerLoginLink").show();
}
else {
@ -227,8 +227,8 @@ $("#themeFooterLoginLink").on("change", function() {
}).trigger("change");
// Numéro de version
$("#themefooterDisplayVersion").on("change", function() {
if($(this).is(":checked")) {
$("#themefooterDisplayVersion").on("change", function () {
if ($(this).is(":checked")) {
$("#footerDisplayVersion").show();
}
else {
@ -237,8 +237,8 @@ $("#themefooterDisplayVersion").on("change", function() {
}).trigger("change");
// Numéro de version
$("#themefooterDisplayCopyright").on("change", function() {
if($(this).is(":checked")) {
$("#themefooterDisplayCopyright").on("change", function () {
if ($(this).is(":checked")) {
$("#footerDisplayCopyright").show();
}
else {
@ -247,8 +247,8 @@ $("#themefooterDisplayCopyright").on("change", function() {
}).trigger("change");
// Site Map
$("#themefooterDisplaySiteMap").on("change", function() {
if($(this).is(":checked")) {
$("#themefooterDisplaySiteMap").on("change", function () {
if ($(this).is(":checked")) {
$("#footerDisplaySiteMap").show();
}
else {
@ -257,8 +257,8 @@ $("#themefooterDisplaySiteMap").on("change", function() {
}).trigger("change");
// Rechercher
$("#themeFooterDisplaySearch").on("change", function() {
if($(this).is(":checked")) {
$("#themeFooterDisplaySearch").on("change", function () {
if ($(this).is(":checked")) {
$("#footerDisplaySearch").show();
}
else {
@ -267,8 +267,8 @@ $("#themeFooterDisplaySearch").on("change", function() {
}).trigger("change");
// Mentions légales
$("#themeFooterDisplayLegal").on("change", function() {
if($(this).is(":checked")) {
$("#themeFooterDisplayLegal").on("change", function () {
if ($(this).is(":checked")) {
$("#footerDisplayLegal").show();
}
else {
@ -278,22 +278,22 @@ $("#themeFooterDisplayLegal").on("change", function() {
// Pages spéciales : activation si une page est sélectionnée
$("#configLegalPageId").on("change", function() {
if ( $("#configLegalPageId option:selected").text() === 'Aucune') {
$("#configLegalPageId").on("change", function () {
if ($("#configLegalPageId option:selected").text() === 'Aucune') {
$("#themeFooterDisplayLegal").prop('checked', false);
$("#themeFooterDisplayLegal").prop( "disabled", true );
$("#themeFooterDisplayLegal").prop("disabled", true);
$("#footerDisplayLegal").hide();
} else {
$("#themeFooterDisplayLegal").prop( "disabled", false );
$("#themeFooterDisplayLegal").prop("disabled", false);
}
}).trigger("change");
$("#configSearchPageId").on("change", function() {
if ( $("#configSearchPageId option:selected").text() === 'Aucune') {
$("#configSearchPageId").on("change", function () {
if ($("#configSearchPageId option:selected").text() === 'Aucune') {
$("#themeFooterDisplaySearch").prop('checked', false);
$("#themeFooterDisplaySearch").prop( "disabled", true );
$("#themeFooterDisplaySearch").prop("disabled", true);
$("#footerDisplaySearch").hide();
} else {
$("#themeFooterDisplaySearch").prop( "disabled", false );
$("#themeFooterDisplaySearch").prop("disabled", false);
}
}).trigger("change");

View File

@ -2,18 +2,18 @@
<div class="row">
<div class="col1">
<?php echo template::button('themeFooterBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'theme',
'value' => template::ico('left')
]); ?>
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'theme',
'value' => template::ico('left')
]); ?>
</div>
<div class="col1">
<?php echo template::button('themeFooterHelp', [
'href' => 'https://doc.zwiicms.fr/pied-de-page',
'target' => '_blank',
'value' => template::ico('help'),
'class' => 'buttonHelp'
]); ?>
<?php echo template::button('themeFooterHelp', [
'href' => 'https://doc.zwiicms.fr/pied-de-page',
'target' => '_blank',
'value' => template::ico('help'),
'class' => 'buttonHelp'
]); ?>
</div>
<div class="col2 offset8">
<?php echo template::submit('themeFooterSubmit'); ?>
@ -26,30 +26,30 @@
<div class="row">
<div class="col6">
<?php echo template::select('themeFooterPosition', $module::$footerPositions, [
'label' => 'Position',
'selected' => $this->getData(['theme', 'footer', 'position'])
]); ?>
'label' => 'Position',
'selected' => $this->getData(['theme', 'footer', 'position'])
]); ?>
</div>
<div class="col6">
<?php echo template::select('themeFooterHeight', $module::$footerHeights, [
'label' => 'Marges verticales',
'selected' => $this->getData(['theme', 'footer', 'height'])
]); ?>
'label' => 'Marges verticales',
'selected' => $this->getData(['theme', 'footer', 'height'])
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<div id="themeFooterPositionOptions">
<?php echo template::checkbox('themeFooterMargin', true, 'Alignement avec le contenu', [
'checked' => $this->getData(['theme', 'footer', 'margin'])
]); ?>
'checked' => $this->getData(['theme', 'footer', 'margin'])
]); ?>
</div>
</div>
<div class="col6">
<div id="themeFooterPositionFixed" class="displayNone">
<?php echo template::checkbox('themeFooterFixed', true, 'Pied de page fixe', [
'checked' => $this->getData(['theme', 'footer', 'fixed'])
]); ?>
'checked' => $this->getData(['theme', 'footer', 'fixed'])
]); ?>
</div>
</div>
</div>
@ -87,35 +87,35 @@
<div class="row">
<div class="col3">
<?php echo template::checkbox('themefooterDisplayCopyright', true, 'Motorisé par', [
'checked' => $this->getData(['theme', 'footer','displayCopyright']),
'help' => 'Affiche cette mention devant ZwiiCMS'
]); ?>
'checked' => $this->getData(['theme', 'footer', 'displayCopyright']),
'help' => 'Affiche cette mention devant ZwiiCMS'
]); ?>
</div>
<div class="col3">
<?php echo template::checkbox('themefooterDisplayVersion', true, 'Version', [
'checked' => $this->getData(['theme', 'footer','displayVersion']),
'help' => 'Affiche le numéro de version après ZwiiCMS'
]); ?>
'checked' => $this->getData(['theme', 'footer', 'displayVersion']),
'help' => 'Affiche le numéro de version après ZwiiCMS'
]); ?>
</div>
<div class="col3">
<?php echo template::checkbox('themefooterDisplaySiteMap', true, 'Plan du site', [
'checked' => $this->getData(['theme', 'footer', 'displaySiteMap'])
]); ?>
'checked' => $this->getData(['theme', 'footer', 'displaySiteMap'])
]); ?>
</div>
<div class="col3">
<?php echo template::checkbox('themefooterDisplayCookie', true, 'Cookies', [
'checked' => $this->getData(['config', 'cookieConsent']) === true ? $this->getData(['theme', 'footer', 'displayCookie']) : false,
'help' => 'Message d\'information relatif aux cookies, disponible si l\'acceptation des cookies est activé.',
'disabled' => !$this->getData(['config', 'cookieConsent'])
]); ?>
'checked' => $this->getData(['config', 'cookieConsent']) === true ? $this->getData(['theme', 'footer', 'displayCookie']) : false,
'help' => 'Message d\'information relatif aux cookies, disponible si l\'acceptation des cookies est activé.',
'disabled' => !$this->getData(['config', 'cookieConsent'])
]); ?>
</div>
</div>
<div class="row">
<div class="col3">
<?php echo template::checkbox('themeFooterLoginLink', true, 'Lien de connexion', [
'checked' => $this->getData(['theme', 'footer', 'loginLink']),
'help' => 'Pour limiter les tentatives de piratage, enregistrez la page de connexion en favori et désactivez cette option.'
]); ?>
'checked' => $this->getData(['theme', 'footer', 'loginLink']),
'help' => 'Pour limiter les tentatives de piratage, enregistrez la page de connexion en favori et désactivez cette option.'
]); ?>
</div>
<div class="col3">
<?php echo template::checkbox('themeFooterMemberBar', true, 'Barre du membre', [
@ -127,13 +127,13 @@
<div class="row">
<div class="col3">
<?php echo template::checkbox('themeFooterDisplayLegal', true, 'Mentions légales', [
'checked' => $this->getData(['locale', 'legalPageId']) === 'none' ? false : $this->getData(['theme', 'footer', 'displayLegal']),
'disabled' => $this->getData(['locale', 'legalPageId']) === 'none' ? true : false,
'help' => 'Option active si une page a été sélectionnée.'
'checked' => $this->getData(['locale', 'legalPageId']) === 'none' ? false : $this->getData(['theme', 'footer', 'displayLegal']),
'disabled' => $this->getData(['locale', 'legalPageId']) === 'none' ? true : false,
'help' => 'Option active si une page a été sélectionnée.'
]); ?>
</div>
<div class="col3">
<?php echo template::select('configLegalPageId', array_merge(['none' => 'Aucune'] , helper::arrayColumn($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('selected', '20px'),
'selected' => $this->getData(['locale', 'legalPageId'])
]); ?>
@ -141,13 +141,13 @@
<div class="col3">
<?php echo template::checkbox('themeFooterDisplaySearch', true, 'Rechercher', [
'checked' => $this->getData(['locale', 'searchPageId']) === 'none' ? false : $this->getData(['theme', 'footer', 'displaySearch']),
'disabled' => $this->getData(['locale', 'searchPageId']) === 'none' ? true : false,
'help' => 'Option active si une page a été sélectionnée.'
]); ?>
'checked' => $this->getData(['locale', 'searchPageId']) === 'none' ? false : $this->getData(['theme', 'footer', 'displaySearch']),
'disabled' => $this->getData(['locale', 'searchPageId']) === 'none' ? true : false,
'help' => 'Option active si une page a été sélectionnée.'
]); ?>
</div>
<div class="col3">
<?php echo template::select('configSearchPageId', array_merge(['none' => 'Aucune'] , helper::arrayColumn($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('selected', '20px'),
'selected' => $this->getData(['locale', 'searchPageId'])
]); ?>
@ -159,10 +159,10 @@
<div class="row">
<div class="col12">
<?php echo template::textarea('themeFooterText', [
'label' => '<div class="titleWysiwygContent">' . template::topic('Contenu personnalisé') .'</div>',
'value' => $this->getData(['theme', 'footer', 'text']),
'class' => 'editorWysiwyg'
]); ?>
'label' => '<div class="titleWysiwygContent">' . template::topic('Contenu personnalisé') . '</div>',
'value' => $this->getData(['theme', 'footer', 'text']),
'class' => 'editorWysiwyg'
]); ?>
</div>
</div>
<div class="row">
@ -174,29 +174,29 @@
<div class="row">
<div class="col3">
<?php echo template::select('themeFooterFont', $module::$fonts['name'], [
'label' => 'Fonte',
'selected' => $this->getData(['theme', 'footer', 'font']),
'fonts' => $module::$fonts['family']
]); ?>
'label' => 'Fonte',
'selected' => $this->getData(['theme', 'footer', 'font']),
'fonts' => $module::$fonts['family']
]); ?>
</div>
<div class="col3">
<?php echo template::select('themeFooterFontSize', $module::$footerFontSizes, [
'label' => 'Taille',
'help' => 'Proportionnelle à celle définie dans le site.',
'selected' => $this->getData(['theme', 'footer', 'fontSize'])
]); ?>
'label' => 'Taille',
'help' => 'Proportionnelle à celle définie dans le site.',
'selected' => $this->getData(['theme', 'footer', 'fontSize'])
]); ?>
</div>
<div class="col3">
<?php echo template::select('themeFooterFontWeight', $module::$fontWeights, [
'label' => 'Style',
'selected' => $this->getData(['theme', 'footer', 'fontWeight'])
]); ?>
'label' => 'Style',
'selected' => $this->getData(['theme', 'footer', 'fontWeight'])
]); ?>
</div>
<div class="col3">
<?php echo template::select('themeFooterTextTransform', $module::$textTransforms, [
'label' => 'Casse',
'selected' => $this->getData(['theme', 'footer', 'textTransform'])
]); ?>
'label' => 'Casse',
'selected' => $this->getData(['theme', 'footer', 'textTransform'])
]); ?>
</div>
</div>
</div>
@ -210,11 +210,11 @@
</h4>
<div class="row">
<div class="col4">
<?php $footerBlockPosition = is_null($this->getData(['theme', 'footer', 'template'])) ? $module::$footerblocks[3] : $module::$footerblocks [$this->getData(['theme', 'footer', 'template'])] ;?>
<?php $footerBlockPosition = is_null($this->getData(['theme', 'footer', 'template'])) ? $module::$footerblocks[3] : $module::$footerblocks[$this->getData(['theme', 'footer', 'template'])]; ?>
<?php echo template::select('themeFooterTemplate', $module::$footerTemplate, [
'label' => 'Répartition',
'selected' => is_null($this->getData(['theme', 'footer', 'template'])) ? 4 : $this->getData(['theme', 'footer', 'template'])
]); ?>
'label' => 'Répartition',
'selected' => is_null($this->getData(['theme', 'footer', 'template'])) ? 4 : $this->getData(['theme', 'footer', 'template'])
]); ?>
</div>
</div>
<div class="row">
@ -227,42 +227,42 @@
<div class="row">
<div class="col12">
<?php echo template::select('themeFooterTextPosition', $footerBlockPosition, [
'label' => 'Position',
'selected' => $this->getData(['theme', 'footer', 'textPosition']),
'class' => 'themeFooterContent'
]); ?>
'label' => 'Position',
'selected' => $this->getData(['theme', 'footer', 'textPosition']),
'class' => 'themeFooterContent'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::select('themeFooterTextAlign', $module::$aligns, [
'label' => 'Alignement',
'selected' => $this->getData(['theme', 'footer', 'textAlign'])
]); ?>
'label' => 'Alignement',
'selected' => $this->getData(['theme', 'footer', 'textAlign'])
]); ?>
</div>
</div>
</div>
<div class="col4">
<p>
<strong>
<?php echo template::topic('Réseaux sociaux'); ?>
<?php echo template::topic('Réseaux sociaux'); ?>
</strong>
</p>
<div class="row">
<div class="col12">
<?php echo template::select('themeFooterSocialsPosition', $footerBlockPosition, [
'label' => 'Position',
'selected' => $this->getData(['theme', 'footer', 'socialsPosition']),
'class' => 'themeFooterContent'
]); ?>
'label' => 'Position',
'selected' => $this->getData(['theme', 'footer', 'socialsPosition']),
'class' => 'themeFooterContent'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::select('themeFooterSocialsAlign', $module::$aligns, [
'label' => 'Alignement',
'selected' => $this->getData(['theme', 'footer', 'socialsAlign'])
]); ?>
'label' => 'Alignement',
'selected' => $this->getData(['theme', 'footer', 'socialsAlign'])
]); ?>
</div>
</div>
</div>
@ -275,18 +275,18 @@
<div class="row">
<div class="col12">
<?php echo template::select('themeFooterCopyrightPosition', $footerBlockPosition, [
'label' => 'Position',
'selected' => $this->getData(['theme', 'footer', 'copyrightPosition']),
'class' => 'themeFooterContent'
]); ?>
'label' => 'Position',
'selected' => $this->getData(['theme', 'footer', 'copyrightPosition']),
'class' => 'themeFooterContent'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::select('themeFooterCopyrightAlign', $module::$aligns, [
'label' => 'Alignement',
'selected' => $this->getData(['theme', 'footer', 'copyrightAlign'])
]); ?>
'label' => 'Alignement',
'selected' => $this->getData(['theme', 'footer', 'copyrightAlign'])
]); ?>
</div>
</div>
</div>

View File

@ -2,18 +2,18 @@
<div class="row">
<div class="col1">
<?php echo template::button('themeHeaderBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'theme',
'value' => template::ico('left')
]); ?>
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'theme',
'value' => template::ico('left')
]); ?>
</div>
<div class="col1">
<?php echo template::button('themeHeaderHelp', [
'href' => 'https://doc.zwiicms.fr/banniere',
'target' => '_blank',
'value' => template::ico('help'),
'class' => 'buttonHelp'
]); ?>
<?php echo template::button('themeHeaderHelp', [
'href' => 'https://doc.zwiicms.fr/banniere',
'target' => '_blank',
'value' => template::ico('help'),
'class' => 'buttonHelp'
]); ?>
</div>
<div class="col2 offset8">
<?php echo template::submit('themeHeaderSubmit'); ?>
@ -28,44 +28,44 @@
<div class="row">
<div class="col4">
<?php echo template::select('themeHeaderPosition', $module::$headerPositions, [
'label' => 'Position',
'selected' => $this->getData(['theme', 'header', 'position'])
]); ?>
'label' => 'Position',
'selected' => $this->getData(['theme', 'header', 'position'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('themeHeaderFeature', $module::$headerFeatures, [
'label' => 'Nature de contenu',
'selected' => $this->getData(['theme', 'header', 'feature'])
]); ?>
'label' => 'Nature de contenu',
'selected' => $this->getData(['theme', 'header', 'feature'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('themeHeaderHeight', $module::$headerHeights, [
'label' => 'Hauteur maximale',
'selected' => $this->getData(['theme', 'header', 'height']),
'help' => 'La hauteur maximale est de 600 pixels, même si les dimensions de l\'image sélectionnée sont supérieures. <br />Lorsque l\'adaptation est positionnée sur Responsive, la hauteur diminue proportionnellement à la largeur.'
]); ?>
'label' => 'Hauteur maximale',
'selected' => $this->getData(['theme', 'header', 'height']),
'help' => 'La hauteur maximale est de 600 pixels, même si les dimensions de l\'image sélectionnée sont supérieures. <br />Lorsque l\'adaptation est positionnée sur Responsive, la hauteur diminue proportionnellement à la largeur.'
]); ?>
</div>
</div>
<div class="row">
<div class="col4">
<?php echo template::select('themeHeaderWide', $module::$containerWides, [
'label' => 'Largeur',
'selected' => $this->getData(['theme', 'header', 'wide'])
]); ?>
'label' => 'Largeur',
'selected' => $this->getData(['theme', 'header', 'wide'])
]); ?>
</div>
<div class="col4">
<div id="themeHeaderSmallDisplay" class="displayNone">
<?php echo template::checkbox('themeHeaderTinyHidden', true, 'Masquer la bannière en écran réduit', [
'checked' => $this->getData(['theme', 'header', 'tinyHidden'])
]); ?>
<?php echo template::checkbox('themeHeaderTinyHidden', true, 'Masquer la bannière en écran réduit', [
'checked' => $this->getData(['theme', 'header', 'tinyHidden'])
]); ?>
</div>
</div>
<div class="col4">
<div id="themeHeaderPositionOptions" class="displayNone">
<?php echo template::checkbox('themeHeaderMargin', true, 'Aligner la bannière avec le contenu', [
'checked' => $this->getData(['theme', 'header', 'margin'])
]); ?>
'checked' => $this->getData(['theme', 'header', 'margin'])
]); ?>
</div>
</div>
</div>
@ -81,19 +81,19 @@
<div class="row">
<div class="col6">
<?php echo template::text('themeHeaderBackgroundColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Arrière-plan',
'value' => $this->getData(['theme', 'header', 'backgroundColor'])
]); ?>
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Arrière-plan',
'value' => $this->getData(['theme', 'header', 'backgroundColor'])
]); ?>
</div>
<div class="col6">
<?php echo template::text('themeHeaderTextColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Texte',
'value' => $this->getData(['theme', 'header', 'textColor'])
]); ?>
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Texte',
'value' => $this->getData(['theme', 'header', 'textColor'])
]); ?>
</div>
</div>
</div>
@ -108,42 +108,42 @@
<div class="row">
<div class="col4">
<?php echo template::checkbox('themeHeaderTextHide', true, 'Masquer le titre du site', [
'checked' => $this->getData(['theme', 'header', 'textHide'])
]); ?>
'checked' => $this->getData(['theme', 'header', 'textHide'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('themeHeaderFont', $module::$fonts['name'], [
'label' => 'Fonte',
'selected' => $this->getData(['theme', 'header', 'font']),
'fonts' => $module::$fonts['family']
]); ?>
'label' => 'Fonte',
'selected' => $this->getData(['theme', 'header', 'font']),
'fonts' => $module::$fonts['family']
]); ?>
</div>
<div class="col4">
<?php echo template::select('themeHeaderFontSize', $module::$headerFontSizes, [
'label' => 'Taille',
'help' => 'Proportionnelle à celle définie dans le site.',
'selected' => $this->getData(['theme', 'header', 'fontSize'])
]); ?>
'label' => 'Taille',
'help' => 'Proportionnelle à celle définie dans le site.',
'selected' => $this->getData(['theme', 'header', 'fontSize'])
]); ?>
</div>
</div>
<div class="row">
<div class="col4">
<?php echo template::select('themeHeaderFontWeight', $module::$fontWeights, [
'label' => 'Style',
'selected' => $this->getData(['theme', 'header', 'fontWeight'])
]); ?>
'label' => 'Style',
'selected' => $this->getData(['theme', 'header', 'fontWeight'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('themeHeaderTextTransform', $module::$textTransforms, [
'label' => 'Casse',
'selected' => $this->getData(['theme', 'header', 'textTransform'])
]); ?>
'label' => 'Casse',
'selected' => $this->getData(['theme', 'header', 'textTransform'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('themeHeaderTextAlign', $module::$aligns, [
'label' => 'Alignement du contenu',
'selected' => $this->getData(['theme', 'header', 'textAlign'])
]); ?>
'label' => 'Alignement du contenu',
'selected' => $this->getData(['theme', 'header', 'textAlign'])
]); ?>
</div>
</div>
@ -159,14 +159,14 @@
<div class="row">
<div class="col12">
<?php
$imageFile = file_exists(self::FILE_DIR.'source/'.$this->getData(['theme', 'header', 'image'])) ?
$this->getData(['theme', 'header', 'image']) : "";
echo template::file('themeHeaderImage', [
'label' => 'Image',
'type' => 1,
'value' => $imageFile
$imageFile = file_exists(self::FILE_DIR . 'source/' . $this->getData(['theme', 'header', 'image'])) ?
$this->getData(['theme', 'header', 'image']) : "";
echo template::file('themeHeaderImage', [
'label' => 'Image',
'type' => 1,
'value' => $imageFile
]); ?>
<span class="themeHeaderImageOptions displayNone" id="themeHeaderImageInfo">
<span class="themeHeaderImageOptions displayNone" id="themeHeaderImageInfo">
<?php echo template::topic('Largeur de l\'image :'); ?> <span id="themeHeaderImageWidth"></span> ( <?php echo template::topic('largeur de site :'); ?> <?php echo $this->getData(['theme', 'site', 'width']); ?>)
-
<?php echo template::topic('Hargeur de l\'image :'); ?> <span id="themeHeaderImageHeight"></span>
@ -179,29 +179,29 @@
<div class="row">
<div class="col3">
<?php echo template::select('themeHeaderImageRepeat', $module::$repeats, [
'label' => 'Répétition',
'selected' => $this->getData(['theme', 'header', 'imageRepeat'])
]); ?>
'label' => 'Répétition',
'selected' => $this->getData(['theme', 'header', 'imageRepeat'])
]); ?>
</div>
<div class="col3">
<?php echo template::select('themeHeaderImageContainer', $module::$headerWide, [
'label' => 'Adaptation',
'selected' => $this->getData(['theme', 'header', 'imageContainer']),
'help' => 'Les modes responsives permettent de conserver des dimensions proportionnelles.<br />
'label' => 'Adaptation',
'selected' => $this->getData(['theme', 'header', 'imageContainer']),
'help' => 'Les modes responsives permettent de conserver des dimensions proportionnelles.<br />
Cover pour une image plus grande que la bannière, Contain pour une image plus petite.
Les modes Auto et Etiré ne provoquent pas de modification de la hauteur de la bannière.'
]); ?>
]); ?>
</div>
<div class="col3">
<?php echo template::select('themeHeaderImagePosition', $module::$imagePositions, [
'label' => 'Position',
'selected' => $this->getData(['theme', 'header', 'imagePosition'])
]); ?>
'label' => 'Position',
'selected' => $this->getData(['theme', 'header', 'imagePosition'])
]); ?>
</div>
<div id="themeHeaderShow" class="col3">
<?php echo template::checkbox('themeHeaderlinkHomePage', true, 'Bannière cliquable', [
'checked' => $this->getData(['theme', 'header', 'linkHomePage'])
]); ?>
'checked' => $this->getData(['theme', 'header', 'linkHomePage'])
]); ?>
</div>
</div>
</div>
@ -213,7 +213,7 @@
<div class="row">
<div class="col12">
<?php echo template::textarea('themeHeaderText', [
'label' => '<div class="titleWysiwygContent">' . template::topic('Contenu personnalisé') .'</div>',
'label' => '<div class="titleWysiwygContent">' . template::topic('Contenu personnalisé') . '</div>',
'class' => 'editorWysiwyg',
'value' => $this->getData(['theme', 'header', 'featureContent'])
]); ?>
@ -222,6 +222,6 @@
</div>
</div>
<div id="featureContent" class="displayNone">
<?php echo $this->getData(['theme','header','featureContent']);?>
<?php echo $this->getData(['theme', 'header', 'featureContent']); ?>
</div>
<?php echo template::formClose(); ?>

View File

@ -60,7 +60,7 @@ $("<a>")
/**
* Affiche les zones cachées
*/
$("#themeShowAll").on("click", function() {
$("#themeShowAll").on("click", function () {
$("header.displayNone, nav.displayNone, footer.displayNone").slideToggle();
});
@ -68,9 +68,9 @@ $("#themeShowAll").on("click", function() {
* Simule un survole du site lors du survole de la section
*/
$("section")
.on("mouseover", function() {
.on("mouseover", function () {
$("#themeOverlaySite:not(.themeOverlayTriggerHover)").addClass("themeOverlayTriggerHover");
})
.on("mouseleave", function() {
.on("mouseleave", function () {
$("#themeOverlaySite.themeOverlayTriggerHover").removeClass("themeOverlayTriggerHover");
});

View File

@ -1,8 +1,8 @@
<?php if(
<?php if (
$this->getData(['theme', 'header', 'position']) === 'hide'
OR $this->getData(['theme', 'menu', 'position']) === 'hide'
OR $this->getData(['theme', 'footer', 'position']) === 'hide'
): ?>
or $this->getData(['theme', 'menu', 'position']) === 'hide'
or $this->getData(['theme', 'footer', 'position']) === 'hide'
) : ?>
<?php echo template::speech('Cliquez sur une zone afin d\'accéder à ses options de personnalisation. Vous pouvez également afficher les zones cachées à l\'aide du bouton ci-dessous.'); ?>
<div class="row">
<div class="col2 offset3">
@ -45,7 +45,7 @@
]); ?>
</div>
<div class="col2">
<?php echo template::button('themeAdmin', [
<?php echo template::button('themeAdmin', [
'ico' => 'brush',
'href' => helper::baseUrl() . $this->getUrl(0) . '/admin',
'value' => 'Administration'
@ -60,7 +60,7 @@
]); ?>
</div>
</div>
<?php else: ?>
<?php else : ?>
<?php echo template::speech('Cliquez sur une zone afin d\'accéder à ses options de personnalisation.'); ?>
<div class="row">
<div class="col2 offset4">
@ -97,7 +97,7 @@
]); ?>
</div>
<div class="col2">
<?php echo template::button('themeAdmin', [
<?php echo template::button('themeAdmin', [
'ico' => 'brush',
'href' => helper::baseUrl() . $this->getUrl(0) . '/admin',
'value' => 'Administration'

View File

@ -14,9 +14,9 @@
/**
* Confirmation de réinitialisation
*/
$("#configManageReset").on("click", function() {
$("#configManageReset").on("click", function () {
var _this = $(this);
return core.confirm("Êtes-vous sûr de vouloir réinitialiser à son état d'origine le thème du site ?", function() {
return core.confirm("Êtes-vous sûr de vouloir réinitialiser à son état d'origine le thème du site ?", function () {
$(location).attr("href", _this.attr("href"));
});
});

View File

@ -1,93 +1,93 @@
<?php echo template::formOpen('themeManageForm'); ?>
<div class="row">
<div class="col1">
<?php echo template::button('themeManageBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'theme',
'value' => template::ico('left')
]); ?>
</div>
<div class="col1 offset8">
<?php echo template::button('configManageReset', [
'class' => 'buttonRed',
'href' => helper::baseUrl() . 'theme/reset/manage' . '&csrf=' . $_SESSION['csrf'],
'value' => template::ico('cancel'),
'help' => 'Réinitialiser avec le thème par défaut'
]); ?>
</div>
<div class="col2">
<?php echo template::submit('themeImportSubmit', [
'value' => 'Appliquer'
]); ?>
</div>
<div class="row">
<div class="col1">
<?php echo template::button('themeManageBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'theme',
'value' => template::ico('left')
]); ?>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Installer un thème archivé (site ou administration)'); ?>
</h4>
<div class="row">
<div class="col6 offset3">
<?php echo template::file('themeManageImport', [
'label' => 'Archive ZIP :',
'type' => 2
]); ?>
</div>
<div class="col1 offset8">
<?php echo template::button('configManageReset', [
'class' => 'buttonRed',
'href' => helper::baseUrl() . 'theme/reset/manage' . '&csrf=' . $_SESSION['csrf'],
'value' => template::ico('cancel'),
'help' => 'Réinitialiser avec le thème par défaut'
]); ?>
</div>
<div class="col2">
<?php echo template::submit('themeImportSubmit', [
'value' => 'Appliquer'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Installer un thème archivé (site ou administration)'); ?>
</h4>
<div class="row">
<div class="col6 offset3">
<?php echo template::file('themeManageImport', [
'label' => 'Archive ZIP :',
'type' => 2
]); ?>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col6">
<div class="block">
<h4>
<?php echo template::topic('Sauvegarde du thème dans le'); ?>
<a href="<?php echo helper::baseUrl(false); ?>core/vendor/filemanager/dialog.php?fldr=theme&type=0&akey=<?php echo md5_file(self::DATA_DIR.'core.json'); ?>" data-lity>
</div>
<div class="row">
<div class="col6">
<div class="block">
<h4>
<?php echo template::topic('Sauvegarde du thème dans le'); ?>
<a href="<?php echo helper::baseUrl(false); ?>core/vendor/filemanager/dialog.php?fldr=theme&type=0&akey=<?php echo md5_file(self::DATA_DIR . 'core.json'); ?>" data-lity>
<?php echo template::topic('gestionnaire de fichiers'); ?>
</a>
</h4>
<div class="row">
<div class="col6">
<?php echo template::button('themeSave', [
'href' => helper::baseUrl() . 'theme/save/theme',
'ico' => 'download-cloud',
'value' => 'Thème du site'
]); ?>
</div>
<div class="col6">
<?php echo template::button('themeSaveAdmin', [
'href' => helper::baseUrl() . 'theme/save/admin',
'ico' => 'download-cloud',
'value' => 'Thème de l\'administration'
]); ?>
</div>
</a>
</h4>
<div class="row">
<div class="col6">
<?php echo template::button('themeSave', [
'href' => helper::baseUrl() . 'theme/save/theme',
'ico' => 'download-cloud',
'value' => 'Thème du site'
]); ?>
</div>
</div>
</div>
<div class="col6">
<div class="block">
<h4>
<?php echo template::topic('Télécharger le thème'); ?>
</h4>
<div class="row">
<div class="col6">
<?php echo template::button('themeExport', [
'href' => helper::baseUrl() . 'theme/export/theme',
'ico' => 'download',
'value' => 'Thème du site'
]); ?>
</div>
<div class="col6">
<?php echo template::button('themeExport', [
'href' => helper::baseUrl() . 'theme/export/admin',
'ico' => 'download',
'value' => 'Thème de l\'administration'
]); ?>
</div>
<div class="col6">
<?php echo template::button('themeSaveAdmin', [
'href' => helper::baseUrl() . 'theme/save/admin',
'ico' => 'download-cloud',
'value' => 'Thème de l\'administration'
]); ?>
</div>
</div>
</div>
</div>
<div class="col6">
<div class="block">
<h4>
<?php echo template::topic('Télécharger le thème'); ?>
</h4>
<div class="row">
<div class="col6">
<?php echo template::button('themeExport', [
'href' => helper::baseUrl() . 'theme/export/theme',
'ico' => 'download',
'value' => 'Thème du site'
]); ?>
</div>
<div class="col6">
<?php echo template::button('themeExport', [
'href' => helper::baseUrl() . 'theme/export/admin',
'ico' => 'download',
'value' => 'Thème de l\'administration'
]); ?>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -2,18 +2,18 @@
<div class="row">
<div class="col1">
<?php echo template::button('themeMenuBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'theme',
'value' => template::ico('left')
]); ?>
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'theme',
'value' => template::ico('left')
]); ?>
</div>
<div class="col1">
<?php echo template::button('themeMenuHelp', [
'href' => 'https://doc.zwiicms.fr/menu',
'target' => '_blank',
'value' => template::ico('help'),
'class' => 'buttonHelp'
]); ?>
<?php echo template::button('themeMenuHelp', [
'href' => 'https://doc.zwiicms.fr/menu',
'target' => '_blank',
'value' => template::ico('help'),
'class' => 'buttonHelp'
]); ?>
</div>
<div class="col2 offset8">
<?php echo template::submit('themeMenuSubmit'); ?>
@ -23,60 +23,61 @@
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic(' Paramètres'); ?>
<?php echo template::topic(' Paramètres'); ?>
</h4>
<div class="row">
<div class="col6">
<?php
if ( $this->getData(['theme', 'header', 'position']) == "site")
{ echo template::select('themeMenuPosition', $module::$menuPositionsSite, [
if ($this->getData(['theme', 'header', 'position']) == "site") {
echo template::select('themeMenuPosition', $module::$menuPositionsSite, [
'label' => 'Position',
'selected' => $this->getData(['theme', 'menu', 'position'])
]);
}else{
echo template::select('themeMenuPosition', $module::$menuPositionsBody, [
'label' => 'Position',
'selected' => $this->getData(['theme', 'menu', 'position'])
]); }
} else {
echo template::select('themeMenuPosition', $module::$menuPositionsBody, [
'label' => 'Position',
'selected' => $this->getData(['theme', 'menu', 'position'])
]);
}
?>
</div>
<div class="col6">
<?php echo template::select('themeMenuWide', $module::$containerWides, [
'label' => 'Largeur',
'selected' => $this->getData(['theme', 'menu', 'wide'])
]); ?>
'label' => 'Largeur',
'selected' => $this->getData(['theme', 'menu', 'wide'])
]); ?>
</div>
</div>
<div class="row">
<div class="col4">
<div class="col4">
<?php echo template::select('themeMenuRadius', $module::$menuRadius, [
'label' => 'Bords arrondis',
'selected' => $this->getData(['theme', 'menu', 'radius']),
'help' => 'Autour de la page sélectionnée'
'label' => 'Bords arrondis',
'selected' => $this->getData(['theme', 'menu', 'radius']),
'help' => 'Autour de la page sélectionnée'
]); ?>
</div>
<div class="col4">
<?php echo template::select('themeMenuHeight', $module::$menuHeights, [
'label' => 'Hauteur',
'selected' => $this->getData(['theme', 'menu', 'height'])
]); ?>
'label' => 'Hauteur',
'selected' => $this->getData(['theme', 'menu', 'height'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('themeMenuTextAlign', $module::$aligns, [
'label' => 'Alignement du contenu',
'selected' => $this->getData(['theme', 'menu', 'textAlign'])
]); ?>
'label' => 'Alignement du contenu',
'selected' => $this->getData(['theme', 'menu', 'textAlign'])
]); ?>
</div>
</div>
<div id="themeMenuPositionOptions" class="displayNone">
<?php echo template::checkbox('themeMenuMargin', true, 'Aligner le menu avec le contenu', [
'checked' => $this->getData(['theme', 'menu', 'margin'])
]); ?>
'checked' => $this->getData(['theme', 'menu', 'margin'])
]); ?>
</div>
<div id="themeMenuPositionFixed" class="displayNone">
<?php echo template::checkbox('themeMenuFixed', true, 'Menu fixe', [
'checked' => $this->getData(['theme', 'menu', 'fixed'])
]); ?>
'checked' => $this->getData(['theme', 'menu', 'fixed'])
]); ?>
</div>
</div>
</div>
@ -89,36 +90,36 @@
</h4>
<div class="row">
<div class="col3">
<?php echo template::checkbox('themeMenuLoginLink', true, 'Lien de connexion', [
'checked' => $this->getData(['theme', 'menu', 'loginLink'])
]); ?>
<?php echo template::checkbox('themeMenuLoginLink', true, 'Lien de connexion', [
'checked' => $this->getData(['theme', 'menu', 'loginLink'])
]); ?>
</div>
<div class="col3">
<?php echo template::checkbox('themeMenuMemberBar', true, 'Barre de membre', [
'checked' => $this->getData(['theme', 'menu', 'memberBar']),
'help' => 'Icônes de gestion de compte et de déconnexion. Uniquement pour les membres connectés'
]); ?>
<?php echo template::checkbox('themeMenuMemberBar', true, 'Barre de membre', [
'checked' => $this->getData(['theme', 'menu', 'memberBar']),
'help' => 'Icônes de gestion de compte et de déconnexion. Uniquement pour les membres connectés'
]); ?>
</div>
<div class="col6">
<?php echo template::select('themeMenuBurgerContent', $module::$burgerContent, [
'label' => 'Affichage dans le menu burger',
'selected' => $this->getData(['theme', 'menu', 'burgerContent']),
'help' => 'Le menu burger remplace le menu complet lorsque la largeur de l\'écran n\'est pas suffisante.'
]); ?>
<?php echo template::select('themeMenuBurgerContent', $module::$burgerContent, [
'label' => 'Affichage dans le menu burger',
'selected' => $this->getData(['theme', 'menu', 'burgerContent']),
'help' => 'Le menu burger remplace le menu complet lorsque la largeur de l\'écran n\'est pas suffisante.'
]); ?>
</div>
</div>
<div class="row">
<div id="themeMenuBurgerLogoId" class="col6 offset6 <?php if( $this->getData(['theme', 'menu', 'burgerContent']) !== 'logo') echo 'displayNone';?>">
<?php
$imageFile = file_exists(self::FILE_DIR.'source/'.$this->getData(['theme', 'menu', 'burgerLogo'])) ?
$this->getData(['theme', 'menu', 'burgerLogo']) : "";
echo template::file('themeMenuBurgerLogo', [
'help' => 'Sélectionner une image de dimensions adaptées',
'label' => 'Logo du menu burger',
'type' => 1,
'value' => $imageFile
]); ?>
</div>
<div id="themeMenuBurgerLogoId" class="col6 offset6 <?php if ($this->getData(['theme', 'menu', 'burgerContent']) !== 'logo') echo 'displayNone'; ?>">
<?php
$imageFile = file_exists(self::FILE_DIR . 'source/' . $this->getData(['theme', 'menu', 'burgerLogo'])) ?
$this->getData(['theme', 'menu', 'burgerLogo']) : "";
echo template::file('themeMenuBurgerLogo', [
'help' => 'Sélectionner une image de dimensions adaptées',
'label' => 'Logo du menu burger',
'type' => 1,
'value' => $imageFile
]); ?>
</div>
</div>
</div>
</div>
@ -132,52 +133,52 @@
<div class="row">
<div class="col4">
<?php echo template::text('themeMenuTextColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Texte',
'value' => $this->getData(['theme', 'menu', 'textColor'])
]); ?>
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Texte',
'value' => $this->getData(['theme', 'menu', 'textColor'])
]); ?>
</div>
<div class="col4">
<?php echo template::text('themeMenuBackgroundColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Arrière-plan',
'value' => $this->getData(['theme', 'menu', 'backgroundColor'])
]); ?>
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Arrière-plan',
'value' => $this->getData(['theme', 'menu', 'backgroundColor'])
]); ?>
</div>
<div class="col4">
<?php echo template::text('themeMenuBackgroundColorSub', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Fond du sous-menu',
'value' => $this->getData(['theme', 'menu', 'backgroundColorSub'])
]); ?>
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Fond du sous-menu',
'value' => $this->getData(['theme', 'menu', 'backgroundColorSub'])
]); ?>
</div>
</div>
<div class="row">
<div class="col4">
<?php echo template::text('themeMenuActiveTextColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Texte page active',
'value' => $this->getData(['theme', 'menu', 'activeTextColor'])
]); ?>
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Texte page active',
'value' => $this->getData(['theme', 'menu', 'activeTextColor'])
]); ?>
</div>
<div class="col4 verticalAlignBottom">
<?php
echo template::checkbox('themeMenuActiveColorAuto', true, 'Couleur de fond automatique', [
echo template::checkbox('themeMenuActiveColorAuto', true, 'Couleur de fond automatique', [
'checked' => $this->getData(['theme', 'menu', 'activeColorAuto']),
'help' => 'La couleur de fond de la page active peut être définie automatique ou selon une couleur définie, comme par exemple celle de fond des pages.'
]); ?>
</div>
<div class="col4">
<?php echo template::text('themeMenuActiveColor', [
'class' => 'colorPicker',
'help' => 'Couleur de fond de la page sélectionnée dans le menu.<br>Le curseur horizontal règle le niveau de transparence.',
'label' => 'Fond page active',
'value' => $this->getData(['theme', 'menu', 'activeColor'])
]); ?>
'class' => 'colorPicker',
'help' => 'Couleur de fond de la page sélectionnée dans le menu.<br>Le curseur horizontal règle le niveau de transparence.',
'label' => 'Fond page active',
'value' => $this->getData(['theme', 'menu', 'activeColor'])
]); ?>
</div>
</div>
</div>
@ -192,31 +193,31 @@
<div class="row">
<div class="col6">
<?php echo template::select('themeMenuFont', $module::$fonts['name'], [
'label' => 'Fonte',
'selected' => $this->getData(['theme', 'menu', 'font']),
'fonts' => $module::$fonts['family']
]); ?>
'label' => 'Fonte',
'selected' => $this->getData(['theme', 'menu', 'font']),
'fonts' => $module::$fonts['family']
]); ?>
</div>
<div class="col6">
<?php echo template::select('themeMenuFontSize', $module::$menuFontSizes, [
'label' => 'Taille',
'help' => 'Proportionnelle à celle définie dans le site',
'selected' => $this->getData(['theme', 'menu', 'fontSize'])
]); ?>
'label' => 'Taille',
'help' => 'Proportionnelle à celle définie dans le site',
'selected' => $this->getData(['theme', 'menu', 'fontSize'])
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::select('themeMenuFontWeight', $module::$fontWeights, [
'label' => 'Style',
'selected' => $this->getData(['theme', 'menu', 'fontWeight'])
]); ?>
'label' => 'Style',
'selected' => $this->getData(['theme', 'menu', 'fontWeight'])
]); ?>
</div>
<div class="col6">
<?php echo template::select('themeMenuTextTransform', $module::$textTransforms, [
'label' => 'Casse',
'selected' => $this->getData(['theme', 'menu', 'textTransform'])
]); ?>
'label' => 'Casse',
'selected' => $this->getData(['theme', 'menu', 'textTransform'])
]); ?>
</div>
</div>
</div>

View File

@ -1,154 +1,153 @@
<?php echo template::formOpen('themeSiteForm'); ?>
<div class="row">
<div class="col1">
<?php echo template::button('themeSiteBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'theme',
'value' => template::ico('left')
]); ?>
</div>
<div class="col1">
<?php echo template::button('themeSiteHelp', [
'href' => 'https://doc.zwiicms.fr/site61863d315ffe0',
'target' => '_blank',
'value' => template::ico('help'),
'class' => 'buttonHelp'
]); ?>
</div>
<div class="col2 offset8">
<?php echo template::submit('themeSiteSubmit'); ?>
</div>
<div class="row">
<div class="col1">
<?php echo template::button('themeSiteBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'theme',
'value' => template::ico('left')
]); ?>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Paramètres'); ?>
</h4>
<div class="row">
<div class="col4">
<?php echo template::select('themeSiteWidth', $module::$siteWidths, [
'label' => 'Largeur du site',
'selected' => $this->getData(['theme', 'site', 'width'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('themeSiteRadius', $module::$radius, [
'label' => 'Arrondi des angles',
'selected' => $this->getData(['theme', 'site', 'radius'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('themeSiteShadow', $module::$shadows, [
'label' => 'Ombre sur les bords du site',
'selected' => $this->getData(['theme', 'site', 'shadow'])
]); ?>
</div>
<div class="col1">
<?php echo template::button('themeSiteHelp', [
'href' => 'https://doc.zwiicms.fr/site61863d315ffe0',
'target' => '_blank',
'value' => template::ico('help'),
'class' => 'buttonHelp'
]); ?>
</div>
<div class="col2 offset8">
<?php echo template::submit('themeSiteSubmit'); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Paramètres'); ?>
</h4>
<div class="row">
<div class="col4">
<?php echo template::select('themeSiteWidth', $module::$siteWidths, [
'label' => 'Largeur du site',
'selected' => $this->getData(['theme', 'site', 'width'])
]); ?>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('themeSiteMargin',true, 'Pas de marge au-dessus et en-dessous du site', [
'checked' => $this->getData(['theme', 'site', 'margin'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('themeSiteRadius', $module::$radius, [
'label' => 'Arrondi des angles',
'selected' => $this->getData(['theme', 'site', 'radius'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('themeSiteShadow', $module::$shadows, [
'label' => 'Ombre sur les bords du site',
'selected' => $this->getData(['theme', 'site', 'shadow'])
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('themeSiteMargin', true, 'Pas de marge au-dessus et en-dessous du site', [
'checked' => $this->getData(['theme', 'site', 'margin'])
]); ?>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Couleurs'); ?>
</h4>
<div class="row">
<div class="col8">
<div class="row">
<div class="col6">
<?php echo template::text('themeSiteBackgroundColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Arrière-plan',
'value' => $this->getData(['theme', 'site', 'backgroundColor'])
]); ?>
</div>
<div class="col6">
<?php echo template::text('themeTextTextColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Texte',
'value' => $this->getData(['theme', 'text', 'textColor'])
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Couleurs'); ?>
</h4>
<div class="row">
<div class="col8">
<div class="row">
<div class="col6">
<?php echo template::text('themeSiteBackgroundColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Arrière-plan',
'value' => $this->getData(['theme', 'site', 'backgroundColor'])
]); ?>
</div>
<div class="row">
<div class="col6">
<?php echo template::text('themeTitleTextColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Titres',
'value' => $this->getData(['theme', 'title', 'textColor'])
]); ?>
</div>
<div class="col6">
<?php echo template::text('themeTextLinkColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Liens',
'value' => $this->getData(['theme', 'text', 'linkColor'])
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::text('themeBlockBackgroundColor', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Arrière-plan des blocs',
'value' => $this->getData(['theme', 'block', 'backgroundColor'])
]); ?>
</div>
<div class="col6">
<?php echo template::text('themeBlockBorderColor', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Bordure des blocs',
'value' => $this->getData(['theme', 'block', 'borderColor'])
]); ?>
</div>
</div>
<div class="row">
<div class="col6 offset3">
<?php echo template::text('themeButtonBackgroundColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Boutons',
'value' => $this->getData(['theme', 'button', 'backgroundColor'])
]); ?>
</div>
<div class="col6">
<?php echo template::text('themeTextTextColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Texte',
'value' => $this->getData(['theme', 'text', 'textColor'])
]); ?>
</div>
</div>
<div class="col4 bodybackground">
<div class="bgPreview">
<div class="row">
<div class="col6">
<h1 class="headerPreview">Titre</h1>
<h2 class="headerPreview">Sous-titre </h2>
</div>
<div class="col6">
<?php echo template::button('themeSiteSubmitButtonPreview', [
'class' => 'buttonSubmitPreview',
'value' => 'Bouton'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<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>
<p><a href="#" class="urlPreview">Lorem ipsum dolor sit amet.</a></p>
</div>
<div class="row">
<div class="col6">
<?php echo template::text('themeTitleTextColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Titres',
'value' => $this->getData(['theme', 'title', 'textColor'])
]); ?>
</div>
<div class="col6">
<?php echo template::text('themeTextLinkColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Liens',
'value' => $this->getData(['theme', 'text', 'linkColor'])
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::text('themeBlockBackgroundColor', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Arrière-plan des blocs',
'value' => $this->getData(['theme', 'block', 'backgroundColor'])
]); ?>
</div>
<div class="col6">
<?php echo template::text('themeBlockBorderColor', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Bordure des blocs',
'value' => $this->getData(['theme', 'block', 'borderColor'])
]); ?>
</div>
</div>
<div class="row">
<div class="col6 offset3">
<?php echo template::text('themeButtonBackgroundColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Boutons',
'value' => $this->getData(['theme', 'button', 'backgroundColor'])
]); ?>
</div>
</div>
</div>
<div class="col4 bodybackground">
<div class="bgPreview">
<div class="row">
<div class="col6">
<h1 class="headerPreview">Titre</h1>
<h2 class="headerPreview">Sous-titre </h2>
</div>
<div class="col6">
<?php echo template::button('themeSiteSubmitButtonPreview', [
'class' => 'buttonSubmitPreview',
'value' => 'Bouton'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<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>
<p><a href="#" class="urlPreview">Lorem ipsum dolor sit amet.</a></p>
</div>
</div>
</div>
@ -157,58 +156,59 @@
</div>
</div>
</div>
<div class="row">
<div class="col6">
<div class="block">
<h4>
<?php echo template::topic('Mise en forme du texte'); ?>
</h4>
<div class="row">
<div class="col6">
<?php
echo template::select('themeTextFont', $module::$fonts['name'], [
'label' => 'Fonte',
'selected' => $this->getData(['theme', 'text', 'font']),
'fonts' => $module::$fonts['family']
]); ?>
</div>
<div class="col6">
<?php echo template::select('themeTextFontSize', $module::$siteFontSizes, [
'label' => 'Taille',
'help' => 'Taille de référence pour le site. Les tailles des polices de la bannière, de menu et de pied de page sont proportionnelles à cette taille.',
'selected' => $this->getData(['theme', 'text', 'fontSize'])
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<div class="block">
<h4>
<?php echo template::topic('Mise en forme du texte'); ?>
</h4>
<div class="row">
<div class="col6">
<?php
echo template::select('themeTextFont', $module::$fonts['name'], [
'label' => 'Fonte',
'selected' => $this->getData(['theme', 'text', 'font']),
'fonts' => $module::$fonts['family']
]); ?>
</div>
</div>
</div>
<div class="col6">
<div class="block">
<h4>
<?php echo template::topic('Mise en forme des titres'); ?>
</h4>
<div class="row">
<div class="col4">
<?php echo template::select('themeTitleFont', $module::$fonts['name'] , [
'label' => 'Fonte',
'selected' => $this->getData(['theme', 'title', 'font']),
'fonts' => $module::$fonts['family']
]); ?>
</div>
<div class="col4">
<?php echo template::select('themeTitleFontWeight', $module::$fontWeights, [
'label' => 'Style',
'selected' => $this->getData(['theme', 'title', 'fontWeight'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('themeTitleTextTransform', $module::$textTransforms, [
'label' => 'Casse',
'selected' => $this->getData(['theme', 'title', 'textTransform'])
]); ?>
</div>
<div class="col6">
<?php echo template::select('themeTextFontSize', $module::$siteFontSizes, [
'label' => 'Taille',
'help' => 'Taille de référence pour le site. Les tailles des polices de la bannière, de menu et de pied de page sont proportionnelles à cette taille.',
'selected' => $this->getData(['theme', 'text', 'fontSize'])
]); ?>
</div>
</div>
</div>
</div>
<div class="col6">
<div class="block">
<h4>
<?php echo template::topic('Mise en forme des titres'); ?>
</h4>
<div class="row">
<div class="col4">
<?php echo template::select('themeTitleFont', $module::$fonts['name'], [
'label' => 'Fonte',
'selected' => $this->getData(['theme', 'title', 'font']),
'fonts' => $module::$fonts['family']
]); ?>
</div>
<div class="col4">
<?php echo template::select('themeTitleFontWeight', $module::$fontWeights, [
'label' => 'Style',
'selected' => $this->getData(['theme', 'title', 'fontWeight'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('themeTitleTextTransform', $module::$textTransforms, [
'label' => 'Casse',
'selected' => $this->getData(['theme', 'title', 'textTransform'])
]); ?>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -13,7 +13,8 @@
* @link http://zwiicms.fr/
*/
class translate extends common {
class translate extends common
{
public static $actions = [
'index' => self::GROUP_ADMIN,
@ -45,7 +46,8 @@ class translate extends common {
/**
* Configuration avancée des langues
*/
public function copy() {
public function copy()
{
// Soumission du formulaire
if ($this->isPost()) {
@ -55,20 +57,20 @@ class translate extends common {
$toCreate = $this->getInput('translateFormCopyTarget');
if ($copyFrom !== $toCreate) {
// Création du dossier
if (is_dir(self::DATA_DIR . $toCreate) === false ) { // Si le dossier est déjà créé
$success = mkdir (self::DATA_DIR . $toCreate, 0755);
$success = mkdir (self::DATA_DIR . $toCreate.'/content', 0755);
if (is_dir(self::DATA_DIR . $toCreate) === false) { // Si le dossier est déjà créé
$success = mkdir(self::DATA_DIR . $toCreate, 0755);
$success = mkdir(self::DATA_DIR . $toCreate . '/content', 0755);
} else {
$success = true;
}
// Copier les données par défaut avec gestion des erreurs
$success = (copy (self::DATA_DIR . $copyFrom . '/locale.json', self::DATA_DIR . $toCreate . '/locale.json') === true && $success === true) ? true : false;
$success = (copy (self::DATA_DIR . $copyFrom . '/module.json', self::DATA_DIR . $toCreate . '/module.json') === true && $success === true) ? true : false;
$success = (copy (self::DATA_DIR . $copyFrom . '/page.json', self::DATA_DIR . $toCreate . '/page.json') === true && $success === true) ? true : false;
$success = ($this->copyDir (self::DATA_DIR . $copyFrom . '/content', self::DATA_DIR . $toCreate . '/content') === true && $success === true) ? true : false;
$success = (copy(self::DATA_DIR . $copyFrom . '/locale.json', self::DATA_DIR . $toCreate . '/locale.json') === true && $success === true) ? true : false;
$success = (copy(self::DATA_DIR . $copyFrom . '/module.json', self::DATA_DIR . $toCreate . '/module.json') === true && $success === true) ? true : false;
$success = (copy(self::DATA_DIR . $copyFrom . '/page.json', self::DATA_DIR . $toCreate . '/page.json') === true && $success === true) ? true : false;
$success = ($this->copyDir(self::DATA_DIR . $copyFrom . '/content', self::DATA_DIR . $toCreate . '/content') === true && $success === true) ? true : false;
// Enregistrer la langue
if ($success) {
$this->setData(['config', 'i18n', $toCreate, 'site' ]);
$this->setData(['config', 'i18n', $toCreate, 'site']);
$notification = 'Données ' . self::$languages[$copyFrom] . ' copiées vers ' . self::$languages[$toCreate];
} else {
$notification = "Quelque chose n\'a pas fonctionné, vérifiez les permissions.";
@ -87,7 +89,7 @@ class translate extends common {
}
// Tableau des langues installées
foreach (self::$languages as $key => $value) {
if ($this->getData(['config','i18n', $key]) === 'site') {
if ($this->getData(['config', 'i18n', $key]) === 'site') {
self::$languagesTarget[$key] = $value;
}
}
@ -104,13 +106,14 @@ class translate extends common {
/**
* Configuration
*/
public function index() {
public function index()
{
// Soumission du formulaire
if($this->isPost()) {
if ($this->isPost()) {
// Sauvegarder les langues de contenu
$this->setData(['config', 'i18n','interface', $this->getInput('translateUI')]);
$this->setData(['config', 'i18n', 'interface', $this->getInput('translateUI')]);
// Valeurs en sortie
$this->addOutput([
@ -126,26 +129,25 @@ class translate extends common {
// Onglet des langues de contenu
foreach (self::$languages as $keyi18n => $value) {
// tableau des langues installées
if (is_dir(self::DATA_DIR . $keyi18n) ) {
self::$languagesInstalled [] = [
template::flag($keyi18n, '50%') ,
$value . ' (' . $keyi18n . ')' ,
if (is_dir(self::DATA_DIR . $keyi18n)) {
self::$languagesInstalled[] = [
template::flag($keyi18n, '50%'),
$value . ' (' . $keyi18n . ')',
self::$i18nUI === $keyi18n ? '(langue de l\'interface)' : '',
'',
template::button('translateContentLanguageEdit' . $keyi18n, [
'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $keyi18n. '/' . $_SESSION['csrf'],
'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $keyi18n . '/' . $_SESSION['csrf'],
'value' => template::ico('flag'),
'help' => 'Editer les locales'
]),
template::button('translateContentLanguageDelete' .$keyi18n, [
'class' => 'translateDelete buttonRed' . (self::$i18nUI === $keyi18n ? ' disabled' : '') ,
template::button('translateContentLanguageDelete' . $keyi18n, [
'class' => 'translateDelete buttonRed' . (self::$i18nUI === $keyi18n ? ' disabled' : ''),
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $keyi18n . '/' . $_SESSION['csrf'],
'value' => template::ico('trash'),
'help' => 'Supprimer cette langue'
])
];
}
}
// Activation du bouton de copie
self::$siteCopy = count(self::$languagesInstalled) > 1 ? false : true;
@ -156,10 +158,10 @@ class translate extends common {
chdir(self::I18N_DIR);
$files = glob('*.json');
// Ajouter une clé au tableau avec le code de langue
foreach( $files as $file) {
foreach ($files as $file) {
// La langue est-elle référencée ?
if (array_key_exists(basename($file, '.json'), self::$languages)) {
self::$i18nFiles[basename($file, '.json')] = self::$languages[basename($file, '.json')];
self::$i18nFiles[basename($file, '.json')] = self::$languages[basename($file, '.json')];
}
}
chdir($dir);
@ -177,10 +179,11 @@ class translate extends common {
* Ajouter une langue de contenu
*/
public function add() {
public function add()
{
// Soumission du formulaire
if($this->isPost()) {
if ($this->isPost()) {
// Création du contenu
$lang = $this->getInput('translateAddContent');
@ -193,7 +196,7 @@ class translate extends common {
// Sus-dossier localisé
if (!file_exists(self::DATA_DIR . $lang)) {
mkdir (self::DATA_DIR . $lang, 0755);
mkdir(self::DATA_DIR . $lang, 0755);
}
// Initialiser la classe
@ -204,9 +207,8 @@ class translate extends common {
]);;
// Capturer et sauver
$db->set($key,init::$defaultData[$key]);
$db->set($key, init::$defaultData[$key]);
$db->save;
}
@ -224,8 +226,8 @@ class translate extends common {
// Tableau des langues non installées
foreach (self::$languages as $key => $value) {
if (!is_dir( self::DATA_DIR . $key))
self::$i18nFiles [$key] = $value;
if (!is_dir(self::DATA_DIR . $key))
self::$i18nFiles[$key] = $value;
}
// Valeurs en sortie
@ -233,13 +235,14 @@ class translate extends common {
'title' => 'Ajouter',
'view' => 'add'
]);
}
public function edit() {
public function edit()
{
// Jeton incorrect ou URl avec le code langue incorrecte
if ( $this->getUrl(3) !== $_SESSION['csrf']
if (
$this->getUrl(3) !== $_SESSION['csrf']
|| !array_key_exists($this->getUrl(2), self::$languages)
) {
// Valeurs en sortie
@ -251,39 +254,40 @@ class translate extends common {
}
// Soumission du formulaire
if($this->isPost()) {
if ($this->isPost()) {
// Sauvegarder les locales
$data = ['locale' => [
'homePageId' => $this->getInput('localeHomePageId', helper::FILTER_ID, true),
'page404' => $this->getInput('localePage404'),
'page403' => $this->getInput('localePage403'),
'page302' => $this->getInput('localePage302'),
'legalPageId' => $this->getInput('localeLegalPageId'),
'searchPageId' => $this->getInput('localeSearchPageId'),
'searchPageLabel' => empty($this->getInput('localeSearchPageLabel', helper::FILTER_STRING_SHORT)) ? 'Rechercher' : $this->getInput('localeSearchPageLabel', helper::FILTER_STRING_SHORT),
'legalPageLabel' => empty($this->getInput('localeLegalPageLabel', helper::FILTER_STRING_SHORT)) ? 'Mentions légales' : $this->getInput('localeLegalPageLabel', helper::FILTER_STRING_SHORT),
'sitemapPageLabel' => empty($this->getInput('localeSitemapPageLabel', helper::FILTER_STRING_SHORT)) ? 'Plan du site' : $this->getInput('localeSitemapPageLabel', helper::FILTER_STRING_SHORT),
'metaDescription' => $this->getInput('localeMetaDescription', helper::FILTER_STRING_LONG, true),
'title' => $this->getInput('localeTitle', helper::FILTER_STRING_SHORT, true),
'cookies' => [
// Les champs sont obligatoires si l'option consentement des cookies est active
'mainLabel' => $this->getInput('localeCookiesZwiiText', helper::FILTER_STRING_LONG, $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN)),
'titleLabel' => $this->getInput('localeCookiesTitleText', helper::FILTER_STRING_SHORT, $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN)),
'linkLegalLabel' => $this->getInput('localeCookiesLinkMlText', helper::FILTER_STRING_SHORT, $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN)),
'cookiesFooterText' => $this->getInput('localeCookiesFooterText', helper::FILTER_STRING_SHORT, $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN)),
'buttonValidLabel' =>$this->getInput('localeCookiesButtonText', helper::FILTER_STRING_SHORT, $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN))
]
$data = [
'locale' => [
'homePageId' => $this->getInput('localeHomePageId', helper::FILTER_ID, true),
'page404' => $this->getInput('localePage404'),
'page403' => $this->getInput('localePage403'),
'page302' => $this->getInput('localePage302'),
'legalPageId' => $this->getInput('localeLegalPageId'),
'searchPageId' => $this->getInput('localeSearchPageId'),
'searchPageLabel' => empty($this->getInput('localeSearchPageLabel', helper::FILTER_STRING_SHORT)) ? 'Rechercher' : $this->getInput('localeSearchPageLabel', helper::FILTER_STRING_SHORT),
'legalPageLabel' => empty($this->getInput('localeLegalPageLabel', helper::FILTER_STRING_SHORT)) ? 'Mentions légales' : $this->getInput('localeLegalPageLabel', helper::FILTER_STRING_SHORT),
'sitemapPageLabel' => empty($this->getInput('localeSitemapPageLabel', helper::FILTER_STRING_SHORT)) ? 'Plan du site' : $this->getInput('localeSitemapPageLabel', helper::FILTER_STRING_SHORT),
'metaDescription' => $this->getInput('localeMetaDescription', helper::FILTER_STRING_LONG, true),
'title' => $this->getInput('localeTitle', helper::FILTER_STRING_SHORT, true),
'cookies' => [
// Les champs sont obligatoires si l'option consentement des cookies est active
'mainLabel' => $this->getInput('localeCookiesZwiiText', helper::FILTER_STRING_LONG, $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN)),
'titleLabel' => $this->getInput('localeCookiesTitleText', helper::FILTER_STRING_SHORT, $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN)),
'linkLegalLabel' => $this->getInput('localeCookiesLinkMlText', helper::FILTER_STRING_SHORT, $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN)),
'cookiesFooterText' => $this->getInput('localeCookiesFooterText', helper::FILTER_STRING_SHORT, $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN)),
'buttonValidLabel' => $this->getInput('localeCookiesButtonText', helper::FILTER_STRING_SHORT, $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN))
]
]
];
// Sauvegarde hors méthodes si la langue n'est pas celle de l'UI
if ( $this->getUrl(2) === self::$i18nUI ) {
if ($this->getUrl(2) === self::$i18nUI) {
// Enregistrer les données par lecture directe du formulaire
$this->setData(['locale', $data['locale'] ]);
$this->setData(['locale', $data['locale']]);
} else {
// Sauver sur le disque
file_put_contents (self::DATA_DIR . $this->getUrl(2) . '/locale.json', json_encode($data, JSON_UNESCAPED_UNICODE), LOCK_EX);
file_put_contents(self::DATA_DIR . $this->getUrl(2) . '/locale.json', json_encode($data, JSON_UNESCAPED_UNICODE), LOCK_EX);
}
// Valeurs en sortie
@ -300,7 +304,7 @@ class translate extends common {
// Récupération des locales de la langue sélectionnée
// Vérifier la conformité de l'URL
if ( !array_key_exists($this->getUrl(2), self::$languages)) {
if (!array_key_exists($this->getUrl(2), self::$languages)) {
// Bidouillage de l'URL, on sort
// Valeurs en sortie
$this->addOutput([
@ -311,27 +315,31 @@ class translate extends common {
}
//Lecture des données pour transmission au formulaire
// La locale est-elle celle de la langue de l'UI ?
if ( $this->getUrl(2) === self::$i18nUI) {
self::$locales [$this->getUrl(2)]['locale'] = $this->getData(['locale']);
if ($this->getUrl(2) === self::$i18nUI) {
self::$locales[$this->getUrl(2)]['locale'] = $this->getData(['locale']);
} else {
// Lire les locales sans passer par les méthodes
self::$locales [$this->getUrl(2)] = json_decode(file_get_contents(self::DATA_DIR . $this->getUrl(2) . '/locale.json'), true);
self::$locales[$this->getUrl(2)] = json_decode(file_get_contents(self::DATA_DIR . $this->getUrl(2) . '/locale.json'), true);
}
// Générer la liste des pages disponibles
self::$pagesList = $this->getData(['page']);
foreach(self::$pagesList as $page => $pageId) {
if ($this->getData(['page',$page,'block']) === 'bar' ||
$this->getData(['page',$page,'disable']) === true) {
foreach (self::$pagesList as $page => $pageId) {
if (
$this->getData(['page', $page, 'block']) === 'bar' ||
$this->getData(['page', $page, 'disable']) === true
) {
unset(self::$pagesList[$page]);
}
}
self::$orphansList = $this->getData(['page']);
foreach(self::$orphansList as $page => $pageId) {
if ($this->getData(['page',$page,'block']) === 'bar' ||
$this->getData(['page',$page,'disable']) === true ||
$this->getdata(['page',$page, 'position']) !== 0) {
foreach (self::$orphansList as $page => $pageId) {
if (
$this->getData(['page', $page, 'block']) === 'bar' ||
$this->getData(['page', $page, 'disable']) === true ||
$this->getdata(['page', $page, 'position']) !== 0
) {
unset(self::$orphansList[$page]);
}
}
@ -346,21 +354,24 @@ class translate extends common {
/***
* Effacer une langue de contenu
*/
public function delete() {
public function delete()
{
// Jeton incorrect ou URl avec le code langue incorrecte
if ( $this->getUrl(3) !== $_SESSION['csrf']
|| !array_key_exists($this->getUrl(2), self::$languages) ) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'translate',
'state' => false,
'notification' => 'Action non autorisée'
]);
if (
$this->getUrl(3) !== $_SESSION['csrf']
|| !array_key_exists($this->getUrl(2), self::$languages)
) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'translate',
'state' => false,
'notification' => 'Action non autorisée'
]);
}
// Effacement d'une langue installée
if ( is_dir( self::DATA_DIR . $this->getUrl(2) ) === true ) {
$success = $this->removeDir( self::DATA_DIR . $this->getUrl(2));
if (is_dir(self::DATA_DIR . $this->getUrl(2)) === true) {
$success = $this->removeDir(self::DATA_DIR . $this->getUrl(2));
}
// Valeurs en sortie
$this->addOutput([
@ -374,21 +385,22 @@ class translate extends common {
* Traitement du changement de langue
* Fonction utilisée par le noyau
*/
public function i18n() {
public function i18n()
{
// Activation du drapeau
if ( $this->getInput('ZWII_I18N_' . strtoupper($this->getUrl(3))) !== $this->getUrl(2) ) {
if ($this->getInput('ZWII_I18N_' . strtoupper($this->getUrl(3))) !== $this->getUrl(2)) {
// Nettoyer et stocker le choix de l'utilisateur
helper::deleteCookie('ZWII_I18N_SITE');
// Sélectionner
setcookie('ZWII_I18N_' . strtoupper($this->getUrl(3)) , $this->getUrl(2), time() + 3600, helper::baseUrl(false, false) , '', helper::isHttps(), true);
// Désactivation du drapeau, langue FR par défaut
setcookie('ZWII_I18N_' . strtoupper($this->getUrl(3)), $this->getUrl(2), time() + 3600, helper::baseUrl(false, false), '', helper::isHttps(), true);
// Désactivation du drapeau, langue FR par défaut
} else {
setcookie('ZWII_I18N_SITE' , 'fr', time() + 3600, helper::baseUrl(false, false) , '', helper::isHttps(), true);
setcookie('ZWII_I18N_SITE', 'fr', time() + 3600, helper::baseUrl(false, false), '', helper::isHttps(), true);
}
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getData(['locale', $this->getUrl(2), 'homePageId' ])
'redirect' => helper::baseUrl() . $this->getData(['locale', $this->getUrl(2), 'homePageId'])
]);
}
}

View File

@ -1,31 +1,30 @@
<?php echo template::formOpen('translateAddForm'); ?>
<div class="row">
<div class="col1">
<?php echo template::button('translateFormBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'translate',
'value' => template::ico('left')
]); ?>
</div>
<div class="col2 offset9">
<?php echo template::submit('translateFormSubmit'); ?>
</div>
<div class="row">
<div class="col1">
<?php echo template::button('translateFormBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'translate',
'value' => template::ico('left')
]); ?>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Ajout d\'une longue de contenu'); ?>
</h4>
<div class="row">
<div class="col4 offset4">
<?php echo template::select('translateAddContent', $module::$i18nFiles, [
'label' => 'Langues disponibles'
]); ?>
</div>
<div class="col2 offset9">
<?php echo template::submit('translateFormSubmit'); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Ajout d\'une longue de contenu'); ?>
</h4>
<div class="row">
<div class="col4 offset4">
<?php echo template::select('translateAddContent', $module::$i18nFiles, [
'label' => 'Langues disponibles'
]); ?>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -14,7 +14,7 @@
</div>
</div>
<div class="row">
<div class="col12">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Copie des traductions rédigées'); ?>
@ -23,12 +23,12 @@
<div class="col6">
<?php echo template::select('translateFormCopySource', $module::$languagesInstalled, [
'label' => 'Pages et les modules de'
]); ?>
]); ?>
</div>
<div class="col6">
<?php echo template::select('translateFormCopyTarget', $module::$languagesTarget, [
'label' => 'Vers'
]); ?>
]); ?>
</div>
</div>
</div>

View File

@ -1,201 +1,200 @@
<?php echo template::formOpen('translateLocaleForm'); ?>
<div class="row">
<div class="col1">
<?php echo template::button('translateFormBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'translate',
'value' => template::ico('left')
]); ?>
</div>
<div class="col2 offset9">
<?php echo template::submit('translateFormSubmit'); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Identité du site
<span id="localeHelpButton" class="helpDisplayButton" title="Cliquer pour consulter l'aide en ligne">
<a href="https://doc.zwiicms.fr/localisation-et-identite" target="_blank">
<?php echo template::ico('help', ['margin' => 'left']);?>
</a>
</span>
</h4>
<div class="row">
<div class="col12">
<?php echo template::text('localeTitle', [
'label' => 'Titre du site' ,
'value' => $module::$locales[$this->getUrl(2)]['locale']['title'],
'help' => 'Il apparaît dans la barre de titre et les partages sur les réseaux sociaux.'
]); ?>
</div>
<div class="row">
<div class="col1">
<?php echo template::button('translateFormBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'translate',
'value' => template::ico('left')
]); ?>
</div>
<div class="col2 offset9">
<?php echo template::submit('translateFormSubmit'); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Identité du site
<span id="localeHelpButton" class="helpDisplayButton" title="Cliquer pour consulter l'aide en ligne">
<a href="https://doc.zwiicms.fr/localisation-et-identite" target="_blank">
<?php echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>
</h4>
<div class="row">
<div class="col12">
<?php echo template::text('localeTitle', [
'label' => 'Titre du site',
'value' => $module::$locales[$this->getUrl(2)]['locale']['title'],
'help' => 'Il apparaît dans la barre de titre et les partages sur les réseaux sociaux.'
]); ?>
</div>
<div class="row">
<div class="col12">
<?php echo template::textarea('localeMetaDescription', [
'label' => 'Description du site',
'value' => $module::$locales[$this->getUrl(2)]['locale']['metaDescription'],
'help' => 'La description d\'une page participe à son référencement, chaque page doit disposer d\'une description différente.'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::textarea('localeMetaDescription', [
'label' => 'Description du site',
'value' => $module::$locales[$this->getUrl(2)]['locale']['metaDescription'],
'help' => 'La description d\'une page participe à son référencement, chaque page doit disposer d\'une description différente.'
]); ?>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Assignation des pages spéciales
<span id="localeHelpButton" class="helpDisplayButton" title="Cliquer pour consulter l'aide en ligne">
<a href="https://doc.zwiicms.fr/localisation-et-identite" target="_blank">
<?php echo template::ico('help', ['margin' => 'left']);?>
</a>
</span>
</h4>
<div class="row">
<div class="col4">
<?php echo template::select('localeHomePageId', helper::arrayColumn($module::$pagesList, 'title', 'SORT_ASC'), [
'label' => 'Accueil du site',
'selected' =>$module::$locales[$this->getUrl(2)]['locale'][ 'homePageId'],
'help' => 'La première page que vos visiteurs verront.'
]); ?>
</div>
<div class="col4">
<?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',
'selected' =>$module::$locales[$this->getUrl(2)]['locale']['page403'],
'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.'
]); ?>
</div>
<div class="col4">
<?php echo template::select('localePage404', array_merge(['none' => 'Page par défaut'],helper::arrayColumn($module::$orphansList, 'title', 'SORT_ASC')), [
'label' => 'Page inexistante, erreur 404',
'selected' =>$module::$locales[$this->getUrl(2)]['locale']['page404'],
'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Assignation des pages spéciales
<span id="localeHelpButton" class="helpDisplayButton" title="Cliquer pour consulter l'aide en ligne">
<a href="https://doc.zwiicms.fr/localisation-et-identite" target="_blank">
<?php echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>
</h4>
<div class="row">
<div class="col4">
<?php echo template::select('localeHomePageId', helper::arrayColumn($module::$pagesList, 'title', 'SORT_ASC'), [
'label' => 'Accueil du site',
'selected' => $module::$locales[$this->getUrl(2)]['locale']['homePageId'],
'help' => 'La première page que vos visiteurs verront.'
]); ?>
</div>
<div class="row">
<div class="col4">
<?php echo template::select('localeLegalPageId', array_merge(['none' => 'Aucune'] , helper::arrayColumn($module::$pagesList, 'title', 'SORT_ASC') ) , [
'label' => 'Mentions légales',
'selected' => $module::$locales[$this->getUrl(2)]['locale']['legalPageId'],
'help' => 'Les mentions légales sont obligatoires en France. Une option du pied de page ajoute un lien discret vers cette page.'
]); ?>
</div>
<div class="col4">
<?php echo template::select('localeSearchPageId', array_merge(['none' => 'Aucune'] , helper::arrayColumn($module::$pagesList, 'title', 'SORT_ASC') ) , [
'label' => 'Recherche dans le site',
'selected' => $module::$locales[$this->getUrl(2)]['locale']['searchPageId'],
'help' => 'Sélectionnez une page contenant le module \'Recherche\'. Une option du pied de page ajoute un lien discret vers cette page.'
]); ?>
</div>
<div class="col4">
<?php
echo template::select('localePage302', array_merge(['none' => 'Page par défaut'],helper::arrayColumn($module::$orphansList, 'title', 'SORT_ASC')), [
'label' => 'Site en maintenance',
'selected' =>$module::$locales[$this->getUrl(2)]['locale']['page302'],
'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.'
]); ?>
</div>
<div class="col4">
<?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',
'selected' => $module::$locales[$this->getUrl(2)]['locale']['page403'],
'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.'
]); ?>
</div>
<div class="col4">
<?php echo template::select('localePage404', array_merge(['none' => 'Page par défaut'], helper::arrayColumn($module::$orphansList, 'title', 'SORT_ASC')), [
'label' => 'Page inexistante, erreur 404',
'selected' => $module::$locales[$this->getUrl(2)]['locale']['page404'],
'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.'
]); ?>
</div>
</div>
<div class="row">
<div class="col4">
<?php echo template::select('localeLegalPageId', array_merge(['none' => 'Aucune'], helper::arrayColumn($module::$pagesList, 'title', 'SORT_ASC')), [
'label' => 'Mentions légales',
'selected' => $module::$locales[$this->getUrl(2)]['locale']['legalPageId'],
'help' => 'Les mentions légales sont obligatoires en France. Une option du pied de page ajoute un lien discret vers cette page.'
]); ?>
</div>
<div class="col4">
<?php echo template::select('localeSearchPageId', array_merge(['none' => 'Aucune'], helper::arrayColumn($module::$pagesList, 'title', 'SORT_ASC')), [
'label' => 'Recherche dans le site',
'selected' => $module::$locales[$this->getUrl(2)]['locale']['searchPageId'],
'help' => 'Sélectionnez une page contenant le module \'Recherche\'. Une option du pied de page ajoute un lien discret vers cette page.'
]); ?>
</div>
<div class="col4">
<?php
echo template::select('localePage302', array_merge(['none' => 'Page par défaut'], helper::arrayColumn($module::$orphansList, 'title', 'SORT_ASC')), [
'label' => 'Site en maintenance',
'selected' => $module::$locales[$this->getUrl(2)]['locale']['page302'],
'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.'
]); ?>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Etiquettes des pages spéciales
<span id="labelHelpButton" class="helpDisplayButton" title="Cliquer pour consulter l'aide en ligne">
<a href="https://doc.zwiicms.fr/etiquettes-des-pages-speciales" target="_blank">
<?php echo template::ico('help', ['margin' => 'left']);?>
</a>
</span>
</h4>
<div class="row">
<div class="col6">
<?php echo template::text('localeLegalPageLabel', [
'label' => 'Mentions légales',
'placeholder' => 'Mentions légales',
'value' => $module::$locales[$this->getUrl(2)]['locale']['legalPageLabel']
]); ?>
</div>
<div class="col6">
<?php echo template::text('localeSearchPageLabel', [
'label' => 'Rechercher',
'placeholder' => 'Rechercher',
'value' => $module::$locales[$this->getUrl(2)]['locale']['searchPageLabel']
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Etiquettes des pages spéciales
<span id="labelHelpButton" class="helpDisplayButton" title="Cliquer pour consulter l'aide en ligne">
<a href="https://doc.zwiicms.fr/etiquettes-des-pages-speciales" target="_blank">
<?php echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>
</h4>
<div class="row">
<div class="col6">
<?php echo template::text('localeLegalPageLabel', [
'label' => 'Mentions légales',
'placeholder' => 'Mentions légales',
'value' => $module::$locales[$this->getUrl(2)]['locale']['legalPageLabel']
]); ?>
</div>
<div class="row">
<div class="col6">
<?php echo template::text('localeSitemapPageLabel', [
'label' => 'Plan du site',
'placeholder' => 'Plan du site',
'value' => $module::$locales[$this->getUrl(2)]['locale']['sitemapPageLabel'],
]); ?>
</div>
<div class="col6">
<?php echo template::text('localeCookiesFooterText', [
'label' => 'Cookies',
'value' => $module::$locales[$this->getUrl(2)]['locale']['cookies']['cookiesFooterText'],
'placeHolder' => 'Cookies'
]); ?>
</div>
<div class="col6">
<?php echo template::text('localeSearchPageLabel', [
'label' => 'Rechercher',
'placeholder' => 'Rechercher',
'value' => $module::$locales[$this->getUrl(2)]['locale']['searchPageLabel']
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::text('localeSitemapPageLabel', [
'label' => 'Plan du site',
'placeholder' => 'Plan du site',
'value' => $module::$locales[$this->getUrl(2)]['locale']['sitemapPageLabel'],
]); ?>
</div>
<div class="col6">
<?php echo template::text('localeCookiesFooterText', [
'label' => 'Cookies',
'value' => $module::$locales[$this->getUrl(2)]['locale']['cookies']['cookiesFooterText'],
'placeHolder' => 'Cookies'
]); ?>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Message d'acceptation des Cookies
<span id="specialeHelpButton" class="helpDisplayButton" title="Cliquer pour consulter l'aide en ligne">
<a href="https://doc.zwiicms.fr/cookies" target="_blank">
<?php echo template::ico('help', ['margin' => 'left']);?>
</a>
</span>
</h4>
<div class="row">
<div class="col6">
<?php echo template::text('localeCookiesTitleText', [
'help' => 'Saisissez le titre de la fenêtre de gestion des cookies.',
'label' => 'Titre de la fenêtre',
'value' => $module::$locales[$this->getUrl(2)]['locale']['cookies']['titleLabel'],
'placeHolder' => 'Gérer les cookies'
]); ?>
</div>
<div class="col6">
<?php echo template::text('localeCookiesButtonText', [
'label' => 'Bouton de validation',
'value' => $module::$locales[$this->getUrl(2)]['locale']['cookies']['buttonValidLabel'],
'placeHolder' => 'J\'ai compris'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Message d'acceptation des Cookies
<span id="specialeHelpButton" class="helpDisplayButton" title="Cliquer pour consulter l'aide en ligne">
<a href="https://doc.zwiicms.fr/cookies" target="_blank">
<?php echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>
</h4>
<div class="row">
<div class="col6">
<?php echo template::text('localeCookiesTitleText', [
'help' => 'Saisissez le titre de la fenêtre de gestion des cookies.',
'label' => 'Titre de la fenêtre',
'value' => $module::$locales[$this->getUrl(2)]['locale']['cookies']['titleLabel'],
'placeHolder' => 'Gérer les cookies'
]); ?>
</div>
<div class="col6">
<?php echo template::text('localeCookiesButtonText', [
'label' => 'Bouton de validation',
'value' => $module::$locales[$this->getUrl(2)]['locale']['cookies']['buttonValidLabel'],
'placeHolder' => 'J\'ai compris'
]); ?>
</div>
</div>
<div class="row">
<div class="col8">
<?php echo template::textarea('localeCookiesZwiiText', [
'help' => 'Saisissez le message pour les cookies déposés par ZwiiCMS, nécessaires au fonctionnement et qui ne nécessitent pas de consentement.',
'label' => 'Cookies Zwii',
'value' => $module::$locales[$this->getUrl(2)]['locale']['cookies']['mainLabel'],
'placeHolder' => 'Ce site utilise des cookies nécessaires à son fonctionnement, ils permettent de fluidifier son fonctionnement par exemple en mémorisant les données de connexion, la langue que vous avez choisie ou la validation de ce message.'
]); ?>
</div>
<div class="row">
<div class="col8">
<?php echo template::textarea('localeCookiesZwiiText', [
'help' => 'Saisissez le message pour les cookies déposés par ZwiiCMS, nécessaires au fonctionnement et qui ne nécessitent pas de consentement.',
'label' => 'Cookies Zwii',
'value' => $module::$locales[$this->getUrl(2)]['locale']['cookies']['mainLabel'],
'placeHolder' => 'Ce site utilise des cookies nécessaires à son fonctionnement, ils permettent de fluidifier son fonctionnement par exemple en mémorisant les données de connexion, la langue que vous avez choisie ou la validation de ce message.'
]); ?>
</div>
<div class="col4">
<?php echo template::text('localeCookiesLinkMlText', [
'help' => 'Saisissez le texte du lien vers les mentions légales,la page doit être définie dans la configuration du site.',
'label' => 'Lien page des mentions légales.',
'value' => $module::$locales[$this->getUrl(2)]['locale']['cookies']['linkLegalLabel'],
'placeHolder' => 'Consulter les mentions légales'
]); ?>
</div>
<div class="col4">
<?php echo template::text('localeCookiesLinkMlText', [
'help' => 'Saisissez le texte du lien vers les mentions légales,la page doit être définie dans la configuration du site.',
'label' => 'Lien page des mentions légales.',
'value' => $module::$locales[$this->getUrl(2)]['locale']['cookies']['linkLegalLabel'],
'placeHolder' => 'Consulter les mentions légales'
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -1,81 +1,81 @@
<?php echo template::formOpen('translateForm'); ?>
<div class="row">
<div class="col1">
<?php echo template::button('translateFormBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl(),
'value' => template::ico('left')
]); ?>
</div>
<div class="col1">
<?php /**echo template::button('translateHelp', [
<div class="row">
<div class="col1">
<?php echo template::button('translateFormBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl(),
'value' => template::ico('left')
]); ?>
</div>
<div class="col1">
<?php /**echo template::button('translateHelp', [
'href' => 'https://doc.zwiicms.fr/prise-en-charge-des-langues-etrangeres',
'target' => '_blank',
'value' => template::ico('help'),
'class' => 'buttonHelp',
'help' => 'Consulter l\'aide en ligne'
]);*/ ?>
</div>
<div class="col1 offset6">
<?php echo template::button('translateButton', [
'href' => helper::baseUrl() . 'translate/copy',
'value' => template::ico('docs'),
'disabled' => $module::$siteCopy,
'help' => 'Copie de sites inter-langues'
]); ?>
</div>
<div class="col1">
<?php echo template::button('translateButton', [
'href' => helper::baseUrl() . 'translate/add',
'value' => template::ico('plus'),
'class' => 'buttonGreen',
'help' => 'Ajouter une langue de contenu'
]); ?>
</div>
<div class="col2">
<?php echo template::submit('translateFormSubmit'); ?>
</div>
</div>
<div class="tab">
<?php echo template::button('translateUiButton', [
'value' => 'Langue de l\'interface',
'class' => 'buttonTab'
<div class="col1 offset6">
<?php echo template::button('translateButton', [
'href' => helper::baseUrl() . 'translate/copy',
'value' => template::ico('docs'),
'disabled' => $module::$siteCopy,
'help' => 'Copie de sites inter-langues'
]); ?>
<?php echo template::button('translateContentButton', [
'value' => 'Langues du contenu',
'class' => 'buttonTab'
]); ?>
</div>
<div class="col1">
<?php echo template::button('translateButton', [
'href' => helper::baseUrl() . 'translate/add',
'value' => template::ico('plus'),
'class' => 'buttonGreen',
'help' => 'Ajouter une langue de contenu'
]); ?>
</div>
<div class="col2">
<?php echo template::submit('translateFormSubmit'); ?>
</div>
</div>
<div id="uiContainer" class="tabContent">
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Langue de l\'administration'); ?>
</h4>
<div class="row">
<div class="col4 offset4">
<?php echo template::select('translateUI', $module::$i18nFiles, [
'label' => 'Traductions installées',
'selected' => $this->getData(['config', 'i18n' , 'interface']),
]); ?>
</div>
<div class="tab">
<?php echo template::button('translateUiButton', [
'value' => 'Langue de l\'interface',
'class' => 'buttonTab'
]); ?>
<?php echo template::button('translateContentButton', [
'value' => 'Langues du contenu',
'class' => 'buttonTab'
]); ?>
</div>
<div id="uiContainer" class="tabContent">
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Langue de l\'administration'); ?>
</h4>
<div class="row">
<div class="col4 offset4">
<?php echo template::select('translateUI', $module::$i18nFiles, [
'label' => 'Traductions installées',
'selected' => $this->getData(['config', 'i18n', 'interface']),
]); ?>
</div>
</div>
</div>
</div>
</div>
<div id="contentContainer" class="tabContent">
<div class="row">
<div class="col12">
<?php if($module::$languagesInstalled): ?>
<?php echo template::table([1, 3, 2, 4, 1, 1], $module::$languagesInstalled, ['Langue', '', '', '', '', '']); ?>
<?php endif; ?>
</div>
</div>
<div id="contentContainer" class="tabContent">
<div class="row">
<div class="col12">
<?php if ($module::$languagesInstalled) : ?>
<?php echo template::table([1, 3, 2, 4, 1, 1], $module::$languagesInstalled, ['Langue', '', '', '', '', '']); ?>
<?php endif; ?>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -13,7 +13,8 @@
* @link http://zwiicms.fr/
*/
class user extends common {
class user extends common
{
public static $actions = [
'add' => self::GROUP_ADMIN,
@ -50,18 +51,19 @@ class user extends common {
/**
* Ajout
*/
public function add() {
public function add()
{
// Soumission du formulaire
if($this->isPost()) {
$check=true;
if ($this->isPost()) {
$check = true;
// L'identifiant d'utilisateur est indisponible
$userId = $this->getInput('userAddId', helper::FILTER_ID, true);
if($this->getData(['user', $userId])) {
if ($this->getData(['user', $userId])) {
self::$inputNotices['userAddId'] = 'Identifiant déjà utilisé';
$check=false;
$check = false;
}
// Double vérification pour le mot de passe
if($this->getInput('userAddPassword', helper::FILTER_STRING_SHORT, true) !== $this->getInput('userAddConfirmPassword', helper::FILTER_STRING_SHORT, true)) {
if ($this->getInput('userAddPassword', helper::FILTER_STRING_SHORT, true) !== $this->getInput('userAddConfirmPassword', helper::FILTER_STRING_SHORT, true)) {
self::$inputNotices['userAddConfirmPassword'] = 'Incorrect';
$check = false;
}
@ -94,14 +96,14 @@ class user extends common {
// Envoie le mail
$sent = true;
if($this->getInput('userAddSendMail', helper::FILTER_BOOLEAN) && $check === true) {
if ($this->getInput('userAddSendMail', helper::FILTER_BOOLEAN) && $check === true) {
$sent = $this->sendMail(
$userMail,
'Compte créé sur ' . $this->getData(['locale', 'title']),
'Bonjour <strong>' . $userFirstname . ' ' . $userLastname . '</strong>,<br><br>' .
'Un administrateur vous a créé un compte sur le site ' . $this->getData(['locale', 'title']) . '. Vous trouverez ci-dessous les détails de votre compte.<br><br>' .
'<strong>Identifiant du compte :</strong> ' . $this->getInput('userAddId') . '<br>' .
'<small>Nous ne conservons pas les mots de passe, en conséquence nous vous conseillons de conserver ce message tant que vous ne vous êtes pas connecté. Vous pourrez modifier votre mot de passe après votre première connexion.</small>',
'Un administrateur vous a créé un compte sur le site ' . $this->getData(['locale', 'title']) . '. Vous trouverez ci-dessous les détails de votre compte.<br><br>' .
'<strong>Identifiant du compte :</strong> ' . $this->getInput('userAddId') . '<br>' .
'<small>Nous ne conservons pas les mots de passe, en conséquence nous vous conseillons de conserver ce message tant que vous ne vous êtes pas connecté. Vous pourrez modifier votre mot de passe après votre première connexion.</small>',
null
);
}
@ -122,13 +124,14 @@ class user extends common {
/**
* Suppression
*/
public function delete() {
public function delete()
{
// Accès refusé
if(
if (
// L'utilisateur n'existe pas
$this->getData(['user', $this->getUrl(2)]) === null
// Groupe insuffisant
AND ($this->getUrl('group') < self::GROUP_MODERATOR)
and ($this->getUrl('group') < self::GROUP_MODERATOR)
) {
// Valeurs en sortie
$this->addOutput([
@ -144,7 +147,7 @@ class user extends common {
]);
}
// Bloque la suppression de son propre compte
elseif($this->getUser('id') === $this->getUrl(2)) {
elseif ($this->getUser('id') === $this->getUrl(2)) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'user',
@ -166,9 +169,12 @@ class user extends common {
/**
* Édition
*/
public function edit() {
if ($this->getUrl(3) !== $_SESSION['csrf'] &&
$this->getUrl(4) !== $_SESSION['csrf']) {
public function edit()
{
if (
$this->getUrl(3) !== $_SESSION['csrf'] &&
$this->getUrl(4) !== $_SESSION['csrf']
) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'user',
@ -176,18 +182,17 @@ class user extends common {
]);
}
// Accès refusé
if(
if (
// L'utilisateur n'existe pas
$this->getData(['user', $this->getUrl(2)]) === null
// Droit d'édition
AND (
and (
// Impossible de s'auto-éditer
(
$this->getUser('id') === $this->getUrl(2)
AND $this->getUrl('group') <= self::GROUP_VISITOR
($this->getUser('id') === $this->getUrl(2)
and $this->getUrl('group') <= self::GROUP_VISITOR
)
// Impossible d'éditer un autre utilisateur
OR ($this->getUrl('group') < self::GROUP_MODERATOR)
or ($this->getUrl('group') < self::GROUP_MODERATOR)
)
) {
// Valeurs en sortie
@ -198,45 +203,41 @@ class user extends common {
// Accès autorisé
else {
// Soumission du formulaire
if($this->isPost()) {
if ($this->isPost()) {
// Double vérification pour le mot de passe
$newPassword = $this->getData(['user', $this->getUrl(2), 'password']);
if($this->getInput('userEditNewPassword')) {
if ($this->getInput('userEditNewPassword')) {
// L'ancien mot de passe est correct
if(password_verify($this->getInput('userEditOldPassword'), $this->getData(['user', $this->getUrl(2), 'password']))) {
if (password_verify($this->getInput('userEditOldPassword'), $this->getData(['user', $this->getUrl(2), 'password']))) {
// La confirmation correspond au mot de passe
if($this->getInput('userEditNewPassword') === $this->getInput('userEditConfirmPassword')) {
if ($this->getInput('userEditNewPassword') === $this->getInput('userEditConfirmPassword')) {
$newPassword = $this->getInput('userEditNewPassword', helper::FILTER_PASSWORD, true);
// Déconnexion de l'utilisateur si il change le mot de passe de son propre compte
if($this->getUser('id') === $this->getUrl(2)) {
if ($this->getUser('id') === $this->getUrl(2)) {
helper::deleteCookie('ZWII_USER_ID');
helper::deleteCookie('ZWII_USER_PASSWORD');
}
}
else {
} else {
self::$inputNotices['userEditConfirmPassword'] = 'Incorrect';
}
}
else {
} else {
self::$inputNotices['userEditOldPassword'] = 'Incorrect';
}
}
// Modification du groupe
if(
if (
$this->getUser('group') === self::GROUP_ADMIN
AND $this->getUrl(2) !== $this->getUser('id')
and $this->getUrl(2) !== $this->getUser('id')
) {
$newGroup = $this->getInput('userEditGroup', helper::FILTER_INT, true);
}
else {
} else {
$newGroup = $this->getData(['user', $this->getUrl(2), 'group']);
}
// Modification de nom Prénom
if($this->getUser('group') === self::GROUP_ADMIN){
if ($this->getUser('group') === self::GROUP_ADMIN) {
$newfirstname = $this->getInput('userEditFirstname', helper::FILTER_STRING_SHORT, true);
$newlastname = $this->getInput('userEditLastname', helper::FILTER_STRING_SHORT, true);
}
else{
} else {
$newfirstname = $this->getData(['user', $this->getUrl(2), 'firstname']);
$newlastname = $this->getData(['user', $this->getUrl(2), 'lastname']);
}
@ -253,20 +254,20 @@ class user extends common {
'signature' => $this->getInput('userEditSignature', helper::FILTER_INT, true),
'mail' => $this->getInput('userEditMail', helper::FILTER_MAIL, true),
'password' => $newPassword,
'connectFail' => $this->getData(['user',$this->getUrl(2),'connectFail']),
'connectTimeout' => $this->getData(['user',$this->getUrl(2),'connectTimeout']),
'accessUrl' => $this->getData(['user',$this->getUrl(2),'accessUrl']),
'accessTimer' => $this->getData(['user',$this->getUrl(2),'accessTimer']),
'accessCsrf' => $this->getData(['user',$this->getUrl(2),'accessCsrf']),
'connectFail' => $this->getData(['user', $this->getUrl(2), 'connectFail']),
'connectTimeout' => $this->getData(['user', $this->getUrl(2), 'connectTimeout']),
'accessUrl' => $this->getData(['user', $this->getUrl(2), 'accessUrl']),
'accessTimer' => $this->getData(['user', $this->getUrl(2), 'accessTimer']),
'accessCsrf' => $this->getData(['user', $this->getUrl(2), 'accessCsrf']),
'files' => $this->getInput('userEditFiles', helper::FILTER_BOOLEAN)
]
]);
// Redirection spécifique si l'utilisateur change son mot de passe
if($this->getUser('id') === $this->getUrl(2) AND $this->getInput('userEditNewPassword')) {
if ($this->getUser('id') === $this->getUrl(2) and $this->getInput('userEditNewPassword')) {
$redirect = helper::baseUrl() . 'user/login/' . str_replace('/', '_', $this->getUrl());
}
// Redirection si retour en arrière possible
elseif($this->getUser('group') === 3) {
elseif ($this->getUser('group') === 3) {
$redirect = helper::baseUrl() . 'user';
}
// Redirection normale
@ -291,11 +292,12 @@ class user extends common {
/**
* Mot de passe perdu
*/
public function forgot() {
public function forgot()
{
// Soumission du formulaire
if($this->isPost()) {
if ($this->isPost()) {
$userId = $this->getInput('userForgotId', helper::FILTER_ID, true);
if($this->getData(['user', $userId])) {
if ($this->getData(['user', $userId])) {
// Enregistre la date de la demande dans le compte utilisateur
$this->setData(['user', $userId, 'forgot', time()]);
// Crée un id unique pour la réinitialisation
@ -305,9 +307,9 @@ class user extends common {
$this->getData(['user', $userId, 'mail']),
'Réinitialisation de votre mot de passe',
'Bonjour <strong>' . $this->getData(['user', $userId, 'firstname']) . ' ' . $this->getData(['user', $userId, 'lastname']) . '</strong>,<br><br>' .
'Vous avez demandé à changer le mot de passe lié à votre compte. Vous trouverez ci-dessous un lien vous permettant de modifier celui-ci.<br><br>' .
'<a href="' . helper::baseUrl() . 'user/reset/' . $userId . '/' . $uniqId . '" target="_blank">' . helper::baseUrl() . 'user/reset/' . $userId . '/' . $uniqId . '</a><br><br>' .
'<small>Si nous n\'avez pas demandé à réinitialiser votre mot de passe, veuillez ignorer ce mail.</small>',
'Vous avez demandé à changer le mot de passe lié à votre compte. Vous trouverez ci-dessous un lien vous permettant de modifier celui-ci.<br><br>' .
'<a href="' . helper::baseUrl() . 'user/reset/' . $userId . '/' . $uniqId . '" target="_blank">' . helper::baseUrl() . 'user/reset/' . $userId . '/' . $uniqId . '</a><br><br>' .
'<small>Si nous n\'avez pas demandé à réinitialiser votre mot de passe, veuillez ignorer ce mail.</small>',
null
);
// Valeurs en sortie
@ -335,23 +337,24 @@ class user extends common {
/**
* Liste des utilisateurs
*/
public function index() {
public function index()
{
$userIdsFirstnames = helper::arrayColumn($this->getData(['user']), 'firstname');
ksort($userIdsFirstnames);
foreach($userIdsFirstnames as $userId => $userFirstname) {
foreach ($userIdsFirstnames as $userId => $userFirstname) {
if ($this->getData(['user', $userId, 'group'])) {
self::$users[] = [
$userId,
$userFirstname . ' ' . $this->getData(['user', $userId, 'lastname']),
self::$groups[$this->getData(['user', $userId, 'group'])],
template::button('userEdit' . $userId, [
'href' => helper::baseUrl() . 'user/edit/' . $userId . '/back/'. $_SESSION['csrf'],
'href' => helper::baseUrl() . 'user/edit/' . $userId . '/back/' . $_SESSION['csrf'],
'value' => template::ico('pencil'),
'help' => 'Editer'
]),
template::button('userDelete' . $userId, [
'class' => 'userDelete buttonRed',
'href' => helper::baseUrl() . 'user/delete/' . $userId. '/' . $_SESSION['csrf'],
'href' => helper::baseUrl() . 'user/delete/' . $userId . '/' . $_SESSION['csrf'],
'value' => template::ico('trash'),
'help' => 'Supprimer'
])
@ -368,17 +371,18 @@ class user extends common {
/**
* Connexion
*/
public function login() {
public function login()
{
// Soumission du formulaire
$logStatus = '';
if($this->isPost()) {
if ($this->isPost()) {
// Lire Id du compte
$userId = $this->getInput('userLoginId', helper::FILTER_ID, true);
// Check le captcha
if(
$this->getData(['config','connect','captcha'])
AND password_verify($this->getInput('userLoginCaptcha', helper::FILTER_INT), $this->getInput('userLoginCaptchaResult') ) === false )
{
if (
$this->getData(['config', 'connect', 'captcha'])
and password_verify($this->getInput('userLoginCaptcha', helper::FILTER_INT), $this->getInput('userLoginCaptchaResult')) === false
) {
$captcha = false;
} else {
$captcha = true;
@ -386,22 +390,24 @@ class user extends common {
/**
* Aucun compte existant
*/
if ( !$this->getData(['user', $userId])) {
if (!$this->getData(['user', $userId])) {
$logStatus = 'Compte inconnu';
//Stockage de l'IP
$this->setData([
'blacklist',
$userId,
[
'connectFail' => $this->getData(['blacklist',$userId,'connectFail']) + 1,
'connectFail' => $this->getData(['blacklist', $userId, 'connectFail']) + 1,
'lastFail' => time(),
'ip' => helper::getIp()
]
]);
// Verrouillage des IP
$ipBlackList = helper::arrayColumn($this->getData(['blacklist']), 'ip');
if ( $this->getData(['blacklist',$userId,'connectFail']) >= $this->getData(['config', 'connect', 'attempt'])
AND in_array($this->getData(['blacklist',$userId,'ip']),$ipBlackList) ) {
if (
$this->getData(['blacklist', $userId, 'connectFail']) >= $this->getData(['config', 'connect', 'attempt'])
and in_array($this->getData(['blacklist', $userId, 'ip']), $ipBlackList)
) {
$logStatus = 'Compte inconnu verrouillé';
// Valeurs en sortie
$this->addOutput([
@ -415,38 +421,40 @@ class user extends common {
'notification' => 'Captcha, identifiant ou mot de passe incorrects'
]);
}
/**
* Le compte existe
*/
} else {
/**
* Le compte existe
*/
} else {
// Cas 4 : le délai de blocage est dépassé et le compte est au max - Réinitialiser
if ($this->getData(['user',$userId,'connectTimeout']) + $this->getData(['config', 'connect', 'timeout']) < time()
AND $this->getData(['user',$userId,'connectFail']) === $this->getData(['config', 'connect', 'attempt']) ) {
$this->setData(['user',$userId,'connectFail',0 ]);
$this->setData(['user',$userId,'connectTimeout',0 ]);
if (
$this->getData(['user', $userId, 'connectTimeout']) + $this->getData(['config', 'connect', 'timeout']) < time()
and $this->getData(['user', $userId, 'connectFail']) === $this->getData(['config', 'connect', 'attempt'])
) {
$this->setData(['user', $userId, 'connectFail', 0]);
$this->setData(['user', $userId, 'connectTimeout', 0]);
}
// Check la présence des variables et contrôle du blocage du compte si valeurs dépassées
// Vérification du mot de passe et du groupe
if (
( $this->getData(['user',$userId,'connectTimeout']) + $this->getData(['config', 'connect', 'timeout']) ) < time()
AND $this->getData(['user',$userId,'connectFail']) < $this->getData(['config', 'connect', 'attempt'])
AND password_verify($this->getInput('userLoginPassword', helper::FILTER_STRING_SHORT, true), $this->getData(['user', $userId, 'password']))
AND $this->getData(['user', $userId, 'group']) >= self::GROUP_MEMBER
AND $captcha === true
($this->getData(['user', $userId, 'connectTimeout']) + $this->getData(['config', 'connect', 'timeout'])) < time()
and $this->getData(['user', $userId, 'connectFail']) < $this->getData(['config', 'connect', 'attempt'])
and password_verify($this->getInput('userLoginPassword', helper::FILTER_STRING_SHORT, true), $this->getData(['user', $userId, 'password']))
and $this->getData(['user', $userId, 'group']) >= self::GROUP_MEMBER
and $captcha === true
) {
// RAZ
$this->setData(['user',$userId,'connectFail',0 ]);
$this->setData(['user',$userId,'connectTimeout',0 ]);
$this->setData(['user', $userId, 'connectFail', 0]);
$this->setData(['user', $userId, 'connectTimeout', 0]);
// Expiration
$expire = $this->getInput('userLoginLongTime', helper::FILTER_BOOLEAN ) === true ? strtotime("+1 year") : 0 ;
setcookie('ZWII_USER_ID', $userId, $expire, helper::baseUrl(false, false) , '', helper::isHttps(), true);
$expire = $this->getInput('userLoginLongTime', helper::FILTER_BOOLEAN) === true ? strtotime("+1 year") : 0;
setcookie('ZWII_USER_ID', $userId, $expire, helper::baseUrl(false, false), '', helper::isHttps(), true);
setcookie('ZWII_USER_PASSWORD', $this->getData(['user', $userId, 'password']), $expire, helper::baseUrl(false, false), '', helper::isHttps(), true);
// Accès multiples avec le même compte
$this->setData(['user',$userId,'accessCsrf',$_SESSION['csrf']]);
$this->setData(['user', $userId, 'accessCsrf', $_SESSION['csrf']]);
// Valeurs en sortie lorsque le site est en maintenance et que l'utilisateur n'est pas administrateur
if(
if (
$this->getData(['config', 'maintenance'])
AND $this->getData(['user', $userId, 'group']) < self::GROUP_ADMIN
and $this->getData(['user', $userId, 'group']) < self::GROUP_ADMIN
) {
$this->addOutput([
'notification' => 'Seul un administrateur peut se connecter lors d\'une maintenance',
@ -457,25 +465,25 @@ class user extends common {
$logStatus = 'Connexion réussie';
// Valeurs en sortie
$this->addOutput([
'notification' => 'Bienvenue ' . $this->getData(['user',$userId,'firstname']) . ' ' . $this->getData(['user',$userId,'lastname']) ,
'notification' => 'Bienvenue ' . $this->getData(['user', $userId, 'firstname']) . ' ' . $this->getData(['user', $userId, 'lastname']),
'redirect' => helper::baseUrl() . str_replace('_', '/', str_replace('__', '#', $this->getUrl(2))),
'state' => true
]);
}
// Sinon notification d'échec
// Sinon notification d'échec
} else {
$notification = 'Captcha, identifiant ou mot de passe incorrects';
$logStatus = $captcha === true ? 'Erreur de mot de passe' : 'Erreur de captcha';
// Cas 1 le nombre de connexions est inférieur aux tentatives autorisées : incrément compteur d'échec
if ($this->getData(['user',$userId,'connectFail']) < $this->getData(['config', 'connect', 'attempt'])) {
$this->setData(['user',$userId,'connectFail',$this->getdata(['user',$userId,'connectFail']) + 1 ]);
if ($this->getData(['user', $userId, 'connectFail']) < $this->getData(['config', 'connect', 'attempt'])) {
$this->setData(['user', $userId, 'connectFail', $this->getdata(['user', $userId, 'connectFail']) + 1]);
}
// Cas 2 la limite du nombre de connexion est atteinte : placer le timer
if ( $this->getdata(['user',$userId,'connectFail']) == $this->getData(['config', 'connect', 'attempt']) ) {
$this->setData(['user',$userId,'connectTimeout', time()]);
if ($this->getdata(['user', $userId, 'connectFail']) == $this->getData(['config', 'connect', 'attempt'])) {
$this->setData(['user', $userId, 'connectTimeout', time()]);
}
// Cas 3 le délai de bloquage court
if ($this->getData(['user',$userId,'connectTimeout']) + $this->getData(['config', 'connect', 'timeout']) > time() ) {
if ($this->getData(['user', $userId, 'connectTimeout']) + $this->getData(['config', 'connect', 'timeout']) > time()) {
$notification = 'Accès bloqué ' . ($this->getData(['config', 'connect', 'timeout']) / 60) . ' minutes.';
}
@ -487,15 +495,15 @@ class user extends common {
}
}
// Journalisation
$dataLog = mb_detect_encoding(strftime('%d/%m/%y',time()), 'UTF-8', true)
? strftime('%d/%m/%y',time()) . ';' . strftime('%R',time()) . ';'
: utf8_encode(strftime('%d/%m/%y',time())) . ';' . utf8_encode(strftime('%R',time())) . ';' ;
$dataLog .= helper::getIp($this->getData(['config','connect','anonymousIp'])) . ';';
$dataLog .= $this->getInput('userLoginId', helper::FILTER_ID) . ';' ;
$dataLog .= $this->getUrl() .';' ;
$dataLog .= $logStatus ;
$dataLog = mb_detect_encoding(strftime('%d/%m/%y', time()), 'UTF-8', true)
? strftime('%d/%m/%y', time()) . ';' . strftime('%R', time()) . ';'
: utf8_encode(strftime('%d/%m/%y', time())) . ';' . utf8_encode(strftime('%R', time())) . ';';
$dataLog .= helper::getIp($this->getData(['config', 'connect', 'anonymousIp'])) . ';';
$dataLog .= $this->getInput('userLoginId', helper::FILTER_ID) . ';';
$dataLog .= $this->getUrl() . ';';
$dataLog .= $logStatus;
$dataLog .= PHP_EOL;
if ($this->getData(['config','connect','log'])) {
if ($this->getData(['config', 'connect', 'log'])) {
file_put_contents(self::DATA_DIR . 'journal.log', $dataLog, FILE_APPEND);
}
// Stockage des cookies
@ -513,7 +521,8 @@ class user extends common {
/**
* Déconnexion
*/
public function logout() {
public function logout()
{
helper::deleteCookie('ZWII_USER_ID');
helper::deleteCookie('ZWII_USER_PASSWORD');
session_destroy();
@ -528,15 +537,16 @@ class user extends common {
/**
* Réinitialisation du mot de passe
*/
public function reset() {
public function reset()
{
// Accès refusé
if(
if (
// L'utilisateur n'existe pas
$this->getData(['user', $this->getUrl(2)]) === null
// Lien de réinitialisation trop vieux
OR $this->getData(['user', $this->getUrl(2), 'forgot']) + 86400 < time()
or $this->getData(['user', $this->getUrl(2), 'forgot']) + 86400 < time()
// Id unique incorrecte
OR $this->getUrl(3) !== md5(json_encode($this->getData(['user', $this->getUrl(2)])))
or $this->getUrl(3) !== md5(json_encode($this->getData(['user', $this->getUrl(2)])))
) {
// Valeurs en sortie
$this->addOutput([
@ -546,15 +556,14 @@ class user extends common {
// Accès autorisé
else {
// Soumission du formulaire
if($this->isPost()) {
if ($this->isPost()) {
// Double vérification pour le mot de passe
if($this->getInput('userResetNewPassword')) {
if ($this->getInput('userResetNewPassword')) {
// La confirmation ne correspond pas au mot de passe
if($this->getInput('userResetNewPassword', helper::FILTER_STRING_SHORT, true) !== $this->getInput('userResetConfirmPassword', helper::FILTER_STRING_SHORT, true)) {
if ($this->getInput('userResetNewPassword', helper::FILTER_STRING_SHORT, true) !== $this->getInput('userResetConfirmPassword', helper::FILTER_STRING_SHORT, true)) {
$newPassword = $this->getData(['user', $this->getUrl(2), 'password']);
self::$inputNotices['userResetConfirmPassword'] = 'Incorrect';
}
else {
} else {
$newPassword = $this->getInput('userResetNewPassword', helper::FILTER_PASSWORD, true);
}
// Modifie le mot de passe
@ -562,8 +571,8 @@ class user extends common {
// Réinitialise la date de la demande
$this->setData(['user', $this->getUrl(2), 'forgot', 0]);
// Réinitialise le blocage
$this->setData(['user', $this->getUrl(2),'connectFail',0 ]);
$this->setData(['user', $this->getUrl(2),'connectTimeout',0 ]);
$this->setData(['user', $this->getUrl(2), 'connectFail', 0]);
$this->setData(['user', $this->getUrl(2), 'connectTimeout', 0]);
// Valeurs en sortie
$this->addOutput([
'notification' => 'Nouveau mot de passe enregistré',
@ -585,66 +594,69 @@ class user extends common {
/**
* Importation CSV d'utilisateurs
*/
public function import() {
public function import()
{
// Soumission du formulaire
$notification = '';
$success = true;
if($this->isPost()) {
if ($this->isPost()) {
// Lecture du CSV et construction du tableau
$file = $this->getInput('userImportCSVFile',helper::FILTER_STRING_SHORT, true);
$file = $this->getInput('userImportCSVFile', helper::FILTER_STRING_SHORT, true);
$filePath = self::FILE_DIR . 'source/' . $file;
if ($file AND file_exists($filePath)) {
if ($file and file_exists($filePath)) {
// Analyse et extraction du CSV
$rows = array_map(function($row) { return str_getcsv($row, $this->getInput('userImportSeparator') ); }, file($filePath));
$rows = array_map(function ($row) {
return str_getcsv($row, $this->getInput('userImportSeparator'));
}, file($filePath));
$header = array_shift($rows);
$csv = array();
foreach($rows as $row) {
foreach ($rows as $row) {
$csv[] = array_combine($header, $row);
}
// Traitement des données
foreach($csv as $item ) {
foreach ($csv as $item) {
// Données valides
if( array_key_exists('id', $item)
AND array_key_exists('prenom',$item)
AND array_key_exists('nom',$item)
AND array_key_exists('groupe',$item)
AND array_key_exists('email',$item)
AND $item['nom']
AND $item['prenom']
AND $item['id']
AND $item['email']
AND $item['groupe']
if (
array_key_exists('id', $item)
and array_key_exists('prenom', $item)
and array_key_exists('nom', $item)
and array_key_exists('groupe', $item)
and array_key_exists('email', $item)
and $item['nom']
and $item['prenom']
and $item['id']
and $item['email']
and $item['groupe']
) {
// Validation du groupe
$item['groupe'] = (int) $item['groupe'];
$item['groupe'] = ( $item['groupe'] >= self::GROUP_BANNED AND $item['groupe'] <= self::GROUP_ADMIN )
? $item['groupe'] : 1;
$item['groupe'] = ($item['groupe'] >= self::GROUP_BANNED and $item['groupe'] <= self::GROUP_ADMIN)
? $item['groupe'] : 1;
// L'utilisateur existe
if ( $this->getData(['user',helper::filter($item['id'] , helper::FILTER_ID)]))
{
if ($this->getData(['user', helper::filter($item['id'], helper::FILTER_ID)])) {
// Notification du doublon
$item['notification'] = template::ico('cancel');
// Création du tableau de confirmation
self::$users[] = [
helper::filter($item['id'] , helper::FILTER_ID),
helper::filter($item['id'], helper::FILTER_ID),
$item['nom'],
$item['prenom'],
self::$groups[$item['groupe']],
$item['prenom'],
helper::filter($item['email'] , helper::FILTER_MAIL),
helper::filter($item['email'], helper::FILTER_MAIL),
$item['notification']
];
// L'utilisateur n'existe pas
} else {
// Nettoyage de l'identifiant
$userId = helper::filter($item['id'] , helper::FILTER_ID);
$userId = helper::filter($item['id'], helper::FILTER_ID);
// Enregistre le user
$create = $this->setData([
'user',
$userId, [
'firstname' => $item['prenom'],
'forgot' => 0,
'group' => $item['groupe'] ,
'group' => $item['groupe'],
'lastname' => $item['nom'],
'mail' => $item['email'],
'pseudo' => $item['prenom'],
@ -655,23 +667,26 @@ class user extends common {
"accessUrl" => null,
"accessTimer" => null,
"accessCsrf" => null
]]);
]
]);
// Icône de notification
$item['notification'] = $create ? template::ico('check') : template::ico('cancel');
// Envoi du mail
if ($create
AND $this->getInput('userImportNotification',helper::FILTER_BOOLEAN) === true) {
if (
$create
and $this->getInput('userImportNotification', helper::FILTER_BOOLEAN) === true
) {
$sent = $this->sendMail(
$item['email'],
'Compte créé sur ' . $this->getData(['locale', 'title']),
'Bonjour <strong>' . $item['prenom'] . ' ' . $item['nom'] . '</strong>,<br><br>' .
'Un administrateur vous a créé un compte sur le site ' . $this->getData(['locale', 'title']) . '. Vous trouverez ci-dessous les détails de votre compte.<br><br>' .
'<strong>Identifiant du compte :</strong> ' . $userId . '<br>' .
'<small>Un mot de passe provisoire vous été attribué, à la première connexion cliquez sur Mot de passe Oublié.</small>'
'Un administrateur vous a créé un compte sur le site ' . $this->getData(['locale', 'title']) . '. Vous trouverez ci-dessous les détails de votre compte.<br><br>' .
'<strong>Identifiant du compte :</strong> ' . $userId . '<br>' .
'<small>Un mot de passe provisoire vous été attribué, à la première connexion cliquez sur Mot de passe Oublié.</small>'
);
if ($sent === true) {
// Mail envoyé changement de l'icône
$item['notification'] = template::ico('mail') ;
$item['notification'] = template::ico('mail');
}
}
// Création du tableau de confirmation
@ -688,10 +703,10 @@ class user extends common {
}
}
if (empty(self::$users)) {
$notification = 'Rien à importer, erreur de format ou fichier incorrect' ;
$notification = 'Rien à importer, erreur de format ou fichier incorrect';
$success = false;
} else {
$notification = 'Importation effectuée' ;
$notification = 'Importation effectuée';
$success = true;
}
} else {
@ -707,5 +722,4 @@ class user extends common {
'state' => $success
]);
}
}

View File

@ -1,95 +1,98 @@
<?php echo template::formOpen('userAddForm'); ?>
<div class="row">
<div class="col1">
<?php echo template::button('userAddBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'user',
'value' => template::ico('left')
]); ?>
</div>
<div class="col2 offset9">
<?php echo template::submit('userAddSubmit'); ?>
</div>
<div class="row">
<div class="col1">
<?php echo template::button('userAddBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'user',
'value' => template::ico('left')
]); ?>
</div>
<div class="row">
<div class="col6">
<div class="block">
<h4>
<?php echo template::topic('Identité'); ?>
</h4>
<div class="row">
<div class="col6">
<?php echo template::text('userAddFirstname', [
'autocomplete' => 'off',
'label' => 'Prénom'
]); ?>
</div>
<div class="col6">
<?php echo template::text('userAddLastname', [
'autocomplete' => 'off',
'label' => 'Nom'
]); ?>
</div>
</div>
<?php echo template::text('userAddPseudo', [
'autocomplete' => 'off',
'label' => 'Pseudo'
]); ?>
<?php echo template::select('userAddSignature', $module::$signature, [
'label' => 'Signature',
'selected' => 1
]); ?>
<?php echo template::mail('userAddMail', [
'autocomplete' => 'off',
'label' => 'Adresse mail'
]); ?>
<?php echo template::select('userAddGroup', self::$groupNews, [
'label' => 'Groupe',
'selected' => self::GROUP_MEMBER
]); ?>
<div id="userAddMemberFiles" class="displayNone">
<?php echo template::checkbox('userAddFiles', true, 'Partage de fichiers autorisé', [
'checked' => false,
'help' => 'Ce membre pourra téléverser ou télécharger des fichiers dans le dossier \'partage\' et ses sous-dossiers'
<div class="col2 offset9">
<?php echo template::submit('userAddSubmit'); ?>
</div>
</div>
<div class="row">
<div class="col6">
<div class="block">
<h4>
<?php echo template::topic('Identité'); ?>
</h4>
<div class="row">
<div class="col6">
<?php echo template::text('userAddFirstname', [
'autocomplete' => 'off',
'label' => 'Prénom'
]); ?>
</div>
<div id="userAddLabelAuth">
<?php echo template::topic('Permissions :'); ?>
<div class="col6">
<?php echo template::text('userAddLastname', [
'autocomplete' => 'off',
'label' => 'Nom'
]); ?>
</div>
<ul id="userAddGroupDescription<?php echo self::GROUP_MEMBER; ?>" class="userAddGroupDescription displayNone">
<li><?php echo template::topic('Accès aux pages privées'); ?></li>
</ul>
<ul id="userAddGroupDescription<?php echo self::GROUP_MODERATOR; ?>" class="userAddGroupDescription displayNone">
<li><?php echo template::topic('Accès aux pages privées'); ?></li>
<li><?php echo template::topic('Ajout / Édition / Suppression de pages'); ?></li>
<li><?php echo template::topic('Ajout / Édition / Suppression de fichiers'); ?></li>
</ul>
<ul id="userAddGroupDescription<?php echo self::GROUP_ADMIN; ?>" class="userAddGroupDescription displayNone">
<li><?php echo template::topic('Administration complète du site'); ?></li>
</ul>
</div>
</div>
<div class="col6">
<div class="block">
<h4>
<?php echo template::topic('Authentification'); ?>
</h4>
<?php echo template::text('userAddId', [
'autocomplete' => 'off',
'label' => 'Identifiant'
<?php echo template::text('userAddPseudo', [
'autocomplete' => 'off',
'label' => 'Pseudo'
]); ?>
<?php echo template::select('userAddSignature', $module::$signature, [
'label' => 'Signature',
'selected' => 1
]); ?>
<?php echo template::mail('userAddMail', [
'autocomplete' => 'off',
'label' => 'Adresse mail'
]); ?>
<?php echo template::select('userAddGroup', self::$groupNews, [
'label' => 'Groupe',
'selected' => self::GROUP_MEMBER
]); ?>
<div id="userAddMemberFiles" class="displayNone">
<?php echo template::checkbox('userAddFiles', true, 'Partage de fichiers autorisé', [
'checked' => false,
'help' => 'Ce membre pourra téléverser ou télécharger des fichiers dans le dossier \'partage\' et ses sous-dossiers'
]); ?>
<?php echo template::password('userAddPassword', [
'autocomplete' => 'off',
'label' => 'Mot de passe'
]); ?>
<?php echo template::password('userAddConfirmPassword', [
'autocomplete' => 'off',
'label' => 'Confirmation'
]); ?>
<?php echo template::checkbox('userAddSendMail', true,
'Prévenir l\'utilisateur par mail');
?>
</div>
<div id="userAddLabelAuth">
<?php echo template::topic('Permissions :'); ?>
</div>
<ul id="userAddGroupDescription<?php echo self::GROUP_MEMBER; ?>" class="userAddGroupDescription displayNone">
<li><?php echo template::topic('Accès aux pages privées'); ?></li>
</ul>
<ul id="userAddGroupDescription<?php echo self::GROUP_MODERATOR; ?>" class="userAddGroupDescription displayNone">
<li><?php echo template::topic('Accès aux pages privées'); ?></li>
<li><?php echo template::topic('Ajout / Édition / Suppression de pages'); ?></li>
<li><?php echo template::topic('Ajout / Édition / Suppression de fichiers'); ?></li>
</ul>
<ul id="userAddGroupDescription<?php echo self::GROUP_ADMIN; ?>" class="userAddGroupDescription displayNone">
<li><?php echo template::topic('Administration complète du site'); ?></li>
</ul>
</div>
</div>
<div class="col6">
<div class="block">
<h4>
<?php echo template::topic('Authentification'); ?>
</h4>
<?php echo template::text('userAddId', [
'autocomplete' => 'off',
'label' => 'Identifiant'
]); ?>
<?php echo template::password('userAddPassword', [
'autocomplete' => 'off',
'label' => 'Mot de passe'
]); ?>
<?php echo template::password('userAddConfirmPassword', [
'autocomplete' => 'off',
'label' => 'Confirmation'
]); ?>
<?php echo template::checkbox(
'userAddSendMail',
true,
'Prévenir l\'utilisateur par mail'
);
?>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -1,117 +1,117 @@
<?php echo template::formOpen('userEditForm'); ?>
<div class="row">
<div class="col1">
<?php if($this->getUser('group') === self::GROUP_ADMIN): ?>
<?php echo template::button('userEditBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'user',
'value' => template::ico('left')
]); ?>
<?php else: ?>
<?php echo template::button('userEditBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl(false),
'value' => template::ico('home')
<div class="row">
<div class="col1">
<?php if ($this->getUser('group') === self::GROUP_ADMIN) : ?>
<?php echo template::button('userEditBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'user',
'value' => template::ico('left')
]); ?>
<?php else : ?>
<?php echo template::button('userEditBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl(false),
'value' => template::ico('home')
]); ?>
<?php endif; ?>
</div>
<div class="col2 offset9">
<?php echo template::submit('userEditSubmit'); ?>
</div>
</div>
<div class="row">
<div class="col6">
<div class="block">
<h4>
<?php echo template::topic('Identité'); ?>
</h4>
<div class="row">
<div class="col6">
<?php echo template::text('userEditFirstname', [
'autocomplete' => 'off',
'disabled' => $this->getUser('group') > 2 ? false : true,
'label' => 'Prénom',
'value' => $this->getData(['user', $this->getUrl(2), 'firstname'])
]); ?>
</div>
<div class="col6">
<?php echo template::text('userEditLastname', [
'autocomplete' => 'off',
'disabled' => $this->getUser('group') > 2 ? false : true,
'label' => 'Nom',
'value' => $this->getData(['user', $this->getUrl(2), 'lastname'])
]); ?>
</div>
</div>
<?php echo template::text('userEditPseudo', [
'autocomplete' => 'off',
'label' => 'Pseudo',
'value' => $this->getData(['user', $this->getUrl(2), 'pseudo'])
]); ?>
<?php echo template::select('userEditSignature', $module::$signature, [
'label' => 'Signature',
'selected' => $this->getData(['user', $this->getUrl(2), 'signature'])
]); ?>
<?php echo template::mail('userEditMail', [
'autocomplete' => 'off',
'label' => 'Adresse mail',
'value' => $this->getData(['user', $this->getUrl(2), 'mail'])
]); ?>
<?php if ($this->getUser('group') === self::GROUP_ADMIN) : ?>
<?php echo template::select('userEditGroup', self::$groupEdits, [
'disabled' => ($this->getUrl(2) === $this->getUser('id')),
'help' => ($this->getUrl(2) === $this->getUser('id') ? 'Impossible de modifier votre propre groupe.' : ''),
'label' => 'Groupe',
'selected' => $this->getData(['user', $this->getUrl(2), 'group'])
]); ?>
<div id="userEditMemberFiles" class="displayNone">
<?php echo template::checkbox('userEditFiles', true, 'Partage de fichiers autorisé', [
'checked' => $this->getData(['user', $this->getUrl(2), 'files']),
'help' => 'Ce membre pourra téléverser ou télécharger des fichiers dans le dossier \'partage\' et ses sous-dossiers'
]); ?>
</div>
<div id="userEditLabelAuth">
<?php echo template::topic('Permissions :'); ?>
</div>
<ul id="userEditGroupDescription<?php echo self::GROUP_MEMBER; ?>" class="userEditGroupDescription displayNone">
<li><?php echo template::topic('Accès aux pages privées'); ?></li>
</ul>
<ul id="userEditGroupDescription<?php echo self::GROUP_MODERATOR; ?>" class="userEditGroupDescription displayNone">
<li><?php echo template::topic('Accès aux pages privées'); ?></li>
<li><?php echo template::topic('Ajout / Édition / Suppression de pages'); ?></li>
<li><?php echo template::topic('Ajout / Édition / Suppression de fichiers'); ?></li>
</ul>
<ul id="userEditGroupDescription<?php echo self::GROUP_ADMIN; ?>" class="userEditGroupDescription displayNone">
<li><?php echo template::topic('Administration complète du site'); ?></li>
</ul>
<?php endif; ?>
</div>
<div class="col2 offset9">
<?php echo template::submit('userEditSubmit'); ?>
</div>
</div>
<div class="row">
<div class="col6">
<div class="block">
<h4>
<?php echo template::topic('Identité'); ?>
</h4>
<div class="row">
<div class="col6">
<?php echo template::text('userEditFirstname', [
'autocomplete' => 'off',
'disabled' => $this->getUser('group') > 2 ? false : true,
'label' => 'Prénom',
'value' => $this->getData(['user', $this->getUrl(2), 'firstname'])
]); ?>
</div>
<div class="col6">
<?php echo template::text('userEditLastname', [
'autocomplete' => 'off',
'disabled' => $this->getUser('group') > 2 ? false : true,
'label' => 'Nom',
'value' => $this->getData(['user', $this->getUrl(2), 'lastname'])
]); ?>
</div>
</div>
<?php echo template::text('userEditPseudo', [
'autocomplete' => 'off',
'label' => 'Pseudo',
'value' => $this->getData(['user', $this->getUrl(2), 'pseudo'])
]); ?>
<?php echo template::select('userEditSignature', $module::$signature, [
'label' => 'Signature',
'selected' => $this->getData(['user', $this->getUrl(2), 'signature'])
]); ?>
<?php echo template::mail('userEditMail', [
'autocomplete' => 'off',
'label' => 'Adresse mail',
'value' => $this->getData(['user', $this->getUrl(2), 'mail'])
]); ?>
<?php if($this->getUser('group') === self::GROUP_ADMIN): ?>
<?php echo template::select('userEditGroup', self::$groupEdits, [
'disabled' => ($this->getUrl(2) === $this->getUser('id')),
'help' => ($this->getUrl(2) === $this->getUser('id') ? 'Impossible de modifier votre propre groupe.' : ''),
'label' => 'Groupe',
'selected' => $this->getData(['user', $this->getUrl(2), 'group'])
]); ?>
<div id="userEditMemberFiles" class="displayNone">
<?php echo template::checkbox('userEditFiles', true, 'Partage de fichiers autorisé', [
'checked' => $this->getData(['user', $this->getUrl(2), 'files']),
'help' => 'Ce membre pourra téléverser ou télécharger des fichiers dans le dossier \'partage\' et ses sous-dossiers'
]); ?>
</div>
<div id="userEditLabelAuth">
<?php echo template::topic('Permissions :'); ?>
</div>
<ul id="userEditGroupDescription<?php echo self::GROUP_MEMBER; ?>" class="userEditGroupDescription displayNone">
<li><?php echo template::topic('Accès aux pages privées'); ?></li>
</ul>
<ul id="userEditGroupDescription<?php echo self::GROUP_MODERATOR; ?>" class="userEditGroupDescription displayNone">
<li><?php echo template::topic('Accès aux pages privées'); ?></li>
<li><?php echo template::topic('Ajout / Édition / Suppression de pages'); ?></li>
<li><?php echo template::topic('Ajout / Édition / Suppression de fichiers'); ?></li>
</ul>
<ul id="userEditGroupDescription<?php echo self::GROUP_ADMIN; ?>" class="userEditGroupDescription displayNone">
<li><?php echo template::topic('Administration complète du site'); ?></li>
</ul>
<?php endif; ?>
</div>
</div>
<div class="col6">
<div class="block">
<h4>
<?php echo template::topic('Authentification'); ?>
</h4>
<?php echo template::text('userEditId', [
'autocomplete' => 'off',
'help' => 'L\'identifiant est défini lors de la création du compte, il ne peut pas être modifié.',
'label' => 'Identifiant',
'readonly' => true,
'value' => $this->getUrl(2)
]); ?>
<?php echo template::password('userEditOldPassword', [
'autocomplete' => 'new-password', // remplace 'off' pour éviter le pré remplissage auto
'label' => 'Ancien mot de passe'
]); ?>
<?php echo template::password('userEditNewPassword', [
'autocomplete' => 'off',
'label' => 'Nouveau mot de passe'
]); ?>
<?php echo template::password('userEditConfirmPassword', [
'autocomplete' => 'off',
'label' => 'Confirmation'
]); ?>
</div>
</div>
<div class="col6">
<div class="block">
<h4>
<?php echo template::topic('Authentification'); ?>
</h4>
<?php echo template::text('userEditId', [
'autocomplete' => 'off',
'help' => 'L\'identifiant est défini lors de la création du compte, il ne peut pas être modifié.',
'label' => 'Identifiant',
'readonly' => true,
'value' => $this->getUrl(2)
]); ?>
<?php echo template::password('userEditOldPassword', [
'autocomplete' => 'new-password', // remplace 'off' pour éviter le pré remplissage auto
'label' => 'Ancien mot de passe'
]); ?>
<?php echo template::password('userEditNewPassword', [
'autocomplete' => 'off',
'label' => 'Nouveau mot de passe'
]); ?>
<?php echo template::password('userEditConfirmPassword', [
'autocomplete' => 'off',
'label' => 'Confirmation'
]); ?>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -1,18 +1,18 @@
<?php echo template::formOpen('userForgotForm'); ?>
<?php echo template::text('userForgotId', [
'label' => 'Identifiant'
]); ?>
<div class="row">
<div class="col1 offset9">
<?php echo template::button('userForgotBack', [
'href' => helper::baseUrl() . 'user/login/' . $this->getUrl(2),
'value' => template::ico('left')
]); ?>
</div>
<div class="col3">
<?php echo template::submit('userForgotSubmit', [
'value' => 'Valider'
]); ?>
</div>
<?php echo template::text('userForgotId', [
'label' => 'Identifiant'
]); ?>
<div class="row">
<div class="col1 offset9">
<?php echo template::button('userForgotBack', [
'href' => helper::baseUrl() . 'user/login/' . $this->getUrl(2),
'value' => template::ico('left')
]); ?>
</div>
<div class="col3">
<?php echo template::submit('userForgotSubmit', [
'value' => 'Valider'
]); ?>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -7,55 +7,55 @@
'value' => template::ico('left')
]); ?>
</div>
<div class="col1">
<?php /**echo template::button('userHelp', [
<div class="col1">
<?php /**echo template::button('userHelp', [
'href' => 'https://doc.zwiicms.fr/importation-d-une-liste-d-utilisateurs',
'target' => '_blank',
'value' => template::ico('help'),
'class' => 'buttonHelp',
'help' => 'Consulter l\'aide en ligne'
]);*/ ?>
</div>
</div>
<div class="col2 offset8">
<?php echo template::submit('userImportSubmit', [
'value' => 'Importer'
]); ?>
</div>
<?php echo template::submit('userImportSubmit', [
'value' => 'Importer'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo template::topic('Importation de fichier plat CSV'); ?>
<?php echo template::topic('Importation de fichier plat CSV'); ?>
</h4>
<div class="row">
<div class="col10">
<?php echo template::file('userImportCSVFile', [
'label' => 'Liste d\'utilisateurs :'
]); ?>
<?php echo template::file('userImportCSVFile', [
'label' => 'Liste d\'utilisateurs :'
]); ?>
</div>
<div class="col2">
<?php echo template::select('userImportSeparator', $module::$separators, [
'label' => 'Séparateur'
]); ?>
<?php echo template::select('userImportSeparator', $module::$separators, [
'label' => 'Séparateur'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::checkbox('userImportNotification', true, 'Envoyer un message de confirmation', [
'checked' => false
]); ?>
'checked' => false
]); ?>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>
<?php if ($module::$users): ?>
<?php if ($module::$users) : ?>
<div class="row">
<div class="col12 textAlignCenter">
<?php echo template::table([1, 3, 3, 1, 1, 2, 1], $module::$users, ['Id', 'Nom', 'Prénom','Groupe', 'Pseudo', 'eMail', '']); ?>
<?php echo template::ico('check');?> Compte créé | <?php echo template::ico('mail');?> Compte créé et notifié | <?php echo template::ico('cancel');?> Erreur dans le fichier, compte non créé.
<?php echo template::table([1, 3, 3, 1, 1, 2, 1], $module::$users, ['Id', 'Nom', 'Prénom', 'Groupe', 'Pseudo', 'eMail', '']); ?>
<?php echo template::ico('check'); ?> Compte créé | <?php echo template::ico('mail'); ?> Compte créé et notifié | <?php echo template::ico('cancel'); ?> Erreur dans le fichier, compte non créé.
</div>
</div>
<?php endif;?>
<?php endif; ?>

View File

@ -18,7 +18,7 @@
<div class="col1 offset8">
<?php echo template::button('userImport', [
'href' => helper::baseUrl() . 'user/import',
'value' => template::ico('upload') ,
'value' => template::ico('upload'),
'help' => 'Importer des utilisateurs en masse'
]); ?>
</div>

View File

@ -1,54 +1,54 @@
<?php echo template::formOpen('userLoginForm'); ?>
<div class="row">
<div class="col6">
<?php echo template::text('userLoginId', [
'label' => 'Identifiant',
'value' => $module::$userId
]); ?>
</div>
<div class="col6">
<?php if ($this->getData(['config', 'connect', 'showPassword']) === true) {
$passwordLabel = '<span id="passwordLabel">Mot de passe</span><span id="passwordIcon">' . template::ico('eye') . '</span>';
} else {
$passwordLabel = 'Mot de passe';
}
?>
<?php echo template::password('userLoginPassword', [
'label' => $passwordLabel
]); ?>
</div>
</div>
<?php if ($this->getData(['config', 'connect', 'captcha'])) : ?>
<div class="row">
<div class="col6">
<?php echo template::text('userLoginId', [
'label' => 'Identifiant',
'value' => $module::$userId
]); ?>
</div>
<div class="col6">
<?php if ($this->getData(['config', 'connect', 'showPassword']) === true) {
$passwordLabel = '<span id="passwordLabel">Mot de passe</span><span id="passwordIcon">'. template::ico('eye') . '</span>';
} else {
$passwordLabel = 'Mot de passe';
}
?>
<?php echo template::password('userLoginPassword', [
'label' => $passwordLabel
<div class="col12 textAlignCenter">
<?php echo template::captcha('userLoginCaptcha', [
'limit' => $this->getData(['config', 'connect', 'captchaStrong']),
'type' => $this->getData(['config', 'connect', 'captchaType'])
]); ?>
</div>
</div>
<?php if ($this->getData(['config', 'connect','captcha'])): ?>
<div class="row">
<div class="col12 textAlignCenter">
<?php echo template::captcha('userLoginCaptcha', [
'limit' => $this->getData(['config','connect', 'captchaStrong']),
'type' => $this->getData(['config','connect', 'captchaType'])
]); ?>
</div>
</div>
<?php endif;?>
<div class="row">
<div class="col6">
<?php echo template::checkbox('userLoginLongTime', true, 'Rester connecté sur ce navigateur', [
'checked' => $module::$userLongtime
]); ?>
</div>
<div class="col6 textAlignRight">
<a href="<?php echo helper::baseUrl(); ?>user/forgot/<?php echo $this->getUrl(2); ?>">Mot de passe perdu ?</a>
</div>
<?php endif; ?>
<div class="row">
<div class="col6">
<?php echo template::checkbox('userLoginLongTime', true, 'Rester connecté sur ce navigateur', [
'checked' => $module::$userLongtime
]); ?>
</div>
<div class="row">
<div class="col2">
<?php echo template::button('userLoginBack', [
'href' => helper::baseUrl() . str_replace('_', '/', str_replace('__', '#', $this->getUrl(2))),
'value' => template::ico('left')
]); ?>
</div>
<div class="col3 offset7">
<?php echo template::submit('userLoginSubmit', [
'value' => 'Connexion'
]); ?>
</div>
<div class="col6 textAlignRight">
<a href="<?php echo helper::baseUrl(); ?>user/forgot/<?php echo $this->getUrl(2); ?>">Mot de passe perdu ?</a>
</div>
</div>
<div class="row">
<div class="col2">
<?php echo template::button('userLoginBack', [
'href' => helper::baseUrl() . str_replace('_', '/', str_replace('__', '#', $this->getUrl(2))),
'value' => template::ico('left')
]); ?>
</div>
<div class="col3 offset7">
<?php echo template::submit('userLoginSubmit', [
'value' => 'Connexion'
]); ?>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -1,21 +1,21 @@
<?php echo template::formOpen('userResetForm'); ?>
<div class="row">
<div class="col6">
<?php echo template::password('userResetNewPassword', [
'label' => 'Nouveau mot de passe'
]); ?>
</div>
<div class="col6">
<?php echo template::password('userResetConfirmPassword', [
'label' => 'Confirmation'
]); ?>
</div>
<div class="row">
<div class="col6">
<?php echo template::password('userResetNewPassword', [
'label' => 'Nouveau mot de passe'
]); ?>
</div>
<div class="row">
<div class="col2 offset10">
<?php echo template::submit('userResetSubmit', [
'value' => 'Valider'
]); ?>
</div>
<div class="col6">
<?php echo template::password('userResetConfirmPassword', [
'label' => 'Confirmation'
]); ?>
</div>
</div>
<div class="row">
<div class="col2 offset10">
<?php echo template::submit('userResetSubmit', [
'value' => 'Valider'
]); ?>
</div>
</div>
<?php echo template::formClose(); ?>