From d3af15c5ac224216d80974749283571c15f2620a Mon Sep 17 00:00:00 2001 From: Kavalar Date: Sun, 20 Jul 2025 15:02:06 +0300 Subject: [PATCH] first prod --- app/modules/view/ViewModule.php | 8 + .../view/controllers/ViewController.php | 8 + app/modules/view/manifest.json | 12 + app/modules/view/routs/view.php | 2 + app/themes/svo/assets/AdminSliderAssets.php | 19 +- app/themes/svo/assets/SvoLpThemeAssets.php | 1 + app/themes/svo/controllers/LpController.php | 15 +- .../svo/controllers/SvoAdminController.php | 27 + app/themes/svo/routs/svo.php | 3 + .../svo/services/MainPageSliderService.php | 90 + app/themes/svo/services/SvoThemeService.php | 34 + .../svo/views/admin/_slider_post_list.php | 3 + app/themes/svo/views/admin/theme_settings.php | 51 +- app/themes/svo/views/lp/post.php | 223 + .../views/widget/admin_slider_posts_list.php | 25 + app/themes/svo/views/widget/main_slider.php | 53 +- .../svo/widgets/AdminSliderPostsList.php | 19 + app/themes/svo/widgets/MainSliderWidget.php | 12 +- bootstrap.php | 2 +- kernel/Assets.php | 20 +- kernel/AssetsCollector.php | 128 + kernel/Theme.php | 15 + kernel/admin_themes/default/layout/main.php | 12 +- kernel/app_modules/view/ViewModule.php | 31 + .../view/controllers/ViewController.php | 98 + .../app_modules/view/interfaces/Viewable.php | 23 + .../2025_07_18_114154_create_view_table.php | 31 + kernel/app_modules/view/models/View.php | 93 + .../view/models/forms/CreateViewForm.php | 25 + kernel/app_modules/view/routs/view.php | 20 + .../app_modules/view/services/ViewService.php | 39 + kernel/app_modules/view/views/form.php | 55 + kernel/app_modules/view/views/index.php | 78 + kernel/app_modules/view/views/view.php | 25 + kernel/helpers/Html.php | 6 + .../modules/option/service/OptionService.php | 35 + kernel/modules/post/service/PostService.php | 5 + resources/themes/svo/Netic-1.0.0/contact.html | 185 + .../themes/svo/Netic-1.0.0/css/.DS_Store | Bin 0 -> 8196 bytes .../svo/Netic-1.0.0/css/animate.min.css | 2 + .../svo/Netic-1.0.0/css/bootstrap-grid.css | 1912 ++ .../Netic-1.0.0/css/bootstrap-grid.css.map | 1 + .../Netic-1.0.0/css/bootstrap-grid.min.css | 7 + .../css/bootstrap-grid.min.css.map | 1 + .../svo/Netic-1.0.0/css/bootstrap-reboot.css | 330 + .../Netic-1.0.0/css/bootstrap-reboot.css.map | 1 + .../Netic-1.0.0/css/bootstrap-reboot.min.css | 8 + .../css/bootstrap-reboot.min.css.map | 1 + .../themes/svo/Netic-1.0.0/css/bootstrap.css | 8950 ++++++++ .../svo/Netic-1.0.0/css/bootstrap.css.map | 1 + .../svo/Netic-1.0.0/css/bootstrap.min.css | 7 + .../svo/Netic-1.0.0/css/bootstrap.min.css.map | 1 + .../svo/Netic-1.0.0/css/default-skin.css | 614 + .../svo/Netic-1.0.0/css/font-awesome.min.css | 4 + .../themes/svo/Netic-1.0.0/css/icomoon.css | 1793 ++ .../themes/svo/Netic-1.0.0/css/jquery-ui.css | 1311 ++ .../Netic-1.0.0/css/jquery.fancybox.min.css | 1 + .../css/jquery.mCustomScrollbar.min.css | 1 + .../themes/svo/Netic-1.0.0/css/meanmenu.css | 179 + .../svo/Netic-1.0.0/css/nice-select.css | 177 + .../themes/svo/Netic-1.0.0/css/normalize.css | 427 + .../svo/Netic-1.0.0/css/owl.carousel.min.css | 6 + .../themes/svo/Netic-1.0.0/css/responsive.css | 636 + .../themes/svo/Netic-1.0.0/css/slick.css | 108 + .../themes/svo/Netic-1.0.0/css/style.css | 1246 + resources/themes/svo/Netic-1.0.0/domain.html | 207 + resources/themes/svo/Netic-1.0.0/hosting.html | 177 + .../svo/Netic-1.0.0/images/banner-bg.png | Bin 0 -> 9074 bytes .../svo/Netic-1.0.0/images/banner-img.png | Bin 0 -> 435853 bytes .../svo/Netic-1.0.0/images/client-img.png | Bin 0 -> 79131 bytes .../svo/Netic-1.0.0/images/hosting-bg.png | Bin 0 -> 472323 bytes .../svo/Netic-1.0.0/images/hosting-img.png | Bin 0 -> 343664 bytes .../themes/svo/Netic-1.0.0/images/icon-1.png | Bin 0 -> 6101 bytes .../themes/svo/Netic-1.0.0/images/icon-2.png | Bin 0 -> 5760 bytes .../themes/svo/Netic-1.0.0/images/icon-3.png | Bin 0 -> 5546 bytes .../themes/svo/Netic-1.0.0/images/icon-4.png | Bin 0 -> 1107 bytes .../themes/svo/Netic-1.0.0/images/icon-5.png | Bin 0 -> 3643 bytes .../themes/svo/Netic-1.0.0/images/icon-6.png | Bin 0 -> 1854 bytes .../themes/svo/Netic-1.0.0/images/icon-7.png | Bin 0 -> 1128 bytes .../themes/svo/Netic-1.0.0/images/icon-9.png | Bin 0 -> 1830 bytes .../themes/svo/Netic-1.0.0/images/logo.png | Bin 0 -> 1765 bytes .../svo/Netic-1.0.0/images/quick-icon.png | Bin 0 -> 1824 bytes resources/themes/svo/Netic-1.0.0/index.html | 527 + resources/themes/svo/Netic-1.0.0/js/.DS_Store | Bin 0 -> 8196 bytes .../svo/Netic-1.0.0/js/bootstrap.bundle.js | 6433 ++++++ .../Netic-1.0.0/js/bootstrap.bundle.js.map | 1 + .../Netic-1.0.0/js/bootstrap.bundle.min.js | 7 + .../js/bootstrap.bundle.min.js.map | 1 + .../themes/svo/Netic-1.0.0/js/bootstrap.js | 3925 ++++ .../svo/Netic-1.0.0/js/bootstrap.js.map | 1 + .../svo/Netic-1.0.0/js/bootstrap.min.js | 7 + .../svo/Netic-1.0.0/js/bootstrap.min.js.map | 1 + resources/themes/svo/Netic-1.0.0/js/custom.js | 363 + .../svo/Netic-1.0.0/js/jquery-3.0.0.min.js | 213 + .../js/jquery.mCustomScrollbar.concat.min.js | 5 + .../themes/svo/Netic-1.0.0/js/jquery.min.js | 5 + .../svo/Netic-1.0.0/js/jquery.validate.js | 1601 ++ .../themes/svo/Netic-1.0.0/js/modernizer.js | 4552 ++++ resources/themes/svo/Netic-1.0.0/js/plugin.js | 18950 ++++++++++++++++ .../themes/svo/Netic-1.0.0/js/popper.min.js | 6 + .../svo/Netic-1.0.0/js/slider-setting.js | 105 + .../themes/svo/Netic-1.0.0/services.html | 287 + .../themes/svo/Netic-1.0.0/testimonial.html | 218 + .../themes/svo/assets/css/netic/posts.css | 111 + .../themes/svo/assets/css/netic/style.css | 8 + resources/themes/svo/slider.js | 8 + 106 files changed, 56912 insertions(+), 63 deletions(-) create mode 100644 app/modules/view/ViewModule.php create mode 100644 app/modules/view/controllers/ViewController.php create mode 100644 app/modules/view/manifest.json create mode 100644 app/modules/view/routs/view.php create mode 100644 app/themes/svo/services/MainPageSliderService.php create mode 100644 app/themes/svo/services/SvoThemeService.php create mode 100644 app/themes/svo/views/admin/_slider_post_list.php create mode 100644 app/themes/svo/views/lp/post.php create mode 100644 app/themes/svo/views/widget/admin_slider_posts_list.php create mode 100644 app/themes/svo/widgets/AdminSliderPostsList.php create mode 100644 kernel/AssetsCollector.php create mode 100644 kernel/Theme.php create mode 100644 kernel/app_modules/view/ViewModule.php create mode 100644 kernel/app_modules/view/controllers/ViewController.php create mode 100644 kernel/app_modules/view/interfaces/Viewable.php create mode 100644 kernel/app_modules/view/migrations/2025_07_18_114154_create_view_table.php create mode 100644 kernel/app_modules/view/models/View.php create mode 100644 kernel/app_modules/view/models/forms/CreateViewForm.php create mode 100644 kernel/app_modules/view/routs/view.php create mode 100644 kernel/app_modules/view/services/ViewService.php create mode 100644 kernel/app_modules/view/views/form.php create mode 100644 kernel/app_modules/view/views/index.php create mode 100644 kernel/app_modules/view/views/view.php create mode 100644 resources/themes/svo/Netic-1.0.0/contact.html create mode 100644 resources/themes/svo/Netic-1.0.0/css/.DS_Store create mode 100644 resources/themes/svo/Netic-1.0.0/css/animate.min.css create mode 100644 resources/themes/svo/Netic-1.0.0/css/bootstrap-grid.css create mode 100644 resources/themes/svo/Netic-1.0.0/css/bootstrap-grid.css.map create mode 100644 resources/themes/svo/Netic-1.0.0/css/bootstrap-grid.min.css create mode 100644 resources/themes/svo/Netic-1.0.0/css/bootstrap-grid.min.css.map create mode 100644 resources/themes/svo/Netic-1.0.0/css/bootstrap-reboot.css create mode 100644 resources/themes/svo/Netic-1.0.0/css/bootstrap-reboot.css.map create mode 100644 resources/themes/svo/Netic-1.0.0/css/bootstrap-reboot.min.css create mode 100644 resources/themes/svo/Netic-1.0.0/css/bootstrap-reboot.min.css.map create mode 100644 resources/themes/svo/Netic-1.0.0/css/bootstrap.css create mode 100644 resources/themes/svo/Netic-1.0.0/css/bootstrap.css.map create mode 100644 resources/themes/svo/Netic-1.0.0/css/bootstrap.min.css create mode 100644 resources/themes/svo/Netic-1.0.0/css/bootstrap.min.css.map create mode 100644 resources/themes/svo/Netic-1.0.0/css/default-skin.css create mode 100644 resources/themes/svo/Netic-1.0.0/css/font-awesome.min.css create mode 100644 resources/themes/svo/Netic-1.0.0/css/icomoon.css create mode 100644 resources/themes/svo/Netic-1.0.0/css/jquery-ui.css create mode 100644 resources/themes/svo/Netic-1.0.0/css/jquery.fancybox.min.css create mode 100644 resources/themes/svo/Netic-1.0.0/css/jquery.mCustomScrollbar.min.css create mode 100644 resources/themes/svo/Netic-1.0.0/css/meanmenu.css create mode 100644 resources/themes/svo/Netic-1.0.0/css/nice-select.css create mode 100644 resources/themes/svo/Netic-1.0.0/css/normalize.css create mode 100644 resources/themes/svo/Netic-1.0.0/css/owl.carousel.min.css create mode 100644 resources/themes/svo/Netic-1.0.0/css/responsive.css create mode 100644 resources/themes/svo/Netic-1.0.0/css/slick.css create mode 100644 resources/themes/svo/Netic-1.0.0/css/style.css create mode 100644 resources/themes/svo/Netic-1.0.0/domain.html create mode 100644 resources/themes/svo/Netic-1.0.0/hosting.html create mode 100644 resources/themes/svo/Netic-1.0.0/images/banner-bg.png create mode 100644 resources/themes/svo/Netic-1.0.0/images/banner-img.png create mode 100644 resources/themes/svo/Netic-1.0.0/images/client-img.png create mode 100644 resources/themes/svo/Netic-1.0.0/images/hosting-bg.png create mode 100644 resources/themes/svo/Netic-1.0.0/images/hosting-img.png create mode 100644 resources/themes/svo/Netic-1.0.0/images/icon-1.png create mode 100644 resources/themes/svo/Netic-1.0.0/images/icon-2.png create mode 100644 resources/themes/svo/Netic-1.0.0/images/icon-3.png create mode 100644 resources/themes/svo/Netic-1.0.0/images/icon-4.png create mode 100644 resources/themes/svo/Netic-1.0.0/images/icon-5.png create mode 100644 resources/themes/svo/Netic-1.0.0/images/icon-6.png create mode 100644 resources/themes/svo/Netic-1.0.0/images/icon-7.png create mode 100644 resources/themes/svo/Netic-1.0.0/images/icon-9.png create mode 100644 resources/themes/svo/Netic-1.0.0/images/logo.png create mode 100644 resources/themes/svo/Netic-1.0.0/images/quick-icon.png create mode 100644 resources/themes/svo/Netic-1.0.0/index.html create mode 100644 resources/themes/svo/Netic-1.0.0/js/.DS_Store create mode 100644 resources/themes/svo/Netic-1.0.0/js/bootstrap.bundle.js create mode 100644 resources/themes/svo/Netic-1.0.0/js/bootstrap.bundle.js.map create mode 100644 resources/themes/svo/Netic-1.0.0/js/bootstrap.bundle.min.js create mode 100644 resources/themes/svo/Netic-1.0.0/js/bootstrap.bundle.min.js.map create mode 100644 resources/themes/svo/Netic-1.0.0/js/bootstrap.js create mode 100644 resources/themes/svo/Netic-1.0.0/js/bootstrap.js.map create mode 100644 resources/themes/svo/Netic-1.0.0/js/bootstrap.min.js create mode 100644 resources/themes/svo/Netic-1.0.0/js/bootstrap.min.js.map create mode 100644 resources/themes/svo/Netic-1.0.0/js/custom.js create mode 100644 resources/themes/svo/Netic-1.0.0/js/jquery-3.0.0.min.js create mode 100644 resources/themes/svo/Netic-1.0.0/js/jquery.mCustomScrollbar.concat.min.js create mode 100644 resources/themes/svo/Netic-1.0.0/js/jquery.min.js create mode 100644 resources/themes/svo/Netic-1.0.0/js/jquery.validate.js create mode 100644 resources/themes/svo/Netic-1.0.0/js/modernizer.js create mode 100644 resources/themes/svo/Netic-1.0.0/js/plugin.js create mode 100644 resources/themes/svo/Netic-1.0.0/js/popper.min.js create mode 100644 resources/themes/svo/Netic-1.0.0/js/slider-setting.js create mode 100644 resources/themes/svo/Netic-1.0.0/services.html create mode 100644 resources/themes/svo/Netic-1.0.0/testimonial.html create mode 100644 resources/themes/svo/assets/css/netic/posts.css create mode 100644 resources/themes/svo/slider.js diff --git a/app/modules/view/ViewModule.php b/app/modules/view/ViewModule.php new file mode 100644 index 0000000..e37befb --- /dev/null +++ b/app/modules/view/ViewModule.php @@ -0,0 +1,8 @@ +registerCSS(slug: "select2", resource: "https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css", addResourceURI: false); + $this->registerCSS( + slug: "select2", + resource: "https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css", + addResourceURI: false, + after: 'bootstrap' + ); } protected function createJS(): void { - $this->registerJS(slug: "select2", resource: "https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js", addResourceURI: false); + $this->registerJS( + slug: "select2", + resource: "https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js", + addResourceURI: false, + after: 'jquery', + ); + $this->registerJS( + slug: "slider", + resource: "/slider.js", + after: 'select2', + ); } } \ No newline at end of file diff --git a/app/themes/svo/assets/SvoLpThemeAssets.php b/app/themes/svo/assets/SvoLpThemeAssets.php index dad7c1c..2b90eef 100644 --- a/app/themes/svo/assets/SvoLpThemeAssets.php +++ b/app/themes/svo/assets/SvoLpThemeAssets.php @@ -11,6 +11,7 @@ class SvoLpThemeAssets extends Assets { $this->registerCSS(slug: "bootstrap", resource: "/css/netic/bootstrap.css"); $this->registerCSS(slug: "style", resource: "/css/netic/style.css"); + $this->registerCSS(slug: "posts", resource: "/css/netic/posts.css"); $this->registerCSS(slug: "responsive", resource: "/css/netic/responsive.css"); $this->registerCSS(slug: "mCustomScrollbar", resource: "/css/netic/jquery.mCustomScrollbar.min.css"); } diff --git a/app/themes/svo/controllers/LpController.php b/app/themes/svo/controllers/LpController.php index 5c304b2..984bdc7 100644 --- a/app/themes/svo/controllers/LpController.php +++ b/app/themes/svo/controllers/LpController.php @@ -2,13 +2,18 @@ namespace app\themes\svo\controllers; +use app\themes\svo\services\MainPageSliderService; use kernel\Controller; +use kernel\helpers\Debug; +use kernel\modules\post\models\Post; +use kernel\modules\post\service\PostService; use kernel\modules\user\service\UserService; class LpController extends Controller { protected \kernel\modules\user\models\User $user; + protected MainPageSliderService $mainPageSliderService; protected function init(): void { @@ -19,6 +24,7 @@ class LpController extends Controller $this->cgView->addVarToLayout("resources", "/resources/themes/svo/assets"); $user = UserService::getAuthUser(); + $this->mainPageSliderService = new MainPageSliderService(); if ($user){ $this->cgView->addVarToLayout("currentUser", $user); $this->user = $user; @@ -27,7 +33,14 @@ class LpController extends Controller public function actionIndex(): void { - $this->cgView->render('index.php'); + $this->cgView->render('index.php', []); + } + + public function actionPost(int $postId): void + { + $post = Post::find($postId); + + $this->cgView->render('post.php', ['post' => $post]); } } \ No newline at end of file diff --git a/app/themes/svo/controllers/SvoAdminController.php b/app/themes/svo/controllers/SvoAdminController.php index b87e69f..44b1474 100644 --- a/app/themes/svo/controllers/SvoAdminController.php +++ b/app/themes/svo/controllers/SvoAdminController.php @@ -2,7 +2,13 @@ namespace app\themes\svo\controllers; +use app\themes\svo\services\MainPageSliderService; +use app\themes\svo\services\SvoThemeService; +use JetBrains\PhpStorm\NoReturn; use kernel\AdminController; +use kernel\Flash; +use kernel\helpers\Debug; +use kernel\Request; class SvoAdminController extends AdminController { @@ -11,6 +17,7 @@ class SvoAdminController extends AdminController { parent::init(); $this->cgView->viewPath = APP_DIR . "/themes/svo/views/admin/"; + $this->cgView->addVarToLayout("svo_theme_resources", "/resources/themes/svo"); } public function actionThemeSettings(): void @@ -18,4 +25,24 @@ class SvoAdminController extends AdminController $this->cgView->render('theme_settings.php'); } + #[NoReturn] public function actionAddSlide(): void + { + $request = new Request(); + $slideId = $request->post('slide'); + + SvoThemeService::addPostSlide($slideId); + + Flash::setMessage('success', 'Слайд добавлен.'); + $this->redirect('/admin/svo-theme/settings?tab=slider', 302); + } + + #[NoReturn] public function actionDeleteSlide(int $post_id): void + { + $mainPageSlideService = new MainPageSliderService(); + $mainPageSlideService->removeSlide($post_id); + + Flash::setMessage('success', 'Слайд удален.'); + $this->redirect('/admin/svo-theme/settings?tab=slider', 302); + } + } \ No newline at end of file diff --git a/app/themes/svo/routs/svo.php b/app/themes/svo/routs/svo.php index fc5e427..c7968cf 100644 --- a/app/themes/svo/routs/svo.php +++ b/app/themes/svo/routs/svo.php @@ -6,11 +6,14 @@ use kernel\CgRouteCollector; App::$collector->filter("auth", [\app\themes\svo\middlewares\LkAuthMiddleware::class, "handler"]); App::$collector->get('/', [\app\themes\svo\controllers\LpController::class, 'actionIndex']); +App::$collector->get('/post/{postId}', [\app\themes\svo\controllers\LpController::class, 'actionPost']); App::$collector->group(["prefix" => "admin"], function (CgRouteCollector $router) { App::$collector->group(["before" => "auth"], function (CGRouteCollector $router) { App::$collector->group(["prefix" => "svo-theme"], function (CGRouteCollector $router) { App::$collector->get('/settings', [\app\themes\svo\controllers\SvoAdminController::class, 'actionThemeSettings']); + App::$collector->get('/delete_slide/{post_id}', [\app\themes\svo\controllers\SvoAdminController::class, 'actionDeleteSlide']); + App::$collector->post('/add_slide', [\app\themes\svo\controllers\SvoAdminController::class, 'actionAddSlide']); }); }); }); diff --git a/app/themes/svo/services/MainPageSliderService.php b/app/themes/svo/services/MainPageSliderService.php new file mode 100644 index 0000000..a510f62 --- /dev/null +++ b/app/themes/svo/services/MainPageSliderService.php @@ -0,0 +1,90 @@ +optionService = new OptionService(); + } + + /** + * Получить список слайдов + * + * @return array + */ + public function getSlides(): array + { + $option = Option::where('key', $this->sliderKey)->first(); + + if (!$option || empty($option->value)) { + return []; + } + + $data = json_decode($option->value, true); + + return $data['ids'] ?? []; + } + + /** + * Добавить слайд + * + * @param int $slideId + * @return bool + */ + public function addSlide(int $slideId): bool + { + return App::$db->capsule::connection()->transaction(function () use ($slideId) { + $option = Option::firstOrNew(['key' => $this->sliderKey]); + + $currentValue = $option->value ? json_decode($option->value, true) : ['ids' => []]; + + if (in_array($slideId, $currentValue['ids'])) { + return true; // слайд уже есть, ничего не делаем + } + + $currentValue['ids'][] = $slideId; + $option->value = json_encode($currentValue); + + return $option->save(); + }); + } + + /** + * Удалить слайд + * + * @param int $slideId + * @return bool + */ + public function removeSlide(int $slideId): bool + { + return App::$db->capsule::connection()->transaction(function () use ($slideId) { + /** @var Option $option */ + $option = Option::where('key', $this->sliderKey)->first(); + + if (!$option || empty($option->value)) { + return false; + } + + $currentValue = json_decode($option->value, true); + + if (!in_array($slideId, $currentValue['ids'] ?? [])) { + return false; // слайда нет в списке + } + + $currentValue['ids'] = array_diff($currentValue['ids'], [$slideId]); + $option->value = json_encode($currentValue); + + return $option->save(); + }); + } +} \ No newline at end of file diff --git a/app/themes/svo/services/SvoThemeService.php b/app/themes/svo/services/SvoThemeService.php new file mode 100644 index 0000000..16da503 --- /dev/null +++ b/app/themes/svo/services/SvoThemeService.php @@ -0,0 +1,34 @@ +get(); + } + + public static function addPostSlide(int $postId) + { + $slides = json_decode(OptionService::getItem('main_news_slider'), true); + + if (!in_array($postId, $slides['ids'])) { + $slides['ids'][] = $postId; + OptionService::createOrUpdate('main_news_slider', json_encode($slides)); + } + + return $slides; + } + + + +} \ No newline at end of file diff --git a/app/themes/svo/views/admin/_slider_post_list.php b/app/themes/svo/views/admin/_slider_post_list.php new file mode 100644 index 0000000..808bcce --- /dev/null +++ b/app/themes/svo/views/admin/_slider_post_list.php @@ -0,0 +1,3 @@ + +Посты diff --git a/app/themes/svo/views/admin/theme_settings.php b/app/themes/svo/views/admin/theme_settings.php index dcc71d1..9de2dd9 100644 --- a/app/themes/svo/views/admin/theme_settings.php +++ b/app/themes/svo/views/admin/theme_settings.php @@ -1,24 +1,28 @@ registerAsset(new \app\themes\svo\assets\AdminSliderAssets($svo_theme_resources)); ?>