forked from ZwiiCMS-Team/ZwiiCMS
Gestion des modules Ok avec langues
This commit is contained in:
parent
5ad0bed230
commit
3cc035d37c
@ -9,9 +9,9 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
|
* @copyright Copyright (C) 2020-2021, Sylvain Lelièvre
|
||||||
* @copyright Copyright (C) 2018-2022, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2022, Frédéric Tempez
|
||||||
* @author Sylvain Lelièvre <lelievresylvain@free.fr>
|
* @author Sylvain Lelièvre <lelievresylvain@free.fr>
|
||||||
* @copyright Copyright (C) 2020-2021, Sylvain Lelièvre
|
|
||||||
* @license GNU General Public License, version 3
|
* @license GNU General Public License, version 3
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
@ -21,7 +21,7 @@ class plugin extends common {
|
|||||||
public static $actions = [
|
public static $actions = [
|
||||||
'index' => self::GROUP_ADMIN,
|
'index' => self::GROUP_ADMIN,
|
||||||
'delete' => self::GROUP_ADMIN,
|
'delete' => self::GROUP_ADMIN,
|
||||||
'dataExport' => self::GROUP_ADMIN,
|
'dataExport' => self::GROUP_ADMIN, // Fonction muette d'exportation
|
||||||
'dataImport' => self::GROUP_ADMIN, // les données d'un module
|
'dataImport' => self::GROUP_ADMIN, // les données d'un module
|
||||||
'store' => self::GROUP_ADMIN,
|
'store' => self::GROUP_ADMIN,
|
||||||
'item' => self::GROUP_ADMIN, // détail d'un objet
|
'item' => self::GROUP_ADMIN, // détail d'un objet
|
||||||
@ -35,6 +35,7 @@ class plugin extends common {
|
|||||||
|
|
||||||
// Gestion des modules
|
// Gestion des modules
|
||||||
public static $modInstal = [];
|
public static $modInstal = [];
|
||||||
|
public static $modOrphans = [];
|
||||||
|
|
||||||
// pour tests
|
// pour tests
|
||||||
public static $valeur = [];
|
public static $valeur = [];
|
||||||
@ -82,6 +83,7 @@ class plugin extends common {
|
|||||||
$success = false;
|
$success = false;
|
||||||
$notification = 'La suppression a échouée';
|
$notification = 'La suppression a échouée';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl() . 'plugin',
|
'redirect' => helper::baseUrl() . 'plugin',
|
||||||
@ -298,7 +300,7 @@ class plugin extends common {
|
|||||||
// Clés moduleIds dans les pages
|
// Clés moduleIds dans les pages
|
||||||
$inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC');
|
$inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC');
|
||||||
foreach( $inPages as $key=>$value){
|
foreach( $inPages as $key=>$value){
|
||||||
$inPagesTitle[ $this->getData(['page', $key, 'title' ]) ] = $value;
|
$pagesInfos[ $this->getData(['page', $key, 'title' ]) ] = $value;
|
||||||
}
|
}
|
||||||
// Parcourir les données des modules
|
// Parcourir les données des modules
|
||||||
foreach ($store as $key=>$value) {
|
foreach ($store as $key=>$value) {
|
||||||
@ -325,7 +327,7 @@ class plugin extends common {
|
|||||||
mb_detect_encoding(strftime('%d %B %Y', $store[$key]['versionDate']), 'UTF-8', true)
|
mb_detect_encoding(strftime('%d %B %Y', $store[$key]['versionDate']), 'UTF-8', true)
|
||||||
? strftime('%d %B %Y', $store[$key]['versionDate'])
|
? strftime('%d %B %Y', $store[$key]['versionDate'])
|
||||||
: utf8_encode(strftime('%d %B %Y', $store[$key]['versionDate'])),
|
: utf8_encode(strftime('%d %B %Y', $store[$key]['versionDate'])),
|
||||||
implode(', ', array_keys($inPagesTitle,$key)),
|
implode(', ', array_keys($pagesInfos,$key)),
|
||||||
template::button('moduleExport' . $key, [
|
template::button('moduleExport' . $key, [
|
||||||
'class' => $class,
|
'class' => $class,
|
||||||
'href' => helper::baseUrl(). $this->getUrl(0) . '/uploadItem/' . $key.'/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre
|
'href' => helper::baseUrl(). $this->getUrl(0) . '/uploadItem/' . $key.'/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre
|
||||||
@ -368,131 +370,137 @@ class plugin extends common {
|
|||||||
// $infoModules[nom_module]['realName'], ['version'], ['update'], ['delete'], ['dataDirectory']
|
// $infoModules[nom_module]['realName'], ['version'], ['update'], ['delete'], ['dataDirectory']
|
||||||
$infoModules = helper::getModules();
|
$infoModules = helper::getModules();
|
||||||
|
|
||||||
// Clés moduleIds dans les pages
|
// Tableau des langues installées
|
||||||
$inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC');
|
foreach (self::$i18nList as $key => $value) {
|
||||||
foreach( $inPages as $key=>$value){
|
if ($this->getData(['config','i18n', $key]) === 'site' ||
|
||||||
$inPagesTitle[ $this->getData(['page', $key, 'title' ]) ] = $value;
|
$key === 'fr') {
|
||||||
|
$i18nSites[$key] = $value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parcourir les données des modules
|
// Langue actuelle
|
||||||
|
$savei18n = self::$i18n;
|
||||||
|
// Parcourir les langues du site traduit
|
||||||
|
foreach ($i18nSites as $keyI18n=>$vaueI18n) {
|
||||||
|
self::$i18n = $keyI18n;
|
||||||
|
// Clés moduleIds dans les pages de la langue sélectionnée
|
||||||
|
$pagesModules = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC');
|
||||||
|
// Générer ls liste des pages avec module pour la sauvegarde ou le backup
|
||||||
|
foreach( $pagesModules as $key=>$value ) {
|
||||||
|
if (!empty($value)) {
|
||||||
|
$pagesInfos [self::$i18n] [$key] ['pageId'] = $key ;
|
||||||
|
$pagesInfos [self::$i18n] [$key] ['title'] = $this->getData(['page', $key, 'title' ]) ;
|
||||||
|
$pagesInfos [self::$i18n] [$key] ['moduleId'] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Restaurer la langue actuelle
|
||||||
|
self::$i18n = $savei18n;
|
||||||
|
|
||||||
|
//var_dump($pagesModules);
|
||||||
|
//var_dump($pagesInfos);
|
||||||
|
|
||||||
|
// Générer la liste des modules orphelins
|
||||||
foreach ($infoModules as $key=>$value) {
|
foreach ($infoModules as $key=>$value) {
|
||||||
|
if (!array_search($key, $pagesModules) ) {
|
||||||
|
$orphans[] = $key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Mise ene forme du tableau des modules orphelins
|
||||||
|
if (isset($orphans)) {
|
||||||
|
foreach ($orphans as $key) {
|
||||||
// Construire le tableau de sortie
|
// Construire le tableau de sortie
|
||||||
self::$modInstal[] = [
|
self::$modOrphans [] = [
|
||||||
|
$infoModules [$key] ['realName'],
|
||||||
$key,
|
$key,
|
||||||
$infoModules[$key]['realName'],
|
$infoModules [$key] ['version'],
|
||||||
$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)) === ''
|
'',
|
||||||
|
$infoModules[$key] ['delete'] === true
|
||||||
? template::button('moduleDelete' . $key, [
|
? template::button('moduleDelete' . $key, [
|
||||||
'class' => 'moduleDelete buttonRed',
|
'class' => 'moduleDelete buttonRed',
|
||||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $key . '/' . $_SESSION['csrf'],
|
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' .$key . '/' . $_SESSION['csrf'],
|
||||||
'value' => template::ico('cancel'),
|
'value' => template::ico('cancel'),
|
||||||
'help' => 'Supprimer le module '. $key
|
'help' => 'Supprimer le module'
|
||||||
])
|
])
|
||||||
: '',
|
: '',
|
||||||
implode(', ',array_keys($inPages,$key)) !== ''
|
|
||||||
? template::button('moduleExport' . $key, [
|
];
|
||||||
'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $key . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parcourir les langues du site traduit
|
||||||
|
foreach ($pagesInfos as $keyI18n=>$valueI18n) {
|
||||||
|
// Modules affectés à des pages
|
||||||
|
|
||||||
|
foreach ($valueI18n as $keyPage=>$value) {
|
||||||
|
|
||||||
|
// Construire le tableau de sortie
|
||||||
|
self::$modInstal[] = [
|
||||||
|
$infoModules[$pagesInfos[$keyI18n][$keyPage]['moduleId']] ['realName'],
|
||||||
|
$pagesInfos[$keyI18n][$keyPage]['moduleId'],
|
||||||
|
$infoModules[$pagesInfos [$keyI18n][$keyPage]['moduleId']] ['version'],
|
||||||
|
template::flag($keyI18n, '20px'),
|
||||||
|
$pagesInfos [$keyI18n][$keyPage]['title'] . ' (' .$keyPage . ')',
|
||||||
|
template::button('moduleExport' . $keyPage, [
|
||||||
|
'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $keyI18n . '/' . $pagesInfos[$keyI18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre
|
||||||
'value' => template::ico('download'),
|
'value' => template::ico('download'),
|
||||||
'help' => 'Exporter les données du module'
|
'help' => 'Exporter les données du module'
|
||||||
])
|
]),
|
||||||
: '',
|
template::button('moduleImport' . $keyPage, [
|
||||||
implode(', ',array_keys($inPages,$key)) === ''
|
'href' => helper::baseUrl(). $this->getUrl(0) . '/import/' . $keyI18n . '/' . $pagesInfos[$keyI18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre
|
||||||
? 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'),
|
'value' => template::ico('upload'),
|
||||||
'help' => 'Importer les données du module'
|
'help' => 'Importer les données du module'
|
||||||
])
|
])
|
||||||
: ''
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'title' => 'Gestion des modules',
|
'title' => 'Gestion des modules installés',
|
||||||
'view' => 'index'
|
'view' => 'index'
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Export des données d'un module externes ou interne à module.json
|
* Export des données d'un module
|
||||||
*/
|
*/
|
||||||
public function dataExport(){
|
public function dataExport() {
|
||||||
// Jeton incorrect
|
// Jeton incorrect
|
||||||
if ($this->getUrl(3) !== $_SESSION['csrf']) {
|
if ($this->getUrl(4) !== $_SESSION['csrf']) {
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl() . 'plugin',
|
'redirect' => helper::baseUrl() . 'plugin',
|
||||||
'state' => false,
|
'state' => false,
|
||||||
'notification' => 'Action non autorisée'
|
'notification' => 'Action non autorisée'
|
||||||
]);
|
]);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
// Soumission du formulaire
|
|
||||||
if($this->isPost()) {
|
|
||||||
// Lire les données du module
|
|
||||||
$infoModules = helper::getModules();
|
|
||||||
// Créer un dossier par défaut
|
// Créer un dossier par défaut
|
||||||
$tmpFolder = self::TEMP_DIR . uniqid();
|
$tmpFolder = self::TEMP_DIR . uniqid();
|
||||||
//$tmpFolder = self::TEMP_DIR . 'test';
|
|
||||||
if (!is_dir($tmpFolder)) {
|
if (!is_dir($tmpFolder)) {
|
||||||
mkdir($tmpFolder, 0755);
|
mkdir($tmpFolder, 0755);
|
||||||
}
|
}
|
||||||
$page = $this->getInput('pluginExportSelectPage');
|
|
||||||
|
|
||||||
// Clés moduleIds dans les pages
|
// Copie des infos sur le module
|
||||||
$inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC');
|
$moduleData = $this->getData(['module', $this->getUrl(3) ]);
|
||||||
// Parcourir les pages utilisant le module
|
$success = file_put_contents ($tmpFolder . '/module.json', json_encode($moduleData));
|
||||||
foreach (array_keys($inPages,$this->getUrl(2)) as $pageId) {
|
|
||||||
// Export des pages hébergeant le module
|
// Le dossier du module s'il existe
|
||||||
$pageParam[$pageId] = $this->getData(['page',$pageId]);
|
if (is_dir(self::DATA_DIR . $this->getUrl(2) . '/' . $this->getUrl(3) ) ) {
|
||||||
// Export du contenu de la page
|
// Copier le dossier des données
|
||||||
//$pageContent[$pageId] = file_get_contents(self::DATA_DIR . self::$i18n . '/content/' . $this->getData(['page', $pageId, 'content']));
|
$success = $this->copyDir(self::DATA_DIR . $this->getUrl(2) . '/' . $this->getUrl(3), $tmpFolder . '/' . self::DATA_DIR . $this->getUrl(2) . '/' . $this->getUrl(3));
|
||||||
$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
|
// création du zip
|
||||||
$fileName = $this->getUrl(2) . '.zip';
|
if ($success)
|
||||||
|
{
|
||||||
|
$fileName = $this->getUrl(2) . '-' . $this->getUrl(3) . '.zip';
|
||||||
$this->makeZip ($fileName, $tmpFolder, []);
|
$this->makeZip ($fileName, $tmpFolder, []);
|
||||||
if (file_exists($fileName)) {
|
if (file_exists($fileName)) {
|
||||||
ob_start();
|
ob_start();
|
||||||
@ -505,6 +513,7 @@ class plugin extends common {
|
|||||||
unlink($fileName);
|
unlink($fileName);
|
||||||
$this->removeDir($tmpFolder);
|
$this->removeDir($tmpFolder);
|
||||||
exit();
|
exit();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
@ -513,21 +522,6 @@ class plugin extends common {
|
|||||||
'state' => false
|
'state' => false
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
|
|
||||||
// Liste des pages contenant le module
|
|
||||||
$inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC');
|
|
||||||
foreach( $inPages as $key=>$value){
|
|
||||||
if ($value === $this->getUrl(2)) {
|
|
||||||
self::$pagesList[] = $key;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Valeurs en sortie
|
|
||||||
$this->addOutput([
|
|
||||||
'title' => 'Export des données de module',
|
|
||||||
'view' => 'dataExport'
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -641,4 +635,5 @@ class plugin extends common {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,18 +0,0 @@
|
|||||||
/**
|
|
||||||
* This file is part of Zwii.
|
|
||||||
*
|
|
||||||
* For full copyright and license information, please see the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*
|
|
||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
|
||||||
* @copyright Copyright (C) 2018-2022, Frédéric Tempez
|
|
||||||
* @license GNU General Public License, version 3
|
|
||||||
* @link http://zwiicms.fr/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** NE PAS EFFACER
|
|
||||||
* admin.css
|
|
||||||
*/
|
|
@ -1,30 +0,0 @@
|
|||||||
<?php echo template::formOpen('pluginImportForm'); ?>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col1">
|
|
||||||
<?php echo template::button('pluginImportBack', [
|
|
||||||
'class' => 'buttonGrey',
|
|
||||||
'href' => helper::baseUrl() . 'plugin',
|
|
||||||
'value' => template::ico('left')
|
|
||||||
]); ?>
|
|
||||||
</div>
|
|
||||||
<div class="col2 offset9">
|
|
||||||
<?php echo template::submit('pluginImportSubmit', [
|
|
||||||
'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::select('pluginExportSelectPage', $module::$pagesList , [
|
|
||||||
'label' => 'Export depuis la page ' . template::flag('site', '20px'),
|
|
||||||
'help' => 'Pour exporter les données de module d\'une autre langue traduite, sélectionnez-la puis revenez sur cet écran'
|
|
||||||
]); ?>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
@ -29,9 +29,14 @@
|
|||||||
"help" => 'Ajouter à partir d\'une archive ZIP'
|
"help" => 'Ajouter à partir d\'une archive ZIP'
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div
|
||||||
|
<?php if($module::$modOrphans): ?>>
|
||||||
|
<h3>Modules non utilisés : </h3>
|
||||||
|
<?php echo template::table([2, 2, 1, 2, 2, 1, 1, 1], $module::$modOrphans, [ 'Module', 'moduleId', 'Version', '', '', '', '', 'Supprimer']); ?>
|
||||||
|
<?php endif; ?>
|
||||||
<?php if($module::$modInstal): ?>
|
<?php if($module::$modInstal): ?>
|
||||||
<?php echo template::table([2, 2, 2, 2, 1, 1, 1], $module::$modInstal, ['Module installé', 'Alias', 'Version', 'Page(s)', 'Supprimer', '', '']); ?>
|
<h3>Modules utilisés : </h3>
|
||||||
|
<?php echo template::table([2, 2, 1, 1, 4, 1, 1], $module::$modInstal, [ 'Module', 'moduleId', 'Version', 'Langue', 'Page (id)', '', '']); ?>
|
||||||
<?php else: ?>
|
<?php else: ?>
|
||||||
<?php echo template::speech('Aucun module installé.'); ?>
|
<?php echo template::speech('Aucun module installé.'); ?>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
1
truc
Normal file
1
truc
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"config":{"previewLength":"100","resultHideContent":"","placeHolder":"Un ou plusieurs mots-cl\u00e9s s\u00e9par\u00e9s par un espace ou par +","submitText":"Rechercher","versionData":"2.2"},"theme":{"keywordColor":"rgba(229, 229, 1, 1)","style":"site\/data\/search\/recherche\/theme.css"}}
|
Loading…
Reference in New Issue
Block a user