kernel v0.1.4
This commit is contained in:
@ -5,6 +5,7 @@ namespace kernel\modules\module_shop_client\controllers;
|
||||
use GuzzleHttp\Client;
|
||||
use GuzzleHttp\Exception\GuzzleException;
|
||||
use JetBrains\PhpStorm\NoReturn;
|
||||
use Josantonius\Session\Facades\Session;
|
||||
use kernel\AdminController;
|
||||
use kernel\Flash;
|
||||
use kernel\helpers\Debug;
|
||||
@ -16,6 +17,7 @@ use kernel\services\AdminThemeService;
|
||||
use kernel\services\KernelService;
|
||||
use kernel\services\ModuleService;
|
||||
use kernel\services\ModuleShopService;
|
||||
use kernel\services\ThemeService;
|
||||
use PHPMailer\PHPMailer\Exception;
|
||||
|
||||
class ModuleShopClientController extends AdminController
|
||||
@ -59,6 +61,7 @@ class ModuleShopClientController extends AdminController
|
||||
'per_page' => $per_page,
|
||||
'kernelService' => new KernelService(),
|
||||
'adminThemeService' => new AdminThemeService(),
|
||||
'themeService' => new ThemeService(),
|
||||
]);
|
||||
} else {
|
||||
$this->cgView->render("module_shop_error_connection.php");
|
||||
@ -156,49 +159,6 @@ class ModuleShopClientController extends AdminController
|
||||
$this->redirect('/admin/module_shop_client', 302);
|
||||
}
|
||||
|
||||
// public function actionSearch(int $page_number = 1): void
|
||||
// {
|
||||
// $request = new Request();
|
||||
// $filters = $request->get();
|
||||
//// Debug::dd($filters);
|
||||
// if ($this->moduleService->issetModuleShopToken()) {
|
||||
// if ($this->moduleService->isServerAvailable()) {
|
||||
// $modules_info = [];
|
||||
// $per_page = 8;
|
||||
// $modules = RESTClient::request($_ENV['MODULE_SHOP_URL'] . '/api/module_shop/gb_slug');
|
||||
// $modules = json_decode($modules->getBody()->getContents(), true);
|
||||
// foreach ($modules as $module) {
|
||||
// foreach ($filters as $key => $value) {
|
||||
// if ($value === '') continue;
|
||||
// if ($module[$key] !== $value) {
|
||||
// break;
|
||||
// }
|
||||
//
|
||||
// $modules_info[] = $module;
|
||||
// }
|
||||
// }
|
||||
// $module_count = count($modules_info);
|
||||
// $modules_info = array_slice($modules_info, $per_page * ($page_number - 1), $per_page);
|
||||
//
|
||||
// $this->cgView->render("index.php", [
|
||||
// 'modules_info' => $modules_info,
|
||||
// 'moduleService' => $this->moduleService,
|
||||
// 'page_number' => $page_number,
|
||||
// 'module_count' => $module_count,
|
||||
// 'per_page' => $per_page,
|
||||
// 'kernelService' => new KernelService(),
|
||||
// 'adminThemeService' => new AdminThemeService(),
|
||||
// 'filterValues' => $filters
|
||||
// ]);
|
||||
// } else {
|
||||
// $this->cgView->render("module_shop_error_connection.php");
|
||||
// }
|
||||
//
|
||||
// } else {
|
||||
// $this->cgView->render("login_at_module_shop.php");
|
||||
// }
|
||||
// }
|
||||
|
||||
public function actionSearch(int $page_number = 1): void
|
||||
{
|
||||
$request = new Request();
|
||||
@ -285,4 +245,108 @@ class ModuleShopClientController extends AdminController
|
||||
$this->cgView->render('module_shop_error_connection.php');
|
||||
}
|
||||
|
||||
#[NoReturn] public function actionAdminThemeInstall(): void
|
||||
{
|
||||
$request = new Request();
|
||||
$id = $request->get("id");
|
||||
$adminThemeInfo = RESTClient::request($_ENV['MODULE_SHOP_URL'] . '/api/module_shop/install/' . $id);
|
||||
|
||||
$adminThemeInfo = json_decode($adminThemeInfo->getBody()->getContents(), true);
|
||||
Files::uploadByUrl($_ENV['MODULE_SHOP_URL'] . $adminThemeInfo['path_to_archive'], RESOURCES_DIR . "/tmp/admin_themes");
|
||||
if ($this->adminThemeService->install('/resources/tmp/admin_themes/' . basename($adminThemeInfo['path_to_archive']))) {
|
||||
Flash::setMessage("success", "Тема админ-панели успешно установлена.");
|
||||
} else {
|
||||
Session::start();
|
||||
Session::set("error", implode(";", $this->adminThemeService->getErrors()));
|
||||
}
|
||||
|
||||
$this->redirect('/admin/module_shop_client', 302);
|
||||
}
|
||||
|
||||
#[NoReturn] public function actionAdminThemeUpdate(): void
|
||||
{
|
||||
$request = new Request();
|
||||
$slug = $request->get("slug");
|
||||
$modules_info = RESTClient::request($_ENV['MODULE_SHOP_URL'] . '/api/module_shop/gb_slug');
|
||||
|
||||
$modules_info = json_decode($modules_info->getBody()->getContents(), true);
|
||||
foreach ($modules_info as $module) {
|
||||
if ($module['slug'] === $slug) {
|
||||
$path = $module['path_to_archive'];
|
||||
}
|
||||
}
|
||||
if (isset($path)) {
|
||||
Files::uploadByUrl($_ENV['MODULE_SHOP_URL'] . $path, RESOURCES_DIR . "/tmp/admin_themes");
|
||||
$this->adminThemeService->update('/resources/tmp/admin_themes/' . basename($path));
|
||||
Flash::setMessage("success", "Тема админ-панели успешно обновлена.");
|
||||
} else {
|
||||
Flash::setMessage("error", "Ошибка обновления темы админ-панели.");
|
||||
}
|
||||
|
||||
$this->redirect('/admin/module_shop_client', 302);
|
||||
}
|
||||
|
||||
#[NoReturn] public function actionAdminThemeDelete(): void
|
||||
{
|
||||
$request = new Request();
|
||||
$slug = $request->get("slug");
|
||||
$adminThemeInfo = $this->adminThemeService->getAdminThemeInfoBySlug($slug);
|
||||
$this->adminThemeService->uninstall($adminThemeInfo['path']);
|
||||
|
||||
Flash::setMessage("success", "Тема админ-панели успешно удалена.");
|
||||
$this->redirect('/admin/module_shop_client', 302);
|
||||
}
|
||||
|
||||
#[NoReturn] public function actionThemeInstall(): void
|
||||
{
|
||||
$request = new Request();
|
||||
$id = $request->get("id");
|
||||
$themeInfo = RESTClient::request($_ENV['MODULE_SHOP_URL'] . '/api/module_shop/install/' . $id);
|
||||
|
||||
$themeInfo = json_decode($themeInfo->getBody()->getContents(), true);
|
||||
Files::uploadByUrl($_ENV['MODULE_SHOP_URL'] . $themeInfo['path_to_archive'], RESOURCES_DIR . "/tmp/themes");
|
||||
if ($this->themeService->install('/resources/tmp/themes/' . basename($themeInfo['path_to_archive']))) {
|
||||
Flash::setMessage("success", "Тема сайта успешно установлена.");
|
||||
} else {
|
||||
Session::start();
|
||||
Session::set("error", implode(";", $this->themeService->getErrors()));
|
||||
}
|
||||
|
||||
$this->redirect('/admin/module_shop_client', 302);
|
||||
}
|
||||
|
||||
#[NoReturn] public function actionThemeUpdate(): void
|
||||
{
|
||||
$request = new Request();
|
||||
$slug = $request->get("slug");
|
||||
$modules_info = RESTClient::request($_ENV['MODULE_SHOP_URL'] . '/api/module_shop/gb_slug');
|
||||
|
||||
$modules_info = json_decode($modules_info->getBody()->getContents(), true);
|
||||
foreach ($modules_info as $module) {
|
||||
if ($module['slug'] === $slug) {
|
||||
$path = $module['path_to_archive'];
|
||||
}
|
||||
}
|
||||
if (isset($path)) {
|
||||
Files::uploadByUrl($_ENV['MODULE_SHOP_URL'] . $path, RESOURCES_DIR . "/tmp/themes");
|
||||
$this->themeService->update('/resources/tmp/themes/' . basename($path));
|
||||
Flash::setMessage("success", "Тема сайта успешно обновлена.");
|
||||
} else {
|
||||
Flash::setMessage("error", "Ошибка обновления темы сайта.");
|
||||
}
|
||||
|
||||
$this->redirect('/admin/module_shop_client', 302);
|
||||
}
|
||||
|
||||
#[NoReturn] public function actionThemeDelete(): void
|
||||
{
|
||||
$request = new Request();
|
||||
$slug = $request->get("slug");
|
||||
$themeInfo = $this->themeService->getThemeInfoBySlug($slug);
|
||||
$this->themeService->uninstall($themeInfo['path']);
|
||||
|
||||
Flash::setMessage("success", "Тема сайта успешно удалена.");
|
||||
$this->redirect('/admin/module_shop_client', 302);
|
||||
}
|
||||
|
||||
}
|
@ -24,7 +24,13 @@ App::$collector->group(["prefix" => "admin"], function (RouteCollector $router){
|
||||
});
|
||||
App::$collector->group(["prefix" => "admin_theme"], function (RouteCollector $router) {
|
||||
App::$collector->get('/install', [\kernel\modules\module_shop_client\controllers\ModuleShopClientController::class, 'actionAdminThemeInstall']);
|
||||
App::$collector->post('/update', [\kernel\modules\module_shop_client\controllers\ModuleShopClientController::class, 'actionAdminThemeUpdate']);
|
||||
App::$collector->get('/update', [\kernel\modules\module_shop_client\controllers\ModuleShopClientController::class, 'actionAdminThemeUpdate']);
|
||||
App::$collector->get('/delete', [\kernel\modules\module_shop_client\controllers\ModuleShopClientController::class, 'actionAdminThemeDelete']);
|
||||
});
|
||||
App::$collector->group(["prefix" => "theme"], function (RouteCollector $router) {
|
||||
App::$collector->get('/install', [\kernel\modules\module_shop_client\controllers\ModuleShopClientController::class, 'actionThemeInstall']);
|
||||
App::$collector->get('/update', [\kernel\modules\module_shop_client\controllers\ModuleShopClientController::class, 'actionThemeUpdate']);
|
||||
App::$collector->get('/delete', [\kernel\modules\module_shop_client\controllers\ModuleShopClientController::class, 'actionThemeDelete']);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -7,6 +7,7 @@
|
||||
* @var \kernel\services\ModuleService $moduleService
|
||||
* @var \kernel\services\KernelService $kernelService
|
||||
* @var \kernel\services\AdminThemeService $adminThemeService
|
||||
* @var \kernel\services\ThemeService $themeService
|
||||
* @var array $filterValues
|
||||
*/
|
||||
|
||||
@ -104,7 +105,7 @@ $table->addAction(function ($row, $url) use ($adminThemeService) {
|
||||
$slug = $row['slug'];
|
||||
if ($adminThemeService->isInstall($slug)) {
|
||||
if (!$adminThemeService->isLastVersion($slug)) {
|
||||
$url = "$url/admin_theme/update/";
|
||||
$url = "$url/admin_theme/update/?slug=" . $row['slug'];
|
||||
|
||||
return \kernel\widgets\IconBtn\IconBtnUpdateWidget::create(['url' => $url])->run();
|
||||
}
|
||||
@ -114,6 +115,53 @@ $table->addAction(function ($row, $url) use ($adminThemeService) {
|
||||
return false;
|
||||
});
|
||||
|
||||
$table->addAction(function ($row, $url) use ($adminThemeService) {
|
||||
if ($row['type'] === 'admin_theme') {
|
||||
if ($adminThemeService->isInstall($row['slug'])) {
|
||||
$url = "$url/admin_theme/delete/?slug=" . $row['slug'];
|
||||
|
||||
return \kernel\widgets\IconBtn\IconBtnDeleteWidget::create(['url' => $url])->run();
|
||||
} else {
|
||||
$url = "$url/admin_theme/install/?id=" . $row['id'];
|
||||
|
||||
return \kernel\widgets\IconBtn\IconBtnInstallWidget::create(['url' => $url])->run();
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
$table->addAction(function ($row, $url) use ($themeService) {
|
||||
if ($row['type'] === 'theme') {
|
||||
$slug = $row['slug'];
|
||||
if ($themeService->isInstall($slug)) {
|
||||
if (!$themeService->isLastVersion($slug)) {
|
||||
$url = "$url/theme/update/?slug=" . $row['slug'];
|
||||
|
||||
return \kernel\widgets\IconBtn\IconBtnUpdateWidget::create(['url' => $url])->run();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
$table->addAction(function ($row, $url) use ($themeService) {
|
||||
if ($row['type'] === 'theme') {
|
||||
if ($themeService->isInstall($row['slug'])) {
|
||||
$url = "$url/theme/delete/?slug=" . $row['slug'];
|
||||
|
||||
return \kernel\widgets\IconBtn\IconBtnDeleteWidget::create(['url' => $url])->run();
|
||||
} else {
|
||||
$url = "$url/theme/install/?id=" . $row['id'];
|
||||
|
||||
return \kernel\widgets\IconBtn\IconBtnInstallWidget::create(['url' => $url])->run();
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
$table->afterPrint(function () {
|
||||
return \kernel\IGTabel\btn\PrimaryBtn::create('Сбросить все фильтры', '/admin/module_shop_client')->fetch();
|
||||
});
|
||||
|
@ -13,21 +13,28 @@ use kernel\services\TokenService;
|
||||
class SecureService
|
||||
{
|
||||
|
||||
public static function createSecretCode(User $user): void
|
||||
public static function createSecretCode(User $user): SecretCode
|
||||
{
|
||||
$secretCode = new SecretCode();
|
||||
$secretCode->user_id = $user->id;
|
||||
$secretCode->code = mt_rand(100000, 999999);
|
||||
$secretCode->code_expires_at = date("Y-m-d H:i:s", strtotime("+5 minutes"));;
|
||||
$secretCode->save();
|
||||
|
||||
return $secretCode;
|
||||
}
|
||||
|
||||
public static function updateSecretCode(User $user): void
|
||||
public static function updateSecretCode(User $user): SecretCode
|
||||
{
|
||||
$secretCode = SecretCode::where('user_id', $user->id)->first();
|
||||
if(!$secretCode){
|
||||
return self::createSecretCode($user);
|
||||
}
|
||||
$secretCode->code = mt_rand(100000, 999999);
|
||||
$secretCode->code_expires_at = date("Y-m-d H:i:s", strtotime("+5 minutes"));;
|
||||
$secretCode->save();
|
||||
|
||||
return $secretCode;
|
||||
}
|
||||
|
||||
public static function getCodeByUserId(int $user_id)
|
||||
|
33
kernel/modules/themes/ThemesModule.php
Normal file
33
kernel/modules/themes/ThemesModule.php
Normal file
@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace kernel\modules\themes;
|
||||
|
||||
use kernel\Module;
|
||||
use kernel\modules\menu\service\MenuService;
|
||||
|
||||
class ThemesModule extends Module
|
||||
{
|
||||
public MenuService $menuService;
|
||||
public function __construct()
|
||||
{
|
||||
$this->menuService = new MenuService();
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function init(): void
|
||||
{
|
||||
$this->menuService->createItem([
|
||||
"label" => "Темы сайта",
|
||||
"url" => "/admin/settings/themes",
|
||||
"slug" => "themes",
|
||||
"parent_slug" => "settings"
|
||||
]);
|
||||
}
|
||||
|
||||
public function deactivate(): void
|
||||
{
|
||||
$this->menuService->removeItemBySlug("themes");
|
||||
}
|
||||
}
|
73
kernel/modules/themes/controllers/ThemeController.php
Normal file
73
kernel/modules/themes/controllers/ThemeController.php
Normal file
@ -0,0 +1,73 @@
|
||||
<?php
|
||||
|
||||
namespace kernel\modules\themes\controllers;
|
||||
|
||||
use DirectoryIterator;
|
||||
use JetBrains\PhpStorm\NoReturn;
|
||||
use kernel\AdminController;
|
||||
use kernel\helpers\Debug;
|
||||
use kernel\models\Option;
|
||||
use kernel\Request;
|
||||
|
||||
class ThemeController extends AdminController
|
||||
{
|
||||
protected function init(): void
|
||||
{
|
||||
parent::init();
|
||||
$this->cgView->viewPath = KERNEL_MODULES_DIR . "/themes/views/";
|
||||
}
|
||||
|
||||
public function actionIndex(): void
|
||||
{
|
||||
$themePaths = Option::where("key", "theme_paths")->first();
|
||||
|
||||
$dirs = [];
|
||||
if ($themePaths){
|
||||
$path = json_decode($themePaths->value);
|
||||
foreach ($path->paths as $p){
|
||||
$dirs[] = getConst($p);
|
||||
}
|
||||
}
|
||||
|
||||
$infoToTable = [];
|
||||
$meta = [];
|
||||
$meta['columns'] = [
|
||||
"preview" => "Превью",
|
||||
"name" => "Название",
|
||||
"author" => "Автор",
|
||||
"version" => "Версия",
|
||||
"description" => "Описание"
|
||||
];
|
||||
$meta['params'] = ["class" => "table table-bordered"];
|
||||
$meta['perPage'] = 10;
|
||||
$meta['baseUrl'] = "/admin/settings/themes";
|
||||
$meta['currentPage'] = 1;
|
||||
|
||||
$infoToTable['meta'] = $meta;
|
||||
|
||||
$themesInfo = [];
|
||||
foreach ($dirs as $dir){
|
||||
$i = 1;
|
||||
foreach (new DirectoryIterator($dir) as $fileInfo) {
|
||||
$info = [];
|
||||
if($fileInfo->isDot()) continue;
|
||||
$info['id'] = $i;
|
||||
$themesInfo[] = array_merge($info, $this->themeService->getThemeInfo($fileInfo->getPathname()));
|
||||
$i++;
|
||||
}
|
||||
}
|
||||
$infoToTable['meta']['total'] = count($themesInfo);
|
||||
$infoToTable['data'] = $themesInfo;
|
||||
|
||||
$this->cgView->render("index.php", ['json' => json_encode($infoToTable, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)]);
|
||||
}
|
||||
|
||||
#[NoReturn] public function actionActivate(): void
|
||||
{
|
||||
$request = new Request();
|
||||
$this->themeService->setActiveTheme($request->get("p"));
|
||||
|
||||
$this->cgView->render("view.php", ['data' => $this->themeService->getThemeInfo($request->get("p"))]);
|
||||
}
|
||||
|
||||
}
|
10
kernel/modules/themes/manifest.json
Normal file
10
kernel/modules/themes/manifest.json
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"name": "Themes",
|
||||
"version": "0.1",
|
||||
"author": "ITGuild",
|
||||
"slug": "themes",
|
||||
"description": "Themes module",
|
||||
"module_class": "kernel\\modules\\themes\\ThemesModule",
|
||||
"module_class_file": "{KERNEL_MODULES}/themes/ThemesModule.php",
|
||||
"routs": "routs/themes.php"
|
||||
}
|
16
kernel/modules/themes/routs/themes.php
Normal file
16
kernel/modules/themes/routs/themes.php
Normal file
@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
use kernel\App;
|
||||
use kernel\modules\admin_themes\controllers\AdminThemeController;
|
||||
use Phroute\Phroute\RouteCollector;
|
||||
|
||||
App::$collector->group(["prefix" => "admin"], function (RouteCollector $router){
|
||||
App::$collector->group(["before" => "auth"], function (RouteCollector $router) {
|
||||
App::$collector->group(["prefix" => "settings"], function (RouteCollector $router) {
|
||||
App::$collector->group(["prefix" => "themes"], function (RouteCollector $router) {
|
||||
App::$collector->get('/', [\kernel\modules\themes\controllers\ThemeController::class, 'actionIndex']);
|
||||
App::$collector->get('/activate', [\kernel\modules\themes\controllers\ThemeController::class, 'actionActivate']);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
25
kernel/modules/themes/views/index.php
Normal file
25
kernel/modules/themes/views/index.php
Normal file
@ -0,0 +1,25 @@
|
||||
<?php
|
||||
/**
|
||||
* @var $json string
|
||||
*/
|
||||
|
||||
|
||||
$table = new \Itguild\Tables\ListJsonTable($json);
|
||||
$table->columns([
|
||||
'preview' => function ($data) {
|
||||
return "<img src='$data' width='200px'>";
|
||||
}
|
||||
]);
|
||||
$table->addAction(function ($row, $url){
|
||||
$active_admin_theme = \kernel\modules\option\service\OptionService::getItem('active_theme');
|
||||
|
||||
if ($row['path'] === $active_admin_theme){
|
||||
return "Активна";
|
||||
} else {
|
||||
$url = "$url/activate/?p=" . $row['path'];
|
||||
|
||||
return \kernel\widgets\IconBtn\IconBtnActivateWidget::create(['url' => $url])->run();
|
||||
}
|
||||
});
|
||||
$table->create();
|
||||
$table->render();
|
25
kernel/modules/themes/views/view.php
Normal file
25
kernel/modules/themes/views/view.php
Normal file
@ -0,0 +1,25 @@
|
||||
<?php
|
||||
/**
|
||||
* @var array $data
|
||||
*/
|
||||
|
||||
$table_info = [
|
||||
"meta" => [
|
||||
"rows" => ["preview" => "Превью", "name" => "Название", "version" => "Версия", "description" => "Описание"],
|
||||
"params" => ["class" => "table table-bordered"],
|
||||
"baseUrl" => "/admin/settings/themes",
|
||||
],
|
||||
"data" => $data
|
||||
];
|
||||
|
||||
$table = new \Itguild\Tables\ViewJsonTable(json_encode($table_info, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
|
||||
$table->rows([
|
||||
'preview' => function ($data) {
|
||||
return "<img src='$data' width='500px'>";
|
||||
}
|
||||
]);
|
||||
$table->beforePrint(function () {
|
||||
return \kernel\widgets\IconBtn\IconBtnListWidget::create(['url' => '/admin/settings/themes'])->run();
|
||||
});
|
||||
$table->create();
|
||||
$table->render();
|
@ -20,7 +20,7 @@ App::$collector->group(["prefix" => "admin"], function (RouteCollector $router){
|
||||
App::$collector->group(["prefix" => "profile"], callback: function (RouteCollector $router) {
|
||||
App::$collector->get('/', [\kernel\modules\user\controllers\UserController::class, 'actionProfile']);
|
||||
App::$collector->get('/update', [\kernel\modules\user\controllers\UserController::class, 'actionProfileUpdate']);
|
||||
App::$collector->post('/edit', [\kernel\modules\user\controllers\UserController::class, 'actionProfileEdit']);
|
||||
App::$collector->any('/edit', [\kernel\modules\user\controllers\UserController::class, 'actionProfileEdit']);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -11,7 +11,11 @@ class UserService
|
||||
|
||||
public function create(FormModel $form_model): false|User
|
||||
{
|
||||
$model = new User();
|
||||
$model = User::where("username", $form_model->getItem('username'))->first();
|
||||
if ($model){
|
||||
return $model;
|
||||
}
|
||||
$model = new User();
|
||||
$model->username = $form_model->getItem('username');
|
||||
$model->email = $form_model->getItem('email');
|
||||
$model->password_hash = password_hash($form_model->getItem('password'), PASSWORD_DEFAULT);
|
||||
|
Reference in New Issue
Block a user