Merge branch '12304' into 12400

This commit is contained in:
Fred Tempez 2023-03-28 13:18:55 +02:00
commit c4fd214e04
40 changed files with 1458 additions and 523 deletions

View File

@ -1,5 +1,21 @@
# Changelog # Changelog
## Version 12.3.04
### Corrections
- Corrige un défaut d'actualisation de la liste des pages et du site map lorsque la page change d'id.
- Serveur SMTP :
- Corrige le décryptage du mot de passe SMTP.
- Corrige un défaut d'encodage UTF-8 du sujet du mail et du titre du site.
- Traduction du message de compte bloqué.
### Améliorations
- Module Blog :
- Aspect de la liste des articles présenté en tableau avec un bouton "Lire la suite" agrémenté d'un effet de flou.
- Des tailles de masquage du texte des articles plus importantes sont proposées.
- Comptes de réseaux sociaux :
- Sont ajoutés Steam, Twitch, Vimeo et Reddit.
- Des icônes accompagnent le noms des réseaux dans la configuration.
## Version 12.3.03 ## Version 12.3.03
- Corrige le problème d'affichage lors de l'édition d'une page contenant une feuille style commentée. - Corrige le problème d'affichage lors de l'édition d'une page contenant une feuille style commentée.
- Corrige des problèmes d'interprétation des scripts intégrés dans une page. - Corrige des problèmes d'interprétation des scripts intégrés dans une page.

View File

@ -1,4 +1,4 @@
# ZwiiCMS 12.3.03 # ZwiiCMS 12.3.04
Zwii est un CMS sans base de données (flat-file) qui permet de créer et gérer facilement un site web sans aucune connaissance en programmation. Zwii est un CMS sans base de données (flat-file) qui permet de créer et gérer facilement un site web sans aucune connaissance en programmation.

View File

@ -1,4 +1,4 @@
# ZwiiCMS 12.3.03 # ZwiiCMS 12.3.04
Zwii is a database-less (flat-file) CMS that allows you to easily create and manage a web site without any programming knowledge. Zwii is a database-less (flat-file) CMS that allows you to easily create and manage a web site without any programming knowledge.

View File

@ -688,25 +688,23 @@ class helper
/** /**
* Cryptage * Cryptage
* @param string $key la clé d'encryptage * @param string $key la clé d'encryptage
* @param string $payload la chaine à coder * @param string $string la chaine à coder
* @return string * @return string
*/ */
public static function encrypt($key, $payload) public static function encrypt($string, $key) {
{ $encrypted = openssl_encrypt($string, "AES-256-CBC", $key, 0, substr(md5($key), 0, 16));
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc')); return base64_encode($encrypted);
$encrypted = openssl_encrypt($payload, 'aes-256-cbc', $key, 0, $iv); }
return base64_encode($encrypted . '::' . $iv);
}
/** /**
* Décryptage * Décryptage
* @param string $key la clé d'encryptage * @param string $key la clé d'encryptage
* @param string $garble la chaine à décoder * @param string $string la chaine à décoder
* @return string * @return string
*/ */
public static function decrypt($key, $garble) public static function decrypt($string, $key) {
{ $decrypted = openssl_decrypt(base64_decode($string), "AES-256-CBC", $key, 0, substr(md5($key), 0, 16));
list($encrypted_data, $iv) = explode('::', base64_decode($garble), 2); return $decrypted;
return openssl_decrypt($encrypted_data, 'aes-256-cbc', $key, 0, $iv); }
}
} }

View File

@ -410,6 +410,22 @@ class layout extends common
$socialUrl = 'https://www.github.com/'; $socialUrl = 'https://www.github.com/';
$title = 'Github'; $title = 'Github';
break; break;
case 'redditId':
$socialUrl = 'https://www.reddit.com/user/';
$title = 'Reddit';
break;
case 'twitchId':
$socialUrl = 'https://www.twitch.tv/';
$title = 'Twitch';
break;
case 'vimeoId':
$socialUrl = 'https://vimeo.com/';
$title = 'Vimeo';
break;
case 'steamId':
$socialUrl = 'https://steamcommunity.com/id/';
$title = 'Steam';
break;
default: default:
$socialUrl = ''; $socialUrl = '';
} }
@ -965,7 +981,7 @@ class layout extends common
'help' => 'Fichiers', 'help' => 'Fichiers',
'href' => helper::baseUrl(false) . 'core/vendor/filemanager/dialog.php?type=0&akey=' . md5_file(self::DATA_DIR . 'core.json') . '&lang=' . $this->getData(['user', $this->getUser('id'), 'language']), 'href' => helper::baseUrl(false) . 'core/vendor/filemanager/dialog.php?type=0&akey=' . md5_file(self::DATA_DIR . 'core.json') . '&lang=' . $this->getData(['user', $this->getUser('id'), 'language']),
'attr' => 'data-lity' 'attr' => 'data-lity'
]) . '</li>'; ]) . '</li>';
} }
if ($this->getUser('group') >= self::GROUP_ADMIN) { if ($this->getUser('group') >= self::GROUP_ADMIN) {
$rightItems .= '<li>' . template::ico('brush', [ $rightItems .= '<li>' . template::ico('brush', [
@ -1016,10 +1032,10 @@ class layout extends common
} }
} }
if ($this->getUser('group') >= self::GROUP_MODERATOR) { if ($this->getUser('group') >= self::GROUP_MODERATOR) {
$rightItems .= '<li><a href="' . helper::baseUrl() . 'user/edit/' . $this->getUser('id') . '/' . $_SESSION['csrf'] . $rightItems .= '<li><a href="' . helper::baseUrl() . 'user/edit/' . $this->getUser('id') . '/' . $_SESSION['csrf'] .
'" data-tippy-content="'. helper::translate('Configurer mon compte') . '">' . '" data-tippy-content="' . helper::translate('Configurer mon compte') . '">' .
template::ico('user', ['margin' => 'right']) . '<span id="displayUsername">' . $this->getUser('firstname') . ' ' . $this->getUser('lastname') . template::ico('user', ['margin' => 'right']) . '<span id="displayUsername">' . $this->getUser('firstname') . ' ' . $this->getUser('lastname') .
'</span></a></li>'; '</span></a></li>';
} }
$rightItems .= '<li>' . template::ico('logout', [ $rightItems .= '<li>' . template::ico('logout', [
'help' => 'Déconnecter', 'help' => 'Déconnecter',
@ -1043,8 +1059,8 @@ class layout extends common
if ($this->core->output['inlineScript']) { if ($this->core->output['inlineScript']) {
$inlineScript = implode($this->core->output['inlineScript']); $inlineScript = implode($this->core->output['inlineScript']);
} }
echo '<script defer>' . helper::minifyJs($coreScript . $this->core->output['script'] ) . '</script>'; echo '<script defer>' . helper::minifyJs($coreScript . $this->core->output['script']) . '</script>';
echo '<script defer>' . htmlspecialchars_decode(helper::minifyJs($inlineScript)) . '</script>'; echo '<script defer>' . helper::minifyJs(htmlspecialchars_decode($inlineScript)) . '</script>';
} }
/** /**

View File

@ -371,55 +371,10 @@ class common
// Construit la liste des pages parents/enfants // Construit la liste des pages parents/enfants
if ($this->hierarchy['all'] === []) { if ($this->hierarchy['all'] === []) {
$pages = helper::arrayColumn($this->getData(['page']), 'position', 'SORT_ASC'); $this->buildHierarchy();
// Parents
foreach ($pages as $pageId => $pagePosition) {
if (
// Page parent
$this->getData(['page', $pageId, 'parentPageId']) === ""
// Ignore les pages dont l'utilisateur n'a pas accès
and ($this->getData(['page', $pageId, 'group']) === self::GROUP_VISITOR
or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and $this->getUser('group') >= $this->getData(['page', $pageId, 'group'])
)
)
) {
if ($pagePosition !== 0) {
$this->hierarchy['visible'][$pageId] = [];
}
if ($this->getData(['page', $pageId, 'block']) === 'bar') {
$this->hierarchy['bar'][$pageId] = [];
}
$this->hierarchy['all'][$pageId] = [];
}
}
// Enfants
foreach ($pages as $pageId => $pagePosition) {
if (
// Page parent
$parentId = $this->getData(['page', $pageId, 'parentPageId'])
// Ignore les pages dont l'utilisateur n'a pas accès
and (
($this->getData(['page', $pageId, 'group']) === self::GROUP_VISITOR
and $this->getData(['page', $parentId, 'group']) === self::GROUP_VISITOR
)
or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and $this->getUser('group') >= $this->getData(['page', $parentId, 'group'])
and $this->getUser('group') >= $this->getData(['page', $pageId, 'group'])
)
)
) {
if ($pagePosition !== 0) {
$this->hierarchy['visible'][$parentId][] = $pageId;
}
if ($this->getData(['page', $pageId, 'block']) === 'bar') {
$this->hierarchy['bar'][$pageId] = [];
}
$this->hierarchy['all'][$parentId][] = $pageId;
}
}
} }
// Construit l'url // Construit l'url
if ($this->url === '') { if ($this->url === '') {
if ($url = $_SERVER['QUERY_STRING']) { if ($url = $_SERVER['QUERY_STRING']) {
@ -707,6 +662,7 @@ class common
} }
} }
/** /**
* Accède à la liste des pages parents et de leurs enfants * Accède à la liste des pages parents et de leurs enfants
* @param int $parentId Id de la page parent * @param int $parentId Id de la page parent
@ -732,6 +688,133 @@ class common
} }
} }
/**
* Fonction pour construire le tableau des pages
* Appelée par le core uniquement
*/
private function buildHierarchy()
{
$pages = helper::arrayColumn($this->getData(['page']), 'position', 'SORT_ASC');
// Parents
foreach ($pages as $pageId => $pagePosition) {
if (
// Page parent
$this->getData(['page', $pageId, 'parentPageId']) === ""
// Ignore les pages dont l'utilisateur n'a pas accès
and ($this->getData(['page', $pageId, 'group']) === self::GROUP_VISITOR
or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and $this->getUser('group') >= $this->getData(['page', $pageId, 'group'])
)
)
) {
if ($pagePosition !== 0) {
$this->hierarchy['visible'][$pageId] = [];
}
if ($this->getData(['page', $pageId, 'block']) === 'bar') {
$this->hierarchy['bar'][$pageId] = [];
}
$this->hierarchy['all'][$pageId] = [];
}
}
// Enfants
foreach ($pages as $pageId => $pagePosition) {
if (
// Page parent
$parentId = $this->getData(['page', $pageId, 'parentPageId'])
// Ignore les pages dont l'utilisateur n'a pas accès
and (
($this->getData(['page', $pageId, 'group']) === self::GROUP_VISITOR
and $this->getData(['page', $parentId, 'group']) === self::GROUP_VISITOR
)
or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and $this->getUser('group') >= $this->getData(['page', $parentId, 'group'])
and $this->getUser('group') >= $this->getData(['page', $pageId, 'group'])
)
)
) {
if ($pagePosition !== 0) {
$this->hierarchy['visible'][$parentId][] = $pageId;
}
if ($this->getData(['page', $pageId, 'block']) === 'bar') {
$this->hierarchy['bar'][$pageId] = [];
}
$this->hierarchy['all'][$parentId][] = $pageId;
}
}
}
/**
* Génère un fichier json avec la liste des pages
*
*/
private function tinyMcePages()
{
// Sauve la liste des pages pour TinyMCE
$parents = [];
$rewrite = (helper::checkRewrite()) ? '' : '?';
// Boucle de recherche des pages actives
foreach ($this->getHierarchy(null, false, false) as $parentId => $childIds) {
$children = [];
// Exclure les barres
if ($this->getData(['page', $parentId, 'block']) !== 'bar') {
// Boucler sur les enfants et récupérer le tableau children avec la liste des enfants
foreach ($childIds as $childId) {
$children[] = [
'title' => '&nbsp;»&nbsp;' . html_entity_decode($this->getData(['page', $childId, 'shortTitle']), ENT_QUOTES),
'value' => $rewrite . $childId
];
}
// Traitement
if (empty($childIds)) {
// Pas d'enfant, uniquement l'entrée du parent
$parents[] = [
'title' => html_entity_decode($this->getData(['page', $parentId, 'shortTitle']), ENT_QUOTES),
'value' => $rewrite . $parentId
];
} else {
// Des enfants, on ajoute la page parent en premier
array_unshift($children, [
'title' => html_entity_decode($this->getData(['page', $parentId, 'shortTitle']), ENT_QUOTES),
'value' => $rewrite . $parentId
]);
// puis on ajoute les enfants au parent
$parents[] = [
'title' => html_entity_decode($this->getData(['page', $parentId, 'shortTitle']), ENT_QUOTES),
'value' => $rewrite . $parentId,
'menu' => $children
];
}
}
}
// Sitemap et Search
$children = [];
$children[] = [
'title' => 'Rechercher dans le site',
'value' => $rewrite . 'search'
];
$children[] = [
'title' => 'Plan du site',
'value' => $rewrite . 'sitemap'
];
$parents[] = [
'title' => 'Pages spéciales',
'value' => '#',
'menu' => $children
];
// Enregistrement : 3 tentatives
for ($i = 0; $i < 3; $i++) {
if (file_put_contents('core/vendor/tinymce/link_list.json', json_encode($parents, JSON_UNESCAPED_UNICODE), LOCK_EX) !== false) {
break;
}
// Pause de 10 millisecondes
usleep(10000);
}
}
/** /**
* Accède à une valeur des variables http (ordre de recherche en l'absence de type : _COOKIE, _POST) * Accède à une valeur des variables http (ordre de recherche en l'absence de type : _COOKIE, _POST)
* @param string $key Clé de la valeur * @param string $key Clé de la valeur
@ -837,74 +920,6 @@ class common
return ($this->checkCSRF() and $this->input['_POST'] !== []); return ($this->checkCSRF() and $this->input['_POST'] !== []);
} }
/**
* Génère un fichier json avec la liste des pages
*
*/
public function listPages()
{
// Sauve la liste des pages pour TinyMCE
$parents = [];
$rewrite = (helper::checkRewrite()) ? '' : '?';
// Boucle de recherche des pages actives
foreach ($this->getHierarchy(null, false, false) as $parentId => $childIds) {
$children = [];
// Exclure les barres
if ($this->getData(['page', $parentId, 'block']) !== 'bar') {
// Boucler sur les enfants et récupérer le tableau children avec la liste des enfants
foreach ($childIds as $childId) {
$children[] = [
'title' => ' » ' . html_entity_decode($this->getData(['page', $childId, 'shortTitle']), ENT_QUOTES),
'value' => $rewrite . $childId
];
}
// Traitement
if (empty($childIds)) {
// Pas d'enfant, uniquement l'entrée du parent
$parents[] = [
'title' => html_entity_decode($this->getData(['page', $parentId, 'shortTitle']), ENT_QUOTES),
'value' => $rewrite . $parentId
];
} else {
// Des enfants, on ajoute la page parent en premier
array_unshift($children, [
'title' => html_entity_decode($this->getData(['page', $parentId, 'shortTitle']), ENT_QUOTES),
'value' => $rewrite . $parentId
]);
// puis on ajoute les enfants au parent
$parents[] = [
'title' => html_entity_decode($this->getData(['page', $parentId, 'shortTitle']), ENT_QUOTES),
'value' => $rewrite . $parentId,
'menu' => $children
];
}
}
}
// Sitemap et Search
$children = [];
$children[] = [
'title' => 'Rechercher dans le site',
'value' => $rewrite . 'search'
];
$children[] = [
'title' => 'Plan du site',
'value' => $rewrite . 'sitemap'
];
$parents[] = [
'title' => 'Pages spéciales',
'value' => '#',
'menu' => $children
];
// Enregistrement : 3 tentatives
for ($i = 0; $i < 3; $i++) {
if (file_put_contents('core/vendor/tinymce/link_list.json', json_encode($parents), LOCK_EX) !== false) {
break;
}
// Pause de 10 millisecondes
usleep(10000);
}
}
/** /**
* Retourne une chemin localisé pour l'enregistrement des données * Retourne une chemin localisé pour l'enregistrement des données
@ -931,14 +946,20 @@ class common
/** /**
* Génère un fichier un fichier sitemap.xml * Génère un fichier un fichier sitemap.xml
* https://github.com/icamys/php-sitemap-generator * https://github.com/icamys/php-sitemap-generator
* $command valeurs possible
* all : génère un site map complet * all : génère un site map complet
* Sinon contient id de la page à créer * Sinon contient id de la page à créer
* @param string Valeurs possibles
*/ */
public function createSitemap($command = "all") public function updateSitemap()
{ {
// Rafraîchit la liste des pages après une modification de pageId notamment
$this->buildHierarchy();
// Actualise la liste des pages pour TinyMCE
$this->tinyMcePages();
//require_once "core/vendor/sitemap/SitemapGenerator.php"; //require_once "core/vendor/sitemap/SitemapGenerator.php";
$timezone = $this->getData(['config', 'timezone']); $timezone = $this->getData(['config', 'timezone']);
@ -1035,6 +1056,8 @@ class common
} }
return (file_exists('sitemap.xml') && file_exists('robots.txt')); return (file_exists('sitemap.xml') && file_exists('robots.txt'));
} }
/* /*
@ -1109,37 +1132,46 @@ class common
include 'core/layout/mail.php'; include 'core/layout/mail.php';
$layout = ob_get_clean(); $layout = ob_get_clean();
$mail = new PHPMailer\PHPMailer\PHPMailer; $mail = new PHPMailer\PHPMailer\PHPMailer;
$mail->CharSet = 'UTF-8';
$mail->setLanguage(substr(self::$i18nUI, 0, 2), 'core/class/phpmailer/i18n/'); $mail->setLanguage(substr(self::$i18nUI, 0, 2), 'core/class/phpmailer/i18n/');
$mail->CharSet = 'UTF-8';
$mail->Encoding = 'base64';
// Mail // Mail
try { try {
// Paramètres SMTP perso // Paramètres SMTP perso
if ($this->getdata(['config', 'smtp', 'enable'])) { if ($this->getdata(['config', 'smtp', 'enable'])) {
$mail->SMTPDebug = PHPMailer\PHPMailer\SMTP::DEBUG_SERVER; //$mail->SMTPDebug = PHPMailer\PHPMailer\SMTP::DEBUG_CLIENT;
$mail->isSMTP(); $mail->isSMTP();
$mail->SMTPAutoTLS = false; $mail->SMTPAutoTLS = false;
$mail->SMTPSecure = false; $mail->SMTPSecure = false;
$mail->SMTPAuth = false; $mail->SMTPAuth = false;
$mail->Host = $this->getdata(['config', 'smtp', 'host']); $mail->Host = $this->getdata(['config', 'smtp', 'host']);
$mail->Port = (int) $this->getdata(['config', 'smtp', 'port']); $mail->Port = (int) $this->getdata(['config', 'smtp', 'port']);
if ($this->getData(['config', 'smtp', 'auth'])) { if ($this->getData(['config', 'smtp', 'auth'])) {
$mail->SMTPAutoTLS = true;
$mail->SMTPSecure = true; $mail->SMTPSecure = true;
$mail->SMTPAuth = $this->getData(['config', 'smtp', 'auth']); $mail->SMTPAuth = true;
$mail->Username = $this->getData(['config', 'smtp', 'username']); $mail->Username = $this->getData(['config', 'smtp', 'username']);
$mail->Password = helper::decrypt($this->getData(['config', 'smtp', 'username']), $this->getData(['config', 'smtp', 'password'])); $mail->Password = helper::decrypt($this->getData(['config', 'smtp', 'password']), $this->getData(['config', 'smtp', 'host']));
$mail->SMTPSecure = $this->getData(['config', 'smtp', 'secure']); switch ($this->getData(['config', 'smtp', 'secure'])) {
case 'ssl':
$mail->SMTPSecure = PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_SMTPS;
break;
case 'tls':
$mail->SMTPSecure = PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_STARTTLS;
break;
default:
break;
}
} }
} }
// Expéditeur // Expéditeur
$host = str_replace('www.', '', $_SERVER['HTTP_HOST']); $host = str_replace('www.', '', $_SERVER['HTTP_HOST']);
$from = $from ? $from : 'no-reply@' . $host; $from = $from ? $from : 'no-reply@' . $host;
$mail->setFrom($from, $this->getData(['locale', 'title'])); $mail->setFrom($from, html_entity_decode($this->getData(['locale', 'title'])));
// répondre à // répondre à
if (is_null($replyTo)) { if (is_null($replyTo)) {
$mail->addReplyTo($from, $this->getData(['locale', 'title'])); $mail->addReplyTo($from, html_entity_decode($this->getData(['locale', 'title'])));
} else { } else {
$mail->addReplyTo($replyTo); $mail->addReplyTo($replyTo);
} }
@ -1153,7 +1185,7 @@ class common
$mail->addAddress($to); $mail->addAddress($to);
} }
$mail->isHTML(true); $mail->isHTML(true);
$mail->Subject = $subject; $mail->Subject = html_entity_decode($subject);
$mail->Body = $layout; $mail->Body = $layout;
$mail->AltBody = strip_tags($content); $mail->AltBody = strip_tags($content);
if ($mail->send()) { if ($mail->send()) {
@ -1162,7 +1194,7 @@ class common
return $mail->ErrorInfo; return $mail->ErrorInfo;
} }
} catch (Exception $e) { } catch (Exception $e) {
return $e->getMessage(); return $mail->ErrorInfo;
} }
} }
@ -1258,7 +1290,7 @@ class common
new RecursiveCallbackFilterIterator( new RecursiveCallbackFilterIterator(
new RecursiveDirectoryIterator( new RecursiveDirectoryIterator(
$folder, $folder,
RecursiveDirectoryIterator::SKIP_DOTS RecursiveDirectoryIterator::SKIP_DOTS
), ),
function ($fileInfo, $key, $iterator) use ($filter) { function ($fileInfo, $key, $iterator) use ($filter) {
return $fileInfo->isFile() || !in_array($fileInfo->getBaseName(), $filter); return $fileInfo->isFile() || !in_array($fileInfo->getBaseName(), $filter);
@ -1275,3 +1307,4 @@ class common
$zip->close(); $zip->close();
} }
} }

View File

@ -951,6 +951,38 @@ footer #footerSocials .zwiico-github:hover {
background: #000; background: #000;
} }
footer #footerSocials .zwiico-reddit {
background: #FF4500;
}
footer #footerSocials .zwiico-reddit:hover {
background: #D23311;
}
footer #footerSocials .zwiico-steam {
background: #171A21;
}
footer #footerSocials .zwiico-steam:hover {
background: #0F1318;
}
footer #footerSocials .zwiico-vimeo {
background: #162221;
}
footer #footerSocials .zwiico-vimeo:hover {
background: #121B1E;
}
footer #footerSocials .zwiico-twitch {
background: #9146FF;
}
footer #footerSocials .zwiico-twitch:hover {
background: #703CEC;
}
/* Bulle de dialogue */ /* Bulle de dialogue */

View File

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="<?php echo substr(self::$i18nContent, 0, 2);?>"> <html xmlns="http://www.w3.org/1999/xhtml" lang="<?php echo substr(self::$i18nContent, 0, 2);?>">
<head> <head>
<meta charset="utf-8"> <meta charset="UTF-8">
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> <meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">

View File

@ -213,7 +213,7 @@ class config extends common
{ {
// Mettre à jour le site map // Mettre à jour le site map
$successSitemap = $this->createSitemap(); $successSitemap = $this->updateSitemap();
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
@ -451,16 +451,20 @@ class config extends common
'twitterId' => $this->getInput('socialTwitterId'), 'twitterId' => $this->getInput('socialTwitterId'),
'youtubeId' => $this->getInput('socialYoutubeId'), 'youtubeId' => $this->getInput('socialYoutubeId'),
'youtubeUserId' => $this->getInput('socialYoutubeUserId'), 'youtubeUserId' => $this->getInput('socialYoutubeUserId'),
'githubId' => $this->getInput('socialGithubId') 'githubId' => $this->getInput('socialGithubId'),
'redditId' => $this->getInput('socialRedditId'),
'twitchId' => $this->getInput('socialTwitchId'),
'vimeoId' => $this->getInput('socialVimeoId'),
'steamId' =>$this->getInput('socialSteamId'),
], ],
'smtp' => [ 'smtp' => [
'enable' => $this->getInput('smtpEnable', helper::FILTER_BOOLEAN), 'enable' => $this->getInput('smtpEnable', helper::FILTER_BOOLEAN),
'host' => $this->getInput('smtpHost', helper::FILTER_STRING_SHORT, $this->getInput('smtpEnable', helper::FILTER_BOOLEAN)), 'host' => $this->getInput('smtpHost', helper::FILTER_STRING_SHORT),
'port' => $this->getInput('smtpPort', helper::FILTER_INT, $this->getInput('smtpEnable', helper::FILTER_BOOLEAN)), 'port' => $this->getInput('smtpPort', helper::FILTER_INT),
'auth' => $this->getInput('smtpAuth', helper::FILTER_BOOLEAN), 'auth' => $this->getInput('smtpAuth', helper::FILTER_BOOLEAN),
'secure' => $this->getInput('smtpSecure', helper::FILTER_STRING_SHORT), 'secure' => $this->getInput('smtpSecure', helper::FILTER_STRING_SHORT),
'username' => $this->getInput('smtpUsername', helper::FILTER_STRING_SHORT, $this->getInput('smtpAuth', helper::FILTER_BOOLEAN)), 'username' => $this->getInput('smtpUsername', helper::FILTER_STRING_SHORT),
'password' => helper::encrypt($this->getData(['config', 'smtp', 'username']), $this->getInput('smtpPassword', null, $this->getInput('smtpAuth', helper::FILTER_BOOLEAN))), 'password' => helper::encrypt($this->getInput('smtpPassword', helper::FILTER_STRING_SHORT),$this->getInput('smtpHost', helper::FILTER_STRING_SHORT)),
'from' => $this->getInput('smtpFrom', helper::FILTER_MAIL, true), 'from' => $this->getInput('smtpFrom', helper::FILTER_MAIL, true),
], ],
'seo' => [ 'seo' => [

View File

@ -2,7 +2,8 @@
<div class="row"> <div class="row">
<div class="col12"> <div class="col12">
<div class="block"> <div class="block">
<h4><?php echo helper::translate('Capture d\'écran Open Graph'); ?> <h4>
<?php echo helper::translate('Capture d\'écran Open Graph'); ?>
<!--<span id="specialeHelpButton" class="helpDisplayButton"> <!--<span id="specialeHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/referencement" target="_blank" title="Cliquer pour consulter l'aide en ligne"> <a href="https://doc.zwiicms.fr/referencement" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php //echo template::ico('help', ['margin' => 'left']); ?> <?php //echo template::ico('help', ['margin' => 'left']); ?>
@ -30,10 +31,11 @@
</div> </div>
</div> </div>
<div class="col5"> <div class="col5">
<?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="row">
<div class="col8 offset2 textAlignCenter"> <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>
</div> </div>
<?php endif; ?> <?php endif; ?>
@ -45,7 +47,8 @@
<div class="row"> <div class="row">
<div class="col12"> <div class="col12">
<div class="block"> <div class="block">
<h4><?php echo helper::translate('Référencement'); ?> <h4>
<?php echo helper::translate('Référencement'); ?>
</h4> </h4>
<div class="row"> <div class="row">
<div class="col4 offset1"> <div class="col4 offset1">
@ -66,7 +69,8 @@
<div class="row"> <div class="row">
<div class="col12"> <div class="col12">
<div class="block"> <div class="block">
<h4><?php echo helper::translate('Réseaux sociaux'); ?> <h4>
<?php echo helper::translate('Réseaux sociaux'); ?>
<!--<span id="specialeHelpButton" class="helpDisplayButton"> <!--<span id="specialeHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/reseaux-sociaux" target="_blank" title="Cliquer pour consulter l'aide en ligne"> <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']); ?> <?php //echo template::ico('help', ['margin' => 'left']); ?>
@ -77,61 +81,92 @@
<div class="col3"> <div class="col3">
<?php echo template::text('socialFacebookId', [ <?php echo template::text('socialFacebookId', [
'help' => 'Saisissez votre ID : https://www.facebook.com/[ID].', 'help' => 'Saisissez votre ID : https://www.facebook.com/[ID].',
'label' => 'Facebook', 'label' => template::ico('facebook', ['margin' => 'right']) . 'Facebook',
'value' => $this->getData(['config', 'social', 'facebookId']) 'value' => $this->getData(['config', 'social', 'facebookId'])
]); ?> ]); ?>
</div> </div>
<div class="col3"> <div class="col3">
<?php echo template::text('socialInstagramId', [ <?php echo template::text('socialInstagramId', [
'help' => 'Saisissez votre ID : https://www.instagram.com/[ID].', 'help' => 'Saisissez votre ID : https://www.instagram.com/[ID].',
'label' => 'Instagram', 'label' => template::ico('instagram', ['margin' => 'right']) . 'Instagram',
'value' => $this->getData(['config', 'social', 'instagramId']) 'value' => $this->getData(['config', 'social', 'instagramId'])
]); ?> ]); ?>
</div> </div>
<div class="col3">
<?php echo template::text('socialTwitterId', [
'help' => 'Saisissez votre ID : https://twitter.com/[ID].',
'label' => template::ico('twitter', ['margin' => 'right']) . 'Twitter',
'value' => $this->getData(['config', 'social', 'twitterId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('socialRedditId', [
'help' => 'Saisissez votre ID Reddit : https://www.reddit.com/user/[ID].',
'label' => template::ico('reddit', ['margin' => 'right']) . 'Reddit',
'value' => $this->getData(['config', 'social', 'redditId'])
]); ?>
</div>
</div>
<div class="row">
<div class="col3"> <div class="col3">
<?php echo template::text('socialYoutubeId', [ <?php echo template::text('socialYoutubeId', [
'help' => 'ID de la chaîne : https://www.youtube.com/channel/[ID].', 'help' => 'ID de la chaîne : https://www.youtube.com/channel/[ID].',
'label' => 'Chaîne Youtube', 'label' => template::ico('youtube', ['margin' => 'right']) . 'Chaîne Youtube',
'value' => $this->getData(['config', 'social', 'youtubeId']) 'value' => $this->getData(['config', 'social', 'youtubeId'])
]); ?> ]); ?>
</div> </div>
<div class="col3"> <div class="col3">
<?php echo template::text('socialYoutubeUserId', [ <?php echo template::text('socialYoutubeUserId', [
'help' => 'Saisissez votre ID Utilisateur : https://www.youtube.com/user/[ID].', 'help' => 'Saisissez votre ID Utilisateur : https://www.youtube.com/user/[ID].',
'label' => 'Youtube', 'label' => template::ico('youtube', ['margin' => 'right']) . 'Youtube',
'value' => $this->getData(['config', 'social', 'youtubeUserId']) 'value' => $this->getData(['config', 'social', 'youtubeUserId'])
]); ?> ]); ?>
</div> </div>
</div>
<div class="row">
<div class="col3"> <div class="col3">
<?php echo template::text('socialTwitterId', [ <?php echo template::text('socialVimeoId', [
'help' => 'Saisissez votre ID : https://twitter.com/[ID].', 'help' => 'Saisissez votre ID Viemo : https://vimeo.com/[ID].',
'label' => 'Twitter', 'label' => template::ico('vimeo', ['margin' => 'right']) . 'Vimeo',
'value' => $this->getData(['config', 'social', 'twitterId']) 'value' => $this->getData(['config', 'social', 'vimeoId'])
]); ?> ]); ?>
</div> </div>
<div class="col3"> <div class="col3">
<?php echo template::text('socialPinterestId', [ <?php echo template::text('socialPinterestId', [
'help' => 'Saisissez votre ID : https://pinterest.com/[ID].', 'help' => 'Saisissez votre ID : https://pinterest.com/[ID].',
'label' => 'Pinterest', 'label' => template::ico('pinterest', ['margin' => 'right']) . 'Pinterest',
'value' => $this->getData(['config', 'social', 'pinterestId']) 'value' => $this->getData(['config', 'social', 'pinterestId'])
]); ?> ]); ?>
</div> </div>
</div>
<div class="row">
<div class="col3"> <div class="col3">
<?php echo template::text('socialLinkedinId', [ <?php echo template::text('socialLinkedinId', [
'help' => 'Saisissez votre ID Linkedin : https://fr.linkedin.com/in/[ID].', 'help' => 'Saisissez votre ID Linkedin : https://fr.linkedin.com/in/[ID].',
'label' => 'Linkedin', 'label' => template::ico('linkedin', ['margin' => 'right']) . 'Linkedin',
'value' => $this->getData(['config', 'social', 'linkedinId']) 'value' => $this->getData(['config', 'social', 'linkedinId'])
]); ?> ]); ?>
</div> </div>
<div class="col3"> <div class="col3">
<?php echo template::text('socialGithubId', [ <?php echo template::text('socialGithubId', [
'help' => 'Saisissez votre ID Github : https://github.com/[ID].', 'help' => 'Saisissez votre ID Github : https://github.com/[ID].',
'label' => 'Github', 'label' => template::ico('github', ['margin' => 'right']) . 'Github',
'value' => $this->getData(['config', 'social', 'githubId']) 'value' => $this->getData(['config', 'social', 'githubId'])
]); ?> ]); ?>
</div> </div>
<div class="col3">
<?php echo template::text('socialTwitchId', [
'help' => 'Saisissez votre ID Twitch : https://www.twitch.tv/[ID].',
'label' => template::ico('twitch', ['margin' => 'right']) . 'Twitch',
'value' => $this->getData(['config', 'social', 'twitchId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('socialSteamId', [
'help' => 'Saisissez votre ID Viemo : https://steamcommunity.com/id/[ID].',
'label' => template::ico('steam', ['margin' => 'right']) . 'Steam',
'value' => $this->getData(['config', 'social', 'steamId'])
]); ?>
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -168,10 +168,10 @@ class page extends common
} }
//file_put_contents(self::DATA_DIR . self::$i18nContent . '/content/' . $pageId . '.html', '<p>Contenu de votre nouvelle page.</p>'); //file_put_contents(self::DATA_DIR . self::$i18nContent . '/content/' . $pageId . '.html', '<p>Contenu de votre nouvelle page.</p>');
$this->setPage($pageId, '<p>Contenu de votre nouvelle page.</p>', self::$i18nContent); $this->setPage($pageId, '<p>Contenu de votre nouvelle page.</p>', self::$i18nContent);
// Met à jour le site map
$this->createSitemap('all'); // Met à jour le sitemap
// Mise à jour de la liste des pages pour TinyMCE $this->updateSitemap();
$this->listPages();
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'redirect' => helper::baseUrl() . $pageId, 'redirect' => helper::baseUrl() . $pageId,
@ -295,10 +295,10 @@ class page extends common
unlink(self::DATA_DIR . self::$i18nContent . '/content/' . $url[0] . '.html'); unlink(self::DATA_DIR . self::$i18nContent . '/content/' . $url[0] . '.html');
} }
$this->deleteData(['module', $url[0]]); $this->deleteData(['module', $url[0]]);
// Met à jour le site map
$this->createSitemap('all'); // Met à jour le sitemap
// Mise à jour de la liste des pages pour TinyMCE $this->updateSitemap();
$this->listPages();
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'redirect' => helper::baseUrl(false), 'redirect' => helper::baseUrl(false),
@ -504,10 +504,8 @@ class page extends common
$content = empty($this->getInput('pageEditContent', null)) ? '<p></p>' : str_replace('<p></p>', '<p>&nbsp;</p>', $this->getInput('pageEditContent', null)); $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 // Met à jour le sitemap
$this->createSitemap('all'); $this->updateSitemap();
// Mise à jour de la liste des pages pour TinyMCE
$this->listPages();
// Redirection vers la configuration // Redirection vers la configuration
if ( if (
@ -554,12 +552,6 @@ class page extends common
} }
} }
// Met à jour le site map
$this->createSitemap('all');
// Mise à jour de la liste des pages pour TinyMCE
$this->listPages();
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'title' => $this->getData(['page', $this->getUrl(2), 'title']), 'title' => $this->getData(['page', $this->getUrl(2), 'title']),

View File

@ -617,8 +617,8 @@ class user extends common
$this->setData(['user', $userId, 'connectTimeout', time()]); $this->setData(['user', $userId, 'connectTimeout', time()]);
} }
// Cas 3 le délai de bloquage court // 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 = sprintf(helper::translate('Accès bloqué %d minutes', ($this->getData(['config', 'connect', 'timeout']) / 60))); $notification = sprintf(helper::translate('Accès bloqué %d minutes'), ($this->getData(['config', 'connect', 'timeout']) / 60));
} }
// Valeurs en sortie // Valeurs en sortie

View File

@ -57,9 +57,13 @@
.zwiico-youtube:before { content: '\f167'; } /* '' */ .zwiico-youtube:before { content: '\f167'; } /* '' */
.zwiico-instagram:before { content: '\f16d'; } /* '' */ .zwiico-instagram:before { content: '\f16d'; } /* '' */
.zwiico-box:before { content: '\f187'; } /* '' */ .zwiico-box:before { content: '\f187'; } /* '' */
.zwiico-vimeo:before { content: '\f194'; } /* '' */
.zwiico-cubes:before { content: '\f1b3'; } /* '' */ .zwiico-cubes:before { content: '\f1b3'; } /* '' */
.zwiico-steam:before { content: '\f1b6'; } /* '' */
.zwiico-file-archive:before { content: '\f1c6'; } /* '' */ .zwiico-file-archive:before { content: '\f1c6'; } /* '' */
.zwiico-sliders:before { content: '\f1de'; } /* '' */ .zwiico-sliders:before { content: '\f1de'; } /* '' */
.zwiico-twitch:before { content: '\f1e8'; } /* '' */
.zwiico-brush:before { content: '\f1fc'; } /* '' */ .zwiico-brush:before { content: '\f1fc'; } /* '' */
.zwiico-pinterest:before { content: '\f231'; } /* '' */ .zwiico-pinterest:before { content: '\f231'; } /* '' */
.zwiico-reddit:before { content: '\f281'; } /* '' */
.zwiico-shopping-basket:before { content: '\f291'; } /* '' */ .zwiico-shopping-basket:before { content: '\f291'; } /* '' */

File diff suppressed because one or more lines are too long

View File

@ -57,9 +57,13 @@
.zwiico-youtube { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf167;&nbsp;'); } .zwiico-youtube { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf167;&nbsp;'); }
.zwiico-instagram { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf16d;&nbsp;'); } .zwiico-instagram { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf16d;&nbsp;'); }
.zwiico-box { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf187;&nbsp;'); } .zwiico-box { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf187;&nbsp;'); }
.zwiico-vimeo { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf194;&nbsp;'); }
.zwiico-cubes { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf1b3;&nbsp;'); } .zwiico-cubes { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf1b3;&nbsp;'); }
.zwiico-steam { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf1b6;&nbsp;'); }
.zwiico-file-archive { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf1c6;&nbsp;'); } .zwiico-file-archive { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf1c6;&nbsp;'); }
.zwiico-sliders { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf1de;&nbsp;'); } .zwiico-sliders { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf1de;&nbsp;'); }
.zwiico-twitch { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf1e8;&nbsp;'); }
.zwiico-brush { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf1fc;&nbsp;'); } .zwiico-brush { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf1fc;&nbsp;'); }
.zwiico-pinterest { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf231;&nbsp;'); } .zwiico-pinterest { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf231;&nbsp;'); }
.zwiico-reddit { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf281;&nbsp;'); }
.zwiico-shopping-basket { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf291;&nbsp;'); } .zwiico-shopping-basket { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf291;&nbsp;'); }

View File

@ -68,9 +68,13 @@
.zwiico-youtube { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf167;&nbsp;'); } .zwiico-youtube { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf167;&nbsp;'); }
.zwiico-instagram { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf16d;&nbsp;'); } .zwiico-instagram { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf16d;&nbsp;'); }
.zwiico-box { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf187;&nbsp;'); } .zwiico-box { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf187;&nbsp;'); }
.zwiico-vimeo { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf194;&nbsp;'); }
.zwiico-cubes { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf1b3;&nbsp;'); } .zwiico-cubes { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf1b3;&nbsp;'); }
.zwiico-steam { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf1b6;&nbsp;'); }
.zwiico-file-archive { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf1c6;&nbsp;'); } .zwiico-file-archive { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf1c6;&nbsp;'); }
.zwiico-sliders { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf1de;&nbsp;'); } .zwiico-sliders { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf1de;&nbsp;'); }
.zwiico-twitch { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf1e8;&nbsp;'); }
.zwiico-brush { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf1fc;&nbsp;'); } .zwiico-brush { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf1fc;&nbsp;'); }
.zwiico-pinterest { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf231;&nbsp;'); } .zwiico-pinterest { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf231;&nbsp;'); }
.zwiico-reddit { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf281;&nbsp;'); }
.zwiico-shopping-basket { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf291;&nbsp;'); } .zwiico-shopping-basket { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf291;&nbsp;'); }

View File

@ -1,11 +1,11 @@
@font-face { @font-face {
font-family: 'zwiico'; font-family: 'zwiico';
src: url('../font/zwiico.eot?24592042'); src: url('../font/zwiico.eot?67918262');
src: url('../font/zwiico.eot?24592042#iefix') format('embedded-opentype'), src: url('../font/zwiico.eot?67918262#iefix') format('embedded-opentype'),
url('../font/zwiico.woff2?24592042') format('woff2'), url('../font/zwiico.woff2?67918262') format('woff2'),
url('../font/zwiico.woff?24592042') format('woff'), url('../font/zwiico.woff?67918262') format('woff'),
url('../font/zwiico.ttf?24592042') format('truetype'), url('../font/zwiico.ttf?67918262') format('truetype'),
url('../font/zwiico.svg?24592042#zwiico') format('svg'); url('../font/zwiico.svg?67918262#zwiico') format('svg');
font-weight: normal; font-weight: normal;
font-style: normal; font-style: normal;
} }
@ -15,7 +15,7 @@
@media screen and (-webkit-min-device-pixel-ratio:0) { @media screen and (-webkit-min-device-pixel-ratio:0) {
@font-face { @font-face {
font-family: 'zwiico'; font-family: 'zwiico';
src: url('../font/zwiico.svg?24592042#zwiico') format('svg'); src: url('../font/zwiico.svg?67918262#zwiico') format('svg');
} }
} }
*/ */
@ -112,9 +112,13 @@
.zwiico-youtube:before { content: '\f167'; } /* '' */ .zwiico-youtube:before { content: '\f167'; } /* '' */
.zwiico-instagram:before { content: '\f16d'; } /* '' */ .zwiico-instagram:before { content: '\f16d'; } /* '' */
.zwiico-box:before { content: '\f187'; } /* '' */ .zwiico-box:before { content: '\f187'; } /* '' */
.zwiico-vimeo:before { content: '\f194'; } /* '' */
.zwiico-cubes:before { content: '\f1b3'; } /* '' */ .zwiico-cubes:before { content: '\f1b3'; } /* '' */
.zwiico-steam:before { content: '\f1b6'; } /* '' */
.zwiico-file-archive:before { content: '\f1c6'; } /* '' */ .zwiico-file-archive:before { content: '\f1c6'; } /* '' */
.zwiico-sliders:before { content: '\f1de'; } /* '' */ .zwiico-sliders:before { content: '\f1de'; } /* '' */
.zwiico-twitch:before { content: '\f1e8'; } /* '' */
.zwiico-brush:before { content: '\f1fc'; } /* '' */ .zwiico-brush:before { content: '\f1fc'; } /* '' */
.zwiico-pinterest:before { content: '\f231'; } /* '' */ .zwiico-pinterest:before { content: '\f231'; } /* '' */
.zwiico-reddit:before { content: '\f281'; } /* '' */
.zwiico-shopping-basket:before { content: '\f291'; } /* '' */ .zwiico-shopping-basket:before { content: '\f291'; } /* '' */

Binary file not shown.

View File

@ -1,7 +1,7 @@
<?xml version="1.0" standalone="no"?> <?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg"> <svg xmlns="http://www.w3.org/2000/svg">
<metadata>Copyright (C) 2022 by original authors @ fontello.com</metadata> <metadata>Copyright (C) 2023 by original authors @ fontello.com</metadata>
<defs> <defs>
<font id="zwiico" horiz-adv-x="1000" > <font id="zwiico" horiz-adv-x="1000" >
<font-face font-family="zwiico" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" /> <font-face font-family="zwiico" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
@ -122,16 +122,24 @@
<glyph glyph-name="box" unicode="&#xf187;" d="M607 386q0 14-10 25t-26 10h-142q-15 0-25-10t-11-25 11-25 25-11h142q15 0 26 11t10 25z m322 107v-536q0-14-11-25t-25-11h-786q-14 0-25 11t-11 25v536q0 14 11 25t25 11h786q14 0 25-11t11-25z m35 250v-143q0-14-10-25t-25-11h-858q-14 0-25 11t-10 25v143q0 14 10 25t25 11h858q14 0 25-11t10-25z" horiz-adv-x="1000" /> <glyph glyph-name="box" unicode="&#xf187;" d="M607 386q0 14-10 25t-26 10h-142q-15 0-25-10t-11-25 11-25 25-11h142q15 0 26 11t10 25z m322 107v-536q0-14-11-25t-25-11h-786q-14 0-25 11t-11 25v536q0 14 11 25t25 11h786q14 0 25-11t11-25z m35 250v-143q0-14-10-25t-25-11h-858q-14 0-25 11t-10 25v143q0 14 10 25t25 11h858q14 0 25-11t10-25z" horiz-adv-x="1000" />
<glyph glyph-name="vimeo" unicode="&#xf194;" d="M721 494q6 121-90 124-129 4-174-146 25 11 46 11 47 0 41-54-2-32-41-93t-59-61q-24 0-46 94-7 30-25 142-16 106-89 99-33-4-91-56l-46-40-45-40 29-37q43 29 49 29 32 0 59-100 9-31 26-92t25-92q38-100 91-100 88 0 214 164 123 158 126 248z m136 124v-536q0-66-47-113t-114-48h-535q-67 0-114 48t-47 113v536q0 66 47 113t114 48h535q67 0 114-48t47-113z" horiz-adv-x="857.1" />
<glyph glyph-name="cubes" unicode="&#xf1b3;" d="M357-61l214 107v176l-214-92v-191z m-36 254l226 96-226 97-225-97z m608-254l214 107v176l-214-92v-191z m-36 254l225 96-225 97-226-97z m-250 163l214 92v149l-214-92v-149z m-36 212l246 105-246 106-246-106z m607-289v-233q0-20-10-37t-29-26l-250-125q-14-8-32-8t-32 8l-250 125q-2 1-4 2-1-1-4-2l-250-125q-14-8-32-8t-31 8l-250 125q-19 9-29 26t-11 37v233q0 21 12 39t32 26l242 104v223q0 22 12 40t31 26l250 107q13 6 28 6t28-6l250-107q20-9 32-26t12-40v-223l242-104q20-8 32-26t11-39z" horiz-adv-x="1285.7" /> <glyph glyph-name="cubes" unicode="&#xf1b3;" d="M357-61l214 107v176l-214-92v-191z m-36 254l226 96-226 97-225-97z m608-254l214 107v176l-214-92v-191z m-36 254l225 96-225 97-226-97z m-250 163l214 92v149l-214-92v-149z m-36 212l246 105-246 106-246-106z m607-289v-233q0-20-10-37t-29-26l-250-125q-14-8-32-8t-32 8l-250 125q-2 1-4 2-1-1-4-2l-250-125q-14-8-32-8t-31 8l-250 125q-19 9-29 26t-11 37v233q0 21 12 39t32 26l242 104v223q0 22 12 40t31 26l250 107q13 6 28 6t28-6l250-107q20-9 32-26t12-40v-223l242-104q20-8 32-26t11-39z" horiz-adv-x="1285.7" />
<glyph glyph-name="steam" unicode="&#xf1b6;" d="M883 525q0-56-40-96t-96-40-97 40-39 96 39 97 97 39 96-39 40-97z m-430-414q0 58-41 99t-98 41q-15 0-30-4l58-23q43-17 61-59t1-85q-18-43-60-61t-85 0q-12 4-35 13t-34 14q18-34 51-54t73-20q58 0 98 40t41 99z m463 414q0 70-50 120t-120 50q-71 0-121-50t-50-120q0-71 50-121t121-49q70 0 120 49t50 121z m84 0q0-106-74-180t-180-74l-244-178q-6-72-61-122t-127-50q-68 0-120 43t-66 107l-128 51v240l217-88q44 27 97 27 7 0 19-1l159 227q1 104 75 178t179 74q105 0 180-75t74-179z" horiz-adv-x="1000" />
<glyph glyph-name="file-archive" unicode="&#xf1c6;" d="M357 636v71h-71v-71h71z m72-72v72h-72v-72h72z m-72-71v71h-71v-71h71z m72-72v72h-72v-72h72z m390 217q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 17-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 16t-16 37v233h-71v-72h-72v72h-286v-858h715z m-350 403l60-195q4-15 4-29 0-46-40-77t-103-30-102 30-41 77q0 14 5 29 12 35 67 221v71h71v-71h44q13 0 22-7t13-19z m-79-260q30 0 51 11t21 25-21 25-51 11-50-11-21-25 21-25 50-11z" horiz-adv-x="857.1" /> <glyph glyph-name="file-archive" unicode="&#xf1c6;" d="M357 636v71h-71v-71h71z m72-72v72h-72v-72h72z m-72-71v71h-71v-71h71z m72-72v72h-72v-72h72z m390 217q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 17-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 16t-16 37v233h-71v-72h-72v72h-286v-858h715z m-350 403l60-195q4-15 4-29 0-46-40-77t-103-30-102 30-41 77q0 14 5 29 12 35 67 221v71h71v-71h44q13 0 22-7t13-19z m-79-260q30 0 51 11t21 25-21 25-51 11-50-11-21-25 21-25 50-11z" horiz-adv-x="857.1" />
<glyph glyph-name="sliders" unicode="&#xf1de;" d="M196 64v-71h-196v71h196z m197 72q14 0 25-11t11-25v-143q0-14-11-25t-25-11h-143q-14 0-25 11t-11 25v143q0 15 11 25t25 11h143z m89 214v-71h-482v71h482z m-357 286v-72h-125v72h125z m732-572v-71h-411v71h411z m-536 643q15 0 26-10t10-26v-142q0-15-10-25t-26-11h-142q-15 0-25 11t-11 25v142q0 15 11 26t25 10h142z m358-286q14 0 25-10t10-25v-143q0-15-10-25t-25-11h-143q-15 0-25 11t-11 25v143q0 14 11 25t25 10h143z m178-71v-71h-125v71h125z m0 286v-72h-482v72h482z" horiz-adv-x="857.1" /> <glyph glyph-name="sliders" unicode="&#xf1de;" d="M196 64v-71h-196v71h196z m197 72q14 0 25-11t11-25v-143q0-14-11-25t-25-11h-143q-14 0-25 11t-11 25v143q0 15 11 25t25 11h143z m89 214v-71h-482v71h482z m-357 286v-72h-125v72h125z m732-572v-71h-411v71h411z m-536 643q15 0 26-10t10-26v-142q0-15-10-25t-26-11h-142q-15 0-25 11t-11 25v142q0 15 11 26t25 10h142z m358-286q14 0 25-10t10-25v-143q0-15-10-25t-25-11h-143q-15 0-25 11t-11 25v143q0 14 11 25t25 10h143z m178-71v-71h-125v71h125z m0 286v-72h-482v72h482z" horiz-adv-x="857.1" />
<glyph glyph-name="twitch" unicode="&#xf1e8;" d="M500 608v-242h-81v242h81z m222 0v-242h-81v242h81z m0-424l141 141v444h-666v-585h182v-121l121 121h222z m222 666v-565l-242-242h-182l-121-122h-121v122h-222v646l61 161h827z" horiz-adv-x="1000" />
<glyph glyph-name="brush" unicode="&#xf1fc;" d="M901 850q39 0 69-26t29-65q0-35-25-84-185-351-260-420-54-51-121-51-71 0-121 52t-51 123q0 71 52 118l356 323q33 30 72 30z m-507-577q22-42 59-73t84-42l1-40q2-118-72-193t-195-75q-68 0-121 26t-85 71-49 102-16 123q4-3 23-17t35-25 32-20 26-9q23 0 31 20 14 37 32 63t39 42 49 27 57 14 70 6z" horiz-adv-x="1000" /> <glyph glyph-name="brush" unicode="&#xf1fc;" d="M901 850q39 0 69-26t29-65q0-35-25-84-185-351-260-420-54-51-121-51-71 0-121 52t-51 123q0 71 52 118l356 323q33 30 72 30z m-507-577q22-42 59-73t84-42l1-40q2-118-72-193t-195-75q-68 0-121 26t-85 71-49 102-16 123q4-3 23-17t35-25 32-20 26-9q23 0 31 20 14 37 32 63t39 42 49 27 57 14 70 6z" horiz-adv-x="1000" />
<glyph glyph-name="pinterest" unicode="&#xf231;" d="M0 517q0 60 21 113t58 93 85 69 103 44 113 14q88 0 164-37t123-108 47-160q0-54-10-105t-34-99-56-83-80-58-106-21q-38 0-75 18t-54 49q-5-22-15-63t-14-53-11-40-15-39-17-35-26-44-35-48l-7-3-5 6q-9 88-9 105 0 51 12 115t37 161 29 113q-18 36-18 94 0 47 29 87t74 41q34 0 53-23t19-57q0-37-24-106t-25-105q0-35 25-58t61-23q31 0 57 14t44 38 31 53 21 61 11 62 4 56q0 96-61 150t-160 54q-111 0-186-72t-75-183q0-25 7-48t15-36 15-26 7-17q0-15-8-40t-21-25q-1 0-9 1-29 9-51 31t-34 53-18 60-6 60z" horiz-adv-x="714.3" /> <glyph glyph-name="pinterest" unicode="&#xf231;" d="M0 517q0 60 21 113t58 93 85 69 103 44 113 14q88 0 164-37t123-108 47-160q0-54-10-105t-34-99-56-83-80-58-106-21q-38 0-75 18t-54 49q-5-22-15-63t-14-53-11-40-15-39-17-35-26-44-35-48l-7-3-5 6q-9 88-9 105 0 51 12 115t37 161 29 113q-18 36-18 94 0 47 29 87t74 41q34 0 53-23t19-57q0-37-24-106t-25-105q0-35 25-58t61-23q31 0 57 14t44 38 31 53 21 61 11 62 4 56q0 96-61 150t-160 54q-111 0-186-72t-75-183q0-25 7-48t15-36 15-26 7-17q0-15-8-40t-21-25q-1 0-9 1-29 9-51 31t-34 53-18 60-6 60z" horiz-adv-x="714.3" />
<glyph glyph-name="reddit" unicode="&#xf281;" d="M1000 378q0-32-16-59t-45-40q7-26 7-54 0-86-60-160t-162-117-223-42-223 42-162 117-59 160q0 26 6 53-28 13-46 41t-17 59q0 46 32 78t79 33q48 0 81-35 122 85 287 90l65 291q2 7 9 12t14 2l206-45q10 21 30 33t44 13q35 0 59-24t25-59-25-59-59-25-59 24-24 59l-186 42-58-264q167-5 289-89 33 34 80 34 46 0 79-33t32-78z m-767-111q0-35 25-59t58-25 60 25 24 59-24 59-60 24q-34 0-58-25t-25-58z m452-198q6 6 6 14t-6 15q-5 5-14 5t-14-5q-23-24-68-35t-89-11-89 11-68 35q-6 5-14 5t-14-5q-6-6-6-14t6-15q24-24 66-38t68-17 51-2 51 2 68 17 66 38z m-1 114q34 0 59 25t24 59q0 34-25 58t-58 25q-35 0-60-24t-24-59 24-59 60-25z" horiz-adv-x="1000" />
<glyph glyph-name="shopping-basket" unicode="&#xf291;" d="M1071 421q30 0 51-20t21-51-21-50-51-21h-8l-64-370q-5-26-25-42t-45-17h-715q-25 0-45 17t-25 42l-64 370h-9q-29 0-50 21t-21 50 21 51 50 20h1000z m-800-446q14 1 24 13t9 26l-18 232q-1 14-13 24t-26 9-24-13-9-26l18-232q1-14 12-24t24-9h3z m229 36v232q0 14-11 25t-25 11-25-11-10-25v-232q0-15 10-25t25-11 25 11 11 25z m214 0v232q0 14-10 25t-25 11-25-11-11-25v-232q0-15 11-25t25-11 25 11 10 25z m197-3l18 232q1 15-9 26t-24 13-26-9-13-24l-18-232q-1-15 9-26t24-13h3q14 0 24 9t12 24z m-645 679l-52-230h-74l56 246q11 49 50 80t89 31h94q0 15 10 25t25 11h215q14 0 25-11t10-25h94q50 0 89-31t49-80l57-246h-74l-52 230q-6 25-25 40t-44 16h-94q0-15-10-25t-25-11h-215q-14 0-25 11t-10 25h-94q-25 0-44-16t-25-40z" horiz-adv-x="1142.9" /> <glyph glyph-name="shopping-basket" unicode="&#xf291;" d="M1071 421q30 0 51-20t21-51-21-50-51-21h-8l-64-370q-5-26-25-42t-45-17h-715q-25 0-45 17t-25 42l-64 370h-9q-29 0-50 21t-21 50 21 51 50 20h1000z m-800-446q14 1 24 13t9 26l-18 232q-1 14-13 24t-26 9-24-13-9-26l18-232q1-14 12-24t24-9h3z m229 36v232q0 14-11 25t-25 11-25-11-10-25v-232q0-15 10-25t25-11 25 11 11 25z m214 0v232q0 14-10 25t-25 11-25-11-11-25v-232q0-15 11-25t25-11 25 11 10 25z m197-3l18 232q1 15-9 26t-24 13-26-9-13-24l-18-232q-1-15 9-26t24-13h3q14 0 24 9t12 24z m-645 679l-52-230h-74l56 246q11 49 50 80t89 31h94q0 15 10 25t25 11h215q14 0 25-11t10-25h94q50 0 89-31t49-80l57-246h-74l-52 230q-6 25-25 40t-44 16h-94q0-15-10-25t-25-11h-215q-14 0-25 11t-10 25h-94q-25 0-44-16t-25-40z" horiz-adv-x="1142.9" />
</font> </font>
</defs> </defs>

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -16,7 +16,7 @@
class blog extends common class blog extends common
{ {
const VERSION = '6.5'; const VERSION = '6.6';
const REALNAME = 'Blog'; const REALNAME = 'Blog';
const DELETE = true; const DELETE = true;
const UPDATE = '0.0'; const UPDATE = '0.0';
@ -89,7 +89,7 @@ class blog extends common
]; ];
//Paramètre longueur maximale des commentaires en nb de caractères //Paramètre longueur maximale des commentaires en nb de caractères
public static $commentLength = [ public static $commentsLength = [
100 => '100 signes', 100 => '100 signes',
250 => '250 signes', 250 => '250 signes',
500 => '500 signes', 500 => '500 signes',
@ -97,11 +97,19 @@ class blog extends common
]; ];
public static $articlesLenght = [ public static $articlesLenght = [
0 => 'Article complet en pleine page', 0 => 'Articles complets',
200 => 'Tableau : couverture + 200 signes', 600 => '600 signes',
400 => 'Tableau : couverture + 400 signes', 800 => '800 signes',
600 => 'Tableau : couverture + 600 signes', 1000 => '1000 signes',
800 => 'Tableau : couverture + 800 signes' 1200 => '1200 signes',
1400 => '1400 signes',
1600 => '1600 signes',
1800 => '1800 signes',
];
public static $articlesLayout = [
false => 'Classique',
true => 'Moderne',
]; ];
// Permissions d'un article // Permissions d'un article
@ -556,11 +564,12 @@ class blog extends common
[ [
'feeds' => $this->getInput('blogOptionShowFeeds', helper::FILTER_BOOLEAN), 'feeds' => $this->getInput('blogOptionShowFeeds', helper::FILTER_BOOLEAN),
'feedsLabel' => $this->getInput('blogOptionFeedslabel', helper::FILTER_STRING_SHORT), 'feedsLabel' => $this->getInput('blogOptionFeedslabel', helper::FILTER_STRING_SHORT),
'layout' => $this->getInput('blogOptionArticlesLayout', helper::FILTER_BOOLEAN),
'articlesLenght' => $this->getInput('blogOptionArticlesLayout', helper::FILTER_BOOLEAN) === false ? $this->getInput('blogOptionArticlesLenght', helper::FILTER_INT): 0,
'itemsperPage' => $this->getInput('blogOptionItemsperPage', helper::FILTER_INT, true), 'itemsperPage' => $this->getInput('blogOptionItemsperPage', helper::FILTER_INT, true),
'articlesLenght' => $this->getInput('blogOptionArticlesLenght', helper::FILTER_INT),
'versionData' => $this->getData(['module', $this->getUrl(0), 'config', 'versionData']),
'dateFormat' => $this->getInput('blogOptionDateFormat'), 'dateFormat' => $this->getInput('blogOptionDateFormat'),
'timeFormat' => $this->getInput('blogOptionTimeFormat'), 'timeFormat' => $this->getInput('blogOptionTimeFormat'),
'versionData' => $this->getData(['module', $this->getUrl(0), 'config', 'versionData']),
] ]
]); ]);
// Valeurs en sortie // Valeurs en sortie

View File

@ -1,4 +1,7 @@
# version 6.6
- Position de l'icône RSS
- Présentation en tableau amélioration du visuel
# version 6.5 # version 6.5
- Intl dates formats - Intl dates formats
- Modifications liées à la suppression de flatpickr - Modifications liées à la suppression de flatpickr

View File

@ -1 +1,87 @@
{"1 article":"1 Artikel","10 articles":"10 Artikel","100 signes":"100 Zeichen","12 articles":"12 Artikel","2 articles":"2 Artikel","250 signes":"250 Zeichen","4 articles":"4 Artikel","500 signes":"500 Zeichen","6 articles":"6 Artikel","750 signes":"750 Zeichen","8 articles":"8 Artikel","Administrateur":"Administrator","Approbation par un modérateur":"Genehmigung durch einen Moderator","Approuver le commentaire ?":"Den Kommentar genehmigen?","Approuvé":"Genehmigt","Article complet en pleine page":"Voller Artikel auf der vollständigen Seite","Article supprimé":"Artikel gelöscht","Articles par page":"Artikel pro Seite","Aucun article":"Kein Artikel","Aucun commentaire":"Kein Kommentar","Auteur":"Auteur","Brouillon":"Unorganisiert","Caractères par commentaire":"Charaktere nach Kommentar","Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.":"Auswahl der maximalen Anzahl von Zeichen für jeden Artikel Kommentar, enthalten HTML -Formatierung.","Commentaire approuvé":"Genehmigter Kommentar","Commentaire rejeté":"Abgelehnter Kommentar","Commentaire supprimé":"Kommentar gelöscht","Commentaires":"Kommentare","Commentaires supprimés":"Gelöschte Kommentare","Edition - Suppression":"Ausgabe - Unterdrückung","Effacer l'article":"Löschen Sie den Artikel","Fermer les commentaires":"Schalten Sie die Kommentare aus","Gestion des commentaires":"Kommentarmanagement","Grande":"Grande","Groupe du propriétaire":"Besitzergruppe","Image de couverture":"Berichterstattung","Informations générales":"Allgemeine Informationen","L'article n'est visible qu'après la date de publication prévue.":"Der Artikel ist erst nach dem Datum der bereitgestellten Veröffentlichung sichtbar.","Largeur":"Bild breite","Le texte de l'article est adapté autour de l'image":"Der Text des Artikels ist um das Bild angepasst","Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction":"Benutzer höherer Gruppen zugreifen ohne Einschränkung auf den Artikel","Lien du flux RSS":"Lien du flux RSS","Masquer l'image dans l'article":"Verstecken Sie das Bild im Artikel","Masquer l'image de couverture dans l'article":"Verstecken Sie das Titelbild im Artikel","Membre":"Mitglied","Notification par email":"Benachrichtigung PAR -E -Mail","Nouvel article créé":"Neuer Artikel erstellt","Options de configuration":"Optionen de Konfiguration","Options de publication":"Publikationsoptionen","Permalink":"Permalink","Petite":"Zierlich","Pleine largeur":"Gesamtbreite","Propriétaire":"Eigentümer","Publication":"Veröffentlichung","Publier":"Veröffentlichen","Rejeter le commentaire ?":"Den Kommentar ablehnen?","Rejeté":"Abgelehnt","Rédiger un article":"Artikel","Supprimer cet article ?":"Diesen Artikel löschen?","Supprimer le commentaire ?":"Den Kommentar löschen?","Supprimer tous les commentaires ?":"Alle Kommentare löschen?","Tableau:couverture + 200 signes":"Tabelle:Cover + 200 Zeichen","Tableau:couverture + 400 signes":"Tabelle:Abdeckung + 400 Zeichen","Tableau:couverture + 600 signes":"Tabelle:Abdeckung + 600 Zeichen","Tableau:couverture + 800 signes":"Tabelle:Abdeckung + 800 Zeichen","Taille optimale de l'image de couverture:920 x 350 pixels.":"Optimale Größe des Titelbildes:920 x 350 Pixel.","Texte de l'étiquette":"Beschriftungstext","Tous les groupes":"Alle Gruppen","Tout effacer":"Alles löschen","Très Grande":"Sehr groß","Très petite":"Sehr klein","À droite":"Nach rechts","À gauche":"Nach links","Éditer l'article":"Bearbeiten Sie den Artikel","Éditer/ Approuver les commentaires":"Kommentare bearbeiten / genehmigen","Éditeur":"Editor","État":"État"} {
"1 article": "1 Artikel",
"10 articles": "10 Artikel",
"100 signes": "100 Zeichen",
"12 articles": "12 Artikel",
"2 articles": "2 Artikel",
"250 signes": "250 Zeichen",
"4 articles": "4 Artikel",
"500 signes": "500 Zeichen",
"6 articles": "6 Artikel",
"750 signes": "750 Zeichen",
"8 articles": "8 Artikel",
"Administrateur": "Administrator",
"Approbation par un modérateur": "Genehmigung durch einen Moderator",
"Approuver le commentaire ?": "Den Kommentar genehmigen?",
"Approuvé": "Genehmigt",
"Article complet en pleine page": "Voller Artikel auf der vollständigen Seite",
"Article supprimé": "Artikel gelöscht",
"Articles par page": "Artikel pro Seite",
"Aucun article": "Kein Artikel",
"Aucun commentaire": "Kein Kommentar",
"Auteur": "Auteur",
"Brouillon": "Unorganisiert",
"Caractères par commentaire": "Charaktere nach Kommentar",
"Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.": "Auswahl der maximalen Anzahl von Zeichen für jeden Artikel Kommentar, enthalten HTML -Formatierung.",
"Commentaire approuvé": "Genehmigter Kommentar",
"Commentaire rejeté": "Abgelehnter Kommentar",
"Commentaire supprimé": "Kommentar gelöscht",
"Commentaires": "Kommentare",
"Commentaires supprimés": "Gelöschte Kommentare",
"Edition - Suppression": "Ausgabe - Unterdrückung",
"Effacer l'article": "Löschen Sie den Artikel",
"Fermer les commentaires": "Schalten Sie die Kommentare aus",
"Gestion des commentaires": "Kommentarmanagement",
"Grande": "Grande",
"Groupe du propriétaire": "Besitzergruppe",
"Image de couverture": "Berichterstattung",
"Informations générales": "Allgemeine Informationen",
"L'article n'est visible qu'après la date de publication prévue.": "Der Artikel ist erst nach dem Datum der bereitgestellten Veröffentlichung sichtbar.",
"Largeur": "Bild breite",
"Le texte de l'article est adapté autour de l'image": "Der Text des Artikels ist um das Bild angepasst",
"Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction": "Benutzer höherer Gruppen zugreifen ohne Einschränkung auf den Artikel",
"Lien du flux RSS": "Lien du flux RSS",
"Masquer l'image dans l'article": "Verstecken Sie das Bild im Artikel",
"Masquer l'image de couverture dans l'article": "Verstecken Sie das Titelbild im Artikel",
"Membre": "Mitglied",
"Notification par email": "Benachrichtigung PAR -E -Mail",
"Nouvel article créé": "Neuer Artikel erstellt",
"Options de configuration": "Optionen de Konfiguration",
"Options de publication": "Publikationsoptionen",
"Permalink": "Permalink",
"Petite": "Zierlich",
"Pleine largeur": "Gesamtbreite",
"Propriétaire": "Eigentümer",
"Publication": "Veröffentlichung",
"Publier": "Veröffentlichen",
"Rejeter le commentaire ?": "Den Kommentar ablehnen?",
"Rejeté": "Abgelehnt",
"Rédiger un article": "Artikel",
"Supprimer cet article ?": "Diesen Artikel löschen?",
"Supprimer le commentaire ?": "Den Kommentar löschen?",
"Supprimer tous les commentaires ?": "Alle Kommentare löschen?",
"200 signes": "200 Zeichen",
"400 signes": "400 Zeichen",
"600 signes": "600 Zeichen",
"1000 signes": "1000 Zeichen",
"1200 signes": "1200 Zeichen",
"1400 signes": "1400 Zeichen",
"1600 signes": "1600 Zeichen",
"1800 signes": "1800 Zeichen",
"Classique": "Klassisch",
"Moderne": "Modern",
"Disposition": "Anordnung",
"Taille optimale de l'image de couverture:920 x 350 pixels.": "Optimale Größe des Titelbildes:920 x 350 Pixel.",
"Texte de l'étiquette": "Beschriftungstext",
"Tous les groupes": "Alle Gruppen",
"Tout effacer": "Alles löschen",
"Très Grande": "Sehr groß",
"Très petite": "Sehr klein",
"À droite": "Nach rechts",
"À gauche": "Nach links",
"Éditer l'article": "Bearbeiten Sie den Artikel",
"Éditer/ Approuver les commentaires": "Kommentare bearbeiten / genehmigen",
"Éditeur": "Editor",
"État": "État",
"Lire la suite": "Mehr lesen"
}

View File

@ -1 +1,87 @@
{"1 article":"1 article","10 articles":"10 articles","100 signes":"100 signs","12 articles":"12 articles","2 articles":"2 articles","250 signes":"250 signs","4 articles":"4 articles","500 signes":"500 signs","6 articles":"6 articles","750 signes":"750 signs","8 articles":"8 articles","Administrateur":"Administrator","Approbation par un modérateur":"Approval by a moderator","Approuver le commentaire ?":"Approve the comment?","Approuvé":"Approved","Article complet en pleine page":"Full article in full page","Article supprimé":"Deleted article","Articles par page":"Articles per page","Aucun article":"No article","Aucun commentaire":"No comment","Auteur":"Auteur","Brouillon":"Draft copy","Caractères par commentaire":"Characters by comment","Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.":"Choosing the maximum number of characters for each article comment, HTML formatting included.","Commentaire approuvé":"Approved comment","Commentaire rejeté":"Rejected commentary","Commentaire supprimé":"Deleted comment","Commentaires":"Comments","Commentaires supprimés":"Deleted comments","Edition - Suppression":"Edition - Suppression","Effacer l'article":"Erase the article","Fermer les commentaires":"Turn off the comments","Gestion des commentaires":"Comment management","Grande":"Large","Groupe du propriétaire":"Owner's group","Image de couverture":"Coverage","Informations générales":"General informations","L'article n'est visible qu'après la date de publication prévue.":"The article is only visible after the date of publication provided.","Largeur":"Image width","Le texte de l'article est adapté autour de l'image":"The text of the article is adapted around the image","Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction":"Users of higher groups access the article without restriction","Lien du flux RSS":"Lien du Flux RSS","Masquer l'image dans l'article":"Hide the image in the article","Masquer l'image de couverture dans l'article":"Hide the cover image in the article","Membre":"Member","Notification par email":"Notification par email","Nouvel article créé":"New article created","Options de configuration":"Configuration options","Options de publication":"Publication options","Permalink":"Permalink","Petite":"Petite","Pleine largeur":"Full width","Propriétaire":"Owner","Publication":"Publication","Publier":"Publish","Rejeter le commentaire ?":"Reject the comment?","Rejeté":"Rejected","Rédiger un article":"Write an article","Supprimer cet article ?":"Delete this article?","Supprimer le commentaire ?":"Delete the comment?","Supprimer tous les commentaires ?":"Delete all comments?","Tableau:couverture + 200 signes":"Table:cover + 200 signs","Tableau:couverture + 400 signes":"Table:cover + 400 signs","Tableau:couverture + 600 signes":"Table:cover + 600 signs","Tableau:couverture + 800 signes":"Table:cover + 800 signs","Taille optimale de l'image de couverture:920 x 350 pixels.":"Optimal size of the cover image:920 x 350 pixels.","Texte de l'étiquette":"Label text","Tous les groupes":"All groups","Tout effacer":"Erase everything","Très Grande":"Very tall","Très petite":"Very small","À droite":"To the right","À gauche":"To the left","Éditer l'article":"Edit the article","Éditer/ Approuver les commentaires":"Edit / approve comments","Éditeur":"Editor","État":"Status"} {
"1 article": "1 article",
"10 articles": "10 articles",
"100 signes": "100 signs",
"12 articles": "12 articles",
"2 articles": "2 articles",
"250 signes": "250 signs",
"4 articles": "4 articles",
"500 signes": "500 signs",
"6 articles": "6 articles",
"750 signes": "750 signs",
"8 articles": "8 articles",
"Administrateur": "Administrator",
"Approbation par un modérateur": "Approval by a moderator",
"Approuver le commentaire ?": "Approve the comment?",
"Approuvé": "Approved",
"Article complet en pleine page": "Full article in full page",
"Article supprimé": "Deleted article",
"Articles par page": "Articles per page",
"Aucun article": "No article",
"Aucun commentaire": "No comment",
"Auteur": "Auteur",
"Brouillon": "Draft copy",
"Caractères par commentaire": "Characters by comment",
"Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.": "Choosing the maximum number of characters for each article comment, HTML formatting included.",
"Commentaire approuvé": "Approved comment",
"Commentaire rejeté": "Rejected commentary",
"Commentaire supprimé": "Deleted comment",
"Commentaires": "Comments",
"Commentaires supprimés": "Deleted comments",
"Edition - Suppression": "Edition - Suppression",
"Effacer l'article": "Erase the article",
"Fermer les commentaires": "Turn off the comments",
"Gestion des commentaires": "Comment management",
"Grande": "Large",
"Groupe du propriétaire": "Owner's group",
"Image de couverture": "Coverage",
"Informations générales": "General informations",
"L'article n'est visible qu'après la date de publication prévue.": "The article is only visible after the date of publication provided.",
"Largeur": "Image width",
"Le texte de l'article est adapté autour de l'image": "The text of the article is adapted around the image",
"Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction": "Users of higher groups access the article without restriction",
"Lien du flux RSS": "Lien du Flux RSS",
"Masquer l'image dans l'article": "Hide the image in the article",
"Masquer l'image de couverture dans l'article": "Hide the cover image in the article",
"Membre": "Member",
"Notification par email": "Notification par email",
"Nouvel article créé": "New article created",
"Options de configuration": "Configuration options",
"Options de publication": "Publication options",
"Permalink": "Permalink",
"Petite": "Petite",
"Pleine largeur": "Full width",
"Propriétaire": "Owner",
"Publication": "Publication",
"Publier": "Publish",
"Rejeter le commentaire ?": "Reject the comment?",
"Rejeté": "Rejected",
"Rédiger un article": "Write an article",
"Supprimer cet article ?": "Delete this article?",
"Supprimer le commentaire ?": "Delete the comment?",
"Supprimer tous les commentaires ?": "Delete all comments?",
"200 signes": "200 characters",
"400 signes": "400 characters",
"600 signes": "600 characters",
"1000 signes": "1000 characters",
"1200 signes": "1200 characters",
"1400 signes": "1400 characters",
"1600 signes": "1600 characters",
"1800 signes": "1800 characters",
"Classique": "Classic",
"Moderne": "Modern",
"Disposition": "Layout",
"Taille optimale de l'image de couverture:920 x 350 pixels.": "Optimal size of the cover image:920 x 350 pixels.",
"Texte de l'étiquette": "Label text",
"Tous les groupes": "All groups",
"Tout effacer": "Erase everything",
"Très Grande": "Very tall",
"Très petite": "Very small",
"À droite": "To the right",
"À gauche": "To the left",
"Éditer l'article": "Edit the article",
"Éditer/ Approuver les commentaires": "Edit / approve comments",
"Éditeur": "Editor",
"État": "Status",
"Lire la suite": "Read more"
}

View File

@ -1 +1,87 @@
{"1 article":"1 Artículo","10 articles":"10 Artículos","100 signes":"100 caracteres","12 articles":"12 Artículos","2 articles":"2 Artículos","250 signes":"250 caracteres","4 articles":"4 Artículos","500 signes":"500 caracteres","6 articles":"6 Artículos","750 signes":"750 caracteres","8 articles":"8 Artículos","Administrateur":"Administrador","Approbation par un modérateur":"Aprobación del moderador","Approuver le commentaire ?":"¿Aprobar el comentario?","Approuvé":"Aprobado","Article complet en pleine page":"Artículo completo a plena página","Article supprimé":"Artículo suprimido","Articles par page":"Artículos por página","Aucun article":"Ningún artículo","Aucun commentaire":"Sin comentarios","Auteur":"Autor","Brouillon":"Borrador","Caractères par commentaire":"Caracteres por comentario","Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.":"Elección del número máximo de caracteres para cada comentario del artículo, incluido el formato html","Commentaire approuvé":"Comentario aprobado","Commentaire rejeté":"Comentario rechazado","Commentaire supprimé":"Comentario eliminado","Commentaires":"Comentarios","Commentaires supprimés":"Comentarios eliminados","Edition - Suppression":"Editar Borrar","Effacer l'article":"Eliminar artículo","Fermer les commentaires":"Cerrar los comentarios","Gestion des commentaires":"Gestión de comentarios","Grande":"Grande","Groupe du propriétaire":"Grupo de propietarios","Image de couverture":"Imagen de portada","Informations générales":"Información general","L'article n'est visible qu'après la date de publication prévue.":"El artículo solo es visible después de la fecha de publicación programada.","Largeur":"Ancho de la imagen","Le texte de l'article est adapté autour de l'image":"El texto del artículo se envuelve alrededor de la imagen","Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction":"Los usuarios de grupos superiores pueden acceder al artículo sin restricción.","Lien du flux RSS":"Enlace de fuente RSS","Masquer l'image dans l'article":"Ocultar imagen en la publicación","Masquer l'image de couverture dans l'article":"Ocultar imagen de portada en el artículo","Membre":"Miembro","Notification par email":"Notificación por correo electrónico","Nouvel article créé":"Nuevo artículo creado","Options de configuration":"Opciones de configuración","Options de publication":"Opciones de publicación","Permalink":"Enlace permanente","Petite":"Pequeña","Pleine largeur":"Anchura completa","Propriétaire":"Propietario","Publication":"Publicación","Publier":"Publicar","Rejeter le commentaire ?":"¿Rechazar el comentario?","Rejeté":"Rechazado","Rédiger un article":"Escribir un artículo","Supprimer cet article ?":"¿Borrar este artículo?","Supprimer le commentaire ?":"¿Borrar el comentario?","Supprimer tous les commentaires ?":"¿Borrar todos los comentarios?","Tableau:couverture + 200 signes":"Tabla:portada + 200 caracteres","Tableau:couverture + 400 signes":"Tabla:portada + 400 caracteres","Tableau:couverture + 600 signes":"Tabla:portada + 600 caracteres","Tableau:couverture + 800 signes":"Tabla:portada + 800 caracteres","Taille optimale de l'image de couverture:920 x 350 pixels.":"Tamaño de imagen de portada óptimo:920 x 350 píxeles.","Texte de l'étiquette":"Texto de la etiqueta","Tous les groupes":"Todos los grupos","Tout effacer":"Borrar todo","Très Grande":"Muy grande","Très petite":"Muy pequeña","À droite":"A la derecha","À gauche":"A la izquierda","Éditer l'article":"Editar artículo","Éditer/ Approuver les commentaires":"Editar / Aprobar comentarios","Éditeur":"Editor","État":"Estado"} {
"1 article": "1 Artículo",
"10 articles": "10 Artículos",
"100 signes": "100 caracteres",
"12 articles": "12 Artículos",
"2 articles": "2 Artículos",
"250 signes": "250 caracteres",
"4 articles": "4 Artículos",
"500 signes": "500 caracteres",
"6 articles": "6 Artículos",
"750 signes": "750 caracteres",
"8 articles": "8 Artículos",
"Administrateur": "Administrador",
"Approbation par un modérateur": "Aprobación del moderador",
"Approuver le commentaire ?": "¿Aprobar el comentario?",
"Approuvé": "Aprobado",
"Article complet en pleine page": "Artículo completo a plena página",
"Article supprimé": "Artículo suprimido",
"Articles par page": "Artículos por página",
"Aucun article": "Ningún artículo",
"Aucun commentaire": "Sin comentarios",
"Auteur": "Autor",
"Brouillon": "Borrador",
"Caractères par commentaire": "Caracteres por comentario",
"Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.": "Elección del número máximo de caracteres para cada comentario del artículo, incluido el formato html",
"Commentaire approuvé": "Comentario aprobado",
"Commentaire rejeté": "Comentario rechazado",
"Commentaire supprimé": "Comentario eliminado",
"Commentaires": "Comentarios",
"Commentaires supprimés": "Comentarios eliminados",
"Edition - Suppression": "Editar Borrar",
"Effacer l'article": "Eliminar artículo",
"Fermer les commentaires": "Cerrar los comentarios",
"Gestion des commentaires": "Gestión de comentarios",
"Grande": "Grande",
"Groupe du propriétaire": "Grupo de propietarios",
"Image de couverture": "Imagen de portada",
"Informations générales": "Información general",
"L'article n'est visible qu'après la date de publication prévue.": "El artículo solo es visible después de la fecha de publicación programada.",
"Largeur": "Ancho de la imagen",
"Le texte de l'article est adapté autour de l'image": "El texto del artículo se envuelve alrededor de la imagen",
"Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction": "Los usuarios de grupos superiores pueden acceder al artículo sin restricción.",
"Lien du flux RSS": "Enlace de fuente RSS",
"Masquer l'image dans l'article": "Ocultar imagen en la publicación",
"Masquer l'image de couverture dans l'article": "Ocultar imagen de portada en el artículo",
"Membre": "Miembro",
"Notification par email": "Notificación por correo electrónico",
"Nouvel article créé": "Nuevo artículo creado",
"Options de configuration": "Opciones de configuración",
"Options de publication": "Opciones de publicación",
"Permalink": "Enlace permanente",
"Petite": "Pequeña",
"Pleine largeur": "Anchura completa",
"Propriétaire": "Propietario",
"Publication": "Publicación",
"Publier": "Publicar",
"Rejeter le commentaire ?": "¿Rechazar el comentario?",
"Rejeté": "Rechazado",
"Rédiger un article": "Escribir un artículo",
"Supprimer cet article ?": "¿Borrar este artículo?",
"Supprimer le commentaire ?": "¿Borrar el comentario?",
"Supprimer tous les commentaires ?": "¿Borrar todos los comentarios?",
"200 signes": "200 caracteres",
"400 signes": "400 caracteres",
"600 signes": "600 caracteres",
"1000 signes": "1000 caracteres",
"1200 signes": "1200 caracteres",
"1400 signes": "1400 caracteres",
"1600 signes": "1600 caracteres",
"1800 signes": "1800 caracteres",
"Classique": "Clásico",
"Moderne": "Moderno",
"Disposition": "Distribución",
"Taille optimale de l'image de couverture:920 x 350 pixels.": "Tamaño de imagen de portada óptimo:920 x 350 píxeles.",
"Texte de l'étiquette": "Texto de la etiqueta",
"Tous les groupes": "Todos los grupos",
"Tout effacer": "Borrar todo",
"Très Grande": "Muy grande",
"Très petite": "Muy pequeña",
"À droite": "A la derecha",
"À gauche": "A la izquierda",
"Éditer l'article": "Editar artículo",
"Éditer/ Approuver les commentaires": "Editar / Aprobar comentarios",
"Éditeur": "Editor",
"État": "Estado",
"Lire la suite": "Leer más"
}

View File

@ -1 +1,88 @@
{} {
"1 article": "",
"10 articles": "",
"100 signes": "",
"12 articles": "",
"2 articles": "",
"250 signes": "",
"4 articles": "",
"500 signes": "",
"6 articles": "",
"750 signes": "",
"8 articles": "",
"Administrateur": "",
"Approbation par un modérateur": "",
"Approuver le commentaire ?": "",
"Approuvé": "",
"Article complet en pleine page": "",
"Article supprimé": "",
"Articles par page": "",
"Aucun article": "",
"Aucun commentaire": "",
"Auteur": "",
"Brouillon": "",
"Caractères par commentaire": "",
"Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.": "",
"Commentaire approuvé": "",
"Commentaire rejeté": "",
"Commentaire supprimé": "",
"Commentaires": "",
"Commentaires supprimés": "",
"Edition - Suppression": "",
"Effacer l'article": "",
"Fermer les commentaires": "",
"Gestion des commentaires": "",
"Grande": "",
"Groupe du propriétaire": "",
"Image de couverture": "",
"Informations générales": "",
"L'article n'est visible qu'après la date de publication prévue.": "",
"Largeur": "",
"Le texte de l'article est adapté autour de l'image": "",
"Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction": "",
"Lien du flux RSS": "",
"Masquer l'image dans l'article": "",
"Masquer l'image de couverture dans l'article": "",
"Membre": "",
"Notification par email": "",
"Nouvel article créé": "",
"Options de configuration": "",
"Options de publication": "",
"Permalink": "",
"Petite": "",
"Pleine largeur": "",
"Propriétaire": "",
"Publication": "",
"Publier": "",
"Rejeter le commentaire ?": "",
"Rejeté": "",
"Rédiger un article": "",
"Supprimer cet article ?": "",
"Supprimer le commentaire ?": "",
"Supprimer tous les commentaires ?": "",
"200 signes": "",
"400 signes": "",
"600 signes": "",
"1000 signes": "",
"1200 signes": "",
"1400 signes": "",
"1600 signes": "",
"1800 signes": "",
"Classique": "",
"Moderne": "",
"Disposition": "",
"Aperçus": "",
"Taille optimale de l'image de couverture:920 x 350 pixels.": "",
"Texte de l'étiquette": "",
"Tous les groupes": "",
"Tout effacer": "",
"Très Grande": "",
"Très petite": "",
"À droite": "",
"À gauche": "",
"Éditer l'article": "",
"Éditer/ Approuver les commentaires": "",
"Éditeur": "",
"État": "",
"Lire la suite": ""
}

View File

@ -1 +1,87 @@
{"1 article":"1 Άρθρο","10 articles":"10 Άρθρα","100 signes":"100 χαρακτήρες","12 articles":"12 Άρθρα","2 articles":"2 Άρθρα","250 signes":"250 χαρακτήρες","4 articles":"4 Άρθρα","500 signes":"500 χαρακτήρες","6 articles":"6 Άρθρα","750 signes":"750 χαρακτήρες","8 articles":"8 Άρθρα","Administrateur":"Διαχειριστής","Approbation par un modérateur":"Έγκριση επόπτη","Approuver le commentaire ?":"Εγκρίνετε το σχόλιο;","Approuvé":"Εγκεκριμένο","Article complet en pleine page":"Άρθρο πλήρους σελίδας","Article supprimé":"Άρθρο που διαγράφηκε","Articles par page":"Άρθρα ανά σελίδα","Aucun article":"κανένα άρθρο","Aucun commentaire":"Κανένα σχόλιο","Auteur":"Συγγραφέας","Brouillon":"Σχέδιο","Caractères par commentaire":"Χαρακτήρες ανά σχόλιο","Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.":"Επιλογή του μέγιστου αριθμού χαρακτήρων για κάθε σχόλιο του άρθρου, συμπεριλαμβανομένης της μορφοποίησης html.","Commentaire approuvé":"Σχόλιο εγκεκριμένο","Commentaire rejeté":"Σχόλιο απορρίφθηκε","Commentaire supprimé":"Σχόλιο διαγράφηκε","Commentaires":"Σχόλια","Commentaires supprimés":"Σχόλια διαγράφονται","Edition - Suppression":"Επεξεργασία - Διαγραφή","Effacer l'article":"Διαγραφή αντικειμένου","Fermer les commentaires":"Κλείσιμο σχολίων","Gestion des commentaires":"Διαχείριση σχολίων","Grande":"Μεγάλη","Groupe du propriétaire":"Ομάδα ιδιοκτήτη","Image de couverture":"εικόνα εξωφύλλου","Informations générales":"Γενικές πληροφορίες","L'article n'est visible qu'après la date de publication prévue.":"Το άρθρο είναι ορατό μόνο μετά την προγραμματισμένη ημερομηνία δημοσίευσης","Largeur":"Πλάτος εικόνας","Le texte de l'article est adapté autour de l'image":"Το κείμενο του άρθρου τοποθετείται γύρω από την εικόνα","Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction":"Οι χρήστες σε ανώτερες ομάδες έχουν απεριόριστη πρόσβαση στο άρθρο","Lien du flux RSS":"Σύνδεσμος τροφοδοσίας RSS","Masquer l'image dans l'article":"Απόκρυψη εικόνας στο άρθρο","Masquer l'image de couverture dans l'article":"Απόκρυψη της εικόνας εξωφύλλου στο άρθρο","Membre":"Μέλος","Notification par email":"Ειδοποίηση ηλεκτρονικού ταχυδρομείου","Nouvel article créé":"Δημιουργήθηκε νέο άρθρο","Options de configuration":"Opções de configuração","Options de publication":"Επιλογές δημοσίευσης","Permalink":"Μόνιμος σύνδεσμος","Petite":"μικρη","Pleine largeur":"Πλήρες πλάτος","Propriétaire":"Ιδιοκτήτης","Publication":"ημερομηνία δημοσίευσης","Publier":"δημοσιεύστε το άρθρο","Rejeter le commentaire ?":"Απορρίπτετε το σχόλιο;","Rejeté":"Απορρίφθηκε","Rédiger un article":"Γράψτε ένα άρθρο","Supprimer cet article ?":"Να διαγράψετε αυτό το άρθρο;","Supprimer le commentaire ?":"Διαγράψτε το σχόλιο;","Supprimer tous les commentaires ?":"Να διαγράψετε όλα τα σχόλια;","Tableau:couverture + 200 signes":"Πίνακας:εξώφυλλο + 200 χαρακτήρες","Tableau:couverture + 400 signes":"Πίνακας:εξώφυλλο + 400 χαρακτήρες","Tableau:couverture + 600 signes":"Πίνακας:εξώφυλλο + 600 χαρακτήρες","Tableau:couverture + 800 signes":"Πίνακας:εξώφυλλο + 800 χαρακτήρες","Taille optimale de l'image de couverture:920 x 350 pixels.":"Βέλτιστο μέγεθος εικόνας εξωφύλλου:920 x 350 pixels","Texte de l'étiquette":"Κείμενο ετικέτας","Tous les groupes":"Όλες οι ομάδες","Tout effacer":"Διαγραφή όλων","Très Grande":"Πολύ μεγάλη","Très petite":"Πολύ μικρη","À droite":"Δεξιά","À gauche":"Αριστερά","Éditer l'article":"Επεξεργασία άρθρου","Éditer/ Approuver les commentaires":"Επεξεργασία / Έγκριση σχολίων","Éditeur":"Συντάκτης","État":"κατάσταση"} {
"1 article": "1 Άρθρο",
"10 articles": "10 Άρθρα",
"100 signes": "100 χαρακτήρες",
"12 articles": "12 Άρθρα",
"2 articles": "2 Άρθρα",
"250 signes": "250 χαρακτήρες",
"4 articles": "4 Άρθρα",
"500 signes": "500 χαρακτήρες",
"6 articles": "6 Άρθρα",
"750 signes": "750 χαρακτήρες",
"8 articles": "8 Άρθρα",
"Administrateur": "Διαχειριστής",
"Approbation par un modérateur": "Έγκριση επόπτη",
"Approuver le commentaire ?": "Εγκρίνετε το σχόλιο;",
"Approuvé": "Εγκεκριμένο",
"Article complet en pleine page": "Άρθρο πλήρους σελίδας",
"Article supprimé": "Άρθρο που διαγράφηκε",
"Articles par page": "Άρθρα ανά σελίδα",
"Aucun article": "κανένα άρθρο",
"Aucun commentaire": "Κανένα σχόλιο",
"Auteur": "Συγγραφέας",
"Brouillon": "Σχέδιο",
"Caractères par commentaire": "Χαρακτήρες ανά σχόλιο",
"Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.": "Επιλογή του μέγιστου αριθμού χαρακτήρων για κάθε σχόλιο του άρθρου, συμπεριλαμβανομένης της μορφοποίησης html.",
"Commentaire approuvé": "Σχόλιο εγκεκριμένο",
"Commentaire rejeté": "Σχόλιο απορρίφθηκε",
"Commentaire supprimé": "Σχόλιο διαγράφηκε",
"Commentaires": "Σχόλια",
"Commentaires supprimés": "Σχόλια διαγράφονται",
"Edition - Suppression": "Επεξεργασία - Διαγραφή",
"Effacer l'article": "Διαγραφή αντικειμένου",
"Fermer les commentaires": "Κλείσιμο σχολίων",
"Gestion des commentaires": "Διαχείριση σχολίων",
"Grande": "Μεγάλη",
"Groupe du propriétaire": "Ομάδα ιδιοκτήτη",
"Image de couverture": "εικόνα εξωφύλλου",
"Informations générales": "Γενικές πληροφορίες",
"L'article n'est visible qu'après la date de publication prévue.": "Το άρθρο είναι ορατό μόνο μετά την προγραμματισμένη ημερομηνία δημοσίευσης",
"Largeur": "Πλάτος εικόνας",
"Le texte de l'article est adapté autour de l'image": "Το κείμενο του άρθρου τοποθετείται γύρω από την εικόνα",
"Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction": "Οι χρήστες σε ανώτερες ομάδες έχουν απεριόριστη πρόσβαση στο άρθρο",
"Lien du flux RSS": "Σύνδεσμος τροφοδοσίας RSS",
"Masquer l'image dans l'article": "Απόκρυψη εικόνας στο άρθρο",
"Masquer l'image de couverture dans l'article": "Απόκρυψη της εικόνας εξωφύλλου στο άρθρο",
"Membre": "Μέλος",
"Notification par email": "Ειδοποίηση ηλεκτρονικού ταχυδρομείου",
"Nouvel article créé": "Δημιουργήθηκε νέο άρθρο",
"Options de configuration": "Opções de configuração",
"Options de publication": "Επιλογές δημοσίευσης",
"Permalink": "Μόνιμος σύνδεσμος",
"Petite": "μικρη",
"Pleine largeur": "Πλήρες πλάτος",
"Propriétaire": "Ιδιοκτήτης",
"Publication": "ημερομηνία δημοσίευσης",
"Publier": "δημοσιεύστε το άρθρο",
"Rejeter le commentaire ?": "Απορρίπτετε το σχόλιο;",
"Rejeté": "Απορρίφθηκε",
"Rédiger un article": "Γράψτε ένα άρθρο",
"Supprimer cet article ?": "Να διαγράψετε αυτό το άρθρο;",
"Supprimer le commentaire ?": "Διαγράψτε το σχόλιο;",
"Supprimer tous les commentaires ?": "Να διαγράψετε όλα τα σχόλια;",
"200 signes": "200 χαρακτήρες",
"400 signes": "400 χαρακτήρες",
"600 signes": "600 χαρακτήρες",
"1000 signes": "1000 χαρακτήρες",
"1200 signes": "1200 χαρακτήρες",
"1400 signes": "1400 χαρακτήρες",
"1600 signes": "1600 χαρακτήρες",
"1800 signes": "1800 χαρακτήρες",
"Classique": "Κλασικό",
"Moderne": "Μοντέρνο",
"Disposition": "Διάταξη",
"Taille optimale de l'image de couverture:920 x 350 pixels.": "Βέλτιστο μέγεθος εικόνας εξωφύλλου:920 x 350 pixels",
"Texte de l'étiquette": "Κείμενο ετικέτας",
"Tous les groupes": "Όλες οι ομάδες",
"Tout effacer": "Διαγραφή όλων",
"Très Grande": "Πολύ μεγάλη",
"Très petite": "Πολύ μικρη",
"À droite": "Δεξιά",
"À gauche": "Αριστερά",
"Éditer l'article": "Επεξεργασία άρθρου",
"Éditer/ Approuver les commentaires": "Επεξεργασία / Έγκριση σχολίων",
"Éditeur": "Συντάκτης",
"État": "κατάσταση",
"Lire la suite": "Διαβάστε περισσότερα"
}

View File

@ -1 +1,87 @@
{"1 article":"1 articolo","10 articles":"10 articoli","100 signes":"100 segni","12 articles":"12 articoli","2 articles":"2 articoli","250 signes":"250 segni","4 articles":"4 articoli","500 signes":"500 segni","6 articles":"6 articoli","750 signes":"750 segni","8 articles":"8 articoli","Administrateur":"Amministratore","Approbation par un modérateur":"Approvazione da parte di un moderatore","Approuver le commentaire ?":"Approvare il commento?","Approuvé":"Approvato","Article complet en pleine page":"Articolo completo in tutta la pagina","Article supprimé":"Articolo cancellato","Articles par page":"Articoli per pagina","Aucun article":"Nessun articolo","Aucun commentaire":"Nessun commento","Auteur":"Auteur","Brouillon":"Progetto di copia","Caractères par commentaire":"Personaggi per commento","Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.":"Scegliere il numero massimo di caratteri per ciascun commento dell'articolo, la formattazione HTML inclusa.","Commentaire approuvé":"Commento approvato","Commentaire rejeté":"Commento respinto","Commentaire supprimé":"Commento cancellato","Commentaires":"Commenti","Commentaires supprimés":"Commenti cancellati","Edition - Suppression":"Edizione - soppressione","Effacer l'article":"Cancella l'articolo","Fermer les commentaires":"Disattiva i commenti","Gestion des commentaires":"Gestione dei commenti","Grande":"Grande","Groupe du propriétaire":"Gruppo del proprietario","Image de couverture":"Copertura","Informations générales":"Informazioni generali","L'article n'est visible qu'après la date de publication prévue.":"L'articolo è visibile solo dopo la data di pubblicazione fornita.","Largeur":"Larghezza dell'immagine","Le texte de l'article est adapté autour de l'image":"Il testo dell'articolo è adattato all'immagine","Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction":"Gli utenti di gruppi più alti accedono all'articolo senza restrizioni","Lien du flux RSS":"Lien Du Flux RSS","Masquer l'image dans l'article":"Nascondi l'immagine nell'articolo","Masquer l'image de couverture dans l'article":"Nascondi l'immagine di copertina nell'articolo","Membre":"Membro","Notification par email":"Email di notifica par","Nouvel article créé":"Nuovo articolo creato","Options de configuration":"Opzioni di configurazione","Options de publication":"Opzioni di pubblicazione","Permalink":"Permalink","Petite":"Petite","Pleine largeur":"Intera larghezza","Propriétaire":"Proprietario","Publication":"Pbblicazione","Publier":"Pubblicare","Rejeter le commentaire ?":"Rifiutare il commento?","Rejeté":"Respinto","Rédiger un article":"Scrivi un articolo","Supprimer cet article ?":"Elimina questo articolo?","Supprimer le commentaire ?":"Elimina il commento?","Supprimer tous les commentaires ?":"Elimina tutti i commenti?","Tableau:couverture + 200 signes":"","Tableau:couverture + 400 signes":"","Tableau:couverture + 600 signes":"","Tableau:couverture + 800 signes":"","Taille optimale de l'image de couverture:920 x 350 pixels.":"","Texte de l'étiquette":"Testo dell'etichetta","Tous les groupes":"Tutti i gruppi","Tout effacer":"Cancellare tutto","Très Grande":"Molto alto","Très petite":"Molto piccolo","À droite":"","À gauche":"A sinistra","Éditer l'article":"Modifica l'articolo","Éditer/ Approuver les commentaires":"","Éditeur":"Editore","État":"Stato"} {
"1 article": "1 articolo",
"10 articles": "10 articoli",
"100 signes": "100 segni",
"12 articles": "12 articoli",
"2 articles": "2 articoli",
"250 signes": "250 segni",
"4 articles": "4 articoli",
"500 signes": "500 segni",
"6 articles": "6 articoli",
"750 signes": "750 segni",
"8 articles": "8 articoli",
"Administrateur": "Amministratore",
"Approbation par un modérateur": "Approvazione da parte di un moderatore",
"Approuver le commentaire ?": "Approvare il commento?",
"Approuvé": "Approvato",
"Article complet en pleine page": "Articolo completo in tutta la pagina",
"Article supprimé": "Articolo cancellato",
"Articles par page": "Articoli per pagina",
"Aucun article": "Nessun articolo",
"Aucun commentaire": "Nessun commento",
"Auteur": "Auteur",
"Brouillon": "Progetto di copia",
"Caractères par commentaire": "Personaggi per commento",
"Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.": "Scegliere il numero massimo di caratteri per ciascun commento dell'articolo, la formattazione HTML inclusa.",
"Commentaire approuvé": "Commento approvato",
"Commentaire rejeté": "Commento respinto",
"Commentaire supprimé": "Commento cancellato",
"Commentaires": "Commenti",
"Commentaires supprimés": "Commenti cancellati",
"Edition - Suppression": "Edizione - soppressione",
"Effacer l'article": "Cancella l'articolo",
"Fermer les commentaires": "Disattiva i commenti",
"Gestion des commentaires": "Gestione dei commenti",
"Grande": "Grande",
"Groupe du propriétaire": "Gruppo del proprietario",
"Image de couverture": "Copertura",
"Informations générales": "Informazioni generali",
"L'article n'est visible qu'après la date de publication prévue.": "L'articolo è visibile solo dopo la data di pubblicazione fornita.",
"Largeur": "Larghezza dell'immagine",
"Le texte de l'article est adapté autour de l'image": "Il testo dell'articolo è adattato all'immagine",
"Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction": "Gli utenti di gruppi più alti accedono all'articolo senza restrizioni",
"Lien du flux RSS": "Lien Du Flux RSS",
"Masquer l'image dans l'article": "Nascondi l'immagine nell'articolo",
"Masquer l'image de couverture dans l'article": "Nascondi l'immagine di copertina nell'articolo",
"Membre": "Membro",
"Notification par email": "Email di notifica par",
"Nouvel article créé": "Nuovo articolo creato",
"Options de configuration": "Opzioni di configurazione",
"Options de publication": "Opzioni di pubblicazione",
"Permalink": "Permalink",
"Petite": "Petite",
"Pleine largeur": "Intera larghezza",
"Propriétaire": "Proprietario",
"Publication": "Pbblicazione",
"Publier": "Pubblicare",
"Rejeter le commentaire ?": "Rifiutare il commento?",
"Rejeté": "Respinto",
"Rédiger un article": "Scrivi un articolo",
"Supprimer cet article ?": "Elimina questo articolo?",
"Supprimer le commentaire ?": "Elimina il commento?",
"Supprimer tous les commentaires ?": "Elimina tutti i commenti?",
"200 signes": "200 caratteri",
"400 signes": "400 caratteri",
"600 signes": "600 caratteri",
"1000 signes": "1000 caratteri",
"1200 signes": "1200 caratteri",
"1400 signes": "1400 caratteri",
"1600 signes": "1600 caratteri",
"1800 signes": "1800 caratteri",
"Classique": "Classico",
"Moderne": "Moderno",
"Disposition": "Layout",
"Taille optimale de l'image de couverture:920 x 350 pixels.": "",
"Texte de l'étiquette": "Testo dell'etichetta",
"Tous les groupes": "Tutti i gruppi",
"Tout effacer": "Cancellare tutto",
"Très Grande": "Molto alto",
"Très petite": "Molto piccolo",
"À droite": "",
"À gauche": "A sinistra",
"Éditer l'article": "Modifica l'articolo",
"Éditer/ Approuver les commentaires": "",
"Éditeur": "Editore",
"État": "Stato",
"Lire la suite": "Continua a leggere"
}

View File

@ -1 +1,87 @@
{"1 article":"1 artigo","10 articles":"10 artigos","100 signes":"100 sinais","12 articles":"12 artigos","2 articles":"2 artigos","250 signes":"250 sinais","4 articles":"4 artigos","500 signes":"500 sinais","6 articles":"6 artigos","750 signes":"750 sinais","8 articles":"8 artigos","Administrateur":"Administrador","Approbation par un modérateur":"Aprovação por um moderador","Approuver le commentaire ?":"Aprovar o comentário?","Approuvé":"Aprovado","Article complet en pleine page":"Artigo completo na página completa","Article supprimé":"Artigo excluído","Articles par page":"Artigos por página","Aucun article":"Nenhum artigo","Aucun commentaire":"Sem comentários","Auteur":"Autora","Brouillon":"Cópia rascunho","Caractères par commentaire":"Personagens por comentários","Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.":"Escolhendo o número máximo de caracteres para cada comentário do artigo, a formatação HTML incluída.","Commentaire approuvé":"Comentário aprovado","Commentaire rejeté":"Comentário rejeitado","Commentaire supprimé":"Comentário excluído","Commentaires":"Comentários","Commentaires supprimés":"Comentários excluídos","Edition - Suppression":"Edição - Supressão","Effacer l'article":"Apague o artigo","Fermer les commentaires":"Desligue os comentários","Gestion des commentaires":"Gerenciamento de comentários","Grande":"Grande","Groupe du propriétaire":"Grupo do proprietário","Image de couverture":"Cobertura","Informations générales":"Informações gerais","L'article n'est visible qu'après la date de publication prévue.":"O artigo é visível apenas após a data da publicação fornecida.","Largeur":"Largura da imagem","Le texte de l'article est adapté autour de l'image":"O texto do artigo é adaptado em torno da imagem","Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction":"Usuários de grupos superiores acessam o artigo sem restrição","Lien du flux RSS":"Lien du Flux RSS","Masquer l'image dans l'article":"Esconder a imagem no artigo","Masquer l'image de couverture dans l'article":"Ocultar a imagem da capa no artigo","Membre":"Membro","Notification par email":"Notificação por e -mail","Nouvel article créé":"Novo artigo criado","Options de configuration":"Opções de configuração","Options de publication":"Opções de publicação","Permalink":"Permalink","Petite":"Petite","Pleine largeur":"Largura completa","Propriétaire":"Proprietário","Publication":"Publicação","Publier":"Publicar","Rejeter le commentaire ?":"Rejeitar o comentário?","Rejeté":"Rejeitado","Rédiger un article":"Escrever um artigo","Supprimer cet article ?":"Excluir este artigo?","Supprimer le commentaire ?":"Excluir o comentário?","Supprimer tous les commentaires ?":"Excluir todos os comentários?","Tableau:couverture + 200 signes":"","Tableau:couverture + 400 signes":"","Tableau:couverture + 600 signes":"","Tableau:couverture + 800 signes":"","Taille optimale de l'image de couverture:920 x 350 pixels.":"","Texte de l'étiquette":"Texto da etiqueta","Tous les groupes":"Todos os grupos","Tout effacer":"Apague tudo","Très Grande":"Muito alto","Très petite":"Muito pequeno","À droite":"","À gauche":"Para a esquerda","Éditer l'article":"Edite o artigo","Éditer/ Approuver les commentaires":"","Éditeur":"Editor","État":"Estado"} {
"1 article": "1 artigo",
"10 articles": "10 artigos",
"100 signes": "100 sinais",
"12 articles": "12 artigos",
"2 articles": "2 artigos",
"250 signes": "250 sinais",
"4 articles": "4 artigos",
"500 signes": "500 sinais",
"6 articles": "6 artigos",
"750 signes": "750 sinais",
"8 articles": "8 artigos",
"Administrateur": "Administrador",
"Approbation par un modérateur": "Aprovação por um moderador",
"Approuver le commentaire ?": "Aprovar o comentário?",
"Approuvé": "Aprovado",
"Article complet en pleine page": "Artigo completo na página completa",
"Article supprimé": "Artigo excluído",
"Articles par page": "Artigos por página",
"Aucun article": "Nenhum artigo",
"Aucun commentaire": "Sem comentários",
"Auteur": "Autora",
"Brouillon": "Cópia rascunho",
"Caractères par commentaire": "Personagens por comentários",
"Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.": "Escolhendo o número máximo de caracteres para cada comentário do artigo, a formatação HTML incluída.",
"Commentaire approuvé": "Comentário aprovado",
"Commentaire rejeté": "Comentário rejeitado",
"Commentaire supprimé": "Comentário excluído",
"Commentaires": "Comentários",
"Commentaires supprimés": "Comentários excluídos",
"Edition - Suppression": "Edição - Supressão",
"Effacer l'article": "Apague o artigo",
"Fermer les commentaires": "Desligue os comentários",
"Gestion des commentaires": "Gerenciamento de comentários",
"Grande": "Grande",
"Groupe du propriétaire": "Grupo do proprietário",
"Image de couverture": "Cobertura",
"Informations générales": "Informações gerais",
"L'article n'est visible qu'après la date de publication prévue.": "O artigo é visível apenas após a data da publicação fornecida.",
"Largeur": "Largura da imagem",
"Le texte de l'article est adapté autour de l'image": "O texto do artigo é adaptado em torno da imagem",
"Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction": "Usuários de grupos superiores acessam o artigo sem restrição",
"Lien du flux RSS": "Lien du Flux RSS",
"Masquer l'image dans l'article": "Esconder a imagem no artigo",
"Masquer l'image de couverture dans l'article": "Ocultar a imagem da capa no artigo",
"Membre": "Membro",
"Notification par email": "Notificação por e -mail",
"Nouvel article créé": "Novo artigo criado",
"Options de configuration": "Opções de configuração",
"Options de publication": "Opções de publicação",
"Permalink": "Permalink",
"Petite": "Petite",
"Pleine largeur": "Largura completa",
"Propriétaire": "Proprietário",
"Publication": "Publicação",
"Publier": "Publicar",
"Rejeter le commentaire ?": "Rejeitar o comentário?",
"Rejeté": "Rejeitado",
"Rédiger un article": "Escrever um artigo",
"Supprimer cet article ?": "Excluir este artigo?",
"Supprimer le commentaire ?": "Excluir o comentário?",
"Supprimer tous les commentaires ?": "Excluir todos os comentários?",
"200 signes": "200 caracteres",
"400 signes": "400 caracteres",
"600 signes": "600 caracteres",
"1000 signes": "1000 caracteres",
"1200 signes": "1200 caracteres",
"1400 signes": "1400 caracteres",
"1600 signes": "1600 caracteres",
"1800 signes": "1800 caracteres",
"Classique": "Clássico",
"Moderne": "Moderno",
"Disposition": "Disposição",
"Taille optimale de l'image de couverture:920 x 350 pixels.": "",
"Texte de l'étiquette": "Texto da etiqueta",
"Tous les groupes": "Todos os grupos",
"Tout effacer": "Apague tudo",
"Très Grande": "Muito alto",
"Très petite": "Muito pequeno",
"À droite": "",
"À gauche": "Para a esquerda",
"Éditer l'article": "Edite o artigo",
"Éditer/ Approuver les commentaires": "",
"Éditeur": "Editor",
"État": "Estado",
"Lire la suite": "Leia mais"
}

View File

@ -1 +1,87 @@
{"1 article":"1 makale","10 articles":"10 makale","100 signes":"100 karakter","12 articles":"12 makale","2 articles":"2 makale","250 signes":"250 karakter","4 articles":"4 makale","500 signes":"500 karakter","6 articles":"6 makale","750 signes":"750 karakter","8 articles":"8 makale","Administrateur":"Yönetici","Approbation par un modérateur":"Moderatör onayı","Approuver le commentaire ?":"Yorum onaylansın mı?","Approuvé":"Onaylandı","Article complet en pleine page":"Tam sayfa tam makale","Article supprimé":"Silinen makale","Articles par page":"Sayfa başına makale","Aucun article":"Makale yok","Aucun commentaire":"Yorum yok","Auteur":"Yazar","Brouillon":"Karalama","Caractères par commentaire":"Yorum başına karakter","Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.":"HTML biçimlendirmesi dahil olmak üzere, makalenin her yorumu için maksimum karakter sayısı seçimi.","Commentaire approuvé":"Onaylanan yorum","Commentaire rejeté":"Reddedilen yorum","Commentaire supprimé":"Silinen yorum","Commentaires":"Yorumlar","Commentaires supprimés":"Silinen yorumlar","Edition - Suppression":"Düzenle - Sil","Effacer l'article":"Makaleyi sil","Fermer les commentaires":"Yorumları kapat","Gestion des commentaires":"Yorum yönetimi","Grande":"Büyük","Groupe du propriétaire":"Sahip grubu","Image de couverture":"Kapak resmi","Informations générales":"Genel bilgiler","L'article n'est visible qu'après la date de publication prévue.":"Makale yalnızca planlanan yayın tarihinden sonra görülebilir.","Largeur":"Resim genişliği","Le texte de l'article est adapté autour de l'image":"Makalenin metni resmin etrafıni çevreler","Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction":"Üst gruplardaki kullanıcılar makaleye kısıtlama olmadan erişebilir","Lien du flux RSS":"RSS dağıtım bağlantısı","Masquer l'image dans l'article":"Makalede resmi gizle","Masquer l'image de couverture dans l'article":"Makalede kapak resmini gizle","Membre":"Üye","Notification par email":"Eposta bildirimi","Nouvel article créé":"Yeni makale oluşturuldu","Options de configuration":"Yapılandırma seçenekleri","Options de publication":"Yayınlama seçenekleri","Permalink":"Kalıcı bağlantı","Petite":"Küçük","Pleine largeur":"Tam genişlik","Propriétaire":"Mal sahibi","Publication":"Yayın","Publier":"Yayınla","Rejeter le commentaire ?":"Yorum reddedilsin mi?","Rejeté":"Reddedildi","Rédiger un article":"Bir makale yaz","Supprimer cet article ?":"Bu makale silinsin mi?","Supprimer le commentaire ?":"Yorum silinsin mi?","Supprimer tous les commentaires ?":"","Tableau:couverture + 200 signes":"","Tableau:couverture + 400 signes":"","Tableau:couverture + 600 signes":"","Tableau:couverture + 800 signes":"","Taille optimale de l'image de couverture:920 x 350 pixels.":"","Texte de l'étiquette":"Etiket metni","Tous les groupes":"Tüm gruplar","Tout effacer":"Her şeyi sil","Très Grande":"Çok büyük","Très petite":"Çok küçük","À droite":"","À gauche":"Sola","Éditer l'article":"Makaleyi düzenle","Éditer/ Approuver les commentaires":"","Éditeur":"Düzenleyici","État":"Durum"} {
"1 article": "1 makale",
"10 articles": "10 makale",
"100 signes": "100 karakter",
"12 articles": "12 makale",
"2 articles": "2 makale",
"250 signes": "250 karakter",
"4 articles": "4 makale",
"500 signes": "500 karakter",
"6 articles": "6 makale",
"750 signes": "750 karakter",
"8 articles": "8 makale",
"Administrateur": "Yönetici",
"Approbation par un modérateur": "Moderatör onayı",
"Approuver le commentaire ?": "Yorum onaylansın mı?",
"Approuvé": "Onaylandı",
"Article complet en pleine page": "Tam sayfa tam makale",
"Article supprimé": "Silinen makale",
"Articles par page": "Sayfa başına makale",
"Aucun article": "Makale yok",
"Aucun commentaire": "Yorum yok",
"Auteur": "Yazar",
"Brouillon": "Karalama",
"Caractères par commentaire": "Yorum başına karakter",
"Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.": "HTML biçimlendirmesi dahil olmak üzere, makalenin her yorumu için maksimum karakter sayısı seçimi.",
"Commentaire approuvé": "Onaylanan yorum",
"Commentaire rejeté": "Reddedilen yorum",
"Commentaire supprimé": "Silinen yorum",
"Commentaires": "Yorumlar",
"Commentaires supprimés": "Silinen yorumlar",
"Edition - Suppression": "Düzenle - Sil",
"Effacer l'article": "Makaleyi sil",
"Fermer les commentaires": "Yorumları kapat",
"Gestion des commentaires": "Yorum yönetimi",
"Grande": "Büyük",
"Groupe du propriétaire": "Sahip grubu",
"Image de couverture": "Kapak resmi",
"Informations générales": "Genel bilgiler",
"L'article n'est visible qu'après la date de publication prévue.": "Makale yalnızca planlanan yayın tarihinden sonra görülebilir.",
"Largeur": "Resim genişliği",
"Le texte de l'article est adapté autour de l'image": "Makalenin metni resmin etrafıni çevreler",
"Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction": "Üst gruplardaki kullanıcılar makaleye kısıtlama olmadan erişebilir",
"Lien du flux RSS": "RSS dağıtım bağlantısı",
"Masquer l'image dans l'article": "Makalede resmi gizle",
"Masquer l'image de couverture dans l'article": "Makalede kapak resmini gizle",
"Membre": "Üye",
"Notification par email": "Eposta bildirimi",
"Nouvel article créé": "Yeni makale oluşturuldu",
"Options de configuration": "Yapılandırma seçenekleri",
"Options de publication": "Yayınlama seçenekleri",
"Permalink": "Kalıcı bağlantı",
"Petite": "Küçük",
"Pleine largeur": "Tam genişlik",
"Propriétaire": "Mal sahibi",
"Publication": "Yayın",
"Publier": "Yayınla",
"Rejeter le commentaire ?": "Yorum reddedilsin mi?",
"Rejeté": "Reddedildi",
"Rédiger un article": "Bir makale yaz",
"Supprimer cet article ?": "Bu makale silinsin mi?",
"Supprimer le commentaire ?": "Yorum silinsin mi?",
"Supprimer tous les commentaires ?": "",
"200 signes": "200 karakter",
"400 signes": "400 karakter",
"600 signes": "600 karakter",
"1000 signes": "1000 karakter",
"1200 signes": "1200 karakter",
"1400 signes": "1400 karakter",
"1600 signes": "1600 karakter",
"1800 signes": "1800 karakter",
"Classique": "Klasik",
"Moderne": "Modern",
"Disposition": "Düzenleme",
"Taille optimale de l'image de couverture:920 x 350 pixels.": "",
"Texte de l'étiquette": "Etiket metni",
"Tous les groupes": "Tüm gruplar",
"Tout effacer": "Her şeyi sil",
"Très Grande": "Çok büyük",
"Très petite": "Çok küçük",
"À droite": "",
"À gauche": "Sola",
"Éditer l'article": "Makaleyi düzenle",
"Éditer/ Approuver les commentaires": "",
"Éditeur": "Düzenleyici",
"État": "Durum",
"Lire la suite": "Devamını oku"
}

View File

@ -117,7 +117,7 @@
<?php echo template::checkbox('blogAddCommentApproved', true, 'Approbation par un modérateur'); ?> <?php echo template::checkbox('blogAddCommentApproved', true, 'Approbation par un modérateur'); ?>
</div> </div>
<div class="col4 commentOptionsWrapper"> <div class="col4 commentOptionsWrapper">
<?php echo template::select('blogAddCommentMaxlength', $module::$commentLength,[ <?php echo template::select('blogAddCommentMaxlength', $module::$commentsLength,[
'help' => 'Choix du nombre maximum de caractères pour chaque commentaire de l\'article, mise en forme html comprise.', 'help' => 'Choix du nombre maximum de caractères pour chaque commentaire de l\'article, mise en forme html comprise.',
'label' => 'Caractères par commentaire' 'label' => 'Caractères par commentaire'
]); ?> ]); ?>

View File

@ -127,7 +127,7 @@
]); ?> ]); ?>
</div> </div>
<div class="col4 commentOptionsWrapper"> <div class="col4 commentOptionsWrapper">
<?php echo template::select('blogEditCommentMaxlength', $module::$commentLength,[ <?php echo template::select('blogEditCommentMaxlength', $module::$commentsLength,[
'help' => 'Choix du nombre maximum de caractères pour chaque commentaire de l\'article, mise en forme html comprise.', 'help' => 'Choix du nombre maximum de caractères pour chaque commentaire de l\'article, mise en forme html comprise.',
'label' => 'Caractères par commentaire', 'label' => 'Caractères par commentaire',
'selected' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'commentMaxlength']) 'selected' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'commentMaxlength'])

View File

@ -1,10 +1,12 @@
.rowArticle { .rowArticle {
margin-bottom: 10px !important; margin-bottom: 10px !important;
} }
.blogPicture { .blogPicture {
float: none; float: none;
border: 1px; border: 1px;
} }
.blogPicture img { .blogPicture img {
width: 100%; width: 100%;
height: auto; height: auto;
@ -18,76 +20,91 @@
margin-top: 0; margin-top: 0;
margin-bottom: 5px; margin-bottom: 5px;
} }
.blogArticlePicture { .blogArticlePicture {
height: auto; height: auto;
border:1px solid lightgray; border: 1px solid lightgray;
box-shadow: 1px 1px 5px; box-shadow: 1px 1px 5px;
} }
.blogArticlePictureleft { .blogArticlePictureleft {
float: left; float: left;
margin: 15px 10px 5px 0 ; margin: 15px 10px 5px 0;
} }
.blogArticlePictureright { .blogArticlePictureright {
float: right; float: right;
margin: 15px 0 5px 10px ; margin: 15px 0 5px 10px;
} }
.blogPicture:hover { .blogPicture:hover {
opacity: .7; opacity: .7;
} }
.row:after { .row:after {
content: " "; content: " ";
display: table; display: table;
clear: both; clear: both;
} }
.blogComment { .blogComment {
padding-right: 10px; padding-right: 10px;
float: right; float: right;
} }
.blogTitle { .blogTitle {
/*background-color: #ECEFF1;*/ /*background-color: #ECEFF1;*/
padding: 0px; padding: 0px;
margin-bottom: 5px; margin-bottom: 5px;
} }
.blogContent { .blogContent {
position: relative;
float: left; float: left;
margin-top: 5px; margin-top: 5px;
} }
.blogDate, .blogEdit {
font-size:0.8em; .blogDate,
.blogEdit {
font-size: 0.8em;
font-style: italic; font-style: italic;
/* /*
color: grey; color: grey;
*/ */
} }
@media (max-width: 768px) { @media (max-width: 768px) {
.blogContent { .blogContent {
display: none; display: none;
} }
.blogPicture img { .blogPicture img {
width: 50% ; width: 50%;
display: block; display: block;
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
} }
} }
.pict20{ .pict20 {
width: 20%; width: 20%;
} }
.pict30{
.pict30 {
width: 30%; width: 30%;
} }
.pict40{
.pict40 {
width: 40%; width: 40%;
} }
.pict50{
.pict50 {
width: 50%; width: 50%;
} }
.pict100{
.pict100 {
width: 100%; width: 100%;
margin: 15px 0 20px 0 ; margin: 15px 0 20px 0;
} }
@ -95,10 +112,42 @@
* Flux RSS * Flux RSS
*/ */
#rssFeed { #rssFeed {
text-align: right; text-align: right;
float: right;
} }
#rssFeed p { #rssFeed p {
display: inline; display: inline;
vertical-align: top; vertical-align: top;
}
.rowArticle,
article {
position: relative;
/* Autres styles pour les articles coupés */
}
.readMoreContainer {
position: absolute;
}
.readMoreContainer,
.readMoreModernContainer {
bottom: 0px;
width: 100%;
height: 45%;
background: linear-gradient(180deg, hsla(0, 0%, 100%, 0) 0, #f6f6f6 100%, #f6f6f6);
}
.readMoreButton {
position: absolute;
width: 20%;
bottom: 0px;
left: 0;
right: 0;
margin-left: auto;
margin-right: auto;
z-index: 99;
background: linear-gradient(180deg, hsla(0, 0%, 100%, 0) 0, #f6f6f6 100%, #f6f6f6);
/* Autres styles pour le bouton */
} }

View File

@ -1,125 +1,129 @@
<?php if ($module::$articles) : ?> <?php if ($this->getData(['module', $this->getUrl(0), 'config', 'feeds'])): ?>
<?php if ($this->getData(['module', $this->getUrl(0), 'config', 'feeds'])) : ?> <div id="rssFeed">
<div id="rssFeed"> <a type="application/rss+xml" href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/rss'; ?>" target="_blank">
<a type="application/rss+xml" href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/rss'; ?>" target="_blank"> <img src='module/blog/ressource/feed-icon-16.gif' />
<img src='module/blog/ressource/feed-icon-16.gif' /> <?php
<?php echo $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel']) ? '<p>' . $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel']) . '</p>' : '';
echo $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel']) ? '<p>' . $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel']) . '</p>' : ''; ?>
?> </a>
</a> </div>
</div> <?php endif; ?>
<?php endif; ?> <?php if ($module::$articles): ?>
<article> <article>
<?php foreach ($module::$articles as $articleId => $article) : ?> <?php foreach ($module::$articles as $articleId => $article): ?>
<?php if ($this->getData(['module', $this->getUrl(0), 'config', 'articlesLenght']) === 0) : ?> <?php if ($this->getData(['module', $this->getUrl(0), 'config', 'layout']) === true): ?>
<div class="row"> <div class="readMoreModernContainer">
<div class="col12"> <div class="row">
<h2 class="blogTitle"> <div class="col12">
<a href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/' . $articleId; ?>"> <h2 class="blogTitle">
<?php echo $article['title']; ?> <a href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/' . $articleId; ?>">
</a> <?php echo $article['title']; ?>
</h2> </a>
</h2>
</div>
</div> </div>
</div> <div class="row">
<div class="row"> <div class="col6 blogEdit">
<div class="col6 blogEdit"> <!-- bloc signature et date -->
<!-- bloc signature et date --> <?php echo template::ico('user'); ?>
<?php echo template::ico('user'); ?> <?php echo $module->signature($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'userId'])); ?>
<?php echo $module->signature($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'userId'])); ?> <?php echo template::ico('calendar-empty'); ?>
<?php echo template::ico('calendar-empty'); ?> <?php echo helper::dateUTF8($module::$dateFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn'])) . ' - ' . helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn'])); ?>
<?php echo helper::dateUTF8($module::$dateFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn'])) . ' - ' . helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn'])); ?> </div>
</div> </div>
</div> <div class="row">
<div class="row"> <div class="col12">
<div class="col12"> <?php if (
<?php if ( $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'picture']) &&
$this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'picture']) && file_exists(self::FILE_DIR . 'source/' . $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'picture']))
file_exists(self::FILE_DIR . 'source/' . $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'picture'])) ): ?>
) : ?> <?php $pictureSize = $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'pictureSize']) === null ? '100' : $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'pictureSize']); ?>
<?php $pictureSize = $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'pictureSize']) === null ? '100' : $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'pictureSize']); ?> <?php if ($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'hidePicture']) == false) {
<?php if ($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'hidePicture']) == false) { echo '<img class="blogArticlePicture blogArticlePicture' . $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'picturePosition']) .
echo '<img class="blogArticlePicture blogArticlePicture' . $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'picturePosition']) . ' pict' . $pictureSize . '" src="' . helper::baseUrl(false) . self::FILE_DIR . 'source/' . $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'picture']) .
' pict' . $pictureSize . '" src="' . helper::baseUrl(false) . self::FILE_DIR . 'source/' . $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'picture']) . '" alt="' . $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'picture']) . '">';
'" alt="' . $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'picture']) . '">'; } ?>
} ?> <?php endif; ?>
<?php endif; ?> <?php echo $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'content']); ?>
<?php echo $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'content']); ?> </div>
</div> </div>
</div> <div class="row">
<div class="row verticalAlignMiddle"> <div class="col6 blogEdit">
<div class="col6 blogEdit"> <!-- Bloc edition -->
<!-- Bloc edition --> <?php if (
<?php if (
$this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD') $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and and
( // Propriétaire ( // Propriétaire
($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) === $module::EDIT_OWNER ($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) === $module::EDIT_OWNER
and ($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'userId']) === $this->getUser('id') and ($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'userId']) === $this->getUser('id')
or $this->getUser('group') === self::GROUP_ADMIN) or $this->getUser('group') === self::GROUP_ADMIN)
)
or (
// Groupe
($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) === self::GROUP_ADMIN
or $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) === self::GROUP_MODERATOR)
and $this->getUser('group') >= $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent'])
)
or (
// Tout le monde
$this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) === $module::EDIT_ALL
and $this->getUser('group') >= $module::$actions['config']
)
) )
or ( ): ?>
// Groupe <a
($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) === self::GROUP_ADMIN href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/edit/' . $articleId . '/' . $_SESSION['csrf']; ?>">
or $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) === self::GROUP_MODERATOR) <?php echo template::ico('pencil'); ?> Éditer
and $this->getUser('group') >= $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) </a>
) <?php endif; ?>
or ( </div>
// Tout le monde <div class="col6 textAlignRight" id="comment">
$this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) === $module::EDIT_ALL <?php if ($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'commentClose'])): ?>
and $this->getUser('group') >= $module::$actions['config'] <p>Cet article ne reçoit pas de commentaire.</p>
) <?php else: ?>
) <p>
) : ?> <?php echo template::ico('comment', ['margin' => 'right']); ?>
<a href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/edit/' . $articleId . '/' . $_SESSION['csrf']; ?>"> <?php
<?php echo template::ico('pencil'); ?> Éditer if ($module::$comments[$articleId] > 0) {
</a> echo '<a href="' . helper::baseUrl() . $this->getUrl(0) . '/' . $articleId . '">';
<?php endif; ?> echo $module::$comments[$articleId] . ' commentaire' . ($module::$comments[$articleId] > 1 ? 's' : '');
</div> echo '</a>';
<div class="col6 textAlignRight" id="comment"> } else {
<?php if ($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'commentClose'])) : ?> echo 'Pas encore de commentaire';
<p>Cet article ne reçoit pas de commentaire.</p> }
<?php else : ?> ?>
<p> </p>
<?php echo template::ico('comment', ['margin' => 'right']); ?> <?php endif; ?>
<?php </div>
if ($module::$comments[$articleId] > 0) {
echo '<a href="' . helper::baseUrl() . $this->getUrl(0) . '/' . $articleId . '">';
echo $module::$comments[$articleId] . ' commentaire' . ($module::$comments[$articleId] > 1 ? 's' : '');
echo '</a>';
} else {
echo 'Pas encore de commentaire';
}
?>
</p>
<?php endif; ?>
</div> </div>
</div> </div>
<?php else : ?> <?php else: ?>
<div class="row rowArticle"> <div class="row">
<?php if ( <?php if (
$article['picture'] && $article['picture'] &&
file_exists(self::FILE_DIR . 'source/' . $article['picture']) file_exists(self::FILE_DIR . 'source/' . $article['picture'])
) : ?> ): ?>
<div class="col3"> <div class="col3">
<?php // Déterminer le nom de la miniature <?php // Déterminer le nom de la miniature
$parts = pathinfo($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'picture'])); $parts = pathinfo($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'picture']));
$thumb = 'mini_' . $parts['basename']; $thumb = 'mini_' . $parts['basename'];
// Créer la miniature si manquante // Créer la miniature si manquante
if (!file_exists(self::FILE_DIR . 'thumb/' . $thumb)) { if (!file_exists(self::FILE_DIR . 'thumb/' . $thumb)) {
$this->makeThumb( $this->makeThumb(
self::FILE_DIR . 'source/' . $article['picture'], self::FILE_DIR . 'source/' . $article['picture'],
self::FILE_DIR . 'thumb/' . $thumb, self::FILE_DIR . 'thumb/' . $thumb,
self::THUMBS_WIDTH self::THUMBS_WIDTH
); );
} }
?> ?>
<a href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/' . $articleId; ?>" class="blogPicture"> <a href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/' . $articleId; ?>" class="blogPicture">
<img src="<?php echo helper::baseUrl(false) . self::FILE_DIR . 'thumb/' . $thumb; ?>" alt="<?php echo $article['picture']; ?>"> <img src="<?php echo helper::baseUrl(false) . self::FILE_DIR . 'thumb/' . $thumb; ?>"
alt="<?php echo $article['picture']; ?>">
</a> </a>
</div> </div>
<div class="col9"> <div class="col9">
<?php else : ?> <?php else: ?>
<div class="col12"> <div class="col12">
<?php endif; ?> <?php endif; ?>
<h2 class="blogTitle"> <h2 class="blogTitle">
@ -129,30 +133,40 @@
</h2> </h2>
<div class="blogComment"> <div class="blogComment">
<a href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/' . $articleId; ?>#comment"> <a href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/' . $articleId; ?>#comment">
<?php if ($article['comment']) : ?> <?php if ($article['comment']): ?>
<?php echo count($article['comment']); ?> <?php echo count($article['comment']); ?>
<?php endif; ?> <?php endif; ?>
</a> </a>
<?php echo template::ico('comment', ['margin' => 'left']); ?> <?php echo template::ico('comment', ['margin' => 'left']); ?>
</div> </div>
<div class="blogDate"> <div class="blogDate">
<!-- bloc signature et date --> <!-- bloc signature et date -->
<?php echo template::ico('user'); ?> <?php echo template::ico('user'); ?>
<?php echo $module->signature($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'userId']));?> <?php echo $module->signature($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'userId'])); ?>
<?php echo template::ico('calendar-empty'); ?> <?php echo template::ico('calendar-empty'); ?>
<?php echo helper::dateUTF8($module::$dateFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn'])) . ' - ' . helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn'])); ?> <?php echo helper::dateUTF8($module::$dateFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn'])) . ' - ' . helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn'])); ?>
</div> </div>
<p class="blogContent"> <div class="blogContent">
<?php $lenght = $this->getData(['module', $this->getUrl(0), 'config', 'articlesLenght']) !== 0 ? $this->getData(['module', $this->getUrl(0), 'config', 'articlesLenght']) : 500 ?> <?php $lenght = $this->getData(['module', $this->getUrl(0), 'config', 'articlesLenght']) !== 0 ? $this->getData(['module', $this->getUrl(0), 'config', 'articlesLenght']) : 500 ?>
<?php echo helper::subword(strip_tags($article['content'], '<br><p>'), 0, $lenght); ?>... <?php echo helper::subword(strip_tags($article['content'], '<br><p>'), 0, $lenght); ?>...
<a href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/' . $articleId; ?>">Lire la suite</a> <div class="readMoreContainer">
</p> <a href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/' . $articleId; ?>"><button
class="readMoreButton">Lire la suite</button></a>
<div class="readMoreContainer">
<a href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/' . $articleId; ?>">
<button class="readMoreButton">
<?php echo helper::translate('Lire la suite'); ?>
</button>
</a>
</div>
</div>
</div> </div>
</div> </div>
<?php endif; ?> </div>
<?php endforeach; ?> <?php endif; ?>
<?php endforeach; ?>
</article> </article>
<?php echo $module::$pages; ?> <?php echo $module::$pages; ?>
<?php else : ?> <?php else: ?>
<?php echo template::speech('Aucun article'); ?> <?php echo template::speech('Aucun article'); ?>
<?php endif; ?> <?php endif; ?>

View File

@ -1,64 +1,71 @@
<?php echo template::formOpen('blogOption'); ?> <?php echo template::formOpen('blogOption'); ?>
<div class="row"> <div class="row">
<div class="col1"> <div class="col1">
<?php echo template::button('blogOptionBack', [ <?php echo template::button('blogOptionBack', [
'class' => 'buttonGrey', 'class' => 'buttonGrey',
'href' => helper::baseUrl() . $this->getUrl(0) . '/config', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config',
'value' => template::ico('left') 'value' => template::ico('left')
]); ?> ]); ?>
</div>
<div class="col2 offset9">
<?php echo template::submit('blogOptionSubmit'); ?>
</div>
</div> </div>
<div class="row"> <div class="col2 offset9">
<div class="col12"> <?php echo template::submit('blogOptionSubmit'); ?>
<div class="block"> </div>
<h4><?php echo helper::translate('Paramètres');?></h4> </div>
<div class="row"> <div class="row">
<div class="col4"> <div class="col12">
<?php echo template::select('blogOptionArticlesLenght', $module::$articlesLenght, [ <div class="block">
'label' => 'Disposition', <h4>
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'articlesLenght']) <?php echo helper::translate('Paramètres'); ?>
]); ?> </h4>
</div> <div class="row">
<div class="col2"> <div class="col3">
<?php echo template::select('blogOptionItemsperPage', $module::$ArticlesListed, [ <?php echo template::select('blogOptionArticlesLayout', $module::$articlesLayout, [
'label' => 'Articles par page', 'label' => 'Disposition',
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'itemsperPage']) 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'layout'])
]); ?> ]); ?>
</div>
<div class="col3">
<?php echo template::select('blogOptionDateFormat', $module::$dateFormats, [
'label' => 'Format des dates',
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'dateFormat'])
]); ?>
</div>
<div class="col3">
<?php echo template::select('blogOptionTimeFormat', $module::$timeFormats, [
'label' => 'Format des heures',
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'timeFormat'])
]); ?>
</div>
</div> </div>
<div class="row"> <div class="col3">
<div class="col6"> <?php echo template::select('blogOptionArticlesLenght', $module::$articlesLenght, [
<?php echo template::checkbox('blogOptionShowFeeds', true, 'Lien du flux RSS', [ 'label' => 'Aperçus',
'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'feeds']), 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'articlesLenght'])
]); ?> ]); ?>
</div> </div>
<div class="col6"> <div class="col2">
<?php echo template::text('blogOptionFeedslabel', [ <?php echo template::select('blogOptionItemsperPage', $module::$ArticlesListed, [
'label' => 'Texte de l\'étiquette', 'label' => 'Articles par page',
'value' => $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel']) 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'itemsperPage'])
]); ?> ]); ?>
</div> </div>
<div class="col2">
<?php echo template::select('blogOptionDateFormat', $module::$dateFormats, [
'label' => 'Format des dates',
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'dateFormat'])
]); ?>
</div>
<div class="col2">
<?php echo template::select('blogOptionTimeFormat', $module::$timeFormats, [
'label' => 'Format des heures',
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'timeFormat'])
]); ?>
</div>
</div>
<div class="row">
<div class="col8">
<?php echo template::checkbox('blogOptionShowFeeds', true, 'Lien du flux RSS', [
'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'feeds']),
]); ?>
</div>
<div class="col4">
<?php echo template::text('blogOptionFeedslabel', [
'label' => 'Texte de l\'étiquette',
'value' => $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel'])
]); ?>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
<?php echo template::formClose(); ?> <?php echo template::formClose(); ?>
<div class="moduleVersion">Version <div class="moduleVersion">Version
<?php echo $module::VERSION; ?> <?php echo $module::VERSION; ?>
</div> </div>

View File

@ -1,17 +1,19 @@
# Version 3.8
- Encode UTF-8 de l'objet du message, et des noms des champs.
# Version 3.7 # Version 3.7
- Modification liées à la suppression de flatpickr - Modification liées à la suppression de flatpickr.
# Version 3.6 # Version 3.6
- Appel de fonction incorrect - Appel de fonction incorrect.
# Version 3.5 # Version 3.5
- Multilingue - Multilingue
# Version 3.4 # Version 3.4
- Bug de présentation, une div en trop. - Bug de présentation, une div en trop.
# Version 3.3 # Version 3.3
- Multilinguisme - Multilinguisme.
# Version 3.2 # Version 3.2
- Bug variable non initialisée - Bug variable non initialisée.
# Version 3.1 # Version 3.1
- Initialisation des paramètres personnalisés - Initialisation des paramètres personnalisés.
# Version 3 # Version 3
- Déplacement des options de formulaires - Déplacement des options de formulaires.
- Gabarit du formulaire sur la page - Gabarit du formulaire sur la page.

View File

@ -14,23 +14,24 @@
* @link http://zwiicms.fr/ * @link http://zwiicms.fr/
*/ */
class form extends common { class form extends common
{
const VERSION = '3.7'; const VERSION = '3.8';
const REALNAME = 'Formulaire'; const REALNAME = 'Formulaire';
const DATADIRECTORY = ''; // Contenu localisé inclus par défaut (page.json et module.json) const DATADIRECTORY = ''; // Contenu localisé inclus par défaut (page.json et module.json)
public static $actions = [ public static $actions = [
'config' => self::GROUP_MODERATOR, 'config' => self::GROUP_MODERATOR,
'option' => self::GROUP_MODERATOR, 'option' => self::GROUP_MODERATOR,
'data' => self::GROUP_MODERATOR, 'data' => self::GROUP_MODERATOR,
'delete' => self::GROUP_MODERATOR, 'delete' => self::GROUP_MODERATOR,
'deleteall' => self::GROUP_MODERATOR, 'deleteall' => self::GROUP_MODERATOR,
'index' => self::GROUP_VISITOR, 'index' => self::GROUP_VISITOR,
'export2csv' => self::GROUP_MODERATOR, 'export2csv' => self::GROUP_MODERATOR,
'output2csv' => self::GROUP_MODERATOR, 'output2csv' => self::GROUP_MODERATOR,
'init' => self::GROUP_MODERATOR, 'init' => self::GROUP_MODERATOR,
'update' => self::GROUP_MODERATOR, 'update' => self::GROUP_MODERATOR,
]; ];
public static $data = []; public static $data = [];
@ -80,32 +81,33 @@ class form extends common {
]; ];
public static $optionOffset = [ public static $optionOffset = [
0 => 'Aucune', 0 => 'Aucune',
1 => 'Une colonne', 1 => 'Une colonne',
2 => 'Deux colonnes' 2 => 'Deux colonnes'
]; ];
public static $optionWidth = [ public static $optionWidth = [
6 => 'Six colonnes', 6 => 'Six colonnes',
7 => 'Sept colonnes', 7 => 'Sept colonnes',
8 => 'Huit colonnes', 8 => 'Huit colonnes',
9 => 'Neuf colonnes', 9 => 'Neuf colonnes',
10 => 'Dix colonnes', 10 => 'Dix colonnes',
11 => 'Onze colonnes', 11 => 'Onze colonnes',
12 => 'Douze colonnes', 12 => 'Douze colonnes',
]; ];
public static $optionAlign = [ public static $optionAlign = [
'' => 'A gauche', '' => 'A gauche',
'textAlignCenter' => 'Au centre', 'textAlignCenter' => 'Au centre',
'textAlignRight' => 'A droite' 'textAlignRight' => 'A droite'
]; ];
/** /**
* Configuration * Configuration
*/ */
public function config() { public function config()
{
// Mise à jour des données de module // Mise à jour des données de module
$this->update(); $this->update();
@ -113,21 +115,21 @@ class form extends common {
// Liste des utilisateurs // Liste des utilisateurs
$userIdsFirstnames = helper::arrayColumn($this->getData(['user']), 'firstname'); $userIdsFirstnames = helper::arrayColumn($this->getData(['user']), 'firstname');
ksort($userIdsFirstnames); ksort($userIdsFirstnames);
self::$listUsers [] = ''; self::$listUsers[] = '';
foreach($userIdsFirstnames as $userId => $userFirstname) { foreach ($userIdsFirstnames as $userId => $userFirstname) {
self::$listUsers [] = $userId; self::$listUsers[] = $userId;
} }
// Soumission du formulaire // Soumission du formulaire
if($this->isPost()) { if ($this->isPost()) {
// Génération des données vides // Génération des données vides
if ($this->getData(['module', $this->getUrl(0), 'data']) === null) { if ($this->getData(['module', $this->getUrl(0), 'data']) === null) {
$this->setData(['module', $this->getUrl(0), 'data', []]); $this->setData(['module', $this->getUrl(0), 'data', []]);
} }
// Génération des champs // Génération des champs
$inputs = []; $inputs = [];
foreach($this->getInput('formConfigPosition', null) as $index => $position) { foreach ($this->getInput('formConfigPosition', null) as $index => $position) {
$inputs[] = [ $inputs[] = [
'name' => htmlspecialchars_decode($this->getInput('formConfigName[' . $index . ']'),ENT_QUOTES), 'name' => html_entity_decode($this->getInput('formConfigName[' . $index . ']')),
'position' => helper::filter($position, helper::FILTER_INT), 'position' => helper::filter($position, helper::FILTER_INT),
'required' => $this->getInput('formConfigRequired[' . $index . ']', helper::FILTER_BOOLEAN), 'required' => $this->getInput('formConfigRequired[' . $index . ']', helper::FILTER_BOOLEAN),
'type' => $this->getInput('formConfigType[' . $index . ']'), 'type' => $this->getInput('formConfigType[' . $index . ']'),
@ -142,13 +144,6 @@ class form extends common {
'state' => true 'state' => true
]); ]);
} }
// Liste des pages
foreach($this->getHierarchy(null, false) as $parentPageId => $childrenPageIds) {
self::$pages[$parentPageId] = $this->getData(['page', $parentPageId, 'title']);
foreach($childrenPageIds as $childKey) {
self::$pages[$childKey] = '&nbsp;&nbsp;&nbsp;&nbsp;' . $this->getData(['page', $childKey, 'title']);
}
}
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'title' => helper::translate('Configuration du module'), 'title' => helper::translate('Configuration du module'),
@ -161,20 +156,21 @@ class form extends common {
} }
public function option() { public function option()
{
// Liste des utilisateurs // Liste des utilisateurs
$userIdsFirstnames = helper::arrayColumn($this->getData(['user']), 'firstname'); $userIdsFirstnames = helper::arrayColumn($this->getData(['user']), 'firstname');
ksort($userIdsFirstnames); ksort($userIdsFirstnames);
self::$listUsers [] = ''; self::$listUsers[] = '';
foreach ($userIdsFirstnames as $userId => $userFirstname) { foreach ($userIdsFirstnames as $userId => $userFirstname) {
self::$listUsers [] = $userId; self::$listUsers[] = $userId;
} }
// Soumission du formulaire // Soumission du formulaire
if ($this->isPost()) { if ($this->isPost()) {
// Débordement // Débordement
$width = $this->getInput('formOptionWidth'); $width = $this->getInput('formOptionWidth');
if ($this->getInput('formOptionWidth',helper::FILTER_INT) + $this->getInput('formOptionOffset',helper::FILTER_INT) > 12 ) { if ($this->getInput('formOptionWidth', helper::FILTER_INT) + $this->getInput('formOptionOffset', helper::FILTER_INT) > 12) {
$width = (string) $this->getInput('formOptionWidth',helper::FILTER_INT) - $this->getInput('formOptionOffset',helper::FILTER_INT); $width = (string) $this->getInput('formOptionWidth', helper::FILTER_INT) - $this->getInput('formOptionOffset', helper::FILTER_INT);
} }
// Configuration // Configuration
@ -186,17 +182,17 @@ class form extends common {
'button' => $this->getInput('formOptionButton'), 'button' => $this->getInput('formOptionButton'),
'captcha' => $this->getInput('formOptionCaptcha', helper::FILTER_BOOLEAN), 'captcha' => $this->getInput('formOptionCaptcha', helper::FILTER_BOOLEAN),
'group' => $this->getInput('formOptionGroup', helper::FILTER_INT), 'group' => $this->getInput('formOptionGroup', helper::FILTER_INT),
'user' => self::$listUsers [$this->getInput('formOptionUser', helper::FILTER_INT)], 'user' => self::$listUsers[$this->getInput('formOptionUser', helper::FILTER_INT)],
'mail' => $this->getInput('formOptionMail') , 'mail' => $this->getInput('formOptionMail'),
'pageId' => $this->getInput('formOptionPageIdToggle', helper::FILTER_BOOLEAN) === true ? $this->getInput('formOptionPageId', helper::FILTER_ID) : '', 'pageId' => $this->getInput('formOptionPageIdToggle', helper::FILTER_BOOLEAN) === true ? $this->getInput('formOptionPageId', helper::FILTER_ID) : '',
'subject' => $this->getInput('formOptionSubject'), 'subject' => html_entity_decode($this->getInput('formOptionSubject')),
'replyto' => $this->getInput('formOptionMailReplyTo', helper::FILTER_BOOLEAN), 'replyto' => $this->getInput('formOptionMailReplyTo', helper::FILTER_BOOLEAN),
'signature' => $this->getInput('formOptionSignature'), 'signature' => $this->getInput('formOptionSignature'),
'logoUrl' => $this->getInput('formOptionLogo'), 'logoUrl' => $this->getInput('formOptionLogo'),
'logoWidth' => $this->getInput('formOptionLogoWidth'), 'logoWidth' => $this->getInput('formOptionLogoWidth'),
'offset' =>$this->getInput('formOptionOffset'), 'offset' => $this->getInput('formOptionOffset'),
'width' =>$width, 'width' => $width,
'align' =>$this->getInput('formOptionAlign'), 'align' => $this->getInput('formOptionAlign'),
] ]
]); ]);
// Génération des données vides // Génération des données vides
@ -209,12 +205,12 @@ class form extends common {
'redirect' => helper::baseUrl() . $this->getUrl(), 'redirect' => helper::baseUrl() . $this->getUrl(),
'state' => true 'state' => true
]); ]);
} else { } else {
// Liste des pages // Liste des pages
foreach($this->getHierarchy(null, false) as $parentPageId => $childrenPageIds) { foreach ($this->getHierarchy(null, true, false) as $parentPageId => $childrenPageIds) {
self::$pages[$parentPageId] = $this->getData(['page', $parentPageId, 'title']); self::$pages[$parentPageId] = $this->getData(['page', $parentPageId, 'title']);
foreach($childrenPageIds as $childKey) { foreach ($childrenPageIds as $childKey) {
self::$pages[$childKey] = '&nbsp;&nbsp;&nbsp;&nbsp;' . $this->getData(['page', $childKey, 'title']); self::$pages[$childKey] = '&nbsp;»&nbsp;' . $this->getData(['page', $childKey, 'title']);
} }
} }
// Valeurs en sortie // Valeurs en sortie
@ -232,9 +228,10 @@ class form extends common {
/** /**
* Données enregistrées * Données enregistrées
*/ */
public function data() { public function data()
{
$data = $this->getData(['module', $this->getUrl(0), 'data']); $data = $this->getData(['module', $this->getUrl(0), 'data']);
if($data) { if ($data) {
// Pagination // Pagination
$pagination = helper::pagination($data, $this->getUrl(), self::$itemsperPage); $pagination = helper::pagination($data, $this->getUrl(), self::$itemsperPage);
// Liste des pages // Liste des pages
@ -243,16 +240,16 @@ class form extends common {
$dataIds = array_reverse(array_keys($data)); $dataIds = array_reverse(array_keys($data));
$data = array_reverse($data); $data = array_reverse($data);
// Données en fonction de la pagination // Données en fonction de la pagination
for($i = $pagination['first']; $i < $pagination['last']; $i++) { for ($i = $pagination['first']; $i < $pagination['last']; $i++) {
$content = ''; $content = '';
foreach($data[$i] as $input => $value) { foreach ($data[$i] as $input => $value) {
$content .= $input . ' : ' . $value . '<br>'; $content .= $input . ' : ' . $value . '<br>';
} }
self::$data[] = [ self::$data[] = [
$content, $content,
template::button('formDataDelete' . $dataIds[$i], [ template::button('formDataDelete' . $dataIds[$i], [
'class' => 'formDataDelete buttonRed', 'class' => 'formDataDelete buttonRed',
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $dataIds[$i] . '/' . $_SESSION['csrf'], 'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $dataIds[$i] . '/' . $_SESSION['csrf'],
'value' => template::ico('trash') 'value' => template::ico('trash')
]) ])
]; ];
@ -268,39 +265,40 @@ class form extends common {
/** /**
* Export CSV * Export CSV
* @author Frédéric Tempez <frederic.tempez@outlook.com> * @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2023, Frédéric Tempez * @copyright Copyright (C) 2018-2023, Frédéric Tempez
*/ */
public function export2csv() { public function export2csv()
{
// Jeton incorrect // Jeton incorrect
if ($this->getUrl(2) !== $_SESSION['csrf']) { if ($this->getUrl(2) !== $_SESSION['csrf']) {
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data', 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data',
'notification' => helper::translate('Action interdite') 'notification' => helper::translate('Action interdite')
]); ]);
} else { } else {
$data = $this->getData(['module', $this->getUrl(0), 'data']); $data = $this->getData(['module', $this->getUrl(0), 'data']);
if ($data !== []) { if ($data !== []) {
$csvfilename = 'data-'.date('dmY').'-'.date('hm').'-'.rand(10,99).'.csv'; $csvfilename = 'data-' . date('dmY') . '-' . date('hm') . '-' . rand(10, 99) . '.csv';
if (!file_exists(self::FILE_DIR.'source/data')) { if (!file_exists(self::FILE_DIR . 'source/data')) {
mkdir(self::FILE_DIR.'source/data', 0755); mkdir(self::FILE_DIR . 'source/data', 0755);
} }
$fp = fopen(self::FILE_DIR.'source/data/'.$csvfilename, 'w'); $fp = fopen(self::FILE_DIR . 'source/data/' . $csvfilename, 'w');
fputcsv($fp, array_keys($data[1]), ';','"'); fputcsv($fp, array_keys($data[1]), ';', '"');
foreach ($data as $fields) { foreach ($data as $fields) {
fputcsv($fp, $fields, ';','"'); fputcsv($fp, $fields, ';', '"');
} }
fclose($fp); fclose($fp);
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'notification' => sprintf(helper::translate('Export CSV effectué dans %1 '), $csvfilename), 'notification' => sprintf(helper::translate('Export CSV effectué dans %1 '), $csvfilename),
'redirect' => helper::baseUrl() . $this->getUrl(0) .'/data', 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data',
'state' => true 'state' => true
]); ]);
} else { } else {
$this->addOutput([ $this->addOutput([
'notification' => helper::translate('Aucune donnée à exporter'), 'notification' => helper::translate('Aucune donnée à exporter'),
'redirect' => helper::baseUrl() . $this->getUrl(0) .'/data' 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data'
]); ]);
} }
} }
@ -310,19 +308,20 @@ class form extends common {
/** /**
* Suppression * Suppression
*/ */
public function deleteall() { public function deleteall()
{
// Jeton incorrect // Jeton incorrect
if ($this->getUrl(2) !== $_SESSION['csrf']) { if ($this->getUrl(2) !== $_SESSION['csrf']) {
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data', 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data',
'notification' => helper::translate('Action interdite') 'notification' => helper::translate('Action interdite')
]); ]);
} else { } else {
$data = ($this->getData(['module', $this->getUrl(0), 'data'])); $data = ($this->getData(['module', $this->getUrl(0), 'data']));
if (count($data) > 0 ) { if (count($data) > 0) {
// Suppression multiple // Suppression multiple
for ($i = 1; $i <= count($data) ; $i++) { for ($i = 1; $i <= count($data); $i++) {
echo $this->deleteData(['module', $this->getUrl(0), 'data', $i]); echo $this->deleteData(['module', $this->getUrl(0), 'data', $i]);
} }
// Valeurs en sortie // Valeurs en sortie
@ -345,17 +344,18 @@ class form extends common {
/** /**
* Suppression * Suppression
*/ */
public function delete() { public function delete()
{
// Jeton incorrect // Jeton incorrect
if ($this->getUrl(3) !== $_SESSION['csrf']) { if ($this->getUrl(3) !== $_SESSION['csrf']) {
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data', 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data',
'notification' => helper::translate('Action interdite') 'notification' => helper::translate('Action interdite')
]); ]);
} else { } else {
// La donnée n'existe pas // La donnée n'existe pas
if($this->getData(['module', $this->getUrl(0), 'data', $this->getUrl(2)]) === null) { if ($this->getData(['module', $this->getUrl(0), 'data', $this->getUrl(2)]) === null) {
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'access' => false 'access' => false
@ -380,19 +380,20 @@ class form extends common {
/** /**
* Accueil * Accueil
*/ */
public function index() { public function index()
{
// Mise à jour des données de module // Mise à jour des données de module
$this->update(); $this->update();
// Soumission du formulaire // Soumission du formulaire
if($this->isPost()) { if ($this->isPost()) {
// Check la captcha // Check la captcha
if( if (
$this->getData(['module', $this->getUrl(0), 'config', 'captcha']) $this->getData(['module', $this->getUrl(0), 'config', 'captcha'])
// AND $this->getInput('formcaptcha', helper::FILTER_INT) !== $this->getInput('formcaptchaFirstNumber', helper::FILTER_INT) + $this->getInput('formcaptchaSecondNumber', helper::FILTER_INT)) // AND $this->getInput('formcaptcha', helper::FILTER_INT) !== $this->getInput('formcaptchaFirstNumber', helper::FILTER_INT) + $this->getInput('formcaptchaSecondNumber', helper::FILTER_INT))
AND password_verify($this->getInput('formCaptcha', helper::FILTER_INT), $this->getInput('formCaptchaResult') ) === false ) and password_verify($this->getInput('formCaptcha', helper::FILTER_INT), $this->getInput('formCaptchaResult')) === false
{ ) {
self::$inputNotices['formCaptcha'] = helper::translate('Captcha incorrect'); self::$inputNotices['formCaptcha'] = helper::translate('Captcha incorrect');
} }
@ -400,9 +401,9 @@ class form extends common {
$data = []; $data = [];
$replyTo = null; $replyTo = null;
$content = ''; $content = '';
foreach($this->getData(['module', $this->getUrl(0), 'input']) as $index => $input) { foreach ($this->getData(['module', $this->getUrl(0), 'input']) as $index => $input) {
// Filtre la valeur // Filtre la valeur
switch($input['type']) { switch ($input['type']) {
case self::TYPE_MAIL: case self::TYPE_MAIL:
$filter = helper::FILTER_MAIL; $filter = helper::FILTER_MAIL;
break; break;
@ -420,10 +421,12 @@ class form extends common {
} }
$value = $this->getInput('formInput[' . $index . ']', $filter, $input['required']) === true ? 'X' : $this->getInput('formInput[' . $index . ']', $filter, $input['required']); $value = $this->getInput('formInput[' . $index . ']', $filter, $input['required']) === true ? 'X' : $this->getInput('formInput[' . $index . ']', $filter, $input['required']);
// premier champ email ajouté au mail en reply si option active // premier champ email ajouté au mail en reply si option active
if ($this->getData(['module', $this->getUrl(0), 'config', 'replyto']) === true && if (
$input['type'] === 'mail') { $this->getData(['module', $this->getUrl(0), 'config', 'replyto']) === true &&
$input['type'] === 'mail'
) {
$replyTo = $value; $replyTo = $value;
} }
// Préparation des données pour la création dans la base // Préparation des données pour la création dans la base
$data[$this->getData(['module', $this->getUrl(0), 'input', $index, 'name'])] = $value; $data[$this->getData(['module', $this->getUrl(0), 'input', $index, 'name'])] = $value;
// Préparation des données pour le mail // Préparation des données pour le mail
@ -434,23 +437,25 @@ class form extends common {
// Envoi du mail // Envoi du mail
// Rechercher l'adresse en fonction du mail // Rechercher l'adresse en fonction du mail
$sent = true; $sent = true;
$singleuser = $this->getData(['user', $singleuser = $this->getData([
$this->getData(['module', $this->getUrl(0), 'config', 'user']), 'user',
'mail']); $this->getData(['module', $this->getUrl(0), 'config', 'user']),
'mail'
]);
$singlemail = $this->getData(['module', $this->getUrl(0), 'config', 'mail']); $singlemail = $this->getData(['module', $this->getUrl(0), 'config', 'mail']);
$group = $this->getData(['module', $this->getUrl(0), 'config', 'group']); $group = $this->getData(['module', $this->getUrl(0), 'config', 'group']);
// Verification si le mail peut être envoyé // Verification si le mail peut être envoyé
if( if (
self::$inputNotices === [] && ( self::$inputNotices === [] && (
$group > 0 || $group > 0 ||
$singleuser !== '' || $singleuser !== '' ||
$singlemail !== '' ) $singlemail !== '')
) { ) {
// Utilisateurs dans le groupe // Utilisateurs dans le groupe
$to = []; $to = [];
if ($group > 0){ if ($group > 0) {
foreach($this->getData(['user']) as $userId => $user) { foreach ($this->getData(['user']) as $userId => $user) {
if($user['group'] >= $group) { if ($user['group'] >= $group) {
$to[] = $user['mail']; $to[] = $user['mail'];
} }
} }
@ -463,10 +468,10 @@ class form extends common {
if (!empty($singlemail)) { if (!empty($singlemail)) {
$to[] = $singlemail; $to[] = $singlemail;
} }
if($to) { if ($to) {
// Sujet du mail // Sujet du mail
$subject = $this->getData(['module', $this->getUrl(0), 'config', 'subject']); $subject = $this->getData(['module', $this->getUrl(0), 'config', 'subject']);
if($subject === '') { if ($subject === '') {
$subject = 'Nouveau message en provenance de votre site'; $subject = 'Nouveau message en provenance de votre site';
} }
// Envoi le mail // Envoi le mail
@ -486,7 +491,7 @@ class form extends common {
$this->addOutput([ $this->addOutput([
'notification' => ($sent === true ? helper::translate('Formulaire soumis') : $sent), 'notification' => ($sent === true ? helper::translate('Formulaire soumis') : $sent),
'redirect' => $redirect ? helper::baseUrl() . $redirect : '', 'redirect' => $redirect ? helper::baseUrl() . $redirect : '',
'state' => ($sent === true ? true : null), 'state' => ($sent === true ? true : false),
'vendor' => [ 'vendor' => [
'flatpickr' 'flatpickr'
], ],
@ -507,23 +512,25 @@ class form extends common {
* Mise à jour du module * Mise à jour du module
* Appelée par les fonctions index et config * Appelée par les fonctions index et config
*/ */
private function update() { private function update()
{
// le module n'est pas initialisé // le module n'est pas initialisé
if ( $this->getData(['module',$this->getUrl(0), 'config']) === NULL ) { if ($this->getData(['module', $this->getUrl(0), 'config']) === NULL) {
$this->init(); $this->init();
} }
} }
/** /**
* Initialisation du thème d'un nouveau module * Initialisation du thème d'un nouveau module
*/ */
private function init() { private function init()
{
// Données du module absentes // Données du module absentes
require_once('module/form/ressource/defaultdata.php'); require_once('module/form/ressource/defaultdata.php');
if ($this->getData(['module', $this->getUrl(0), 'config' ]) === null) { if ($this->getData(['module', $this->getUrl(0), 'config']) === null) {
$this->setData(['module', $this->getUrl(0), 'config', init::$defaultData]); $this->setData(['module', $this->getUrl(0), 'config', init::$defaultData]);
} }
} }
} }

View File

@ -46,6 +46,7 @@
&& strlen($this->getData(['module', $this->getUrl(0), 'posts', $newsId, 'content'])) >= $this->getData(['module', $this->getUrl(0), 'config', 'height']) && strlen($this->getData(['module', $this->getUrl(0), 'posts', $newsId, 'content'])) >= $this->getData(['module', $this->getUrl(0), 'config', 'height'])
): ?> ): ?>
<?php echo ' ... <a href="' . helper::baseUrl(true) . $this->getUrl(0) . '/' . $newsId . '"><span class="newsSuite">lire la suite</span></a>'; ?> <?php echo ' ... <a href="' . helper::baseUrl(true) . $this->getUrl(0) . '/' . $newsId . '"><span class="newsSuite">lire la suite</span></a>'; ?>
<?php endif; ?> <?php endif; ?>
</div> </div>
</div> </div>