Revert "Merge branch '11300' of https://forge.chapril.org/fredtempez/ZwiiCMS-private into 11300"
This reverts commit 81f2fad880a7377f40b831ab75d55a08855f3017, reversing changes made to 333bc1f9cba6c5c2e66db309dd83a5774d1ec90e.
This commit is contained in:
parent
81f2fad880
commit
b2094b7834
11
CHANGES.md
11
CHANGES.md
@ -1,14 +1,8 @@
|
||||
# Changelog
|
||||
|
||||
|
||||
## Version 12.0.00
|
||||
- Modifications :
|
||||
- Module addon refondu et renommé plugin.
|
||||
- Réorganisation massive des modules afin d'éviter de faire cohabiter des formulaires avec des champs d'information.
|
||||
- Désormais, les URL internes seront relatives, cela signifie qu'elles ne contiendront plus le domaine et le chemin d'accès au site. Cela permettra le déplacement d'un site d'un hébergement à un autre, d'un dossier d'hébergement à un autre, sans avoir à convertir les adresses internes. Les données d'un site mis à jour et importées d'une version antérieures sont automatiquement converties. En conséquence, le bloc de conversion de la fenêtre d'import est supprimé.
|
||||
|
||||
## Version 11.3.00
|
||||
Corrections :
|
||||
- Corrections :
|
||||
- Thème / site : problème d'aperçu du body ; police du thème admin non chargées.
|
||||
- Bugs avec les aperçus des sélecteurs de fontes.
|
||||
- Notice générée par l'effacement d'une page sans module.
|
||||
@ -36,8 +30,9 @@ Corrections :
|
||||
- Thème ; pied de page ; option pied de page fixe inopérante.
|
||||
- Edition des pages orphelines : "Ne pas afficher" une page contenant des sous-pages provoquait un bug d'affichage dans le menu, la page était malgré tout affichée en fin de menu. Ce problème était causé par les pages enfants dont l'affichage n'était pas modifié. Le correctif cascade l'option "Ne pas afficher" aux sous-pages. La réciproque n'est pas appliquée, il faudra rendre visible les sous-pages d'une page parente qui devient à nouveau visible.
|
||||
- Modifications :
|
||||
- Mise à jour en ligne, contrôle de la clé MD5 de l'archive update.tar.gz.
|
||||
- Addons (gestion des modules), le bouton d'accès au store est déplacé à la page de gestion des modules. Quelques étiquettes de boutons sont modifiés.
|
||||
- Thème ; pied de page ; options pied de page fixe et alignement avec le contenu déplacées dans les paramètres.
|
||||
- Mise à jour en ligne, contrôle de la clé MD5 de l'archive update.tar.gz.
|
||||
|
||||
## Version 11.2.02
|
||||
- Correction :
|
||||
|
@ -1,6 +1,6 @@
|
||||
|
||||
|
||||
# ZwiiCMS 12.0.00
|
||||
# ZwiiCMS 11.3.0
|
||||
|
||||
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.
|
||||
|
||||
|
@ -281,7 +281,7 @@ class helper {
|
||||
|
||||
if($version = helper::getOnlineVersion()) {
|
||||
//return (trim($version) !== common::ZWII_VERSION);
|
||||
return ((version_compare(common::ZWII_VERSION,$version)) === -1);
|
||||
return ((version_compare(common::ZWII_VERSION,$version,'<')) === -1);
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
|
@ -19,17 +19,15 @@ class template {
|
||||
'name' => $nameId,
|
||||
'target' => '',
|
||||
'uniqueSubmission' => false,
|
||||
'value' => 'Bouton',
|
||||
'help' => ''
|
||||
'value' => 'Bouton'
|
||||
], $attributes);
|
||||
// Retourne le html
|
||||
return sprintf(
|
||||
'<a %s class="button %s %s %s" %s>%s</a>',
|
||||
'<a %s class="button %s %s %s">%s</a>',
|
||||
helper::sprintAttributes($attributes, ['class', 'disabled', 'ico', 'value']),
|
||||
$attributes['disabled'] ? 'disabled' : '',
|
||||
$attributes['class'],
|
||||
$attributes['uniqueSubmission'] ? 'uniqueSubmission' : '',
|
||||
$attributes['help'] ? ' title="' . $attributes['help'] . '" ': '',
|
||||
($attributes['ico'] ? template::ico($attributes['ico'], 'right') : '') . $attributes['value']
|
||||
);
|
||||
}
|
||||
|
@ -490,6 +490,26 @@ $(document).ready(function(){
|
||||
};
|
||||
});
|
||||
|
||||
/**
|
||||
* Active le système d'aide interne
|
||||
*
|
||||
*/
|
||||
|
||||
$(".buttonHelp").click(function() {
|
||||
$(".helpDisplayContent").slideToggle();
|
||||
/**
|
||||
if( $(".buttonHelp").css('opacity') > '0.75'){
|
||||
$(".buttonHelp").css('opacity','0.5');
|
||||
}
|
||||
else{
|
||||
$(".buttonHelp").css('opacity','1');
|
||||
}
|
||||
*/
|
||||
});
|
||||
|
||||
$(".helpDisplayContent").click(function() {
|
||||
$(".helpDisplayContent").slideToggle();
|
||||
});
|
||||
|
||||
/**
|
||||
* Remove ID Facebook from URL
|
||||
|
@ -45,8 +45,8 @@ class common {
|
||||
|
||||
// Numéro de version
|
||||
const ZWII_UPDATE_URL = 'https://forge.chapril.org/ZwiiCMS-Team/update/raw/branch/master/';
|
||||
const ZWII_VERSION = '12.0.00';
|
||||
const ZWII_UPDATE_CHANNEL = "test";
|
||||
const ZWII_VERSION = '11.3.00';
|
||||
const ZWII_UPDATE_CHANNEL = "v11";
|
||||
|
||||
public static $actions = [];
|
||||
public static $coreModuleIds = [
|
||||
@ -58,7 +58,7 @@ class common {
|
||||
'theme',
|
||||
'user',
|
||||
'translate',
|
||||
'plugin'
|
||||
'addon'
|
||||
];
|
||||
public static $accessList = [
|
||||
'user',
|
||||
@ -538,8 +538,6 @@ class common {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Effacer les données de la page
|
||||
* @param string pageId
|
||||
@ -549,8 +547,7 @@ class common {
|
||||
|
||||
return unlink(self::DATA_DIR . $lang . '/content/' . $this->getData(['page', $page, 'content']));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Sauvegarde des données
|
||||
@ -1182,34 +1179,13 @@ class common {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Fonction de parcours des données de module
|
||||
* @param string $find donnée à rechercher
|
||||
* @param string $replace donnée à remplacer
|
||||
* @param array tableau à analyser
|
||||
* @param int count nombres d'occurrences
|
||||
* @return array avec les valeurs remplacées.
|
||||
*/
|
||||
public function recursive_array_replace ($find, $replace, $array, &$count) {
|
||||
if (!is_array($array)) {
|
||||
return str_replace($find, $replace, $array, $count);
|
||||
}
|
||||
|
||||
$newArray = [];
|
||||
foreach ($array as $key => $value) {
|
||||
$newArray[$key] = $this->recursive_array_replace($find, $replace, $value,$c);
|
||||
$count += $c;
|
||||
}
|
||||
return $newArray;
|
||||
}
|
||||
|
||||
/**
|
||||
* Génère une archive d'un dossier et des sous-dossiers
|
||||
* @param string fileName path et nom de l'archive
|
||||
* @param string folder path à zipper
|
||||
* @param array filter dossiers à exclure
|
||||
*/
|
||||
public function makeZip ($fileName, $folder, $filter = [] ) {
|
||||
public function makeZip ($fileName, $folder, $filter ) {
|
||||
$zip = new ZipArchive();
|
||||
$zip->open($fileName, ZipArchive::CREATE | ZipArchive::OVERWRITE);
|
||||
//$directory = 'site/';
|
||||
@ -2091,7 +2067,7 @@ class common {
|
||||
}
|
||||
if($this->getUser('group') >= self::GROUP_ADMIN) {
|
||||
$rightItems .= '<li><a href="' . helper::baseUrl() . 'theme" data-tippy-content="Personnaliser les thèmes">' . template::ico('brush') . '</a></li>';
|
||||
$rightItems .= '<li><a href="' . helper::baseUrl() . 'plugin" data-tippy-content="Gérer les modules">' . template::ico('puzzle') . '</a></li>';
|
||||
$rightItems .= '<li><a href="' . helper::baseUrl() . 'addon" data-tippy-content="Gérer les modules">' . template::ico('puzzle') . '</a></li>';
|
||||
if ($this->getData(['config', 'i18n', 'enable']) === true) {
|
||||
$rightItems .= '<li><a href="' . helper::baseUrl() . 'translate" data-tippy-content="Gestion des langues">' . template::ico('flag') . '</a></li>';
|
||||
}
|
||||
|
@ -741,55 +741,6 @@ if ($this->getData(['core', 'dataVersion']) < 11202) {
|
||||
$this->setData(['core', 'dataVersion', 11202]);
|
||||
}
|
||||
|
||||
// Version 11.2.03
|
||||
if ($this->getData(['core', 'dataVersion']) < 11203) {
|
||||
// Supprimer l'information de redirection
|
||||
$old = str_replace('?','',$this->getData(['core', 'baseUrl']));
|
||||
$new = '';
|
||||
$c3 = 0;
|
||||
$success = false ;
|
||||
// Boucler sur les pages
|
||||
foreach($this->getHierarchy(null,null,null) as $parentId => $childIds) {
|
||||
$content = $this->getPage($parentId, self::$i18n);
|
||||
$titre = $this->getData(['page', $parentId, 'title']);
|
||||
$content = $titre . ' ' . $content ;
|
||||
$replace = str_replace( 'href="' . $old , 'href="'. $new , stripslashes($content),$c1) ;
|
||||
$replace = str_replace( 'src="' . $old , 'src="'. $new , stripslashes($replace),$c2) ;
|
||||
|
||||
if ($c1 > 0 || $c2 > 0) {
|
||||
$success = true;
|
||||
$this->setPage($parentId, $replace, self::$i18n);
|
||||
$c3 += $c1 + $c2;
|
||||
}
|
||||
foreach($childIds as $childId) {
|
||||
$content = $this->getPage($childId, self::$i18n);
|
||||
$content = $titre . ' ' . $content ;
|
||||
$replace = str_replace( 'href="' . $old , 'href="'. $new , stripslashes($content),$c1) ;
|
||||
$replace = str_replace( 'src="' . $old , 'src="'. $new , stripslashes($replace),$c2) ;
|
||||
if ($c1 > 0 || $c2 > 0) {
|
||||
$success = true;
|
||||
$this->setPage($childId, $replace, self::$i18n);
|
||||
$c3 += $c1 + $c2;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Traiter les modules dont la redirection
|
||||
$content = $this->getdata(['module']);
|
||||
$replace = $this->recursive_array_replace('href="' . $old , 'href="'. $new, $content, $c1);
|
||||
$replace = $this->recursive_array_replace('src="' . $old , 'src="'. $new, $replace, $c2);
|
||||
if ($content !== $replace) {
|
||||
$this->setdata(['module',$replace]);
|
||||
$c3 += $c1 + $c2;
|
||||
$success = true;
|
||||
}
|
||||
|
||||
// Effacer la baseUrl
|
||||
$this->deleteData(['core', 'baseUrl']);
|
||||
|
||||
// Mise à jour
|
||||
$this->setData(['core', 'dataVersion', 11203]);
|
||||
}
|
||||
|
||||
// Version 11.3.00
|
||||
if ($this->getData(['core', 'dataVersion']) < 11300) {
|
||||
|
||||
@ -839,14 +790,4 @@ if ($this->getData(['core', 'dataVersion']) < 11300) {
|
||||
|
||||
// Mise à jour
|
||||
$this->setData(['core', 'dataVersion', 11300]);
|
||||
}
|
||||
|
||||
// Version 12.0.00
|
||||
if ($this->getData(['core', 'dataVersion']) < 12000) {
|
||||
|
||||
// Effacer le dossier
|
||||
$this->removeDir('core/module/addon');
|
||||
|
||||
// Mise à jour
|
||||
$this->setData(['core', 'dataVersion', 12000]);
|
||||
}
|
||||
}
|
@ -1744,6 +1744,22 @@ th.col12 {
|
||||
width: 60%;
|
||||
}
|
||||
|
||||
/* Système d'aide */
|
||||
|
||||
.helpDisplayContent {
|
||||
display: none;
|
||||
width: 100%;
|
||||
padding: 10px 10px;
|
||||
-webkit-box-shadow: 5px 5px 11px 0px #222222;
|
||||
box-shadow: 5px 5px 11px 0px #222222;
|
||||
border-radius: 5px;
|
||||
z-index: 30;
|
||||
}
|
||||
|
||||
.helpDisplayContent, .helpDisplayButton {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* Bannière masquable en petit écran*/
|
||||
@media screen and (max-width: 768px) {
|
||||
.bannerDisplay{
|
||||
|
594
core/module/addon/addon.php
Normal file
594
core/module/addon/addon.php
Normal file
@ -0,0 +1,594 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file is part of Zwii.
|
||||
*
|
||||
* For full copyright and license information, please see the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*
|
||||
* @author Rémi Jean <remi.jean@outlook.com>
|
||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||
* @copyright Copyright (C) 2018-2022, Frédéric Tempez
|
||||
* @author Sylvain Lelièvre <lelievresylvain@free.fr>
|
||||
* @copyright Copyright (C) 2020-2021, Sylvain Lelièvre
|
||||
* @license GNU General Public License, version 3
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
|
||||
class addon extends common {
|
||||
|
||||
public static $actions = [
|
||||
'index' => self::GROUP_ADMIN,
|
||||
'delete' => self::GROUP_ADMIN,
|
||||
'export' => self::GROUP_ADMIN,
|
||||
'import' => self::GROUP_ADMIN,
|
||||
'store' => self::GROUP_ADMIN,
|
||||
'item' => self::GROUP_ADMIN,
|
||||
'upload' => self::GROUP_ADMIN,
|
||||
'uploadItem'=> self::GROUP_ADMIN
|
||||
];
|
||||
|
||||
// URL des modules
|
||||
const BASEURL_STORE = 'https://store.zwiicms.fr/';
|
||||
const MODULE_STORE = '?modules/';
|
||||
|
||||
// Gestion des modules
|
||||
public static $modInstal = [];
|
||||
|
||||
// pour tests
|
||||
public static $valeur = [];
|
||||
|
||||
// le catalogue
|
||||
public static $storeList = [];
|
||||
public static $storeItem = [];
|
||||
|
||||
|
||||
/*
|
||||
* Effacement d'un module installé et non utilisé
|
||||
*/
|
||||
public function delete() {
|
||||
|
||||
// Jeton incorrect
|
||||
if ($this->getUrl(3) !== $_SESSION['csrf']) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'addon',
|
||||
'state' => false,
|
||||
'notification' => 'Action non autorisée'
|
||||
]);
|
||||
}
|
||||
else{
|
||||
// Suppression des dossiers
|
||||
$infoModules = helper::getModules();
|
||||
$module = $this->getUrl(2);
|
||||
//Liste des dossiers associés au module non effacés
|
||||
if( $this->removeDir('./module/'.$module ) === true ){
|
||||
$success = true;
|
||||
$notification = 'Module '. $module .' désinstallé';
|
||||
if(($infoModules[$this->getUrl(2)]['dataDirectory']) ) {
|
||||
if (
|
||||
is_dir($infoModules[$this->getUrl(2)]['dataDirectory'])
|
||||
&& !$this->removeDir($infoModules[$this->getUrl(2)]['dataDirectory'])
|
||||
){
|
||||
$notification = 'Module '.$module .' désinstallé, il reste des données dans ' . $infoModules[$this->getUrl(2)]['dataDirectory'];
|
||||
}
|
||||
}
|
||||
}
|
||||
else{
|
||||
$success = false;
|
||||
$notification = 'La suppression a échouée';
|
||||
}
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'addon',
|
||||
'notification' => $notification,
|
||||
'state' => $success
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/***
|
||||
* Installation d'un module
|
||||
* Fonction utilisée par upload et storeUpload
|
||||
*/
|
||||
private function install ($moduleName, $checkValid){
|
||||
$tempFolder = 'datamodules';//uniqid();
|
||||
$zip = new ZipArchive();
|
||||
if ($zip->open($moduleName) === TRUE) {
|
||||
$notification = 'Archive ouverte';
|
||||
mkdir (self::TEMP_DIR . $tempFolder, 0755);
|
||||
$zip->extractTo(self::TEMP_DIR . $tempFolder );
|
||||
// Archive de module ?
|
||||
$success = false;
|
||||
$notification = 'Ce n\'est pas l\'archive d\'un module !';
|
||||
$moduleDir = self::TEMP_DIR . $tempFolder . '/module';
|
||||
$moduleName = '';
|
||||
if ( is_dir( $moduleDir )) {
|
||||
// Lire le nom du module
|
||||
if ($dh = opendir( $moduleDir )) {
|
||||
while ( false !== ($file = readdir($dh)) ) {
|
||||
if ($file != "." && $file != "..") {
|
||||
$moduleName = $file;
|
||||
}
|
||||
}
|
||||
closedir($dh);
|
||||
}
|
||||
// Module normalisé ?
|
||||
if( is_file( $moduleDir.'/'.$moduleName.'/'.$moduleName.'.php' ) AND is_file( $moduleDir.'/'.$moduleName.'/view/index/index.php' ) ){
|
||||
|
||||
// Lecture de la version et de la validation d'update du module pour validation de la mise à jour
|
||||
// Pour une version <= version installée l'utilisateur doit cocher 'Mise à jour forcée'
|
||||
$version = '0.0';
|
||||
$update = '0.0';
|
||||
$valUpdate = false;
|
||||
$file = file_get_contents( $moduleDir.'/'.$moduleName.'/'.$moduleName.'.php');
|
||||
$file = str_replace(' ','',$file);
|
||||
$file = str_replace("\t",'',$file);
|
||||
$pos1 = strpos($file, 'constVERSION');
|
||||
if( $pos1 !== false){
|
||||
$posdeb = strpos($file, "'", $pos1);
|
||||
$posend = strpos($file, "'", $posdeb + 1);
|
||||
$version = substr($file, $posdeb + 1, $posend - $posdeb - 1);
|
||||
}
|
||||
$pos1 = strpos($file, 'constUPDATE');
|
||||
if( $pos1 !== false){
|
||||
$posdeb = strpos($file, "'", $pos1);
|
||||
$posend = strpos($file, "'", $posdeb + 1);
|
||||
$update = substr($file, $posdeb + 1, $posend - $posdeb - 1);
|
||||
}
|
||||
// Si version actuelle >= version indiquée dans UPDATE la mise à jour est validée
|
||||
$infoModules = helper::getModules();
|
||||
if( $infoModules[$moduleName]['update'] >= $update ) $valUpdate = true;
|
||||
|
||||
// Module déjà installé ?
|
||||
$moduleInstal = false;
|
||||
foreach($infoModules as $key=>$value ){
|
||||
if($moduleName === $key){
|
||||
$moduleInstal = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Validation de la maj si autorisation du concepteur du module ET
|
||||
// ( Version plus récente OU Check de forçage )
|
||||
$valNewVersion = floatval($version);
|
||||
$valInstalVersion = floatval( $infoModules[$moduleName]['version'] );
|
||||
$newVersion = false;
|
||||
if( $valNewVersion > $valInstalVersion ) $newVersion = true;
|
||||
$validMaj = $valUpdate && ( $newVersion || $checkValid);
|
||||
|
||||
// Nouvelle installation ou mise à jour du module
|
||||
if( ! $moduleInstal || $validMaj ){
|
||||
// Copie récursive des dossiers
|
||||
$this->copyDir( self::TEMP_DIR . $tempFolder, './' );
|
||||
$success = true;
|
||||
if( ! $moduleInstal ){
|
||||
$notification = 'Module '.$moduleName.' installé';
|
||||
}
|
||||
else{
|
||||
$notification = 'Module '.$moduleName.' mis à jour';
|
||||
}
|
||||
}
|
||||
else{
|
||||
$success = false;
|
||||
if( $valNewVersion == $valInstalVersion){
|
||||
$notification = ' Version détectée '.$version.' = à celle installée '.$infoModules[$moduleName]['version'];
|
||||
}
|
||||
else{
|
||||
$notification = ' Version détectée '.$version.' < à celle installée '.$infoModules[$moduleName]['version'];
|
||||
}
|
||||
if( $valUpdate === false){
|
||||
if( $infoModules[$moduleName]['update'] === $update ){
|
||||
$notification = ' Mise à jour par ce procédé interdite par le concepteur du module';
|
||||
}
|
||||
else{
|
||||
$notification = ' Mise à jour par ce procédé interdite, votre version est trop ancienne';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Supprimer le dossier temporaire même si le module est invalide
|
||||
$this->removeDir(self::TEMP_DIR . $tempFolder);
|
||||
$zip->close();
|
||||
} else {
|
||||
// erreur à l'ouverture
|
||||
$success = false;
|
||||
$notification = 'Impossible d\'ouvrir l\'archive';
|
||||
}
|
||||
return(['success' => $success,
|
||||
'notification'=> $notification
|
||||
]);
|
||||
}
|
||||
|
||||
/***
|
||||
* Installation d'un module à partir du gestionnaire de fichier
|
||||
*/
|
||||
public function upload() {
|
||||
// Soumission du formulaire
|
||||
if($this->isPost()) {
|
||||
// Installation d'un module
|
||||
$checkValidMaj = $this->getInput('configModulesCheck', helper::FILTER_BOOLEAN);
|
||||
$zipFilename = $this->getInput('configModulesInstallation', helper::FILTER_STRING_SHORT);
|
||||
if( $zipFilename !== ''){
|
||||
$success = [
|
||||
'success' => false,
|
||||
'notification'=> ''
|
||||
];
|
||||
$state = $this->install(self::FILE_DIR.'source/'.$zipFilename, $checkValidMaj);
|
||||
}
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . $this->getUrl(),
|
||||
'notification' => $state['notification'],
|
||||
'state' => $state['success']
|
||||
]);
|
||||
}
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => 'Téléverser un module',
|
||||
'view' => 'upload'
|
||||
]);
|
||||
}
|
||||
|
||||
/***
|
||||
* Installation d'un module par le catalogue
|
||||
*/
|
||||
public function uploadItem() {
|
||||
// Jeton incorrect
|
||||
if ($this->getUrl(3) !== $_SESSION['csrf']) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'store',
|
||||
'state' => false,
|
||||
'notification' => 'Action non autorisée'
|
||||
]);
|
||||
} else {
|
||||
// Récupérer le module en ligne
|
||||
$moduleName = $this->getUrl(2);
|
||||
// Informations sur les module en ligne
|
||||
$store = json_decode(helper::getUrlContents(self::BASEURL_STORE . self::MODULE_STORE . 'list'), true);
|
||||
// Url du module à télécharger
|
||||
$moduleFilePath = $store[$moduleName]['file'];
|
||||
// Télécharger le fichier
|
||||
$moduleData = helper::getUrlContents(self::BASEURL_STORE . self::FILE_DIR . 'source/' . $moduleFilePath);
|
||||
// Extraire de l'arborescence
|
||||
$d = explode('/',$moduleFilePath);
|
||||
$moduleFile = $d[count($d)-1];
|
||||
// Créer le dossier modules
|
||||
if (!is_dir(self::FILE_DIR . 'source/modules')) {
|
||||
mkdir (self::FILE_DIR . 'source/modules', 0755);
|
||||
}
|
||||
// Sauver les données du fichiers
|
||||
file_put_contents(self::FILE_DIR . 'source/modules/' . $moduleFile, $moduleData);
|
||||
|
||||
/**
|
||||
* $if( $moduleFile !== ''){
|
||||
* $success = [
|
||||
* 'success' => false,
|
||||
* 'notification'=> ''
|
||||
* ];
|
||||
* $state = $this->install(self::FILE_DIR.'source/modules/'.$moduleFile, false);
|
||||
*}
|
||||
*/
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'addon/store',
|
||||
'notification' => $moduleFile . ' téléchargé dans le dossier modules du gestionnaire de fichiers',
|
||||
'state' => true
|
||||
]);
|
||||
|
||||
}
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => 'Catalogue de modules',
|
||||
'view' => 'store'
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Catalogue des modules sur le site ZwiiCMS.fr
|
||||
*/
|
||||
public function store() {
|
||||
$store = json_decode(helper::getUrlContents(self::BASEURL_STORE . self::MODULE_STORE . 'list'), true);
|
||||
if ($store) {
|
||||
// Modules installés
|
||||
$infoModules = helper::getModules();
|
||||
// Clés moduleIds dans les pages
|
||||
$inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC');
|
||||
foreach( $inPages as $key=>$value){
|
||||
$inPagesTitle[ $this->getData(['page', $key, 'title' ]) ] = $value;
|
||||
}
|
||||
// Parcourir les données des modules
|
||||
foreach ($store as $key=>$value) {
|
||||
// Module non installé
|
||||
$ico = template::ico('download');
|
||||
$class = '';
|
||||
// Le module est installé
|
||||
if (array_key_exists($key,$infoModules) === true) {
|
||||
$class = 'buttonGreen';
|
||||
$ico = template::ico('update');
|
||||
}
|
||||
// Le module est installé et utilisé
|
||||
if (in_array($key,$inPages) === true) {
|
||||
$class = 'buttonRed';
|
||||
$ico = template::ico('update');
|
||||
}
|
||||
self::$storeList [] = [
|
||||
$store[$key]['category'],
|
||||
'<a href="' . self::BASEURL_STORE . self::MODULE_STORE . $key . '" target="_blank" >'.$store[$key]['title'].'</a>',
|
||||
$store[$key]['version'],
|
||||
mb_detect_encoding(strftime('%d %B %Y', $store[$key]['versionDate']), 'UTF-8', true)
|
||||
? strftime('%d %B %Y', $store[$key]['versionDate'])
|
||||
: utf8_encode(strftime('%d %B %Y', $store[$key]['versionDate'])),
|
||||
implode(', ', array_keys($inPagesTitle,$key)),
|
||||
template::button('moduleExport' . $key, [
|
||||
'class' => $class,
|
||||
'href' => helper::baseUrl(). $this->getUrl(0) . '/uploadItem/' . $key.'/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre
|
||||
'value' => $ico
|
||||
])
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => 'Catalogue de modules en ligne',
|
||||
'view' => 'store'
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Détail d'un objet du catalogue
|
||||
*/
|
||||
public function item() {
|
||||
$store = json_decode(helper::getUrlContents(self::BASEURL_STORE . self::MODULE_STORE . 'list'), true);
|
||||
self::$storeItem = $store [$this->getUrl(2)] ;
|
||||
self::$storeItem ['fileDate'] = mb_detect_encoding(strftime('%d %B %Y',self::$storeItem ['fileDate']), 'UTF-8', true)
|
||||
? strftime('%d %B %Y', self::$storeItem ['fileDate'])
|
||||
: utf8_encode(strftime('%d %B %Y', self::$storeItem ['fileDate']));
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' =>'Module ' . self::$storeItem['title'],
|
||||
'view' => 'item'
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gestion des modules
|
||||
*/
|
||||
public function index() {
|
||||
|
||||
// Lister les modules
|
||||
// $infoModules[nom_module]['realName'], ['version'], ['update'], ['delete'], ['dataDirectory']
|
||||
$infoModules = helper::getModules();
|
||||
|
||||
// Clés moduleIds dans les pages
|
||||
$inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC');
|
||||
foreach( $inPages as $key=>$value){
|
||||
$inPagesTitle[ $this->getData(['page', $key, 'title' ]) ] = $value;
|
||||
}
|
||||
|
||||
// Parcourir les données des modules
|
||||
foreach ($infoModules as $key=>$value) {
|
||||
// Construire le tableau de sortie
|
||||
self::$modInstal[] = [
|
||||
$key,
|
||||
$infoModules[$key]['realName'],
|
||||
$infoModules[$key]['version'],
|
||||
implode(', ', array_keys($inPagesTitle,$key)),
|
||||
//|| ('delete',$infoModules[$key]) && $infoModules[$key]['delete'] === true && implode(', ',array_keys($inPages,$key)) === ''
|
||||
$infoModules[$key]['delete'] === true && implode(', ',array_keys($inPages,$key)) === ''
|
||||
? template::button('moduleDelete' . $key, [
|
||||
'class' => 'moduleDelete buttonRed',
|
||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $key . '/' . $_SESSION['csrf'],
|
||||
'value' => template::ico('cancel')
|
||||
])
|
||||
: '',
|
||||
implode(', ',array_keys($inPages,$key)) !== ''
|
||||
? template::button('moduleExport' . $key, [
|
||||
'href' => helper::baseUrl(). $this->getUrl(0) . '/export/' . $key . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre
|
||||
'value' => template::ico('download')
|
||||
])
|
||||
: '',
|
||||
implode(', ',array_keys($inPages,$key)) === ''
|
||||
? template::button('moduleExport' . $key, [
|
||||
'href' => helper::baseUrl(). $this->getUrl(0) . '/import/' . $key . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre
|
||||
'value' => template::ico('upload')
|
||||
])
|
||||
: ''
|
||||
];
|
||||
}
|
||||
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => 'Gestion des modules',
|
||||
'view' => 'index'
|
||||
]);
|
||||
}
|
||||
|
||||
/*
|
||||
* Export des données d'un module externes ou interne à module.json
|
||||
*/
|
||||
public function export(){
|
||||
// Jeton incorrect
|
||||
if ($this->getUrl(3) !== $_SESSION['csrf']) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'addon',
|
||||
'state' => false,
|
||||
'notification' => 'Action non autorisée'
|
||||
]);
|
||||
}
|
||||
else {
|
||||
// Lire les données du module
|
||||
$infoModules = helper::getModules();
|
||||
// Créer un dossier par défaut
|
||||
$tmpFolder = self::TEMP_DIR . uniqid();
|
||||
//$tmpFolder = self::TEMP_DIR . 'test';
|
||||
if (!is_dir($tmpFolder)) {
|
||||
mkdir($tmpFolder, 0755);
|
||||
}
|
||||
// Clés moduleIds dans les pages
|
||||
$inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC');
|
||||
// Parcourir les pages utilisant le module
|
||||
foreach (array_keys($inPages,$this->getUrl(2)) as $pageId) {
|
||||
// Export des pages hébergeant le module
|
||||
$pageParam[$pageId] = $this->getData(['page',$pageId]);
|
||||
// Export du contenu de la page
|
||||
//$pageContent[$pageId] = file_get_contents(self::DATA_DIR . self::$i18n . '/content/' . $this->getData(['page', $pageId, 'content']));
|
||||
$pageContent[$pageId] = $this->getPage($pageId, self::$i18n);
|
||||
// Export de fr/module.json
|
||||
$moduleId = 'fr/module.json';
|
||||
$moduleDir = str_replace('site/data/','',$infoModules[$this->getUrl(2)]['dataDirectory']);
|
||||
// Création de l'arborescence des langues
|
||||
// Pas de nom dossier de langue - dossier par défaut
|
||||
$t = explode ('/',$moduleId);
|
||||
if ( is_array($t)) {
|
||||
$lang = 'fr';
|
||||
} else {
|
||||
$lang = $t[0];
|
||||
}
|
||||
// Créer le dossier temporaire si inexistant sinon le nettoie et le créer
|
||||
if (!is_dir($tmpFolder . '/' . $lang)) {
|
||||
mkdir ($tmpFolder . '/' . $lang, 0755, true);
|
||||
} else {
|
||||
$this->removeDir($tmpFolder . '/' . $lang);
|
||||
mkdir ($tmpFolder . '/' . $lang, 0755, true);
|
||||
}
|
||||
// Créer le dossier temporaire des données du module
|
||||
if ($infoModules[$this->getUrl(2)]['dataDirectory']) {
|
||||
if (!is_dir($tmpFolder . '/' . $moduleDir)) {
|
||||
mkdir ($tmpFolder . '/' . $moduleDir, 0755, true) ;
|
||||
}
|
||||
}
|
||||
// Sauvegarde si données non vides
|
||||
$tmpData [$pageId] = $this->getData(['module',$pageId ]);
|
||||
if ($tmpData [$pageId] !== null) {
|
||||
file_put_contents($tmpFolder . '/' . $moduleId, json_encode($tmpData));
|
||||
}
|
||||
// Export des données localisées dans le dossier de données du module
|
||||
if ($infoModules[$this->getUrl(2)]['dataDirectory'] &&
|
||||
is_dir($infoModules[$this->getUrl(2)]['dataDirectory'])) {
|
||||
$this->copyDir ($infoModules[$this->getUrl(2)]['dataDirectory'], $tmpFolder . '/' . $moduleDir);
|
||||
}
|
||||
}
|
||||
// Enregistrement des pages dans le dossier de langue identique à module
|
||||
if (!file_exists($tmpFolder . '/' . $lang . '/page.json')) {
|
||||
file_put_contents($tmpFolder . '/' . $lang . '/page.json', json_encode($pageParam));
|
||||
mkdir ($tmpFolder . '/' . $lang . '/content', 0755);
|
||||
file_put_contents($tmpFolder . '/' . $lang . '/content/' . $this->getData(['page', $pageId, 'content']), $pageContent);
|
||||
}
|
||||
// création du zip
|
||||
$fileName = $this->getUrl(2) . '.zip';
|
||||
$this->makeZip ($fileName, $tmpFolder, []);
|
||||
if (file_exists($fileName)) {
|
||||
ob_start();
|
||||
header('Content-Type: application/octet-stream');
|
||||
header('Content-Disposition: attachment; filename="' . $fileName . '"');
|
||||
header('Content-Length: ' . filesize($fileName));
|
||||
ob_clean();
|
||||
ob_end_flush();
|
||||
readfile( $fileName);
|
||||
unlink($fileName);
|
||||
$this->removeDir($tmpFolder);
|
||||
exit();
|
||||
} else {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'addon',
|
||||
'notification' => 'Quelque chose s\'est mal passé',
|
||||
'state' => false
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Importer des données d'un module externes ou interne à module.json
|
||||
*/
|
||||
public function import(){
|
||||
// Jeton incorrect
|
||||
if ($this->getUrl(3) !== $_SESSION['csrf']) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'addon',
|
||||
'state' => false,
|
||||
'notification' => 'Action non autorisée'
|
||||
]);
|
||||
}
|
||||
else {
|
||||
// Soumission du formulaire
|
||||
if($this->isPost()) {
|
||||
// Récupérer le fichier et le décompacter
|
||||
$zipFilename = $this->getInput('addonImportFile', helper::FILTER_STRING_SHORT, true);
|
||||
$tempFolder = uniqid();
|
||||
mkdir (self::TEMP_DIR . $tempFolder, 0755);
|
||||
$zip = new ZipArchive();
|
||||
if ($zip->open(self::FILE_DIR . 'source/' . $zipFilename) === TRUE) {
|
||||
$zip->extractTo(self::TEMP_DIR . $tempFolder );
|
||||
}
|
||||
// Import des données localisées page.json et module.json
|
||||
// Pour chaque dossier localisé
|
||||
$dataTarget = array();
|
||||
$dataSource = array();
|
||||
// Liste des pages de même nom dans l'archive et le site
|
||||
$list = '';
|
||||
foreach (self::$i18nList as $key=>$value) {
|
||||
// Les Pages et les modules
|
||||
foreach (['page','module'] as $fileTarget){
|
||||
if (file_exists(self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json')) {
|
||||
// Le dossier de langue existe
|
||||
// faire la fusion
|
||||
$dataSource = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json'), true);
|
||||
// Des pages de même nom que celles de l'archive existent
|
||||
if( $fileTarget === 'page' ){
|
||||
foreach( $dataSource as $keydataSource=>$valuedataSource ){
|
||||
foreach( $this->getData(['page']) as $keypage=>$valuepage ){
|
||||
if( $keydataSource === $keypage){
|
||||
$list === '' ? $list .= ' '.$this->getData(['page', $keypage, 'title']) : $list .= ', '.$this->getData(['page', $keypage, 'title']);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$dataTarget = json_decode(file_get_contents(self::DATA_DIR . $key . '/' . $fileTarget . '.json'), true);
|
||||
$data [$fileTarget] = array_merge($dataTarget[$fileTarget], $dataSource);
|
||||
if( $list === ''){
|
||||
file_put_contents(self::DATA_DIR . '/' .$key . '/' . $fileTarget . '.json', json_encode( $data ,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT|LOCK_EX) );
|
||||
}
|
||||
// copie du contenu de la page
|
||||
$this->copyDir (self::TEMP_DIR . $tempFolder . '/' .$key . '/content', self::DATA_DIR . '/' .$key . '/content');
|
||||
// Supprimer les fichiers importés
|
||||
unlink (self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Import des fichiers placés ailleurs que dans les dossiers localisés.
|
||||
$this->copyDir (self::TEMP_DIR . $tempFolder,self::DATA_DIR );
|
||||
|
||||
// Supprimer le dossier temporaire
|
||||
$this->removeDir(self::TEMP_DIR . $tempFolder);
|
||||
$zip->close();
|
||||
if( $list !== '' ){
|
||||
$success = false;
|
||||
strpos( $list, ',') === false ? $notification = 'Import impossible la page suivante doit être renommée :'.$list : $notification = 'Import impossible les pages suivantes doivent être renommées :'.$list;
|
||||
}
|
||||
else{
|
||||
$success = true;
|
||||
$notification = 'Import réussi';
|
||||
}
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'addon',
|
||||
'state' => $success,
|
||||
'notification' => $notification
|
||||
]);
|
||||
}
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => 'Importer des données de module',
|
||||
'view' => 'import'
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
31
core/module/addon/view/import/import.php
Normal file
31
core/module/addon/view/import/import.php
Normal file
@ -0,0 +1,31 @@
|
||||
<?php echo template::formOpen('addonImportForm'); ?>
|
||||
<div class="row">
|
||||
<div class="col2">
|
||||
<?php echo template::button('addonImportBack', [
|
||||
'class' => 'buttonGrey',
|
||||
'href' => helper::baseUrl() . 'addon',
|
||||
'ico' => 'left',
|
||||
'value' => 'Retour'
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col2 offset8">
|
||||
<?php echo template::submit('addonImportSubmit', [
|
||||
'value' => 'Appliquer'
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col12">
|
||||
<div class="block">
|
||||
<h4>Installer des données de module</h4>
|
||||
<div class="row">
|
||||
<div class="col6 offset3">
|
||||
<?php echo template::file('addonImportFile', [
|
||||
'label' => 'Archive ZIP :',
|
||||
'type' => 2
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
8
core/module/addon/view/index/index.help.html
Normal file
8
core/module/addon/view/index/index.help.html
Normal file
@ -0,0 +1,8 @@
|
||||
<h3>MODULES INSTALLES</h3>
|
||||
Les modules installés sont listés dans le tableau avec leur nom usuel (alias) et leur numéro de version.
|
||||
Si le module est utilisé le nom de la page ou des pages apparaît, dans le cas contraire une icône permet de le supprimer.
|
||||
<h3>EXPORTER IMPORTER</h3>
|
||||
<p>Exporter produit une archive au nom du module contenant les pages concernées ainsi que les données et ressources utilisées par le module dans ces pages.</p>
|
||||
<p>Vous pouvez vous en servir comme d'une sauvegarde partielle ou pour transférer les pages et les données du module vers un autre site.</p>
|
||||
<p>Une fois le module installé l'import permet de restaurer les pages et les données sauvegardées. Vous devrez avoir au préalable transféré le fichier zip d'un export sur votre serveur par 'Gérer les fichiers'.
|
||||
Si une page de même nom existe sur votre site vous serez invité à modifier son nom.</p>
|
@ -1,6 +1,5 @@
|
||||
/**
|
||||
* This file is part of Zwii.
|
||||
*
|
||||
* For full copyright and license information, please see the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*
|
||||
@ -12,7 +11,12 @@
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
|
||||
|
||||
/** NE PAS EFFACER
|
||||
* admin.css
|
||||
*/
|
||||
/**
|
||||
* Confirmation de suppression
|
||||
*/
|
||||
$(".moduleDelete").on("click", function() {
|
||||
var _this = $(this);
|
||||
return core.confirm("Êtes-vous sûr de vouloir supprimer ce module ?", function() {
|
||||
$(location).attr("href", _this.attr("href"));
|
||||
});
|
||||
});
|
40
core/module/addon/view/index/index.php
Normal file
40
core/module/addon/view/index/index.php
Normal file
@ -0,0 +1,40 @@
|
||||
<div class="row">
|
||||
<div class="col2">
|
||||
<?php echo template::button('configModulesBack', [
|
||||
'class' => 'buttonGrey',
|
||||
'href' => helper::baseUrl(),
|
||||
'ico' => 'left',
|
||||
'value' => 'Retour'
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col2">
|
||||
<?php echo template::button('configModulesHelp', [
|
||||
'href' => 'https://doc.zwiicms.fr/les-modules',
|
||||
'target' => '_blank',
|
||||
'ico' => 'help',
|
||||
'value' => 'Aide',
|
||||
'class' => 'buttonHelp'
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col2 offset4">
|
||||
<?php echo template::button('configModulesStore', [
|
||||
'href' => helper::baseUrl() . 'addon/store',
|
||||
'value' => 'Catalogue en ligne'
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col2">
|
||||
<?php echo template::button('configStoreUpload', [
|
||||
'href' => helper::baseUrl() . 'addon/upload',
|
||||
'value' => 'Installer'
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Aide à propos de la gestion des modules, view index -->
|
||||
<div class="helpDisplayContent">
|
||||
<?php echo file_get_contents( 'core/module/addon/view/index/index.help.html') ;?>
|
||||
</div>
|
||||
<?php if($module::$modInstal): ?>
|
||||
<?php echo template::table([2, 2, 2, 2, 1, 1, 1], $module::$modInstal, ['Module installé', 'Alias', 'Version', 'Page(s)', 'Supprimer', 'Exporter', 'Importer']); ?>
|
||||
<?php else: ?>
|
||||
<?php echo template::speech('Aucun module installé.'); ?>
|
||||
<?php endif; ?>
|
15
core/module/addon/view/store/store.php
Normal file
15
core/module/addon/view/store/store.php
Normal file
@ -0,0 +1,15 @@
|
||||
<div class="row">
|
||||
<div class="col2">
|
||||
<?php echo template::button('configStoreBack', [
|
||||
'class' => 'buttonGrey',
|
||||
'href' => helper::baseUrl() . 'addon/upload',
|
||||
'ico' => 'left',
|
||||
'value' => 'Retour'
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php if($module::$storeList): ?>
|
||||
<?php echo template::table([2, 2, 1, 2, 2, 2, 1], $module::$storeList, ['Catégorie', 'Module', 'Version', 'Date', 'Pages', 'Télécharger ou <br> Mettre à jour']); ?>
|
||||
<?php else: ?>
|
||||
<?php echo template::speech('Le catalogue est vide.'); ?>
|
||||
<?php endif; ?>
|
6
core/module/addon/view/upload/upload.help.html
Normal file
6
core/module/addon/view/upload/upload.help.html
Normal file
@ -0,0 +1,6 @@
|
||||
<h3>INSTALLER OU METTRE A JOUR</h3>
|
||||
<p>Avant de choisir le fichier ZIP du module à installer vous devez le télécharger sur votre serveur en utilisant le 'Catalogue en ligne'.</p>
|
||||
<p>D'autres modules sont également disponibles sur le <a href="https://forum.zwiicms.fr/categories/t%C3%A9l%C3%A9chargements-de-modules" target="_blank" rel="noopener">forum de ZwiiCMS</a>,
|
||||
téléversez les sur votre serveur avec 'Gérer les fichiers'.</p>
|
||||
<p>Lors d'une mise à jour Zwii contrôle la version du module à installer, pour réinstaller un module de même numéro de version vous devez cocher 'Mise à jour forcée'.
|
||||
Il est déconseillé d'installer un module plus ancien.</p>
|
@ -1,27 +1,30 @@
|
||||
<?php echo template::formOpen('configModulesUpload'); ?>
|
||||
<div class="row">
|
||||
<div class="col1">
|
||||
<div class="col2">
|
||||
<?php echo template::button('configModulesBack', [
|
||||
'class' => 'buttonGrey',
|
||||
'href' => helper::baseUrl() . 'plugin',
|
||||
'value' => template::ico('left')
|
||||
'href' => helper::baseUrl() . 'addon',
|
||||
'ico' => 'left',
|
||||
'value' => 'Retour'
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col1">
|
||||
<?php echo template::button('pluginIndexHelp', [
|
||||
'href' => 'https://doc.zwiicms.fr/installation-d-un-module',
|
||||
'target' => '_blank',
|
||||
<div class="col2">
|
||||
<?php echo template::button('addonIndexHelp', [
|
||||
'class' => 'buttonHelp',
|
||||
'value' => template::ico('help'),
|
||||
'help' => 'Consulter l\'aide en ligne'
|
||||
'ico' => 'help',
|
||||
'value' => 'Aide'
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col2 offset8">
|
||||
<div class="col2 offset6">
|
||||
<?php echo template::submit('configModulesSubmit',[
|
||||
'value' => 'Valider',
|
||||
'ico' => 'check'
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Aide à propos de la gestion des modules, view upload -->
|
||||
<div class="helpDisplayContent">
|
||||
<?php echo file_get_contents( 'core/module/addon/view/upload/upload.help.html') ;?>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col12">
|
@ -19,7 +19,6 @@ class config extends common {
|
||||
public static $actions = [
|
||||
'backup' => self::GROUP_ADMIN,
|
||||
'copyBackups'=> self::GROUP_ADMIN,
|
||||
'delBackups'=> self::GROUP_ADMIN,
|
||||
'configMetaImage' => self::GROUP_ADMIN,
|
||||
'generateFiles' => self::GROUP_ADMIN,
|
||||
'index' => self::GROUP_ADMIN,
|
||||
@ -384,15 +383,6 @@ class config extends common {
|
||||
$this->setData(['user',$users]);
|
||||
}
|
||||
}
|
||||
// Conversion vers des Url relatives
|
||||
if ($this->getData(['core', 'baseUrl'])) {
|
||||
$url = str_replace('?','',$this->getData(['core', 'baseUrl']));
|
||||
// Suppresion de la base Url
|
||||
$this->updateBaseUrl($url);
|
||||
// Effacer la baseUrl
|
||||
$this->deleteData(['core', 'baseUrl']);
|
||||
}
|
||||
|
||||
// Message de notification
|
||||
$notification = $success === true ? 'Restaurer effectuée avec succès' : 'Erreur inconnue';
|
||||
$redirect = $this->getInput('configRestoreImportUser', helper::FILTER_BOOLEAN) === true ? helper::baseUrl() . 'config/restore' : helper::baseUrl() . 'user/login/';
|
||||
@ -594,7 +584,7 @@ class config extends common {
|
||||
$this->generateFiles();
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => 'Configuration du site',
|
||||
'title' => 'Configuration',
|
||||
'view' => 'index',
|
||||
'notification' => 'Modifications enregistrées ' ,
|
||||
'state' => true
|
||||
@ -626,7 +616,7 @@ class config extends common {
|
||||
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => 'Configuration du site',
|
||||
'title' => 'Configuration',
|
||||
'view' => 'index'
|
||||
]);
|
||||
}
|
||||
@ -665,8 +655,10 @@ class config extends common {
|
||||
/**
|
||||
* Met à jour les données de site avec l'adresse transmise
|
||||
*/
|
||||
public function updateBaseUrl ($url) {
|
||||
public function updateBaseUrl () {
|
||||
// Supprimer l'information de redirection
|
||||
$old = str_replace('?','',$this->getData(['core', 'baseUrl']));
|
||||
$new = helper::baseUrl(false,false);
|
||||
$c3 = 0;
|
||||
$success = false ;
|
||||
// Boucler sur les pages
|
||||
@ -674,8 +666,8 @@ class config extends common {
|
||||
$content = $this->getPage($parentId, self::$i18n);
|
||||
$titre = $this->getData(['page', $parentId, 'title']);
|
||||
$content = $titre . ' ' . $content ;
|
||||
$replace = str_replace( 'href="' . $url , 'href="'. '' , stripslashes($content),$c1) ;
|
||||
$replace = str_replace( 'src="' . $url , 'src="'. '' , stripslashes($replace),$c2) ;
|
||||
$replace = str_replace( 'href="' . $old , 'href="'. $new , stripslashes($content),$c1) ;
|
||||
$replace = str_replace( 'src="' . $old , 'src="'. $new , stripslashes($replace),$c2) ;
|
||||
|
||||
if ($c1 > 0 || $c2 > 0) {
|
||||
$success = true;
|
||||
@ -685,8 +677,8 @@ class config extends common {
|
||||
foreach($childIds as $childId) {
|
||||
$content = $this->getPage($childId, self::$i18n);
|
||||
$content = $titre . ' ' . $content ;
|
||||
$replace = str_replace( 'href="' . $url , 'href="'. '' , stripslashes($content),$c1) ;
|
||||
$replace = str_replace( 'src="' . $url , 'src="'. '' , stripslashes($replace),$c2) ;
|
||||
$replace = str_replace( 'href="' . $old , 'href="'. $new , stripslashes($content),$c1) ;
|
||||
$replace = str_replace( 'src="' . $old , 'src="'. $new , stripslashes($replace),$c2) ;
|
||||
if ($c1 > 0 || $c2 > 0) {
|
||||
$success = true;
|
||||
$this->setPage($childId, $replace, self::$i18n);
|
||||
@ -696,8 +688,8 @@ class config extends common {
|
||||
}
|
||||
// Traiter les modules dont la redirection
|
||||
$content = $this->getdata(['module']);
|
||||
$replace = $this->recursive_array_replace('href="' . $url , 'href="'. '', $content, $c1);
|
||||
$replace = $this->recursive_array_replace('src="' . $url , 'src="'. '', $replace, $c2);
|
||||
$replace = $this->recursive_array_replace('href="' . $old , 'href="'. $new, $content, $c1);
|
||||
$replace = $this->recursive_array_replace('src="' . $old , 'src="'. $new, $replace, $c2);
|
||||
if ($content !== $replace) {
|
||||
$this->setdata(['module',$replace]);
|
||||
$c3 += $c1 + $c2;
|
||||
@ -726,7 +718,7 @@ class config extends common {
|
||||
file_put_contents(self::DATA_DIR . 'journal.log',$d);
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => 'Configuration du site',
|
||||
'title' => 'Configuration',
|
||||
'view' => 'index',
|
||||
'notification' => 'Journal réinitialisé avec succès',
|
||||
'state' => true
|
||||
@ -734,7 +726,7 @@ class config extends common {
|
||||
} else {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => 'Configuration du site',
|
||||
'title' => 'Configuration',
|
||||
'view' => 'index',
|
||||
'notification' => 'Aucun journal à effacer',
|
||||
'state' => false
|
||||
@ -762,7 +754,7 @@ class config extends common {
|
||||
} else {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => 'Configuration du site',
|
||||
'title' => 'Configuration',
|
||||
'view' => 'index',
|
||||
'notification' => 'Aucun fichier journal à télécharger',
|
||||
'state' => false
|
||||
@ -799,7 +791,7 @@ class config extends common {
|
||||
} else {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => 'Configuration du site',
|
||||
'title' => 'Configuration',
|
||||
'view' => 'index',
|
||||
'notification' => 'Aucune liste noire à télécharger',
|
||||
'state' => false
|
||||
@ -816,7 +808,7 @@ class config extends common {
|
||||
$this->setData(['blacklist',[]]);
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => 'Configuration du site',
|
||||
'title' => 'Configuration',
|
||||
'view' => 'index',
|
||||
'notification' => 'Liste noire réinitialisée avec succès',
|
||||
'state' => true
|
||||
@ -824,7 +816,7 @@ class config extends common {
|
||||
} else {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => 'Configuration du site',
|
||||
'title' => 'Configuration',
|
||||
'view' => 'index',
|
||||
'notification' => 'Pas de liste à effacer',
|
||||
'state' => false
|
||||
@ -843,37 +835,32 @@ class config extends common {
|
||||
$this->copyDir(self::BACKUP_DIR, self::FILE_DIR . 'source/backup' );
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => 'Configuration du site',
|
||||
'title' => 'Configuration',
|
||||
'view' => 'index',
|
||||
'notification' => 'Copie terminée',
|
||||
'state' => true
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Vider le dosser des sauvegardes automatisées
|
||||
* Fonction de parcours des données de module
|
||||
* @param string $find donnée à rechercher
|
||||
* @param string $replace donnée à remplacer
|
||||
* @param array tableau à analyser
|
||||
* @param int count nombres d'occurrences
|
||||
* @return array avec les valeurs remplacées.
|
||||
*/
|
||||
public function delBackups() {
|
||||
$path = realpath(self::BACKUP_DIR);
|
||||
$success = $fail = 0;
|
||||
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename)
|
||||
{
|
||||
if (strpos($filename,'.zip')) {
|
||||
|
||||
$r = unlink($filename);
|
||||
$success = $r === true ? $succes + 1 : $success;
|
||||
$fail = $r === false ? $fail + 1 : $fail;
|
||||
}
|
||||
private function recursive_array_replace ($find, $replace, $array, &$count) {
|
||||
if (!is_array($array)) {
|
||||
return str_replace($find, $replace, $array, $count);
|
||||
}
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => 'Configuration du site',
|
||||
'view' => 'index',
|
||||
'notification' => 'Suppression terminée :<br />' . $success . ' fichiers effacé(s) <br />' . $fail . ' échec(s)',
|
||||
'state' => true
|
||||
]);
|
||||
|
||||
$newArray = [];
|
||||
foreach ($array as $key => $value) {
|
||||
$newArray[$key] = $this->recursive_array_replace($find, $replace, $value,$c);
|
||||
$count += $c;
|
||||
}
|
||||
return $newArray;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -1,13 +1,14 @@
|
||||
<?php echo template::formOpen('configBackupForm'); ?>
|
||||
<div class="row">
|
||||
<div class="col1">
|
||||
<div class="col2">
|
||||
<?php echo template::button('configBackupBack', [
|
||||
'class' => 'buttonGrey',
|
||||
'href' => helper::baseUrl() . 'config',
|
||||
'value' => template::ico('left')
|
||||
'ico' => 'left',
|
||||
'value' => 'Retour'
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col2 offset9">
|
||||
<div class="col2 offset8">
|
||||
<?php echo template::submit('configBackupSubmit',[
|
||||
'value' => 'Sauvegarder',
|
||||
'uniqueSubmission' => true
|
||||
|
@ -10,17 +10,7 @@
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
|
||||
$(document).ready(function () {
|
||||
|
||||
/**
|
||||
* Confirmation de suppression
|
||||
*/
|