admin theme manager

This commit is contained in:
2024-09-11 17:38:46 +03:00
parent 69b27d4975
commit 42b28df07d
129 changed files with 16335 additions and 53 deletions

View File

@ -3,6 +3,7 @@
namespace kernel;
use kernel\Controller;
use kernel\helpers\Debug;
use kernel\services\AdminThemeService;
class AdminController extends Controller

View File

@ -4,7 +4,6 @@ namespace kernel;
use app\helpers\Debug;
use Phroute\Phroute\Dispatcher;
class App

View File

@ -2,8 +2,6 @@
namespace kernel;
use app\helpers\Debug;
class CgView
{
public string $viewPath = '';

View File

@ -2,8 +2,6 @@
namespace kernel;
use app\helpers\Debug;
class FileUpload
{
protected string $fileTmpPath;

View File

@ -2,7 +2,6 @@
namespace kernel;
use app\helpers\Debug;
use MadeSimple\Validator\Validator;
class FormModel

View File

@ -1,6 +1,7 @@
{
"name": "Default",
"version": "0.1",
"slug": "default",
"description": "Default admin theme",
"preview": "preview.png",
"resource": "/resources/default",

View File

@ -1,6 +1,7 @@
{
"name": "Simple",
"version": "0.1",
"slug": "simple",
"description": "Simple admin theme",
"preview": "preview.png",
"resource": "/resources/simple",

View File

@ -4,7 +4,6 @@
namespace kernel\console;
use app\helpers\Debug;
use kernel\App;
use Phroute\Phroute\Dispatcher;

View File

@ -1,29 +0,0 @@
<?php
namespace kernel\console\controllers;
use app\helpers\Debug;
use kernel\console\ConsoleController;
use ZipArchive;
class AdminTheme extends ConsoleController
{
public function actionInstallTheme()
{
if (!isset($this->argv['path'])) {
throw new \Exception('Missing admin theme path "--path" specified');
}
$zip = new ZipArchive;
$res = $zip->open(ROOT_DIR . $this->argv['path']);
if ($res === TRUE) {
$zip->extractTo(RESOURCES_DIR . '/tmp/ad/');
$zip->close();
echo 'woot!';
} else {
echo 'doh!';
}
}
}

View File

@ -0,0 +1,49 @@
<?php
namespace kernel\console\controllers;
use kernel\console\ConsoleController;
use kernel\helpers\Files;
use kernel\helpers\Manifest;
use ZipArchive;
class AdminThemeController extends ConsoleController
{
public function actionInstallTheme(): void
{
if (!isset($this->argv['path'])) {
throw new \Exception('Missing admin theme path "--path" specified');
}
$zip = new ZipArchive;
$tmpThemeDir = md5(time());
$res = $zip->open(ROOT_DIR . $this->argv['path']);
if ($res === TRUE) {
$tmpThemeDirFull = RESOURCES_DIR . '/tmp/ad/' . $tmpThemeDir . "/";
$zip->extractTo($tmpThemeDirFull);
$zip->close();
$this->out->r('Архив распакован', 'green');
} else {
$this->out->r('Message: Ошибка чтения архива', 'red');
}
if (file_exists($tmpThemeDirFull . "meta/manifest.json")){
$manifestJson = getConst(file_get_contents($tmpThemeDirFull . "meta/manifest.json"));
$manifest = Manifest::getWithVars($manifestJson);
$this->out->r('manifest.json инициализирован', 'green');
$fileHelper = new Files();
$fileHelper->copy_folder($tmpThemeDirFull . "meta", $manifest['theme_path']);
$fileHelper->copy_folder($tmpThemeDirFull . "resources", $manifest['resource_path']);
$this->out->r("Удаляем временные файлы", 'green');
$fileHelper->recursiveRemoveDir($tmpThemeDirFull);
$this->out->r("Тема " . $manifest['name'] . " установлена", 'green');
}
}
}

View File

@ -13,6 +13,6 @@ App::$collector->group(["prefix" => "migration"], callback: function (RouteColle
});
App::$collector->group(["prefix" => "admin-theme"], callback: function (RouteCollector $router){
App::$collector->console('install', [\kernel\console\controllers\AdminTheme::class, 'actionInstallTheme']);
App::$collector->console('install', [\kernel\console\controllers\AdminThemeController::class, 'actionInstallTheme']);
});

20
kernel/helpers/Debug.php Normal file
View File

@ -0,0 +1,20 @@
<?php
namespace kernel\helpers;
class Debug
{
public static function prn($content)
{
echo '<pre style="background: lightgray; border: 1px solid black; padding: 2px">';
print_r($content);
echo '</pre>';
}
public static function dd($content)
{
echo '<pre style="background: lightgray; border: 1px solid black; padding: 2px">';
print_r($content);
echo '</pre>';
die();
}
}

44
kernel/helpers/Files.php Normal file
View File

@ -0,0 +1,44 @@
<?php
namespace kernel\helpers;
use FilesystemIterator;
class Files
{
public function copy_folder($d1, $d2): void
{
if (is_dir($d1)) {
if (!file_exists($d2)){
$_d2 = mkdir($d2, permissions: 0755, recursive: true);
if (!$_d2) {
return;
}
}
$d = dir($d1);
while (false !== ($entry = $d->read())) {
if ($entry != '.' && $entry != '..') {
$this->copy_folder("$d1/$entry", "$d2/$entry");
}
}
$d->close();
} else {
copy($d1, $d2);
}
}
public function recursiveRemoveDir($dir): void
{
$includes = new FilesystemIterator($dir);
foreach ($includes as $include) {
if(is_dir($include) && !is_link($include)) {
$this->recursiveRemoveDir($include);
}
else {
unlink($include);
}
}
rmdir($dir);
}
}

View File

@ -0,0 +1,20 @@
<?php
namespace kernel\helpers;
class Manifest
{
public static function getWithVars(string $manifestJson): array
{
$manifest = json_decode($manifestJson, true);
$keys = ["{slug}" => $manifest['slug']];
foreach($keys as $key => $value)
{
$manifestJson = str_replace($key, $value, $manifestJson);
}
return json_decode($manifestJson, true);
}
}

View File

@ -2,7 +2,6 @@
namespace kernel\models;
use app\helpers\Debug;
use Illuminate\Database\Eloquent\Model;
/**

View File

@ -2,14 +2,12 @@
namespace kernel\modules\admin_themes\controllers;
use app\helpers\Debug;
use DirectoryIterator;
use JetBrains\PhpStorm\NoReturn;
use kernel\AdminController;
use kernel\Controller;
use kernel\helpers\Debug;
use kernel\models\Option;
use kernel\Request;
use kernel\services\AdminThemeService;
class AdminThemeController extends AdminController
{

View File

@ -3,9 +3,6 @@
* @var $json string
*/
use app\helpers\Debug;
use Itguild\EloquentTable\EloquentDataProvider;
use Itguild\EloquentTable\ListEloquentTable;
use kernel\models\Option;

View File

@ -2,7 +2,6 @@
namespace kernel\modules\menu\controllers;
use app\helpers\Debug;
use Exception;
use JetBrains\PhpStorm\NoReturn;
use kernel\AdminController;

View File

@ -2,7 +2,6 @@
namespace kernel\modules\menu\models;
use app\helpers\Debug;
use Illuminate\Database\Eloquent\Model;
/**

View File

@ -2,9 +2,8 @@
namespace kernel\modules\user\service;
use app\helpers\Debug;
use kernel\modules\user\models\User;
use kernel\FormModel;
use kernel\modules\user\models\User;
class UserService
{

View File

@ -2,6 +2,8 @@
namespace kernel\services;
use kernel\helpers\Debug;
use kernel\helpers\Manifest;
use kernel\models\Option;
class AdminThemeService
@ -45,7 +47,7 @@ class AdminThemeService
$info['path'] = $theme;
if (file_exists($theme . "/manifest.json")){
$manifest = file_get_contents($theme . "/manifest.json");
$manifest = json_decode($manifest, true);
$manifest = Manifest::getWithVars($manifest);
$manifest['preview'] = $manifest['resource'] . "/" . $manifest['preview'];
$info = array_merge($info, $manifest);
}