From fa2676ddb2fe7b33f95bea50fac59c83b94f4b69 Mon Sep 17 00:00:00 2001 From: stasbilay02 Date: Wed, 9 Oct 2024 15:12:30 +0300 Subject: [PATCH] psck module --- app/modules/tag/manifest.json | 5 +- .../console/controllers/ModuleController.php | 30 +++--- kernel/helpers/Files.php | 32 +++--- resources/tmp/ad/tag/app/TagModule.php | 38 ------- .../ad/tag/app/controllers/TagController.php | 8 -- resources/tmp/ad/tag/app/manifest.json | 11 -- resources/tmp/ad/tag/app/routs/tag.php | 2 - .../tag/kernel/controllers/TagController.php | 101 ------------------ .../2024_10_08_093710_create_tag_table.php | 31 ------ resources/tmp/ad/tag/kernel/models/Tag.php | 46 -------- .../tag/kernel/models/forms/CreateTagForm.php | 20 ---- resources/tmp/ad/tag/kernel/routs/tag.php | 18 ---- .../tmp/ad/tag/kernel/services/TagService.php | 42 -------- resources/tmp/ad/tag/kernel/views/form.php | 58 ---------- resources/tmp/ad/tag/kernel/views/index.php | 39 ------- resources/tmp/ad/tag/kernel/views/view.php | 30 ------ .../resources/tmp/ad/tag/app/TagModule.php | 38 ------- .../ad/tag/app/controllers/TagController.php | 8 -- .../resources/tmp/ad/tag/app/manifest.json | 11 -- .../resources/tmp/ad/tag/app/routs/tag.php | 2 - .../tag/kernel/controllers/TagController.php | 101 ------------------ .../2024_10_08_093710_create_tag_table.php | 31 ------ .../tmp/ad/tag/kernel/models/Tag.php | 46 -------- .../tag/kernel/models/forms/CreateTagForm.php | 20 ---- .../resources/tmp/ad/tag/kernel/routs/tag.php | 18 ---- .../tmp/ad/tag/kernel/services/TagService.php | 42 -------- .../tmp/ad/tag/kernel/views/form.php | 58 ---------- .../tmp/ad/tag/kernel/views/index.php | 39 ------- .../tmp/ad/tag/kernel/views/view.php | 30 ------ resources/tmp/modules/tag.itguild | Bin 0 -> 6338 bytes resources/tmp/modules/tag.zip | Bin 8694 -> 0 bytes resources/tmp/modules/tag/app/manifest.json | 5 +- 32 files changed, 36 insertions(+), 924 deletions(-) delete mode 100644 resources/tmp/ad/tag/app/TagModule.php delete mode 100644 resources/tmp/ad/tag/app/controllers/TagController.php delete mode 100644 resources/tmp/ad/tag/app/manifest.json delete mode 100644 resources/tmp/ad/tag/app/routs/tag.php delete mode 100644 resources/tmp/ad/tag/kernel/controllers/TagController.php delete mode 100644 resources/tmp/ad/tag/kernel/migrations/2024_10_08_093710_create_tag_table.php delete mode 100644 resources/tmp/ad/tag/kernel/models/Tag.php delete mode 100644 resources/tmp/ad/tag/kernel/models/forms/CreateTagForm.php delete mode 100644 resources/tmp/ad/tag/kernel/routs/tag.php delete mode 100644 resources/tmp/ad/tag/kernel/services/TagService.php delete mode 100644 resources/tmp/ad/tag/kernel/views/form.php delete mode 100644 resources/tmp/ad/tag/kernel/views/index.php delete mode 100644 resources/tmp/ad/tag/kernel/views/view.php delete mode 100644 resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/app/TagModule.php delete mode 100644 resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/app/controllers/TagController.php delete mode 100644 resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/app/manifest.json delete mode 100644 resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/app/routs/tag.php delete mode 100644 resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/controllers/TagController.php delete mode 100644 resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/migrations/2024_10_08_093710_create_tag_table.php delete mode 100644 resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/models/Tag.php delete mode 100644 resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/models/forms/CreateTagForm.php delete mode 100644 resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/routs/tag.php delete mode 100644 resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/services/TagService.php delete mode 100644 resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/views/form.php delete mode 100644 resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/views/index.php delete mode 100644 resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/views/view.php create mode 100644 resources/tmp/modules/tag.itguild delete mode 100644 resources/tmp/modules/tag.zip diff --git a/app/modules/tag/manifest.json b/app/modules/tag/manifest.json index e0c74b6..974f984 100644 --- a/app/modules/tag/manifest.json +++ b/app/modules/tag/manifest.json @@ -4,8 +4,9 @@ "author": "ITGuild", "slug": "tag", "description": "Tags module", - "module_path": "{APP}/modules/{slug}", + "app_module_path": "{APP}/modules/{slug}", + "kernel_module_path": "{KERNEL_APP_MODULES}/{slug}", "module_class": "app\\modules\\tag\\TagModule", "module_class_file": "{APP}/modules/tag/TagModule.php", "routs": "routs/tag.php" -} \ No newline at end of file +} diff --git a/kernel/console/controllers/ModuleController.php b/kernel/console/controllers/ModuleController.php index d9e3aac..67417d7 100644 --- a/kernel/console/controllers/ModuleController.php +++ b/kernel/console/controllers/ModuleController.php @@ -34,13 +34,14 @@ class ModuleController extends ConsoleController $this->out->r('Message: Ошибка чтения архива', 'red'); } - if (file_exists($tmpModuleDirFull . "manifest.json")){ - $manifestJson = getConst(file_get_contents($tmpModuleDirFull . "manifest.json")); + if (file_exists($tmpModuleDirFull . "/app/manifest.json")){ + $manifestJson = getConst(file_get_contents($tmpModuleDirFull . "/app/manifest.json")); $manifest = Manifest::getWithVars($manifestJson); $this->out->r('manifest.json инициализирован', 'green'); $fileHelper = new Files(); - $fileHelper->copy_folder($tmpModuleDirFull, $manifest['module_path']); + $fileHelper->copy_folder($tmpModuleDirFull . '/app', $manifest['app_module_path']); + $fileHelper->copy_folder($tmpModuleDirFull . '/kernel', $manifest['kernel_module_path']); $this->out->r("Удаляем временные файлы", 'green'); $fileHelper->recursiveRemoveDir($tmpModuleDirFull); @@ -60,18 +61,21 @@ class ModuleController extends ConsoleController if (file_exists(ROOT_DIR . $this->argv['path'])) { $moduleService = new ModuleService(); - $moduleInfo = $moduleService->getModuleInfo(ROOT_DIR . $this->argv['path']); + $moduleInfo = $moduleService->getModuleInfo(APP_DIR . '/modules/' . basename($this->argv['path'])); if ($moduleService->isActive($moduleInfo['slug'])) { $moduleService->setActiveModule($moduleInfo['slug']); } $fileHelper = new Files(); - $fileHelper->recursiveRemoveDir(ROOT_DIR . $this->argv['path']); - + if (file_exists(APP_DIR . '/modules/' . $moduleInfo['slug'])) { + $fileHelper->recursiveRemoveDir(APP_DIR . '/modules/'. $moduleInfo['slug']); + } + if (file_exists(KERNEL_APP_MODULES_DIR . '/' . $moduleInfo['slug'])) { + $fileHelper->recursiveRemoveDir(KERNEL_APP_MODULES_DIR . '/' . $moduleInfo['slug']); + } $this->out->r("Модуль удален", 'green'); } else { - var_dump($this->argv['path']); $this->out->r("Модуль не найден", 'red'); } } @@ -91,17 +95,13 @@ class ModuleController extends ConsoleController $fileHelper->copy_folder(APP_DIR . '/modules/' . $moduleName, $tmpModuleDirFull . 'app/'); $fileHelper->copy_folder(KERNEL_APP_MODULES_DIR . '/' . $moduleName, $tmpModuleDirFull . 'kernel/'); - $this->out->r("Модуль собран в одну папку", 'green'); + $this->out->r("Модуль собран во временную папку", 'green'); - -// $fileHelper->pack($zip, RESOURCES_DIR . '/tmp/modules/' . $moduleName . '.zip'); - $fileHelper->pack($tmpModuleDirFull, RESOURCES_DIR . '/tmp/modules/' . $moduleName . '.zip'); - -// $zip->addEmptyDir($moduleName); -// $zip->close(); -// $this->out->r("zip закрыт", 'green'); + $fileHelper->pack($tmpModuleDirFull, RESOURCES_DIR . '/tmp/modules/' . $moduleName . '.itguild'); $this->out->r("Архив создан", 'green'); + $fileHelper->recursiveRemoveDir($tmpModuleDirFull); + $this->out->r("Временная папка удалена", 'green'); } } diff --git a/kernel/helpers/Files.php b/kernel/helpers/Files.php index f70ef16..10f91bd 100644 --- a/kernel/helpers/Files.php +++ b/kernel/helpers/Files.php @@ -43,13 +43,13 @@ class Files rmdir($dir); } - public function pack(string $source, string $destination, bool $include_source = true): void + public function pack(string $source, string $destination/*, bool $include_source = true*/): void { $zip = new ZipArchive(); $zip->open($destination, ZipArchive::CREATE | ZipArchive::OVERWRITE); - if ($include_source) { - $zip->addEmptyDir(basename($source)); - } +// if ($include_source) { +// $zip->addEmptyDir(basename($source)); +// } if (is_file($source)) { $zip->addFile(basename($source)); @@ -62,24 +62,22 @@ class Files $zip->close(); } - private function recursiveAddFile(ZipArchive $zip, string $dir): void + private function recursiveAddFile(ZipArchive $zip, string $dir, string $folder = ''): void { $includes = new FilesystemIterator($dir); -// Debug::prn($includes); + foreach ($includes as $include) { -// var_dump($include->getFilename()); - if(is_dir($include)/* && !is_link($include)*/) { - var_dump('ЭТО ПАПКА'); -// $d = dir($include); -// $entry = $d->read(); -// if ($entry == '.' || $entry == '..') continue; - $zip->addEmptyDir(basename($include)); - $this->recursiveAddFile($zip, $include); + if(is_dir($include)) { +// $folder .= '/' . $include->getFilename() . '/'; +// $this->recursiveAddFile($zip, $include, $folder); + + $tmpFolder = $folder . '/' . $include->getFilename() . '/'; + $this->recursiveAddFile($zip, $include, $tmpFolder); } - else { - var_dump("ЭТО ФАЙЛ"); - $zip->addFile($include); + if (is_file($include)) { + $zip->addFile($include->getPathName(), $folder . $include->getFilename()); } } } + } \ No newline at end of file diff --git a/resources/tmp/ad/tag/app/TagModule.php b/resources/tmp/ad/tag/app/TagModule.php deleted file mode 100644 index b2f0ffd..0000000 --- a/resources/tmp/ad/tag/app/TagModule.php +++ /dev/null @@ -1,38 +0,0 @@ -menuService = new MenuService(); - $this->migrationService = new MigrationService(); - } - - /** - * @throws \Exception - */ - public function init(): void - { - $this->migrationService->runAtPath("{KERNEL_APP_MODULES}/tag/migrations"); - - $this->menuService->createItem([ - "label" => "Тэги", - "url" => "/admin/tag", - "slug" => "tag", - ]); - } - - public function deactivate(): void - { - $this->menuService->removeItemBySlug("tag"); - } -} \ No newline at end of file diff --git a/resources/tmp/ad/tag/app/controllers/TagController.php b/resources/tmp/ad/tag/app/controllers/TagController.php deleted file mode 100644 index 4598872..0000000 --- a/resources/tmp/ad/tag/app/controllers/TagController.php +++ /dev/null @@ -1,8 +0,0 @@ -cgView->viewPath = KERNEL_APP_MODULES_DIR . "/tag/views/"; - $this->tagService = new TagService(); - } - - public function actionCreate(): void - { - $this->cgView->render("form.php"); - } - - #[NoReturn] public function actionAdd(): void - { - $tagForm = new CreateTagForm(); - $tagForm->load($_REQUEST); - if ($tagForm->validate()){ - $tag = $this->tagService->create($tagForm); - if ($tag){ - $this->redirect("/admin/tag/" . $tag->id); - } - } - $this->redirect("/admin/tag/create"); - } - - public function actionIndex($page_number = 1): void - { - $this->cgView->render("index.php", ['page_number' => $page_number]); - } - - /** - * @throws Exception - */ - public function actionView($id): void - { - $tag = Tag::find($id); - - if (!$tag){ - throw new Exception(message: "The tag not found"); - } - $this->cgView->render("view.php", ['tag' => $tag]); - } - - /** - * @throws Exception - */ - public function actionUpdate($id): void - { - $model = Tag::find($id); - if (!$model){ - throw new Exception(message: "The tag not found"); - } - - $this->cgView->render("form.php", ['model' => $model]); - } - - /** - * @throws Exception - */ - public function actionEdit($id): void - { - $tag = Tag::find($id); - if (!$tag){ - throw new Exception(message: "The tag not found"); - } - $tagForm = new CreateTagForm(); - $tagService = new TagService(); - $tagForm->load($_REQUEST); - if ($tagForm->validate()) { - $tag = $tagService->update($tagForm, $tag); - if ($tag) { - $this->redirect("/admin/tag/" . $tag->id); - } - } - $this->redirect("/admin/tag/update/" . $id); - } - - #[NoReturn] public function actionDelete($id): void - { - $post = Tag::find($id)->first(); - $post->delete(); - $this->redirect("/admin/tag/"); - } - -} \ No newline at end of file diff --git a/resources/tmp/ad/tag/kernel/migrations/2024_10_08_093710_create_tag_table.php b/resources/tmp/ad/tag/kernel/migrations/2024_10_08_093710_create_tag_table.php deleted file mode 100644 index 37c4be5..0000000 --- a/resources/tmp/ad/tag/kernel/migrations/2024_10_08_093710_create_tag_table.php +++ /dev/null @@ -1,31 +0,0 @@ -schema->create('tag', function (Blueprint $table) { - $table->increments('id'); - $table->string('label', 255)->nullable(false); - $table->string('entity', 255)->nullable(false); - $table->string('slug', 255)->unique(); - $table->integer('status')->default(1); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - \kernel\App::$db->schema->dropIfExists('tag'); - } -}; diff --git a/resources/tmp/ad/tag/kernel/models/Tag.php b/resources/tmp/ad/tag/kernel/models/Tag.php deleted file mode 100644 index 49e1bb4..0000000 --- a/resources/tmp/ad/tag/kernel/models/Tag.php +++ /dev/null @@ -1,46 +0,0 @@ - 'Заголовок', - 'entity' => 'Сущность', - 'slug' => 'Slug', - 'status' => 'Статус', - ]; - } - - /** - * @return string[] - */ - public static function getStatus(): array - { - return [ - self::DISABLE_STATUS => "Не активный", - self::ACTIVE_STATUS => "Активный", - ]; - } - -} \ No newline at end of file diff --git a/resources/tmp/ad/tag/kernel/models/forms/CreateTagForm.php b/resources/tmp/ad/tag/kernel/models/forms/CreateTagForm.php deleted file mode 100644 index 82fd893..0000000 --- a/resources/tmp/ad/tag/kernel/models/forms/CreateTagForm.php +++ /dev/null @@ -1,20 +0,0 @@ - 'required|min-str-len:5|max-str-len:30', - 'entity' => 'required|min-str-len:1|max-str-len:50', - 'slug' => '', - 'status' => '' - ]; - } - -} \ No newline at end of file diff --git a/resources/tmp/ad/tag/kernel/routs/tag.php b/resources/tmp/ad/tag/kernel/routs/tag.php deleted file mode 100644 index 6ec41fe..0000000 --- a/resources/tmp/ad/tag/kernel/routs/tag.php +++ /dev/null @@ -1,18 +0,0 @@ -group(["prefix" => "admin"], function (CgRouteCollector $router) { - App::$collector->group(["prefix" => "tag"], function (CGRouteCollector $router){ - App::$collector->get('/', [\app\modules\tag\controllers\TagController::class, 'actionIndex']); - App::$collector->get('/page/{page_number}', [\app\modules\tag\controllers\TagController::class, 'actionIndex']); - App::$collector->get('/create', [\app\modules\tag\controllers\TagController::class, 'actionCreate']); - App::$collector->post("/", [\app\modules\tag\controllers\TagController::class, 'actionAdd']); - App::$collector->get('/{id}', [\app\modules\tag\controllers\TagController::class, 'actionView']); - App::$collector->any('/update/{id}', [\app\modules\tag\controllers\TagController::class, 'actionUpdate']); - App::$collector->any("/edit/{id}", [\app\modules\tag\controllers\TagController::class, 'actionEdit']); - App::$collector->get('/delete/{id}', [\app\modules\tag\controllers\TagController::class, 'actionDelete']); - }); -}); \ No newline at end of file diff --git a/resources/tmp/ad/tag/kernel/services/TagService.php b/resources/tmp/ad/tag/kernel/services/TagService.php deleted file mode 100644 index 9407f0a..0000000 --- a/resources/tmp/ad/tag/kernel/services/TagService.php +++ /dev/null @@ -1,42 +0,0 @@ -label = $form_model->getItem('label'); - $model->entity = $form_model->getItem('entity'); - $model->status = $form_model->getItem('status'); - $model->slug = Slug::createSlug($form_model->getItem('label'), Tag::class); - if ($model->save()){ - return $model; - } - - return false; - } - - public function update(FormModel $form_model, Tag $tag): false|Tag - { - if ($tag->label !== $form_model->getItem('label')) { - $tag->slug = Slug::createSlug($form_model->getItem('label'), Tag::class); - } - $tag->label = $form_model->getItem('label'); - $tag->entity = $form_model->getItem('entity'); - $tag->status = $form_model->getItem('status'); - - if ($tag->save()){ - return $tag; - } - - return false; - } - -} \ No newline at end of file diff --git a/resources/tmp/ad/tag/kernel/views/form.php b/resources/tmp/ad/tag/kernel/views/form.php deleted file mode 100644 index 3a37b96..0000000 --- a/resources/tmp/ad/tag/kernel/views/form.php +++ /dev/null @@ -1,58 +0,0 @@ -beginForm(isset($model) ? "/admin/tag/edit/" . $model->id : "/admin/tag"); - -$form->field(class: \itguild\forms\inputs\TextInput::class, name: "label", params: [ - 'class' => "form-control", - 'placeholder' => 'Заголовок', - 'value' => $model->label ?? '' -]) - ->setLabel("Заголовок") - ->render(); - -$form->field(class: \itguild\forms\inputs\TextInput::class, name: "entity", params: [ - 'class' => "form-control", - 'placeholder' => 'Сущность', - 'value' => $model->entity ?? '' -]) - ->setLabel("Сущность") - ->render(); - -$form->field(\itguild\forms\inputs\Select::class, 'status', [ - 'class' => "form-control", - 'value' => $model->status ?? '' -]) - ->setLabel("Статус") - ->setOptions(Tag::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/resources/tmp/ad/tag/kernel/views/index.php b/resources/tmp/ad/tag/kernel/views/index.php deleted file mode 100644 index 0d5503f..0000000 --- a/resources/tmp/ad/tag/kernel/views/index.php +++ /dev/null @@ -1,39 +0,0 @@ - $page_number, - 'perPage' => 8, - 'params' => ["class" => "table table-bordered", "border" => "2"], - 'baseUrl' => "/admin/tag", -])); - -$table->beforePrint(function () { - return PrimaryBtn::create("Создать", "/admin/tag/create")->fetch(); - //return (new PrimaryBtn("Создать", "/admin/user/create"))->fetch(); -}); - -$table->columns([ - "status" => [ - "value" => function ($cell) { - return Tag::getStatus()[$cell]; - }] -]); - -$table->addAction(\kernel\IGTabel\action_column\ViewActionColumn::class); -$table->addAction(\kernel\IGTabel\action_column\DeleteActionColumn::class); -$table->addAction(\kernel\IGTabel\action_column\EditActionColumn::class); -$table->create(); -$table->render(); \ No newline at end of file diff --git a/resources/tmp/ad/tag/kernel/views/view.php b/resources/tmp/ad/tag/kernel/views/view.php deleted file mode 100644 index b09034f..0000000 --- a/resources/tmp/ad/tag/kernel/views/view.php +++ /dev/null @@ -1,30 +0,0 @@ - ["class" => "table table-bordered", "border" => "2"], - 'baseUrl' => "/admin/tag", -])); -$table->beforePrint(function () use ($tag) { - $btn = PrimaryBtn::create("Список", "/admin/tag")->fetch(); - $btn .= SuccessBtn::create("Редактировать", "/admin/tag/update/" . $tag->id)->fetch(); - $btn .= DangerBtn::create("Удалить", "/admin/tag/delete/" . $tag->id)->fetch(); - return $btn; -}); -$table->rows([ - 'status' => (function ($data) { - return \kernel\app_modules\tag\models\Tag::getStatus()[$data]; - }) -]); -$table->create(); -$table->render(); \ No newline at end of file diff --git a/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/app/TagModule.php b/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/app/TagModule.php deleted file mode 100644 index b2f0ffd..0000000 --- a/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/app/TagModule.php +++ /dev/null @@ -1,38 +0,0 @@ -menuService = new MenuService(); - $this->migrationService = new MigrationService(); - } - - /** - * @throws \Exception - */ - public function init(): void - { - $this->migrationService->runAtPath("{KERNEL_APP_MODULES}/tag/migrations"); - - $this->menuService->createItem([ - "label" => "Тэги", - "url" => "/admin/tag", - "slug" => "tag", - ]); - } - - public function deactivate(): void - { - $this->menuService->removeItemBySlug("tag"); - } -} \ No newline at end of file diff --git a/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/app/controllers/TagController.php b/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/app/controllers/TagController.php deleted file mode 100644 index 4598872..0000000 --- a/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/app/controllers/TagController.php +++ /dev/null @@ -1,8 +0,0 @@ -cgView->viewPath = KERNEL_APP_MODULES_DIR . "/tag/views/"; - $this->tagService = new TagService(); - } - - public function actionCreate(): void - { - $this->cgView->render("form.php"); - } - - #[NoReturn] public function actionAdd(): void - { - $tagForm = new CreateTagForm(); - $tagForm->load($_REQUEST); - if ($tagForm->validate()){ - $tag = $this->tagService->create($tagForm); - if ($tag){ - $this->redirect("/admin/tag/" . $tag->id); - } - } - $this->redirect("/admin/tag/create"); - } - - public function actionIndex($page_number = 1): void - { - $this->cgView->render("index.php", ['page_number' => $page_number]); - } - - /** - * @throws Exception - */ - public function actionView($id): void - { - $tag = Tag::find($id); - - if (!$tag){ - throw new Exception(message: "The tag not found"); - } - $this->cgView->render("view.php", ['tag' => $tag]); - } - - /** - * @throws Exception - */ - public function actionUpdate($id): void - { - $model = Tag::find($id); - if (!$model){ - throw new Exception(message: "The tag not found"); - } - - $this->cgView->render("form.php", ['model' => $model]); - } - - /** - * @throws Exception - */ - public function actionEdit($id): void - { - $tag = Tag::find($id); - if (!$tag){ - throw new Exception(message: "The tag not found"); - } - $tagForm = new CreateTagForm(); - $tagService = new TagService(); - $tagForm->load($_REQUEST); - if ($tagForm->validate()) { - $tag = $tagService->update($tagForm, $tag); - if ($tag) { - $this->redirect("/admin/tag/" . $tag->id); - } - } - $this->redirect("/admin/tag/update/" . $id); - } - - #[NoReturn] public function actionDelete($id): void - { - $post = Tag::find($id)->first(); - $post->delete(); - $this->redirect("/admin/tag/"); - } - -} \ No newline at end of file diff --git a/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/migrations/2024_10_08_093710_create_tag_table.php b/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/migrations/2024_10_08_093710_create_tag_table.php deleted file mode 100644 index 37c4be5..0000000 --- a/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/migrations/2024_10_08_093710_create_tag_table.php +++ /dev/null @@ -1,31 +0,0 @@ -schema->create('tag', function (Blueprint $table) { - $table->increments('id'); - $table->string('label', 255)->nullable(false); - $table->string('entity', 255)->nullable(false); - $table->string('slug', 255)->unique(); - $table->integer('status')->default(1); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - \kernel\App::$db->schema->dropIfExists('tag'); - } -}; diff --git a/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/models/Tag.php b/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/models/Tag.php deleted file mode 100644 index 49e1bb4..0000000 --- a/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/models/Tag.php +++ /dev/null @@ -1,46 +0,0 @@ - 'Заголовок', - 'entity' => 'Сущность', - 'slug' => 'Slug', - 'status' => 'Статус', - ]; - } - - /** - * @return string[] - */ - public static function getStatus(): array - { - return [ - self::DISABLE_STATUS => "Не активный", - self::ACTIVE_STATUS => "Активный", - ]; - } - -} \ No newline at end of file diff --git a/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/models/forms/CreateTagForm.php b/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/models/forms/CreateTagForm.php deleted file mode 100644 index 82fd893..0000000 --- a/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/models/forms/CreateTagForm.php +++ /dev/null @@ -1,20 +0,0 @@ - 'required|min-str-len:5|max-str-len:30', - 'entity' => 'required|min-str-len:1|max-str-len:50', - 'slug' => '', - 'status' => '' - ]; - } - -} \ No newline at end of file diff --git a/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/routs/tag.php b/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/routs/tag.php deleted file mode 100644 index 6ec41fe..0000000 --- a/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/routs/tag.php +++ /dev/null @@ -1,18 +0,0 @@ -group(["prefix" => "admin"], function (CgRouteCollector $router) { - App::$collector->group(["prefix" => "tag"], function (CGRouteCollector $router){ - App::$collector->get('/', [\app\modules\tag\controllers\TagController::class, 'actionIndex']); - App::$collector->get('/page/{page_number}', [\app\modules\tag\controllers\TagController::class, 'actionIndex']); - App::$collector->get('/create', [\app\modules\tag\controllers\TagController::class, 'actionCreate']); - App::$collector->post("/", [\app\modules\tag\controllers\TagController::class, 'actionAdd']); - App::$collector->get('/{id}', [\app\modules\tag\controllers\TagController::class, 'actionView']); - App::$collector->any('/update/{id}', [\app\modules\tag\controllers\TagController::class, 'actionUpdate']); - App::$collector->any("/edit/{id}", [\app\modules\tag\controllers\TagController::class, 'actionEdit']); - App::$collector->get('/delete/{id}', [\app\modules\tag\controllers\TagController::class, 'actionDelete']); - }); -}); \ No newline at end of file diff --git a/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/services/TagService.php b/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/services/TagService.php deleted file mode 100644 index 9407f0a..0000000 --- a/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/services/TagService.php +++ /dev/null @@ -1,42 +0,0 @@ -label = $form_model->getItem('label'); - $model->entity = $form_model->getItem('entity'); - $model->status = $form_model->getItem('status'); - $model->slug = Slug::createSlug($form_model->getItem('label'), Tag::class); - if ($model->save()){ - return $model; - } - - return false; - } - - public function update(FormModel $form_model, Tag $tag): false|Tag - { - if ($tag->label !== $form_model->getItem('label')) { - $tag->slug = Slug::createSlug($form_model->getItem('label'), Tag::class); - } - $tag->label = $form_model->getItem('label'); - $tag->entity = $form_model->getItem('entity'); - $tag->status = $form_model->getItem('status'); - - if ($tag->save()){ - return $tag; - } - - return false; - } - -} \ No newline at end of file diff --git a/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/views/form.php b/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/views/form.php deleted file mode 100644 index 3a37b96..0000000 --- a/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/views/form.php +++ /dev/null @@ -1,58 +0,0 @@ -beginForm(isset($model) ? "/admin/tag/edit/" . $model->id : "/admin/tag"); - -$form->field(class: \itguild\forms\inputs\TextInput::class, name: "label", params: [ - 'class' => "form-control", - 'placeholder' => 'Заголовок', - 'value' => $model->label ?? '' -]) - ->setLabel("Заголовок") - ->render(); - -$form->field(class: \itguild\forms\inputs\TextInput::class, name: "entity", params: [ - 'class' => "form-control", - 'placeholder' => 'Сущность', - 'value' => $model->entity ?? '' -]) - ->setLabel("Сущность") - ->render(); - -$form->field(\itguild\forms\inputs\Select::class, 'status', [ - 'class' => "form-control", - 'value' => $model->status ?? '' -]) - ->setLabel("Статус") - ->setOptions(Tag::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/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/views/index.php b/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/views/index.php deleted file mode 100644 index 0d5503f..0000000 --- a/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/views/index.php +++ /dev/null @@ -1,39 +0,0 @@ - $page_number, - 'perPage' => 8, - 'params' => ["class" => "table table-bordered", "border" => "2"], - 'baseUrl' => "/admin/tag", -])); - -$table->beforePrint(function () { - return PrimaryBtn::create("Создать", "/admin/tag/create")->fetch(); - //return (new PrimaryBtn("Создать", "/admin/user/create"))->fetch(); -}); - -$table->columns([ - "status" => [ - "value" => function ($cell) { - return Tag::getStatus()[$cell]; - }] -]); - -$table->addAction(\kernel\IGTabel\action_column\ViewActionColumn::class); -$table->addAction(\kernel\IGTabel\action_column\DeleteActionColumn::class); -$table->addAction(\kernel\IGTabel\action_column\EditActionColumn::class); -$table->create(); -$table->render(); \ No newline at end of file diff --git a/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/views/view.php b/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/views/view.php deleted file mode 100644 index b09034f..0000000 --- a/resources/tmp/modules/tag (2)/home/stas/PhpProjects/MicroFrameWork/resources/tmp/ad/tag/kernel/views/view.php +++ /dev/null @@ -1,30 +0,0 @@ - ["class" => "table table-bordered", "border" => "2"], - 'baseUrl' => "/admin/tag", -])); -$table->beforePrint(function () use ($tag) { - $btn = PrimaryBtn::create("Список", "/admin/tag")->fetch(); - $btn .= SuccessBtn::create("Редактировать", "/admin/tag/update/" . $tag->id)->fetch(); - $btn .= DangerBtn::create("Удалить", "/admin/tag/delete/" . $tag->id)->fetch(); - return $btn; -}); -$table->rows([ - 'status' => (function ($data) { - return \kernel\app_modules\tag\models\Tag::getStatus()[$data]; - }) -]); -$table->create(); -$table->render(); \ No newline at end of file diff --git a/resources/tmp/modules/tag.itguild b/resources/tmp/modules/tag.itguild new file mode 100644 index 0000000000000000000000000000000000000000..aca28888bcc1397bd414ccf762abc3a5c8055539 GIT binary patch literal 6338 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 H4FLETxDcta literal 0 HcmV?d00001 diff --git a/resources/tmp/modules/tag.zip b/resources/tmp/modules/tag.zip deleted file mode 100644 index 0bfc347d812f25cabc5715059c21cc3619b1685c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8694 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