Skip to content
Snippets Groups Projects
Commit b0625c41 authored by Sofiane Lasri's avatar Sofiane Lasri
Browse files

Gestion des modules

parent a4adf7cf
Branches
Tags
No related merge requests found
Showing
with 380 additions and 212 deletions
...@@ -36,6 +36,50 @@ if (isset($_GET["getNotifications"])) { ...@@ -36,6 +36,50 @@ if (isset($_GET["getNotifications"])) {
} }
echo json_encode($response); echo json_encode($response);
*/ */
} elseif (isset($_GET["checkModulesAliases"])&&!empty($_GET["checkModulesAliases"])){
$aliases = json_decode($_GET["checkModulesAliases"],true);
$aliasesAlreadyUsed = array();
if(isset($aliases['adminAccess'])){
$response = $bdd->prepare("SELECT * FROM `vbcms-activatedExtensions` WHERE adminAccess=?");
$response->execute([$aliases['adminAccess']]);
if(!empty($response->fetch())) $aliasesAlreadyUsed['adminAccess'] = true;
else $aliasesAlreadyUsed['adminAccess'] = false;
}
if(isset($aliases['clientAccess'])){
$response = $bdd->prepare("SELECT * FROM `vbcms-activatedExtensions` WHERE clientAccess=?");
$response->execute([$aliases['clientAccess']]);
if(!empty($response->fetch())) $aliasesAlreadyUsed['clientAccess'] = true;
else $aliasesAlreadyUsed['clientAccess'] = false;
}
echo json_encode($aliasesAlreadyUsed);
} elseif (isset($_GET["enableExtension"])&&!empty($_GET["enableExtension"])){
$extensionToEnable = json_decode($_GET["enableExtension"],true);
// On va scanner le dossier des extensions pour les afficher dans la page
$extensionsFolder = $GLOBALS['vbcmsRootPath'].'/vbcms-content/extensions/';
$extensionsFolderContent = scandir($extensionsFolder);
foreach ($extensionsFolderContent as $extensionFolder){
if(!in_array($extensionFolder,[".", ".."]) && is_dir($extensionsFolder.$extensionFolder)){ // Ici on check qu'il s'agisse bien d'un dossier
if(file_exists($extensionsFolder.$extensionFolder.'/extensionInfos.json')){
unset($extensionInfos);
$extensionInfos = json_decode(file_get_contents($extensionsFolder.$extensionFolder.'/extensionInfos.json'),true);
if($extensionInfos["name"]==$extensionToEnable["name"]){
$extensionInfos["path"] = $extensionFolder;
break;
}
}
}
}
// Maintenant on va créer l'instance de l'extension et l'activer
if($extensionInfos["type"]=="module"){
$calledmodule = new VBcms\module($extensionInfos["name"]);
$calledmodule->initModule($extensionInfos["name"], $extensionInfos["path"], $extensionInfos["adminAccess"], $extensionInfos["clientAccess"], $extensionInfos["compatible"], $extensionInfos["workshopId"]);
}
} elseif(isset($_GET)&&!empty($_GET)){
echo "Commande \"".array_key_first($_GET)."(".$_GET[array_key_first($_GET)].")\" non reconnue.";
} else {?> } else {?>
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
...@@ -53,7 +97,7 @@ if (isset($_GET["getNotifications"])) { ...@@ -53,7 +97,7 @@ if (isset($_GET["getNotifications"])) {
<div class="page-content" leftSidebar="240" rightSidebar="0"> <div class="page-content" leftSidebar="240" rightSidebar="0">
<div class="d-flex flex-column"> <div class="d-flex flex-column">
<div class="align-self-center text-center"> <div class="align-self-center text-center">
<img src="https://cdn.vbcms.net/images/vbcms-logo/raccoon-512x.png"> <img src="<?=$websiteUrl?>vbcms-admin/images/vbcms-logo/raccoon-512x.png">
<h1 class="mt-5">Tâches de fond</h1> <h1 class="mt-5">Tâches de fond</h1>
<p>Cette page n'est pas accessible en tant que telle. Seuls les addons peuvent communiquer avec. :D</p> <p>Cette page n'est pas accessible en tant que telle. Seuls les addons peuvent communiquer avec. :D</p>
</div> </div>
......
...@@ -36,6 +36,9 @@ body { ...@@ -36,6 +36,9 @@ body {
font-family: 'Inter', sans-serif; font-family: 'Inter', sans-serif;
} }
.bg-brown{
background-color: var(--mainBrown);
}
.text-brown { .text-brown {
color: var(--mainBrown)!important; color: var(--mainBrown)!important;
} }
...@@ -198,3 +201,6 @@ body { ...@@ -198,3 +201,6 @@ body {
.table tbody tr:hover{ .table tbody tr:hover{
background-color: #dadada; background-color: #dadada;
} }
.modal-header{
padding: .5rem 1rem;
}
\ No newline at end of file
...@@ -533,6 +533,7 @@ header .menu-item{ ...@@ -533,6 +533,7 @@ header .menu-item{
background-size: cover !important; background-size: cover !important;
} }
.js-snackbar-container{ .js-snackbar-container{
position: fixed !important;
max-width: calc(100% - 240px) !important; max-width: calc(100% - 240px) !important;
} }
......
...@@ -31,13 +31,6 @@ function resizePageContent(width,side){ ...@@ -31,13 +31,6 @@ function resizePageContent(width,side){
} }
} }
function download(filePath){
var link=document.createElement('a');
link.href = filePath;
link.target = "_blank";
link.download;
link.click();
}
function getDateTime() { function getDateTime() {
var now = new Date(); var now = new Date();
...@@ -66,127 +59,17 @@ function getDateTime() { ...@@ -66,127 +59,17 @@ function getDateTime() {
return dateTime; return dateTime;
} }
// VENDORS function b64DecodeUnicode(str) {
/* // Going backwards: from bytestream, to percent-encoding, to original string.
//download.js v3.0, by dandavis; 2008-2014. [CCBY2] see http://danml.com/download.html for tests/usage return decodeURIComponent(atob(str).split('').map(function(c) {
function download(data, strFileName, strMimeType) { return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
var self = window, // this script is only for browsers anyway...
u = "application/octet-stream", // this default mime also triggers iframe downloads
m = strMimeType || u,
x = data,
D = document,
a = D.createElement("a"),
z = function(a){return String(a);},
B = self.Blob || self.MozBlob || self.WebKitBlob || z,
BB = self.MSBlobBuilder || self.WebKitBlobBuilder || self.BlobBuilder,
fn = strFileName || "download",
blob,
b,
ua,
fr;
//if(typeof B.bind === 'function' ){ B=B.bind(self); }
if(String(this)==="true"){ //reverse arguments, allowing download.bind(true, "text/xml", "export.xml") to act as a callback
x=[x, m];
m=x[0];
x=x[1];
} }
function isJson(str) {
//go ahead and download dataURLs right away
if(String(x).match(/^data\:[\w+\-]+\/[\w+\-]+[,;]/)){
return navigator.msSaveBlob ? // IE10 can't do a[download], only Blobs:
navigator.msSaveBlob(d2b(x), fn) :
saver(x) ; // everyone else can save dataURLs un-processed
}//end if dataURL passed?
try { try {
JSON.parse(str);
blob = x instanceof B ? } catch (e) {
x : return false;
new B([x], {type: m}) ;
}catch(y){
if(BB){
b = new BB();
b.append([x]);
blob = b.getBlob(m); // the blob
}
}
function d2b(u) {
var p= u.split(/[:;,]/),
t= p[1],
dec= p[2] == "base64" ? atob : decodeURIComponent,
bin= dec(p.pop()),
mx= bin.length,
i= 0,
uia= new Uint8Array(mx);
for(i;i<mx;++i) uia[i]= bin.charCodeAt(i);
return new B([uia], {type: t});
} }
function saver(url, winMode){
if ('download' in a) { //html5 A[download]
a.href = url;
a.setAttribute("download", fn);
a.innerHTML = "downloading...";
D.body.appendChild(a);
setTimeout(function() {
a.click();
D.body.removeChild(a);
if(winMode===true){setTimeout(function(){ self.URL.revokeObjectURL(a.href);}, 250 );}
}, 66);
return true; return true;
} }
\ No newline at end of file
//do iframe dataURL download (old ch+FF):
var f = D.createElement("iframe");
D.body.appendChild(f);
if(!winMode){ // force a mime that will download:
url="data:"+url.replace(/^data:([\w\/\-\+]+)/, u);
}
f.src = url;
setTimeout(function(){ D.body.removeChild(f); }, 333);
}//end saver
if (navigator.msSaveBlob) { // IE10+ : (has Blob, but not a[download] or URL)
return navigator.msSaveBlob(blob, fn);
}
if(self.URL){ // simple fast and modern way using Blob and URL:
saver(self.URL.createObjectURL(blob), true);
}else{
// handle non-Blob()+non-URL browsers:
if(typeof blob === "string" || blob.constructor===z ){
try{
return saver( "data:" + m + ";base64," + self.btoa(blob) );
}catch(y){
return saver( "data:" + m + "," + encodeURIComponent(blob) );
}
}
// Blob but not URL:
fr=new FileReader();
fr.onload=function(e){
saver(this.result);
};
fr.readAsDataURL(blob);
}
return true;
} */ /* end download() */
\ No newline at end of file
...@@ -2,6 +2,12 @@ ...@@ -2,6 +2,12 @@
// On va récupérer la liste des extensions activées pour la comparer à la liste d'extension installées // On va récupérer la liste des extensions activées pour la comparer à la liste d'extension installées
$activatedExtensions = $bdd->query("SELECT * FROM `vbcms-activatedExtensions`")->fetchAll(PDO::FETCH_ASSOC); $activatedExtensions = $bdd->query("SELECT * FROM `vbcms-activatedExtensions`")->fetchAll(PDO::FETCH_ASSOC);
$activatedExtensionsNames = array();
foreach($activatedExtensions as $activatedExtension){
array_push($activatedExtensionsNames, $activatedExtension['name']);
}
$requiredModulesNames = array();
// On va scanner le dossier des extensions pour les afficher dans la page // On va scanner le dossier des extensions pour les afficher dans la page
$extensionsFolder = $GLOBALS['vbcmsRootPath'].'/vbcms-content/extensions/'; $extensionsFolder = $GLOBALS['vbcmsRootPath'].'/vbcms-content/extensions/';
$extensionsFolderContent = scandir($extensionsFolder); $extensionsFolderContent = scandir($extensionsFolder);
...@@ -12,19 +18,21 @@ foreach ($extensionsFolderContent as $extensionFolder){ ...@@ -12,19 +18,21 @@ foreach ($extensionsFolderContent as $extensionFolder){
if(file_exists($extensionsFolder.$extensionFolder.'/extensionInfos.json')){ if(file_exists($extensionsFolder.$extensionFolder.'/extensionInfos.json')){
$extensionInfos = json_decode(file_get_contents($extensionsFolder.$extensionFolder.'/extensionInfos.json'),true); $extensionInfos = json_decode(file_get_contents($extensionsFolder.$extensionFolder.'/extensionInfos.json'),true);
foreach($extensionInfos as $extensionInfoKey => $extensionInfoValue){ foreach($extensionInfos as $extensionInfoKey => $extensionInfoValue){
$extensionsList[$extensionInfos['type'].'s'][$extensionListIndex][$extensionInfoKey] = $extensionInfoValue; $extensionsList[$extensionInfos['type']][$extensionListIndex][$extensionInfoKey] = $extensionInfoValue;
} }
// On vérifie que l'extension dispose d'une icône // On vérifie que l'extension dispose d'une icône
if(file_exists($extensionsFolder.$extensionFolder.'/extension-logo.jpg')){ if(file_exists($extensionsFolder.$extensionFolder.'/extension-logo.jpg')){
$extensionsList[$extensionInfos['type'].'s'][$extensionListIndex]['extensionLogo'] = $GLOBALS['websiteUrl'].'vbcms-content/extensions/'.$extensionFolder.'/extension-logo.jpg'; $extensionsList[$extensionInfos['type']][$extensionListIndex]['extensionLogo'] = $GLOBALS['websiteUrl'].'vbcms-content/extensions/'.$extensionFolder.'/extension-logo.jpg';
}elseif(file_exists($extensionsFolder.$extensionFolder.'/extension-logo.png')){ }elseif(file_exists($extensionsFolder.$extensionFolder.'/extension-logo.png')){
$extensionsList[$extensionInfos['type'].'s'][$extensionListIndex]['extensionLogo'] = $GLOBALS['websiteUrl'].'vbcms-content/extensions/'.$extensionFolder.'/extension-logo.png'; $extensionsList[$extensionInfos['type']][$extensionListIndex]['extensionLogo'] = $GLOBALS['websiteUrl'].'vbcms-content/extensions/'.$extensionFolder.'/extension-logo.png';
}else{ }else{
$extensionsList[$extensionInfos['type'].'s'][$extensionListIndex]['extensionLogo'] = null; $extensionsList[$extensionInfos['type']][$extensionListIndex]['extensionLogo'] = null;
} }
$extensionsList[$extensionInfos['type'].'s'][$extensionListIndex]['activated'] = false; // Flag pour juste après $extensionsList[$extensionInfos['type']][$extensionListIndex]['activated'] = false; // Flag pour juste après
$extensionsList[$extensionInfos['type'].'s'][$extensionListIndex]['isWsSuscribed'] = false; // Pour le moment on a pas le workshop donc je met false $extensionsList[$extensionInfos['type']][$extensionListIndex]['isWsSuscribed'] = false; // Pour le moment on a pas le workshop donc je met false
$extensionListIndex++;
} }
} }
} }
...@@ -32,15 +40,32 @@ foreach ($extensionsFolderContent as $extensionFolder){ ...@@ -32,15 +40,32 @@ foreach ($extensionsFolderContent as $extensionFolder){
// Maintenant on va comparer les extensiosn installées avec les extensions activées // Maintenant on va comparer les extensiosn installées avec les extensions activées
foreach ($activatedExtensions as $activatedExtension){ foreach ($activatedExtensions as $activatedExtension){
// Dans un premier temps on va vérifier qu'il existe une extension de ce type (ouai au moins si y en a pas c'est réglé x) ) // Dans un premier temps on va vérifier qu'il existe une extension de ce type (ouai au moins si y en a pas c'est réglé x) )
if(isset($extensionsList[$activatedExtension['type'].'s'])){ if(isset($extensionsList[$activatedExtension['type']])){
for($i = 0; $i < count($extensionsList[$activatedExtension['type'].'s']); $i++){ for($i = 0; $i < count($extensionsList[$activatedExtension['type']]); $i++){
if($extensionsList[$activatedExtension['type'].'s'][$i]['name'] == $activatedExtension['name']){ if($extensionsList[$activatedExtension['type']][$i]['name'] == $activatedExtension['name']){
$extensionsList[$activatedExtension['type'].'s'][$i]['activated'] = true; $extensionsList[$activatedExtension['type']][$i]['activated'] = true;
foreach($extensionsList[$activatedExtension['type']][$i]['requiredModules'] as $requiredModule){
if(!in_array($requiredModule, $requiredModulesNames))
array_push($requiredModulesNames, $requiredModule);
}
break; break;
} }
} }
} }
} }
// Enfin on va vérifier que toutes les dépendances sont satisfaites
$keys = array_keys($extensionsList);
foreach ($requiredModulesNames as $requiredModuleName){
for($i = 0; $i < sizeof($keys); $i++){
for($j = 0; $j < count($extensionsList[$keys[$i]]); $j++){
if($extensionsList[$keys[$i]][$j]['name'] == $requiredModuleName && $extensionsList[$keys[$i]][$j]['activated'] == false){
$extensionsList[$keys[$i]][$j]['isAnUnsatisfiedDependency'] = true;
}
}
}
}
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
...@@ -50,6 +75,20 @@ foreach ($activatedExtensions as $activatedExtension){ ...@@ -50,6 +75,20 @@ foreach ($activatedExtensions as $activatedExtension){
<?php include 'includes/depedencies.php';?> <?php include 'includes/depedencies.php';?>
</head> </head>
<body> <body>
<style type="text/css">
.warningBlink{
animation:warningBlinkText 2.4s infinite;
}
@keyframes warningBlinkText{
0%{ color: #FFC107; }
22.5%{ color: transparent; }
27.5%{ color: transparent; }
50%{ color: #DC3545; }
72.5%{ color: transparent; }
77.5%{ color: transparent; }
100%{ color: #FFC107; }
}
</style>
<?php <?php
include ('includes/navbar.php'); include ('includes/navbar.php');
?> ?>
...@@ -60,40 +99,38 @@ foreach ($activatedExtensions as $activatedExtension){ ...@@ -60,40 +99,38 @@ foreach ($activatedExtensions as $activatedExtension){
<p><?=$translation["ws_pageDesc"]?></p> <p><?=$translation["ws_pageDesc"]?></p>
<div class="width-50em d-flex flex-column"> <div class="width-50em d-flex flex-column">
<?php
if($debugMode == "1"){ ?>
<h5>Debug</h5> <h5>Debug</h5>
<div class="border rounded my-2"> <div class="border rounded my-2">
<pre><code><?php echo 'extensionsFolderContent:<br>'; print_r($extensionsFolderContent); echo '<br>extensionsList:<br>'; print_r($extensionsList); ?></code></pre> <pre><code><?php echo 'extensionsFolderContent:<br>'; print_r($extensionsFolderContent); echo '<br>extensionsList:<br>'; print_r($extensionsList); ?></code></pre>
</div> </div>
<?php } ?>
<?php <?php
foreach ($extensionsList as $extensionTypeName => $extensionTypeExtensions){ foreach ($extensionsList as $extensionTypeName => $extensionTypeExtensions){
if($extensionTypeName == "modules"){ echo "<h5>".$translation["ws_".$extensionTypeName.'s']."</h5>";
echo "<h5>".$translation["ws_modules"]."</h5>";
}elseif($extensionTypeName == "themes"){
echo "<h5>".$translation["ws_themes"]."</h5>";
}elseif($extensionTypeName == "plugins"){
echo "<h5>".$translation["ws_plugins"]."</h5>";
}
foreach ($extensionTypeExtensions as $extension){ foreach ($extensionTypeExtensions as $extension){
if(!empty($extension['extensionLogo'])) $backgroundLogo = 'style="background-image: url(\''.$extension['extensionLogo'].'\')"'; if(!empty($extension['extensionLogo'])) $backgroundLogo = 'style="background-image: url(\''.$extension['extensionLogo'].'\')"';
else $backgroundLogo = null; else $backgroundLogo = null;
echo('<div class="workshop-suscribedCard my-2" id="'.$extension['name'].'" depedencies="'.json_encode($extension['requiredModules']).'"> if(isset($extension['isAnUnsatisfiedDependency'])&&$extension['isAnUnsatisfiedDependency'] == true) $depedencyWarning = '<i class="fas fa-exclamation-circle warningBlink ml-1" data-toggle="tooltip" data-placement="top" title="'.$translation["ws_requireddependece"].'"></i>';
else $depedencyWarning = null;
echo('<div class="workshop-suscribedCard my-2" id="'.$extension['name'].'" depedencies=\''.json_encode($extension['requiredModules']).'\' adminAccess="'.$extension['adminAccess'].'" clientAccess="'.$extension['clientAccess'].'" type="'.$extension['type'].'">
<div class="addonLogo" '.$backgroundLogo.'></div> <div class="addonLogo" '.$backgroundLogo.'></div>
<div class="ml-4 addonDetails flex-grow-1"> <div class="ml-4 addonDetails flex-grow-1">
<h6 class="mb-0"><a class="text-dark text-decoration-none" href="#">'.$extension['showname'].'</a></h6> <h6 class="mb-0"><a class="text-dark text-decoration-none" href="#">'.$extension['showname'].'</a>'.$depedencyWarning.'</h6>
<small class="text-muted">Par <a class="text-brown" href="https://workshop.vbcms.net/team/'.$extension['author'].'">Team Workshop à Récupérer</a></small> <small class="text-muted">Par <a class="text-brown" href="https://workshop.vbcms.net/team/'.$extension['author'].'">Team Workshop à Récupérer</a></small>
<p>'.$extension['description'].'</p> <p>'.$extension['description'].'</p>
</div> </div>
<div class="addonControl">'); <div class="addonControl">');
if($extension['activated']) if($extension['activated'])
echo '<button class="btn btn-sm btn-brown float-right my-1" id="toogle-addon-'.$extension['name'].'" onclick="disableAddon('.$extension['name'].')">'.$translation["ws_disable"].'</button>'; echo '<button class="btn btn-sm btn-brown float-right my-1" id="toogle-addon-'.$extension['name'].'" onclick="disableAddon(\''.$extension['name'].'\')">'.$translation["ws_disable"].'</button>';
else else
echo '<button class="btn btn-sm btn-brown float-right my-1" id="toogle-addon-'.$extension['name'].'" onclick="enableAddon('.$extension['name'].')">'.$translation["ws_enable"].'</button>'; echo '<button class="btn btn-sm btn-brown float-right my-1" id="toogle-addon-'.$extension['name'].'" onclick="enableAddon(\''.$extension['name'].'\')">'.$translation["ws_enable"].'</button>';
if($extension['isWsSuscribed']) if($extension['isWsSuscribed'])
echo '<button class="btn btn-sm btn-danger float-right my-1" onclick="unsuscribeAddon('.$extension['name'].')">Se désabonner</button>'; echo '<button class="btn btn-sm btn-danger float-right my-1" onclick="unsuscribeAddon('.$extension['name'].')">Se désabonner</button>';
echo('</div> echo('</div>
</div>'); </div>');
} }
...@@ -132,54 +169,139 @@ foreach ($activatedExtensions as $activatedExtension){ ...@@ -132,54 +169,139 @@ foreach ($activatedExtensions as $activatedExtension){
</div> </div>
<div class="admin-tips"> <div class="admin-tips">
<div class="tip"> <div class="tip">
<h5>Créer un addon</h5> <h5>Créer une extension</h5>
<p><b>Créer un addon pour VBcms est un jeu d'enfant!</b><br><a href="#" class="text-brown">Check la documentation</a> pour en savoir plus, les créateurs sont régulièrement mis en avant sur le Workshop!</p> <p><b>Créer une extension pour VBcms est un jeu d'enfant!</b><br><a href="#" class="text-brown">Check la documentation</a> pour en savoir plus, les créateurs sont régulièrement mis en avant sur le Workshop!</p>
<img class="mt-n3" width="96" src="<?=$websiteUrl?>vbcms-admin/images/misc/create-addon.jpg"> <img class="mt-n3" width="96" src="<?=$websiteUrl?>vbcms-admin/images/misc/create-addon.jpg">
</div> </div>
<div class="tip"> <div class="tip">
<h5>Quèsaco une dépendance?</h5> <h5>Quèsaco une dépendance?</h5>
<p>Tu as très probablement déjà du voir ce message d'avertissement lors de l'activation de la désactivation d'un addon, sans trop savoir ce qu'est une dépendance.</p> <p>Tu as très probablement déjà du voir ce message d'avertissement lors de l'activation de la désactivation d'une extension, sans trop savoir ce qu'est une dépendance.</p>
<img class="mt-n1 mb-1" src="<?=$websiteUrl?>vbcms-admin/images/misc/alerte-dependance.jpg"> <img class="mt-n1 mb-1" src="<?=$websiteUrl?>vbcms-admin/images/misc/alerte-dependance.jpg">
<p><b>Une dépendance est un addon nécessaire au bon fonctionnement d'autres addons</b>. Le désactiver pourrait provoquer une erreur fatale, c'est pour cela que VBcms désactive tous ses liens par défaut.</p> <p><b>Une dépendance est une extension nécessaire au bon fonctionnement d'autres extensions</b>. La désactiver pourrait provoquer une erreur fatale, c'est pour cela que VBcms désactive tous ses liens par défaut.</p>
</div> </div>
</div> </div>
</div> </div>
<div class="modal fade" id="depedenciesModal"> <div class="modal fade" id="extensionActivationModal">
<div class="modal-dialog"> <div class="modal-dialog">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header bg-brown text-white">
<h5 id="depedenciesModalTitle" class="modal-title"><?=$translation['ws_requireddependecies']?></h5> <h5 id="extensionActivationModalTitle" class="modal-title"><?=$translation['ws_activateModule']?></h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"> <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span> <span aria-hidden="true">&times;</span>
</button> </button>
</div> </div>
<div class="modal-body"> <div class="modal-body" id="extensionActivationModalBody">
<p id="depedenciesModalDesc"><?=$translation['ws_enableRequireddependecies']?></p> <div id="moduleAccessDiv" moduleName="">
<div class="form-group">
<label><?=$translation['ws_clientAccess']?></label>
<input type="text" class="form-control" id="clientAccessInput" placeholder="">
<small class="form-text text-muted"><?=$translation["ws_clientAccessExplaination"]?></small>
<div class="invalid-feedback">Veuillez renter un alias unique</div>
</div>
<div class="form-group">
<label><?=$translation['ws_adminAccess']?></label>
<input type="text" class="form-control" id="adminAccessInput" placeholder="">
<small class="form-text text-muted"><?=$translation["ws_adminAccessExplaination"]?></small>
<div class="invalid-feedback">Veuillez renter un alias unique</div>
</div>
</div>
<div id="depedenciesInfosDiv">
<h5>Note</h5>
<p><?=$translation['ws_enableRequiredDepedencies']?><br>
<?=$translation['ws_enableRequiredDepedenciesMarkerInfo']?></p>
</div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Fermer</button> <button type="button" class="btn btn-outline-brown" data-dismiss="modal">Fermer</button>
<button id="depedenciesModalBtn" onclick="" type="button" class="btn btn-primary">Activer</button> <button id="extensionActivationModalBtn" onclick="" type="button" class="btn btn-brown">Activer</button>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
$(function () {
$('[data-toggle="tooltip"]').tooltip()
})
function enableAddon(name, depedenciesId, confirm){ document.getElementById('adminAccessInput').addEventListener("change", function (evt) {
if (depedenciesId!="[]"&&confirm==0) { validateAccesses();
$("#depedenciesModalTitle").html("<?=$translation['ws_requireddependecies']?>"); }, false);
$("#depedenciesModalDesc").html("<?=$translation['ws_enableRequireddependecies']?>");
$("#depedenciesModalBtn").attr("onclick", "enableAddon("+name+", '"+depedenciesId+"', 1)"); document.getElementById('clientAccessInput').addEventListener("change", function (evt) {
$("#depedenciesModalBtn").html("<?=$translation['ws_enable']?>"); validateAccesses();
$('#depedenciesModal').modal('toggle'); }, false);
function validateAccesses(){
var array = {
adminAccess: $("#adminAccessInput").val(),
clientAccess: $("#clientAccessInput").val()
};
$.get("<?=$websiteUrl?>vbcms-admin/backTasks/?checkModulesAliases="+encodeURIComponent(JSON.stringify(array)), function(data) {
if (!isJson(data)) {
SnackBar({
message: "<?=$translation['ws_cantVerifyModulesAlias']?>: "+data,
status: "danger",
timeout: false
});
} else { } else {
var array = []; var json = JSON.parse(data);
array.push(name); console.log(json.clientAccess);
array.push(depedenciesId); if(json.clientAccess==true){
console.log(encodeURIComponent(JSON.stringify(array))); $("#clientAccessInput").parent().children(".invalid-feedback").css("display", 'block');
$.get("<?=$websiteUrl?>vbcms-admin/backTasks/?enableWSAddon="+encodeURIComponent(JSON.stringify(array)), function(data) { } else {
$("#clientAccessInput").parent().children(".invalid-feedback").css("display", 'none');
}
console.log(json.adminAccess);
if(json.adminAccess==true){
$("#adminAccessInput").parent().children(".invalid-feedback").css("display", 'block');
} else {
$("#adminAccessInput").parent().children(".invalid-feedback").css("display", 'none');
}
if(json.clientAccess==false && json.adminAccess==false){
$("#extensionActivationModalBtn").attr("onclick", "enableAddon('"+$("#moduleAccessDiv").attr('moduleName')+"', '"+$("#adminAccessInput").val()+"', '"+$("#clientAccessInput").val()+"')");
if(typeof $("#extensionActivationModalBtn").attr("disabled") !== 'undefined'){
$("#extensionActivationModalBtn").removeAttr("disabled");
}
}else{
console.log("test");
$("#extensionActivationModalBtn").attr("disabled", "");
}
}
});
}
function enableAddon(name, adminAccess, clientAccess){
if(($("#"+name).attr("type")=="module") && ((typeof adminAccess === 'undefined') || (typeof clientAccess === 'undefined'))){
$("#moduleAccessDiv").css('display', 'block');
$("#moduleAccessDiv").attr('moduleName', name);
$("#extensionActivationModalTitle").html('<?=$translation["ws_enableModule"]?>');
$("#clientAccessInput").attr("placeholder", $("#"+name).attr("clientAccess"));
$("#adminAccessInput").attr("placeholder", $("#"+name).attr("adminAccess"));
$("#clientAccessInput").attr("value", $("#"+name).attr("clientAccess"));
$("#adminAccessInput").attr("value", $("#"+name).attr("adminAccess"));
$("#extensionActivationModalBtn").attr("onclick", "enableAddon('"+name+"', '"+$("#"+name).attr("adminAccess")+"', '"+$("#"+name).attr("clientAccess")+"')");
$("#extensionActivationModalBtn").html("<?=$translation['ws_enable']?>");
$('#extensionActivationModal').modal('toggle');
if($("#"+name).attr("depedencies") != "[]"){
$("#depedenciesInfosDiv").css('display', 'block');
} else {
$("#depedenciesInfosDiv").css('display', 'none');
}
} else {
var array = {};
array.name=name;
if($("#"+name).attr("type")=="module"){
array.adminAccess=adminAccess;
array.clientAccess=clientAccess;
}
$.get("<?=$websiteUrl?>vbcms-admin/backTasks/?enableExtension="+encodeURIComponent(JSON.stringify(array)), function(data) {
if (data != "") { if (data != "") {
SnackBar({ SnackBar({
message: "<?=$translation['ws_errorEnableAddon']?>: "+data, message: "<?=$translation['ws_errorEnableAddon']?>: "+data,
...@@ -196,11 +318,11 @@ foreach ($activatedExtensions as $activatedExtension){ ...@@ -196,11 +318,11 @@ foreach ($activatedExtensions as $activatedExtension){
function disableAddon(name, confirm){ function disableAddon(name, confirm){
$.get("<?=$websiteUrl?>vbcms-admin/backTasks/?checkIfModuleIsUsedByOthers="+name, function(depedenciesId) { $.get("<?=$websiteUrl?>vbcms-admin/backTasks/?checkIfModuleIsUsedByOthers="+name, function(depedenciesId) {
if (depedenciesId!="[]"&&confirm==0) { if (depedenciesId!="[]"&&confirm==0) {
$("#depedenciesModalTitle").html("<?=$translation['ws_requireddependecies']?>"); $("#extensionActivationModalTitle").html("<?=$translation['ws_requireddependecies']?>");
$("#depedenciesModalDesc").html("<?=$translation['ws_disableRequireddependecies']?>"); $("#extensionActivationModalDesc").html("<?=$translation['ws_disableRequireddependecies']?>");
$("#depedenciesModalBtn").attr("onclick", "disableAddon("+name+", 1)"); $("#extensionActivationModalBtn").attr("onclick", "disableAddon("+name+", 1)");
$("#depedenciesModalBtn").html("<?=$translation['ws_disable']?>"); $("#extensionActivationModalBtn").html("<?=$translation['ws_disable']?>");
$('#depedenciesModal').modal('toggle'); $('#extensionActivationModal').modal('toggle');
} else { } else {
var array = []; var array = [];
array.push(name); array.push(name);
......
vbcms-content/extensions/vbcms-filemanager/extension-logo.jpg

1.4 KiB

{
"workshopId" : "",
"requiredModules" : [],
"type" : "module",
"name": "vbcms-filemanager",
"showname": "Gestionnaire de fichiers de base",
"version": "1.0",
"compatible": "48",
"author": "1",
"description": "Il s'agit du gestionnaire de fichers inclu avec VBcms. ",
"clientAccess": "",
"adminAccess": "filemanager",
"permissions": ""
}
\ No newline at end of file
<?php
function enable($name, $path){
adminNavbarAddCategory($name, "gallery_medias");
adminNavbarAddItem($name, "fas fa-photo-video", "gallery_filemanager", "/vbcms-admin/".$path."/browse");
}
function disable(){
}
\ No newline at end of file
{ {
"workshopId" : "", "workshopId" : "",
"requiredModules" : [], "requiredModules" : ["vbcms-filemanager"],
"type" : "module", "type" : "module",
"name": "vbcms-websiteSystem", "name": "vbcms-websiteSystem",
"showname": "Système de site internet de base", "showname": "Système de site internet de base",
"version": "1.0", "version": "1.0",
"compatible": "2.1", "compatible": "48",
"author": "1", "author": "1",
"description": "Il s'agit du système de site internet inclu avec VBcms.", "description": "Il s'agit du système de site internet inclu avec VBcms.",
"clientAccess": "", "clientAccess": "",
......
<?php
function enable(){
}
function disable(){
}
\ No newline at end of file
...@@ -60,15 +60,17 @@ $translation["workshop"] = "Workshop"; ...@@ -60,15 +60,17 @@ $translation["workshop"] = "Workshop";
$translation["ws_visit"] = "Visiter"; $translation["ws_visit"] = "Visiter";
$translation["ws_addonsLists"] = "Liste des extensions"; $translation["ws_addonsLists"] = "Liste des extensions";
$translation["ws_pendingAddons"] = "Extensions en attentes"; $translation["ws_pendingAddons"] = "Extensions en attentes";
$translation["ws_createAddon"] = "Créer un addon"; $translation["ws_createAddon"] = "Créer une extension";
$translation["ws_addonsLists_suscribed"] = "Articles abonnés"; $translation["ws_addonsLists_suscribed"] = "Articles abonnés";
$translation["ws_updatesAddons"] = "Mises à jours"; $translation["ws_updatesAddons"] = "Mises à jours";
$translation["ws_manage"] = "Gérer les extensions"; $translation["ws_manage"] = "Gérer les extensions";
$translation["ws_requireddependecies"] = "Dépendances requises"; $translation["ws_requireddependecies"] = "Dépendances requises";
$translation["ws_enableRequireddependecies"] = "Cette extension dépend d'une/d'autres extension(s), elle(s) seront/sera automatiquement activée(s)"; $translation["ws_requireddependece"] = "Dépendance requise";
$translation["ws_enableRequiredDepedencies"] = "Cette extension dépend d'une ou plusieurs autres extensions. Elles devront être activées afin de pouvoir débloquer l'ensemble des fonctionnalités.";
$translation["ws_enableRequiredDepedenciesMarkerInfo"] = 'Les extensions à activer seront marquées par cette icône: <i class="fas fa-exclamation-circle warningBlink ml-1" data-toggle="tooltip" data-placement="top" title="'.$translation["ws_requireddependece"].'"></i>';
$translation["ws_disableRequireddependecies"] = "Cette extension dépend d'une/d'autres extension(s). La désactiver pourrait engeandrer des erreurs!"; $translation["ws_disableRequireddependecies"] = "Cette extension dépend d'une/d'autres extension(s). La désactiver pourrait engeandrer des erreurs!";
$translation["ws_errorEnableAddon"] = "Echec lors de l'activation de l'extension."; $translation["ws_errorEnableAddon"] = "Echec lors de l'activation de l'extension";
$translation["ws_errorDisableAddon"] = "Echec lors de désactivation de l'extension."; $translation["ws_errorDisableAddon"] = "Echec lors de la désactivation de l'extension";
$translation["ws_pageDesc"] = "Ici tu peux gérer les extensions téléchargées. Libre à toi de les activer/désactiver, fais attention cependant aux dépendances!"; $translation["ws_pageDesc"] = "Ici tu peux gérer les extensions téléchargées. Libre à toi de les activer/désactiver, fais attention cependant aux dépendances!";
$translation["ws_unsuscribe"] = "Se désabonner"; $translation["ws_unsuscribe"] = "Se désabonner";
$translation["ws_disable"] = "Désactiver"; $translation["ws_disable"] = "Désactiver";
...@@ -76,7 +78,14 @@ $translation["ws_enable"] = "Activer"; ...@@ -76,7 +78,14 @@ $translation["ws_enable"] = "Activer";
$translation["ws_modules"] = "Modules"; $translation["ws_modules"] = "Modules";
$translation["ws_themes"] = "Thèmes"; $translation["ws_themes"] = "Thèmes";
$translation["ws_plugins"] = "Plugins"; $translation["ws_plugins"] = "Plugins";
$translation["sample"] = "sample"; $translation["ws_extensions"] = "Extensions";
$translation["ws_activateModule"] = "Activer un module";
$translation["ws_adminAccess"] = "Accès admin";
$translation["ws_clientAccess"] = "Accès client";
$translation["ws_clientAccessExplaination"] = "Alias auquel le module sera accessible pour le client";
$translation["ws_adminAccessExplaination"] = "Alias auquel le module sera accessible sur le panel admin";
$translation["ws_enableModule"] = "Activer un module";
$translation["ws_cantVerifyModulesAlias"] = "Impossible de vérifier les alias utilisés";
$translation["sample"] = "sample"; $translation["sample"] = "sample";
$translation["sample"] = "sample"; $translation["sample"] = "sample";
$translation["sample"] = "sample"; $translation["sample"] = "sample";
......
...@@ -13,7 +13,9 @@ function loadModule($type, $moduleAlias, $moduleParams){ ...@@ -13,7 +13,9 @@ function loadModule($type, $moduleAlias, $moduleParams){
$response = $response->fetch(PDO::FETCH_ASSOC); $response = $response->fetch(PDO::FETCH_ASSOC);
if (!empty($response)) { if (!empty($response)) {
include $GLOBALS['vbcmsRootPath'].'/vbcms-content/modules'.$response["path"]."/moduleLoadPage.php"; // Le module appelé va se charger du reste //include $GLOBALS['vbcmsRootPath'].'/vbcms-content/modules'.$response["path"]."/pageHandler.php"; // Le module appelé va se charger du reste
$calledmodule = new VBcms\module($response["name"]);
$calledmodule->call($moduleParams, $type);
} else { } else {
// Aucun module d'activé ne se charge de ce chemin // Aucun module d'activé ne se charge de ce chemin
if (empty($moduleAlias)) { if (empty($moduleAlias)) {
...@@ -27,7 +29,9 @@ function loadModule($type, $moduleAlias, $moduleParams){ ...@@ -27,7 +29,9 @@ function loadModule($type, $moduleAlias, $moduleParams){
if (!empty($response)) { if (!empty($response)) {
// On a trouvé un module qui gère l'index, au cas où cet alias n'existe pas, ce sera ce module qui gérera la page 404 // On a trouvé un module qui gère l'index, au cas où cet alias n'existe pas, ce sera ce module qui gérera la page 404
include $GLOBALS['vbcmsRootPath'].'/vbcms-content/modules'.$response["path"]."/moduleLoadPage.php"; // Le module appelé va se charger du reste $calledmodule = new VBcms\module($response["name"]);
$calledmodule->call($moduleParams, $type);
//include $GLOBALS['vbcmsRootPath'].'/vbcms-content/modules'.$response["path"]."/pageHandler.php"; // Le module appelé va se charger du reste
} else { } else {
// Si on arrive ici c'est qu'il n'y a vraiment aucun module qui gère cet alias // Si on arrive ici c'est qu'il n'y a vraiment aucun module qui gère cet alias
show404($type); show404($type);
...@@ -43,8 +47,8 @@ function loadModule($type, $moduleAlias, $moduleParams){ ...@@ -43,8 +47,8 @@ function loadModule($type, $moduleAlias, $moduleParams){
$response = $response->fetch(PDO::FETCH_ASSOC); $response = $response->fetch(PDO::FETCH_ASSOC);
if (!empty($response)) { if (!empty($response)) {
//include $GLOBALS['vbcmsRootPath'].'/vbcms-content/modules'.$response["path"]."/moduleLoadPage.php"; // Le module appelé va se charger du reste //include $GLOBALS['vbcmsRootPath'].'/vbcms-content/modules'.$response["path"]."/pageHandler.php"; // Le module appelé va se charger du reste
$calledmodule = new VBcms\module($response["name"],$response["path"],$response["adminAccess"],$response["clientAccess"],$response["vbcmsVerId"]); $calledmodule = new VBcms\module($response["name"]);
$calledmodule->call($moduleParams, $type); $calledmodule->call($moduleParams, $type);
} else { } else {
show404($type); show404($type);
...@@ -68,3 +72,47 @@ function show404($type){ ...@@ -68,3 +72,47 @@ function show404($type){
} }
} }
// Petites fonctions utiles
function isJson($string) {
json_decode($string);
return (json_last_error() == JSON_ERROR_NONE);
}
function getRandomString($length) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}
// Fonctions pour la barre de naviguation admin
function adminNavbarAddCategory($moduleName, $title){
global $bdd;
$position = 1+($bdd->query("SELECT position FROM `vbcms-adminNavbar` ORDER BY position DESC LIMIT 1")->fetchColumn());
$response = $bdd->prepare("INSERT INTO `vbcms-adminNavbar` (id, parentId, position, parentPosition, value1, value2, value3) VALUES (?,?,?,?,?,?,?)");
$response->execute([null, 0, $position, 0, $moduleName, $title, ""]);
}
function adminNavbarAddItem($moduleName, $icon, $name, $link){
global $bdd;
$response = $bdd->prepare("SELECT * FROM `vbcms-adminNavbar` WHERE value1 = ? AND parentPosition = 0"); // Je récupère l'id du dossier parent
$response->execute([$moduleName]);
$parentInfos = $response->fetch(PDO::FETCH_ASSOC);
$response = $bdd->prepare("SELECT parentPosition FROM `vbcms-adminNavbar` WHERE parentId = ? ORDER BY parentPosition DESC LIMIT 1"); // Je récupère l'id du dossier parent
$response->execute([$moduleName]);
$parentPosition = 1+ $response->fetchColumn();
$response = $bdd->prepare("INSERT INTO `vbcms-adminNavbar` (id, parentId, position, parentPosition, value1, value2, value3) VALUES (?,?,?,?,?,?,?)");
$response->execute([null, $parentInfos["id"], $parentInfos["position"], $parentPosition, $icon, $name, $link]);
}
function modifyNavItem($item){
global $bdd;
$item = json_decode($item);
$response = $bdd->prepare("UPDATE `vbcms-clientNavbar` SET value1=?, value2=? WHERE id=?");
$response->execute([$item[1], $item[2], $item[0]]);
}
\ No newline at end of file
...@@ -6,22 +6,29 @@ namespace VBcms{ ...@@ -6,22 +6,29 @@ namespace VBcms{
class module { class module {
// Cette classe se chargera de charger les modules // Cette classe se chargera de charger les modules
private $name, $path, $adminAccess, $clientAccess, $vbcmsVerId; private $name, $path, $adminAccess, $clientAccess, $vbcmsVerId, $workshopId;
private $bdd, $mbdd; private $bdd, $mbdd;
private $permissions = array(); private $permissions = array();
public function __construct($name, $path, $adminAccess, $clientAccess, $vbcmsVerId){ public function __construct($name){
$this->name = $name; $this->name = $name;
$this->path = $path;
$this->adminAccess = $adminAccess;
$this->clientAccess = $clientAccess;
$this->vbcmsVerId = $vbcmsVerId;
// On va initialiser le driver sql // On va initialiser le driver sql
global $bdd; global $bdd;
$this->bdd = $bdd; $this->bdd = $bdd;
$moduleInfos = $bdd->prepare("SELECT * FROM `vbcms-activatedExtensions` WHERE name=?");
$moduleInfos->execute([$name]);
$moduleInfos = $moduleInfos->fetch(PDO::FETCH_ASSOC);
if(!empty($moduleInfos)){
$this->path = $moduleInfos['path'];
$this->adminAccess = $moduleInfos['adminAccess'];
$this->clientAccess = $moduleInfos['clientAccess'];
$this->vbcmsVerId = $moduleInfos['vbcmsVerId'];
$this->workshopId = $moduleInfos['workshopId'];
}
//$this->mbdd = new \moduleDatabaseConnect($name); //$this->mbdd = new \moduleDatabaseConnect($name);
// UPDATE 01/07/2021 : N'est plus utile après reflexion // UPDATE 01/07/2021 : N'est plus utile après reflexion
...@@ -38,11 +45,26 @@ namespace VBcms{ ...@@ -38,11 +45,26 @@ namespace VBcms{
*/ */
} }
function initModule($name, $path, $adminAccess, $clientAccess, $vbcmsVerId, $workshopId){
$this->name = $name;
$this->path = $path;
$this->adminAccess = $adminAccess;
$this->clientAccess = $clientAccess;
$this->vbcmsVerId = $vbcmsVerId;
if(empty($workshopId))$this->workshopId = NULL;
else $this->workshopId = $workshopId;
$bdd=$this->bdd;
include $GLOBALS['vbcmsRootPath'].'/vbcms-content/extensions/'.$this->path."/init.php"; // Le module appelé va se charger du reste
enable($name, $path);
$query = $bdd->prepare("INSERT INTO `vbcms-activatedExtensions` (`name`, `type`, `path`, `adminAccess`, `clientAccess`, `vbcmsVerId`, `workshopId`) VALUES (?,?,?,?,?,?,?)");
$query->execute([$name, "module", $path, $adminAccess, $clientAccess, $vbcmsVerId, $this->workshopId]);
}
function call(array $parameters, $type){ function call(array $parameters, $type){
//$mbdd=$this->mbdd; //$mbdd=$this->mbdd;
$bdd=$this->bdd; $bdd=$this->bdd;
include $GLOBALS['vbcmsRootPath'].'/vbcms-content/extensions/'.$this->path."/moduleLoadPage.php"; // Le module appelé va se charger du reste include $GLOBALS['vbcmsRootPath'].'/vbcms-content/extensions/'.$this->path."/pageHandler.php"; // Le module appelé va se charger du reste
} }
} }
......
...@@ -25,3 +25,5 @@ $websiteName = $bdd->query("SELECT value FROM `vbcms-settings` WHERE name='websi ...@@ -25,3 +25,5 @@ $websiteName = $bdd->query("SELECT value FROM `vbcms-settings` WHERE name='websi
$websiteDescription = $bdd->query("SELECT value FROM `vbcms-settings` WHERE name='websiteDescription'")->fetchColumn(); $websiteDescription = $bdd->query("SELECT value FROM `vbcms-settings` WHERE name='websiteDescription'")->fetchColumn();
$websiteMetaColor = $bdd->query("SELECT value FROM `vbcms-settings` WHERE name='websiteMetaColor'")->fetchColumn(); $websiteMetaColor = $bdd->query("SELECT value FROM `vbcms-settings` WHERE name='websiteMetaColor'")->fetchColumn();
$websiteLogo = $bdd->query("SELECT value FROM `vbcms-settings` WHERE name='websiteLogo'")->fetchColumn(); $websiteLogo = $bdd->query("SELECT value FROM `vbcms-settings` WHERE name='websiteLogo'")->fetchColumn();
$debugMode = $bdd->query("SELECT value FROM `vbcms-settings` WHERE name='debugMode'")->fetchColumn();
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment