From da77807b81cb41b54d5362e7fba7be4a09d98f2f Mon Sep 17 00:00:00 2001 From: stasbilay02 Date: Fri, 6 Sep 2024 16:53:20 +0300 Subject: [PATCH] add modules and upload file --- app/controllers/AnswerController.php | 32 ------ app/controllers/MenuController.php | 106 ------------------ app/controllers/QuestionController.php | 36 ------ app/models/Answer.php | 14 --- app/models/Question.php | 22 ---- kernel/FileUpload.php | 51 +++++++++ kernel/IGTabel/EloquentDataProvider.php | 78 ------------- kernel/IGTabel/JSONCreator.php | 40 ------- .../ListJsonTableEloquentCollection.php | 42 ------- kernel/IGTabel/ViewJsonTableEloquentModel.php | 37 ------ .../menu/controllers/MenuController.php | 29 +++-- .../modules/menu/service}/MenuService.php | 42 ++++++- kernel/modules/menu/views/form.php | 2 +- .../post}/controllers/PostController.php | 39 +++---- {app => kernel/modules/post}/models/Post.php | 2 +- .../modules/post/service}/PostService.php | 4 +- .../modules/post/views}/form.php | 4 +- .../modules/post/views}/index.php | 4 +- .../modules/post/views}/view.php | 2 +- .../user}/controllers/UserController.php | 35 +++--- {app => kernel/modules/user}/models/User.php | 2 +- .../modules/user/service}/UserService.php | 4 +- .../modules/user/views}/form.php | 2 +- .../modules/user/views}/index.php | 2 +- .../modules/user/views}/view.php | 2 +- kernel/routs/admin.php | 32 +++--- kernel/services/MenuService.php | 49 -------- .../40/5c4044ac0df8411aaf0dbdb41846dc29.png | Bin 0 -> 25517 bytes .../bb/71bbe61dded4fb0ba8269540c6989974.png | Bin 0 -> 18476 bytes views/admin/menu/form.php | 78 ------------- views/admin/menu/index.php | 35 ------ views/admin/menu/view.php | 46 -------- views/main_layout.html.twig | 19 ---- views/question_create.html.twig | 13 --- views/user_create.html.twig | 23 ---- views/user_table.html.twig | 5 - views/user_update.html.twig | 23 ---- views/widgets/admin/menu.php | 6 +- 38 files changed, 180 insertions(+), 782 deletions(-) delete mode 100644 app/controllers/AnswerController.php delete mode 100644 app/controllers/MenuController.php delete mode 100644 app/controllers/QuestionController.php delete mode 100644 app/models/Answer.php delete mode 100644 app/models/Question.php create mode 100644 kernel/FileUpload.php delete mode 100644 kernel/IGTabel/EloquentDataProvider.php delete mode 100644 kernel/IGTabel/JSONCreator.php delete mode 100644 kernel/IGTabel/ListJsonTableEloquentCollection.php delete mode 100644 kernel/IGTabel/ViewJsonTableEloquentModel.php rename {app/services => kernel/modules/menu/service}/MenuService.php (59%) rename {app => kernel/modules/post}/controllers/PostController.php (64%) rename {app => kernel/modules/post}/models/Post.php (94%) rename {app/services => kernel/modules/post/service}/PostService.php (89%) rename {views/admin/post => kernel/modules/post/views}/form.php (92%) rename {views/admin/post => kernel/modules/post/views}/index.php (93%) rename {views/admin/post => kernel/modules/post/views}/view.php (95%) rename {app => kernel/modules/user}/controllers/UserController.php (72%) rename {app => kernel/modules/user}/models/User.php (94%) rename {app/services => kernel/modules/user/service}/UserService.php (93%) rename {views/admin/user => kernel/modules/user/views}/form.php (97%) rename {views/admin/user => kernel/modules/user/views}/index.php (96%) rename {views/admin/user => kernel/modules/user/views}/view.php (95%) delete mode 100644 kernel/services/MenuService.php create mode 100644 resources/upload/5c/40/5c4044ac0df8411aaf0dbdb41846dc29.png create mode 100644 resources/upload/71/bb/71bbe61dded4fb0ba8269540c6989974.png delete mode 100644 views/admin/menu/form.php delete mode 100644 views/admin/menu/index.php delete mode 100644 views/admin/menu/view.php delete mode 100644 views/main_layout.html.twig delete mode 100644 views/question_create.html.twig delete mode 100644 views/user_create.html.twig delete mode 100644 views/user_table.html.twig delete mode 100644 views/user_update.html.twig diff --git a/app/controllers/AnswerController.php b/app/controllers/AnswerController.php deleted file mode 100644 index 3482afa..0000000 --- a/app/controllers/AnswerController.php +++ /dev/null @@ -1,32 +0,0 @@ -$answer,'question_id'=>$question_id,'user_id'=>$user_id]); - } - public static function actionUpvoteAnswer($answer_id,$user_id) - { - return Upvote::create(['answer_id'=>$answer_id,'user_id'=>$user_id]); - } - - public function actionUpdateAnswer($answer_id,$new_answer) - { - $answer = Answer::find($answer_id); - $answer->answer = $new_answer; - return $answer->save(); - } - - public function actionViewAllAnswers(): void - { - foreach (Answer::all() as $answer) - { - echo $answer->answer . "
"; - } - } -} \ No newline at end of file diff --git a/app/controllers/MenuController.php b/app/controllers/MenuController.php deleted file mode 100644 index 75145bb..0000000 --- a/app/controllers/MenuController.php +++ /dev/null @@ -1,106 +0,0 @@ -cgView->viewPath = ROOT_DIR . "/views/admin/"; - $this->cgView->layout = "layouts/main.php"; - } - - public function actionCreate(): void - { - $this->cgView->render("menu/form.php"); - } - - #[NoReturn] public function actionAdd(): void - { - $menuForm = new CreateMenuForm(); - $menuService = new MenuService(); - $menuForm->load($_REQUEST); - if ($menuForm->validate()){ - $menuItem = $menuService->create($menuForm); - if ($menuItem){ - $this->redirect("/admin/menu/" . $menuItem->id); - } - } - $this->redirect("/admin/menu/create"); - } - - /** - * @throws Exception - */ - public function actionIndex($page_number = 1): void - { - $this->cgView->render("menu/index.php", ['page_number' => $page_number]); - } - - /** - * @throws Exception - */ - public function actionView($id): void - { - $menuItem = Menu::find($id); - - if (!$menuItem){ - throw new Exception(message: "The menu item not found"); - } - $this->cgView->render("menu/view.php", ['menu' => $menuItem]); - } - - /** - * @throws RuntimeError - * @throws SyntaxError - * @throws LoaderError|Exception - */ - public function actionUpdate($id): void - { - $model = Menu::find($id); - if (!$model){ - throw new Exception(message: "The menu item not found"); - } - - $this->cgView->render("menu/form.php", ['model' => $model]); - } - - /** - * @throws Exception - */ - public function actionEdit($id): void - { - $menuItem = Menu::find($id); - if (!$menuItem){ - throw new Exception(message: "The menu item not found"); - } - $menuForm = new CreateMenuForm(); - $menuService = new MenuService(); - $menuForm->load($_REQUEST); - if ($menuForm->validate()){ - $menuItem = $menuService->update($menuForm, $menuItem); - if ($menuItem){ - $this->redirect("/admin/menu/" . $menuItem->id); - } - } - $this->redirect("/admin/menu/update/" . $id); - } - - #[NoReturn] public function actionDelete($id): void - { - Menu::find($id)->delete(); - $this->redirect("/admin/menu/"); - } - -} \ No newline at end of file diff --git a/app/controllers/QuestionController.php b/app/controllers/QuestionController.php deleted file mode 100644 index 2dfaf3a..0000000 --- a/app/controllers/QuestionController.php +++ /dev/null @@ -1,36 +0,0 @@ -twig->render('question_create.html.twig'); - } - - public function actionGetQuestionsWithAnswers(): array - { - return Question::with('AnswerController')->get()->toArray(); - } - - public function actionGetQuestionsWithUsers(): array - { - return Question::with('user')->get()->toArray(); - } - - public function actionGetQuestionAnswersUpvotes($question_id) - { - return Question::find($question_id)->answers()->with('upvotes')->get()->toArray(); - } - - public function actionViewAllQuestions() - { - foreach (Question::all() as $question) - { - echo $question->question. "
"; - } - } -} \ No newline at end of file diff --git a/app/models/Answer.php b/app/models/Answer.php deleted file mode 100644 index 593e156..0000000 --- a/app/models/Answer.php +++ /dev/null @@ -1,14 +0,0 @@ -hasMany('\Models\Upvote'); - } -} \ No newline at end of file diff --git a/app/models/Question.php b/app/models/Question.php deleted file mode 100644 index 4f3b28d..0000000 --- a/app/models/Question.php +++ /dev/null @@ -1,22 +0,0 @@ -hasMany('\Models\Answer'); - } - - public function user() - { - return $this->belongsTo('\Models\User'); - } -} \ No newline at end of file diff --git a/kernel/FileUpload.php b/kernel/FileUpload.php new file mode 100644 index 0000000..1f72ec6 --- /dev/null +++ b/kernel/FileUpload.php @@ -0,0 +1,51 @@ +fileTmpPath = $file['tmp_name']; + $this->fileName = $file['name']; + $this->fileSize = $file['size']; + $this->fileType = $file['type']; + $this->fileNameCmps = explode('.', $this->fileName); + $this->fileExtension = strtolower(end($this->fileNameCmps)); + } + + public function setNewFileName(): void + { + $this->newFileName = md5(time() . $this->fileName) . '.' . $this->fileExtension; + } + + public function checkExtension(): void + { + + } + + public function upload(): void + { + $this->newFileName = md5(time() . $this->fileName) . '.' . $this->fileExtension; + if (in_array($this->fileExtension, $this->allowedFileExtensions)) { + mkdir('./resources/upload/' . mb_substr($this->newFileName, 0, 2) . '/' . mb_substr($this->newFileName, 2, 2) . '/', 0777, true); + $uploadFileDir = './resources/upload/' . mb_substr($this->newFileName, 0, 2) . '/' . mb_substr($this->newFileName, 2, 2) . '/'; + $dest_path = $uploadFileDir . $this->newFileName; + move_uploaded_file($this->fileTmpPath, $dest_path); + } else { + echo "Ниченр не получилочь :("; + } + } + +} \ No newline at end of file diff --git a/kernel/IGTabel/EloquentDataProvider.php b/kernel/IGTabel/EloquentDataProvider.php deleted file mode 100644 index 2efe235..0000000 --- a/kernel/IGTabel/EloquentDataProvider.php +++ /dev/null @@ -1,78 +0,0 @@ -queryBuilder = $source::query(); -// $model = new $source(); -// } elseif (is_object($source)) { -// $this->queryBuilder = $source; -// $model = $source->getModel(); -// } else { -// throw new Exception(message: "source is not valid"); -// } -// $this->options = $options; -// $this->currentPage = $this->options['currentPage'] ?? 1; -// $this->perPage = $this->options['perPage'] ?? 10; -// $this->meta['total'] = $model->count(); -// $this->meta['totalWithFilters'] = $this->queryBuilder->count(); -// $this->meta['columns'] = $options['columns'] ?? $model->labels(); -// $this->meta['perPage'] = $options['perPage'] ?? 10; -// $this->meta['currentPage'] = $options['currentPage'] ?? 1; -// $this->meta['baseUrl'] = $options['baseUrl'] ?? $model->table; -// $this->meta['params'] = $options['params'] ?? []; -// $this->meta['actions'] = $options['actions'] ?? []; -// $this->createQuery(); -// -// $this->jsonStr = (new JSONCreator($this->meta, $this->getCollection()->toArray()))->getJson(); -// -// } -// -// public function createQuery(): void -// { -// if ($this->currentPage > 1) { -// $this->queryBuilder->skip(($this->currentPage - 1) * $this->perPage)->take($this->perPage); -// } else { -// $this->queryBuilder->take($this->perPage); -// } -// } -// -// public function getCollection() -// { -// return $this->queryBuilder->get(); -// } -// -// /** -// * @return string|null -// */ -// public function getJson(): string|null -// { -// return $this->jsonStr; -// } -// -//} \ No newline at end of file diff --git a/kernel/IGTabel/JSONCreator.php b/kernel/IGTabel/JSONCreator.php deleted file mode 100644 index 8a8da5a..0000000 --- a/kernel/IGTabel/JSONCreator.php +++ /dev/null @@ -1,40 +0,0 @@ - "table table-bordered", "border" => "1"] : $meta['params']; -// if ($meta) { -// $this->informationArray = [ -// "meta" => $meta, -// "data" => $data ?? [] -// ]; -// } -// } -// -// /** -// * @param array $infArr -// * @return string|null -// */ -// protected function toJson(array $infArr): ?string -// { -// if ($infArr) -// return json_encode($infArr, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); -// return null; -// } -// -// /** -// * @return string|null -// */ -// public function getJson(): ?string -// { -// return $this->toJson($this->informationArray); -// } -//} \ No newline at end of file diff --git a/kernel/IGTabel/ListJsonTableEloquentCollection.php b/kernel/IGTabel/ListJsonTableEloquentCollection.php deleted file mode 100644 index 32c86a9..0000000 --- a/kernel/IGTabel/ListJsonTableEloquentCollection.php +++ /dev/null @@ -1,42 +0,0 @@ -meta['columns'] = $params['columns'] ?? $model->labels(); -// $this->meta['perPage'] = $params['perPage'] ?? 10; -// $this->meta['currentPage'] = $params['currentPage'] ?? 1; -// $this->meta['baseUrl'] = $params['baseUrl'] ?? $model->table; -// $this->meta['params'] = $params['params'] ?? []; -// $this->meta['actions'] = $params['actions'] ?? []; -// -// $this->jsonStr = (new JSONCreator($this->meta, $collection->toArray()))->getJson(); -// } -// -// /** -// * @return string|null -// */ -// public function getJson(): string|null -// { -// return $this->jsonStr; -// } -// -//} \ No newline at end of file diff --git a/kernel/IGTabel/ViewJsonTableEloquentModel.php b/kernel/IGTabel/ViewJsonTableEloquentModel.php deleted file mode 100644 index 8915be7..0000000 --- a/kernel/IGTabel/ViewJsonTableEloquentModel.php +++ /dev/null @@ -1,37 +0,0 @@ -meta['rows'] = $params['rows'] ?? $model->labels(); -// $this->meta['baseUrl'] = $params['baseUrl'] ?? $model->table; -// $this->meta['params'] = $params['params'] ?? []; -// $this->meta['actions'] = $params['actions'] ?? []; -// -//// $this->jsonStr = (new JSONCreator($this->meta, $model->toArray()))->getJson(); -// $model = $model->toArray(); -// if(isset($model['user_id'])) -// { -// $model['user_id'] = User::find($model['user_id'])->username; -// } -// -// $this->jsonStr = (new JSONCreator($this->meta, $model))->getJson(); -// } -// -// public function getJson(): ?string -// { -// return $this->jsonStr; -// } -// -//} \ No newline at end of file diff --git a/kernel/modules/menu/controllers/MenuController.php b/kernel/modules/menu/controllers/MenuController.php index 3c8b239..8075d3d 100644 --- a/kernel/modules/menu/controllers/MenuController.php +++ b/kernel/modules/menu/controllers/MenuController.php @@ -4,22 +4,26 @@ namespace kernel\modules\menu\controllers; use app\helpers\Debug; use app\models\forms\CreateMenuForm; -use app\services\MenuService; +use kernel\FileUpload; +use kernel\modules\menu\service\MenuService; use Exception; use JetBrains\PhpStorm\NoReturn; +use kernel\AdminController; use kernel\Controller; use kernel\models\Menu; use Twig\Error\LoaderError; use Twig\Error\RuntimeError; use Twig\Error\SyntaxError; -class MenuController extends Controller +class MenuController extends AdminController { + private MenuService $menuService; + protected function init(): void { + parent::init(); $this->cgView->viewPath = KERNEL_MODULES_DIR . "/menu/views/"; - $this->cgView->layoutPath = ROOT_DIR . "/views/admin/"; - $this->cgView->layout = "layouts/main.php"; + $this->menuService = new MenuService(); } public function actionCreate(): void @@ -29,11 +33,15 @@ class MenuController extends Controller #[NoReturn] public function actionAdd(): void { + if (isset($_FILES['icon_file']) && $_FILES['icon_file']['error'] === UPLOAD_ERR_OK) { + $file = new FileUpload($_FILES['icon_file']); + $file->upload(); + } + $menuForm = new CreateMenuForm(); - $menuService = new MenuService(); $menuForm->load($_REQUEST); if ($menuForm->validate()){ - $menuItem = $menuService->create($menuForm); + $menuItem = $this->menuService->create($menuForm); if ($menuItem){ $this->redirect("/admin/settings/menu/" . $menuItem->id); } @@ -82,15 +90,20 @@ class MenuController extends Controller */ public function actionEdit($id): void { +// Debug::prn($_REQUEST); +// Debug::prn($_FILES); $menuItem = Menu::find($id); if (!$menuItem){ throw new Exception(message: "The menu item not found"); } + if (isset($_FILES['icon_file']) && $_FILES['icon_file']['error'] === UPLOAD_ERR_OK) { + $file = new FileUpload($_FILES['icon_file']); + $file->upload(); + } $menuForm = new CreateMenuForm(); - $menuService = new MenuService(); $menuForm->load($_REQUEST); if ($menuForm->validate()){ - $menuItem = $menuService->update($menuForm, $menuItem); + $menuItem = $this->menuService->update($menuForm, $menuItem); if ($menuItem){ $this->redirect("/admin/settings/menu/" . $menuItem->id); } diff --git a/app/services/MenuService.php b/kernel/modules/menu/service/MenuService.php similarity index 59% rename from app/services/MenuService.php rename to kernel/modules/menu/service/MenuService.php index 5dce0b6..6101f63 100644 --- a/app/services/MenuService.php +++ b/kernel/modules/menu/service/MenuService.php @@ -1,14 +1,13 @@ get(); + if (!$collection->isEmpty()){ + return $collection; + } + return false; + } + + public static function hasActiveChild(int $id): bool + { + $child = self::getChild($id); + if (!$child->isEmpty()){ + foreach ($child as $item){ +// if ($item->url === \kernel\Request::getUrlPath()){ +// return true; +// } + if (strripos(Request::getUrlPath(), $item->url) !== false) { + return true; + } + } + } + + return false; + } + + public static function isActive($url): bool + { + if ($url === Request::getUrlPath()){ + return true; + } else { + if (strripos(\kernel\Request::getUrlPath(), ($url . "/page")) !== false) { + return true; + } + } + return false; + } } \ No newline at end of file diff --git a/kernel/modules/menu/views/form.php b/kernel/modules/menu/views/form.php index bd4bc63..dc35eef 100644 --- a/kernel/modules/menu/views/form.php +++ b/kernel/modules/menu/views/form.php @@ -13,7 +13,7 @@ $form->field(class: \itguild\forms\inputs\Select::class, name: "parent_id", para 'value' => $model->parent_id ?? '' ]) ->setLabel("Родительский пункт меню") - ->setOptions(\app\services\MenuService::createLabelArr()) + ->setOptions(\kernel\modules\menu\service\MenuService::createLabelArr()) ->render(); $form->field(class: \itguild\forms\inputs\File::class, name: "icon_file", params: [ diff --git a/app/controllers/PostController.php b/kernel/modules/post/controllers/PostController.php similarity index 64% rename from app/controllers/PostController.php rename to kernel/modules/post/controllers/PostController.php index 1a309da..10c10c7 100644 --- a/app/controllers/PostController.php +++ b/kernel/modules/post/controllers/PostController.php @@ -1,37 +1,36 @@ cgView->viewPath = ROOT_DIR . "/views/admin/"; - $this->cgView->layout = "layouts/main.php"; + $this->cgView->viewPath = KERNEL_MODULES_DIR . "/post/views/"; + $this->postService = new PostService(); } public function actionCreate(): void { - $this->cgView->render("post/form.php"); + $this->cgView->render("form.php"); } #[NoReturn] public function actionAdd(): void { $postForm = new CreatePostForm(); - $postService = new PostService(); $postForm->load($_REQUEST); if ($postForm->validate()) { - $post = $postService->create($postForm); + $post = $this->postService->create($postForm); if ($post) { $this->redirect("/admin/post/" . $post->id); } @@ -45,7 +44,7 @@ class PostController extends Controller public function actionIndex($page_number = 1): void { - $this->cgView->render("post/index.php", ['page_number' => $page_number]); + $this->cgView->render("index.php", ['page_number' => $page_number]); } /** @@ -58,7 +57,7 @@ class PostController extends Controller if (!$content){ throw new Exception(message: "The post not found"); } - $this->cgView->render("post/view.php", ['content' => $content]); + $this->cgView->render("view.php", ['content' => $content]); } /** @@ -71,7 +70,7 @@ class PostController extends Controller throw new Exception(message: "The post not found"); } - $this->cgView->render("post/form.php", ['model' => $model]); + $this->cgView->render("form.php", ['model' => $model]); } /** @@ -86,12 +85,10 @@ class PostController extends Controller $postForm = new CreatePostForm(); $postService = new PostService(); $postForm->load($_REQUEST); - if((new UserService)->check($_REQUEST['user_id'])) { - if ($postForm->validate()) { - $post = $postService->update($postForm, $post); - if ($post) { - $this->redirect("/admin/post/" . $post->id); - } + if ($postForm->validate()) { + $post = $postService->update($postForm, $post); + if ($post) { + $this->redirect("/admin/post/" . $post->id); } } $this->redirect("/admin/post/update/" . $id); diff --git a/app/models/Post.php b/kernel/modules/post/models/Post.php similarity index 94% rename from app/models/Post.php rename to kernel/modules/post/models/Post.php index 175edc7..c2ae704 100644 --- a/app/models/Post.php +++ b/kernel/modules/post/models/Post.php @@ -1,6 +1,6 @@ beginForm(isset($model) ? "/admin/post/edit/" . $model->id : "/admin/post"); @@ -21,7 +21,7 @@ $form->field(class: \itguild\forms\inputs\Select::class, name: "user_id", params 'value' => $model->user_id ?? '' ]) ->setLabel("Пользователи") - ->setOptions(\app\services\UserService::createUsernameArr()) + ->setOptions(\kernel\modules\user\service\UserService::createUsernameArr()) ->render(); ?> diff --git a/views/admin/post/index.php b/kernel/modules/post/views/index.php similarity index 93% rename from views/admin/post/index.php rename to kernel/modules/post/views/index.php index c2b760b..8b29982 100644 --- a/views/admin/post/index.php +++ b/kernel/modules/post/views/index.php @@ -5,8 +5,8 @@ * @var int $page_number */ -use app\models\Post; -use app\models\User; +use kernel\modules\post\models\Post; +use kernel\modules\user\models\User; use app\tables\columns\post\PostDeleteActionColumn; use app\tables\columns\post\PostEditActionColumn; use app\tables\columns\post\PostViewActionColumn; diff --git a/views/admin/post/view.php b/kernel/modules/post/views/view.php similarity index 95% rename from views/admin/post/view.php rename to kernel/modules/post/views/view.php index 410201f..13837b1 100644 --- a/views/admin/post/view.php +++ b/kernel/modules/post/views/view.php @@ -4,7 +4,7 @@ * @var \Illuminate\Database\Eloquent\Collection $content */ -use app\models\User; +use kernel\modules\user\models\User; use Itguild\EloquentTable\ViewEloquentTable; use Itguild\EloquentTable\ViewJsonTableEloquentModel; use kernel\IGTabel\btn\DangerBtn; diff --git a/app/controllers/UserController.php b/kernel/modules/user/controllers/UserController.php similarity index 72% rename from app/controllers/UserController.php rename to kernel/modules/user/controllers/UserController.php index 76fa475..dff504b 100644 --- a/app/controllers/UserController.php +++ b/kernel/modules/user/controllers/UserController.php @@ -1,11 +1,11 @@ cgView->viewPath = ROOT_DIR . "/views/admin/"; - $this->cgView->layout = "layouts/main.php"; + parent::init(); + $this->cgView->viewPath = KERNEL_MODULES_DIR . "/user/views/"; + $this->userService = new UserService(); } public function actionCreate(): void { - $this->cgView->render("user/form.php"); + $this->cgView->render("form.php"); } #[NoReturn] public function actionAdd(): void { $userForm = new CreateUserForm(); - $userService = new UserService(); $userForm->load($_REQUEST); if ($userForm->validate()){ - $user = $userService->create($userForm); + $user = $this->userService->create($userForm); if ($user){ $this->redirect("/admin/user/" . $user->id); } @@ -39,17 +43,12 @@ class UserController extends Controller{ $this->redirect("/admin/user/create"); } - public function actionQuestionCount($user_id) - { - return Question::where('user_id', $user_id)->count(); - } - /** * @throws \Exception */ public function actionIndex($page_number = 1): void { - $this->cgView->render("user/index.php", ['page_number' => $page_number]); + $this->cgView->render("index.php", ['page_number' => $page_number]); } /** @@ -62,7 +61,7 @@ class UserController extends Controller{ if (!$user){ throw new Exception(message: "The user not found"); } - $this->cgView->render("user/view.php", ['user' => $user]); + $this->cgView->render("view.php", ['user' => $user]); } /** @@ -77,7 +76,7 @@ class UserController extends Controller{ throw new Exception(message: "The user not found"); } - $this->cgView->render("user/form.php", ['model' => $model]); + $this->cgView->render("form.php", ['model' => $model]); } /** diff --git a/app/models/User.php b/kernel/modules/user/models/User.php similarity index 94% rename from app/models/User.php rename to kernel/modules/user/models/User.php index 546cc93..f6a37c7 100644 --- a/app/models/User.php +++ b/kernel/modules/user/models/User.php @@ -1,5 +1,5 @@ beginForm(isset($model) ? "/admin/user/edit/" . $model->id : "/admin/user"); diff --git a/views/admin/user/index.php b/kernel/modules/user/views/index.php similarity index 96% rename from views/admin/user/index.php rename to kernel/modules/user/views/index.php index 4723cc2..d551c89 100644 --- a/views/admin/user/index.php +++ b/kernel/modules/user/views/index.php @@ -4,13 +4,13 @@ * @var int $page_number */ -use app\models\User; use app\tables\columns\user\UserDeleteActionColumn; use app\tables\columns\user\UserEditActionColumn; use app\tables\columns\user\UserViewActionColumn; use Itguild\EloquentTable\EloquentDataProvider; use Itguild\EloquentTable\ListEloquentTable; use kernel\IGTabel\btn\PrimaryBtn; +use kernel\modules\user\models\User; $table = new ListEloquentTable(new EloquentDataProvider(User::class, [ 'currentPage' => $page_number, diff --git a/views/admin/user/view.php b/kernel/modules/user/views/view.php similarity index 95% rename from views/admin/user/view.php rename to kernel/modules/user/views/view.php index 67fee01..fc8293b 100644 --- a/views/admin/user/view.php +++ b/kernel/modules/user/views/view.php @@ -4,7 +4,7 @@ * @var \Illuminate\Database\Eloquent\Collection $user */ -use app\models\User; +use kernel\modules\user\models\User; use Itguild\EloquentTable\ViewEloquentTable; use Itguild\EloquentTable\ViewJsonTableEloquentModel; use kernel\IGTabel\btn\DangerBtn; diff --git a/kernel/routs/admin.php b/kernel/routs/admin.php index aa9e7fc..9c8c18a 100644 --- a/kernel/routs/admin.php +++ b/kernel/routs/admin.php @@ -8,24 +8,24 @@ use Phroute\Phroute\RouteCollector; App::$collector->group(["prefix" => "admin"], function (RouteCollector $router){ App::$collector->group(["prefix" => "user"], callback: function (RouteCollector $router){ - App::$collector->get('/', [\app\controllers\UserController::class, 'actionIndex']); - App::$collector->get('/page/{page_number}', [\app\controllers\UserController::class, 'actionIndex']); - App::$collector->get('/create', [\app\controllers\UserController::class, 'actionCreate']); - App::$collector->post("/", [\app\controllers\UserController::class, 'actionAdd']); - App::$collector->get('/{id}', [\app\controllers\UserController::class, 'actionView']); - App::$collector->any('/update/{id}', [\app\controllers\UserController::class, 'actionUpdate']); - App::$collector->any("/edit/{id}", [\app\controllers\UserController::class, 'actionEdit']); - App::$collector->get('/delete/{id}', [\app\controllers\UserController::class, 'actionDelete']); + App::$collector->get('/', [\kernel\modules\user\controllers\UserController::class, 'actionIndex']); + App::$collector->get('/page/{page_number}', [\kernel\modules\user\controllers\UserController::class, 'actionIndex']); + App::$collector->get('/create', [\kernel\modules\user\controllers\UserController::class, 'actionCreate']); + App::$collector->post("/", [\kernel\modules\user\controllers\UserController::class, 'actionAdd']); + App::$collector->get('/{id}', [\kernel\modules\user\controllers\UserController::class, 'actionView']); + App::$collector->any('/update/{id}', [\kernel\modules\user\controllers\UserController::class, 'actionUpdate']); + App::$collector->any("/edit/{id}", [\kernel\modules\user\controllers\UserController::class, 'actionEdit']); + App::$collector->get('/delete/{id}', [\kernel\modules\user\controllers\UserController::class, 'actionDelete']); }); App::$collector->group(["prefix" => "post"], function (RouteCollector $router){ - App::$collector->get('/', [\app\controllers\PostController::class, 'actionIndex']); - App::$collector->get('/page/{page_number}', [\app\controllers\PostController::class, 'actionIndex']); - App::$collector->get('/create', [\app\controllers\PostController::class, 'actionCreate']); - App::$collector->post("/", [\app\controllers\PostController::class, 'actionAdd']); - App::$collector->get('/{id}', [\app\controllers\PostController::class, 'actionView']); - App::$collector->any('/update/{id}', [\app\controllers\PostController::class, 'actionUpdate']); - App::$collector->any("/edit/{id}", [\app\controllers\PostController::class, 'actionEdit']); - App::$collector->get('/delete/{id}', [\app\controllers\PostController::class, 'actionDelete']); + App::$collector->get('/', [\kernel\modules\post\controllers\PostController::class, 'actionIndex']); + App::$collector->get('/page/{page_number}', [\kernel\modules\post\controllers\PostController::class, 'actionIndex']); + App::$collector->get('/create', [\kernel\modules\post\controllers\PostController::class, 'actionCreate']); + App::$collector->post("/", [\kernel\modules\post\controllers\PostController::class, 'actionAdd']); + App::$collector->get('/{id}', [\kernel\modules\post\controllers\PostController::class, 'actionView']); + App::$collector->any('/update/{id}', [\kernel\modules\post\controllers\PostController::class, 'actionUpdate']); + App::$collector->any("/edit/{id}", [\kernel\modules\post\controllers\PostController::class, 'actionEdit']); + App::$collector->get('/delete/{id}', [\kernel\modules\post\controllers\PostController::class, 'actionDelete']); }); App::$collector->group(["prefix" => "settings"], function (RouteCollector $router){ App::$collector->group(["prefix" => "menu"], function (RouteCollector $router){ diff --git a/kernel/services/MenuService.php b/kernel/services/MenuService.php deleted file mode 100644 index 3b26c4e..0000000 --- a/kernel/services/MenuService.php +++ /dev/null @@ -1,49 +0,0 @@ -get(); - if (!$collection->isEmpty()){ - return $collection; - } - - return false; - } - - public static function hasActiveChild(int $id): bool - { - $child = self::getChild($id); - if (!$child->isEmpty()){ - foreach ($child as $item){ -// if ($item->url === \kernel\Request::getUrlPath()){ -// return true; -// } - if (strripos(Request::getUrlPath(), $item->url) !== false) { - return true; - } - } - } - - return false; - } - - public static function isActive($url): bool - { - if ($url === Request::getUrlPath()){ - return true; - } else { - if (strripos(\kernel\Request::getUrlPath(), ($url . "/page")) !== false) { - return true; - } - } - return false; - } -} \ No newline at end of file diff --git a/resources/upload/5c/40/5c4044ac0df8411aaf0dbdb41846dc29.png b/resources/upload/5c/40/5c4044ac0df8411aaf0dbdb41846dc29.png new file mode 100644 index 0000000000000000000000000000000000000000..212a06c598bcdab35e912f4436cb04962679fd98 GIT binary patch literal 25517 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

n7imB;D_QdDX3j8J_-dTggrO6*yC+C(Mk$E5= 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 a>Hi1ntKd+3&i~;60000beginForm(isset($model) ? "/admin/menu/edit/" . $model->id : "/admin/menu"); - -$form->field(class: \itguild\forms\inputs\Select::class, name: "parent_id", params: [ - 'class' => "form-control", - 'value' => $model->parent_id ?? '' -]) - ->setLabel("Родительский пункт меню") - ->setOptions(\app\services\MenuService::createLabelArr()) - ->render(); - -$form->field(class: \itguild\forms\inputs\File::class, name: "icon_file", params: [ - 'class' => "form-control", - 'value' => $model->icon_file ?? '' -]) - ->setLabel("Путь к иконке") - ->render(); - -$form->field(class: \itguild\forms\inputs\TextInput::class, name: "icon_font", params: [ - 'class' => "form-control", - 'value' => $model->icon_font ?? '' -]) - ->setLabel("Иконка") - ->render(); - -$form->field(class: \itguild\forms\inputs\TextInput::class, name: "label", params: [ - 'class' => "form-control", - 'value' => $model->label ?? '' -]) - ->setLabel("Заголовок") - ->render(); - -$form->field(class: \itguild\forms\inputs\TextInput::class, name: "url", params: [ - 'class' => "form-control", - 'value' => $model->url ?? '' -]) - ->setLabel("URL") - ->render(); - -$form->field(class: \itguild\forms\inputs\Select::class, name: "status", params: [ - 'class' => "form-control", - 'value' => $model->status ?? '1' -]) - ->setLabel("Статус") - ->setOptions(Menu::getStatus()) - ->render(); -?> -

-
- field(\itguild\forms\inputs\Button::class, name: "btn-submit", params: [ - 'class' => "btn btn-primary ", - 'value' => 'Отправить', - 'typeInput' => 'submit' - ]) - ->render(); - ?> -
-
- field(\itguild\forms\inputs\Button::class, name: "btn-reset", params: [ - 'class' => "btn btn-warning", - 'value' => 'Сбросить', - 'typeInput' => 'reset' - ]) - ->render(); - ?> -
-
-endForm(); diff --git a/views/admin/menu/index.php b/views/admin/menu/index.php deleted file mode 100644 index d5f55c3..0000000 --- a/views/admin/menu/index.php +++ /dev/null @@ -1,35 +0,0 @@ - $page_number, - 'perPage' => 8, - 'params' => ["class" => "table table-bordered", "border" => "2"], - 'baseUrl' => "/admin/menu", -])); -$table->columns([ - 'parent_id' => (function ($data) { - if ($data == 0) return null; - return Menu::find($data)->label; - }) -]); -$table->beforePrint(function () { - return PrimaryBtn::create("Создать", "/admin/menu/create")->fetch(); - //return (new PrimaryBtn("Создать", "/admin/user/create"))->fetch(); -}); -$table->addAction(MenuViewActionColumn::class); -$table->addAction(MenuEditActionColumn::class); -$table->addAction(MenuDeleteActionColumn::class); -$table->create(); -$table->render(); \ No newline at end of file diff --git a/views/admin/menu/view.php b/views/admin/menu/view.php deleted file mode 100644 index 92aac76..0000000 --- a/views/admin/menu/view.php +++ /dev/null @@ -1,46 +0,0 @@ - ["class" => "table table-bordered", "border" => "2"], - 'baseUrl' => "/admin/menu", -])); -$table->beforePrint(function () use ($menu) { - $btn = PrimaryBtn::create("Список", "/admin/menu")->fetch(); - $btn .= SuccessBtn::create("Редактировать", "/admin/menu/update/" . $menu->id)->fetch(); - $btn .= DangerBtn::create("Удалить", "/admin/menu/delete/" . $menu->id)->fetch(); - return $btn; -}); -$table->rows([ - 'parent_id' => (function ($data) { - if ($data == 0) return null; - return Menu::find($data)->label; - }), - 'created_at' => function ($data) { - if (!$data){ - return null; - } - - return (new DateTimeImmutable($data))->format("d-m-Y"); - }, - 'updated_at' => function ($data) { - if (!$data){ - return null; - } - - return (new DateTimeImmutable($data))->format("d-m-Y"); - } -]); -$table->create(); -$table->render(); \ No newline at end of file diff --git a/views/main_layout.html.twig b/views/main_layout.html.twig deleted file mode 100644 index 1601dbd..0000000 --- a/views/main_layout.html.twig +++ /dev/null @@ -1,19 +0,0 @@ - - - - - Примеры шаблонизатора Twig - - - -
-
-

HEADER

- {% block content %} - {% endblock %} -

FOOTER

-
-
- - - \ No newline at end of file diff --git a/views/question_create.html.twig b/views/question_create.html.twig deleted file mode 100644 index afd7928..0000000 --- a/views/question_create.html.twig +++ /dev/null @@ -1,13 +0,0 @@ -{% extends "main_layout.html.twig" %} - -{% block content %} -
- Вопрос:
-

- - - -
-{% endblock %} \ No newline at end of file diff --git a/views/user_create.html.twig b/views/user_create.html.twig deleted file mode 100644 index 45d4e71..0000000 --- a/views/user_create.html.twig +++ /dev/null @@ -1,23 +0,0 @@ -{% extends "main_layout.html.twig" %} - -{% block content %} -
- Логин:
-

- - Пароль:
-

- - Email адрес:
-

- - - -
-{% endblock %} \ No newline at end of file diff --git a/views/user_table.html.twig b/views/user_table.html.twig deleted file mode 100644 index 32b5450..0000000 --- a/views/user_table.html.twig +++ /dev/null @@ -1,5 +0,0 @@ -{% extends "main_layout.html.twig" %} - -{% block content %} - {{ table() }} -{% endblock %} \ No newline at end of file diff --git a/views/user_update.html.twig b/views/user_update.html.twig deleted file mode 100644 index 65a46f6..0000000 --- a/views/user_update.html.twig +++ /dev/null @@ -1,23 +0,0 @@ -{% extends "main_layout.html.twig" %} - -{% block content %} -
- Логин:
-

- - Пароль:
-

- - Email адрес:
-

- - - -
-{% endblock %} \ No newline at end of file diff --git a/views/widgets/admin/menu.php b/views/widgets/admin/menu.php index 54ddc6d..fe5773b 100644 --- a/views/widgets/admin/menu.php +++ b/views/widgets/admin/menu.php @@ -5,13 +5,13 @@ ?>
    id); + $child = \kernel\modules\menu\service\MenuService::getChild($item->id); if ($child): ?>
  • -
      " id="itemid?>"> +