diff --git a/app/modules/tag/manifest.json b/app/modules/tag/manifest.json index 974f984..456f81c 100644 --- a/app/modules/tag/manifest.json +++ b/app/modules/tag/manifest.json @@ -5,7 +5,6 @@ "slug": "tag", "description": "Tags module", "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" diff --git a/kernel/console/controllers/ModuleController.php b/kernel/console/controllers/ModuleController.php index 67417d7..c586f76 100644 --- a/kernel/console/controllers/ModuleController.php +++ b/kernel/console/controllers/ModuleController.php @@ -22,31 +22,11 @@ class ModuleController extends ConsoleController throw new \Exception('Missing module path "--path" specified'); } - $zip = new ZipArchive; - $tmpModuleDir = md5(time()); - $res = $zip->open(ROOT_DIR . $this->argv['path']); - if ($res === TRUE) { - $tmpModuleDirFull = RESOURCES_DIR . '/tmp/ad/' . $tmpModuleDir . "/"; - $zip->extractTo($tmpModuleDirFull); - $zip->close(); - $this->out->r('Архив распакован', 'green'); + if (file_exists(ROOT_DIR . $this->argv['path'])) { + $moduleService = new ModuleService(); + $moduleService->installModule($this->argv['path']); } else { - $this->out->r('Message: Ошибка чтения архива', 'red'); - } - - 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 . '/app', $manifest['app_module_path']); - $fileHelper->copy_folder($tmpModuleDirFull . '/kernel', $manifest['kernel_module_path']); - - $this->out->r("Удаляем временные файлы", 'green'); - $fileHelper->recursiveRemoveDir($tmpModuleDirFull); - - $this->out->r("Модуль " . $manifest['name'] . " установлен", 'green'); + $this->out->r("Модуль не найден", 'red'); } } @@ -61,25 +41,15 @@ class ModuleController extends ConsoleController if (file_exists(ROOT_DIR . $this->argv['path'])) { $moduleService = new ModuleService(); - $moduleInfo = $moduleService->getModuleInfo(APP_DIR . '/modules/' . basename($this->argv['path'])); - - if ($moduleService->isActive($moduleInfo['slug'])) { - $moduleService->setActiveModule($moduleInfo['slug']); - } - - $fileHelper = new Files(); - 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'); + $moduleService->uninstallModule($this->argv['path']); } else { $this->out->r("Модуль не найден", 'red'); } } + /** + * @throws \Exception + */ public function actionPackModule(): void { if (!isset($this->argv['path'])) { @@ -87,22 +57,10 @@ class ModuleController extends ConsoleController } if (file_exists(ROOT_DIR . $this->argv['path'])) { - $moduleName = basename($this->argv['path']); - - $tmpModuleDirFull = RESOURCES_DIR . '/tmp/ad/' . $moduleName . "/"; - - $fileHelper = new Files(); - $fileHelper->copy_folder(APP_DIR . '/modules/' . $moduleName, $tmpModuleDirFull . 'app/'); - $fileHelper->copy_folder(KERNEL_APP_MODULES_DIR . '/' . $moduleName, $tmpModuleDirFull . 'kernel/'); - - $this->out->r("Модуль собран во временную папку", 'green'); - - $fileHelper->pack($tmpModuleDirFull, RESOURCES_DIR . '/tmp/modules/' . $moduleName . '.itguild'); - - $this->out->r("Архив создан", 'green'); - $fileHelper->recursiveRemoveDir($tmpModuleDirFull); - $this->out->r("Временная папка удалена", 'green'); - + $moduleService = new ModuleService(); + $moduleService->packModule($this->argv['path']); + } else { + $this->out->r("Модуль не найден", 'red'); } } diff --git a/kernel/controllers/ModuleController.php b/kernel/controllers/ModuleController.php index e8524e8..cbae844 100644 --- a/kernel/controllers/ModuleController.php +++ b/kernel/controllers/ModuleController.php @@ -51,7 +51,7 @@ class ModuleController extends AdminController public function actionActivate(): void { $request = new Request(); - $this->moduleService->setActiveModule($request->get("slug")); + $this->moduleService->toggleModule($request->get("slug")); $mod_info = $this->moduleService->getModuleInfoBySlug($request->get('slug')); $this->cgView->render("view.php", ['data' => $mod_info]); diff --git a/kernel/services/ModuleService.php b/kernel/services/ModuleService.php index f787be5..f639cff 100644 --- a/kernel/services/ModuleService.php +++ b/kernel/services/ModuleService.php @@ -3,9 +3,12 @@ namespace kernel\services; use DirectoryIterator; +use kernel\console\Out; use kernel\helpers\Debug; +use kernel\helpers\Files; use kernel\helpers\Manifest; use kernel\models\Option; +use ZipArchive; class ModuleService { @@ -44,7 +47,7 @@ class ModuleService return false; } - public function setActiveModule(string $module): void + public function toggleModule(string $module): void { $active_modules = Option::where("key", "active_modules")->first(); $path = json_decode($active_modules->value); @@ -154,4 +157,79 @@ class ModuleService return $migrationsPaths; } + /** + * @throws \Exception + */ + public function installModule(string $path): void + { + $zip = new ZipArchive; + $tmpModuleDir = md5(time()); + $res = $zip->open(ROOT_DIR . $path); + if ($res === TRUE) { + $tmpModuleDirFull = RESOURCES_DIR . '/tmp/ad/' . $tmpModuleDir . "/"; + $zip->extractTo($tmpModuleDirFull); + $zip->close(); +// $out->out->r('Архив распакован', 'green'); +// } else { +// $this->out->r('Message: Ошибка чтения архива', 'red'); + } + + if (!file_exists($tmpModuleDirFull . "/app/manifest.json")) { + throw new \Exception('manifest.json not found'); + } + + $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 . '/app', $manifest['app_module_path']); + if (isset($manifest['kernel_module_path'])) { + $fileHelper->copy_folder($tmpModuleDirFull . '/kernel', $manifest['kernel_module_path']); + } else { + $fileHelper->copy_folder($tmpModuleDirFull . '/kernel', KERNEL_APP_MODULES_DIR . '/' . $manifest['slug']); + } + +// $this->out->r("Удаляем временные файлы", 'green'); + $fileHelper->recursiveRemoveDir($tmpModuleDirFull); + +// $this->out->r("Модуль " . $manifest['name'] . " установлен", 'green'); + } + + public function uninstallModule(string $path): void + { + $moduleInfo = $this->getModuleInfo(APP_DIR . '/modules/' . basename($path)); + + if ($this->isActive($moduleInfo['slug'])) { + $this->toggleModule($moduleInfo['slug']); + } + + $fileHelper = new Files(); + 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']); + } + } + + public function packModule(string $path): void + { + $moduleName = basename($path); + + $tmpModuleDirFull = RESOURCES_DIR . '/tmp/ad/' . $moduleName . "/"; + + $fileHelper = new Files(); + $fileHelper->copy_folder(APP_DIR . '/modules/' . $moduleName, $tmpModuleDirFull . 'app/'); + $fileHelper->copy_folder(KERNEL_APP_MODULES_DIR . '/' . $moduleName, $tmpModuleDirFull . 'kernel/'); + +// $this->out->r("Модуль собран во временную папку", 'green'); + + $fileHelper->pack($tmpModuleDirFull, RESOURCES_DIR . '/tmp/modules/' . $moduleName . '.itguild'); + +// $this->out->r("Архив создан", 'green'); + $fileHelper->recursiveRemoveDir($tmpModuleDirFull); +// $this->out->r("Временная папка удалена", 'green'); + } + } \ No newline at end of file diff --git a/resources/tmp/ad/288812b9d3be03880a18cfc8baa6b9cc/app/TagModule.php b/resources/tmp/ad/288812b9d3be03880a18cfc8baa6b9cc/app/TagModule.php new file mode 100644 index 0000000..b2f0ffd --- /dev/null +++ b/resources/tmp/ad/288812b9d3be03880a18cfc8baa6b9cc/app/TagModule.php @@ -0,0 +1,38 @@ +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/288812b9d3be03880a18cfc8baa6b9cc/app/controllers/TagController.php b/resources/tmp/ad/288812b9d3be03880a18cfc8baa6b9cc/app/controllers/TagController.php new file mode 100644 index 0000000..4598872 --- /dev/null +++ b/resources/tmp/ad/288812b9d3be03880a18cfc8baa6b9cc/app/controllers/TagController.php @@ -0,0 +1,8 @@ +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/288812b9d3be03880a18cfc8baa6b9cc/kernel/migrations/2024_10_08_093710_create_tag_table.php b/resources/tmp/ad/288812b9d3be03880a18cfc8baa6b9cc/kernel/migrations/2024_10_08_093710_create_tag_table.php new file mode 100644 index 0000000..37c4be5 --- /dev/null +++ b/resources/tmp/ad/288812b9d3be03880a18cfc8baa6b9cc/kernel/migrations/2024_10_08_093710_create_tag_table.php @@ -0,0 +1,31 @@ +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/288812b9d3be03880a18cfc8baa6b9cc/kernel/models/Tag.php b/resources/tmp/ad/288812b9d3be03880a18cfc8baa6b9cc/kernel/models/Tag.php new file mode 100644 index 0000000..49e1bb4 --- /dev/null +++ b/resources/tmp/ad/288812b9d3be03880a18cfc8baa6b9cc/kernel/models/Tag.php @@ -0,0 +1,46 @@ + 'Заголовок', + '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/288812b9d3be03880a18cfc8baa6b9cc/kernel/models/forms/CreateTagForm.php b/resources/tmp/ad/288812b9d3be03880a18cfc8baa6b9cc/kernel/models/forms/CreateTagForm.php new file mode 100644 index 0000000..82fd893 --- /dev/null +++ b/resources/tmp/ad/288812b9d3be03880a18cfc8baa6b9cc/kernel/models/forms/CreateTagForm.php @@ -0,0 +1,20 @@ + '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/288812b9d3be03880a18cfc8baa6b9cc/kernel/routs/tag.php b/resources/tmp/ad/288812b9d3be03880a18cfc8baa6b9cc/kernel/routs/tag.php new file mode 100644 index 0000000..6ec41fe --- /dev/null +++ b/resources/tmp/ad/288812b9d3be03880a18cfc8baa6b9cc/kernel/routs/tag.php @@ -0,0 +1,18 @@ +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/288812b9d3be03880a18cfc8baa6b9cc/kernel/services/TagService.php b/resources/tmp/ad/288812b9d3be03880a18cfc8baa6b9cc/kernel/services/TagService.php new file mode 100644 index 0000000..9407f0a --- /dev/null +++ b/resources/tmp/ad/288812b9d3be03880a18cfc8baa6b9cc/kernel/services/TagService.php @@ -0,0 +1,42 @@ +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/288812b9d3be03880a18cfc8baa6b9cc/kernel/views/form.php b/resources/tmp/ad/288812b9d3be03880a18cfc8baa6b9cc/kernel/views/form.php new file mode 100644 index 0000000..3a37b96 --- /dev/null +++ b/resources/tmp/ad/288812b9d3be03880a18cfc8baa6b9cc/kernel/views/form.php @@ -0,0 +1,58 @@ +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/288812b9d3be03880a18cfc8baa6b9cc/kernel/views/index.php b/resources/tmp/ad/288812b9d3be03880a18cfc8baa6b9cc/kernel/views/index.php new file mode 100644 index 0000000..0d5503f --- /dev/null +++ b/resources/tmp/ad/288812b9d3be03880a18cfc8baa6b9cc/kernel/views/index.php @@ -0,0 +1,39 @@ + $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/288812b9d3be03880a18cfc8baa6b9cc/kernel/views/view.php b/resources/tmp/ad/288812b9d3be03880a18cfc8baa6b9cc/kernel/views/view.php new file mode 100644 index 0000000..b09034f --- /dev/null +++ b/resources/tmp/ad/288812b9d3be03880a18cfc8baa6b9cc/kernel/views/view.php @@ -0,0 +1,30 @@ + ["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/ad/6061f1739a4083115f9124a9eefbc9e4/app/TagModule.php b/resources/tmp/ad/6061f1739a4083115f9124a9eefbc9e4/app/TagModule.php new file mode 100644 index 0000000..b2f0ffd --- /dev/null +++ b/resources/tmp/ad/6061f1739a4083115f9124a9eefbc9e4/app/TagModule.php @@ -0,0 +1,38 @@ +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/6061f1739a4083115f9124a9eefbc9e4/app/controllers/TagController.php b/resources/tmp/ad/6061f1739a4083115f9124a9eefbc9e4/app/controllers/TagController.php new file mode 100644 index 0000000..4598872 --- /dev/null +++ b/resources/tmp/ad/6061f1739a4083115f9124a9eefbc9e4/app/controllers/TagController.php @@ -0,0 +1,8 @@ +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/6061f1739a4083115f9124a9eefbc9e4/kernel/migrations/2024_10_08_093710_create_tag_table.php b/resources/tmp/ad/6061f1739a4083115f9124a9eefbc9e4/kernel/migrations/2024_10_08_093710_create_tag_table.php new file mode 100644 index 0000000..37c4be5 --- /dev/null +++ b/resources/tmp/ad/6061f1739a4083115f9124a9eefbc9e4/kernel/migrations/2024_10_08_093710_create_tag_table.php @@ -0,0 +1,31 @@ +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/6061f1739a4083115f9124a9eefbc9e4/kernel/models/Tag.php b/resources/tmp/ad/6061f1739a4083115f9124a9eefbc9e4/kernel/models/Tag.php new file mode 100644 index 0000000..49e1bb4 --- /dev/null +++ b/resources/tmp/ad/6061f1739a4083115f9124a9eefbc9e4/kernel/models/Tag.php @@ -0,0 +1,46 @@ + 'Заголовок', + '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/6061f1739a4083115f9124a9eefbc9e4/kernel/models/forms/CreateTagForm.php b/resources/tmp/ad/6061f1739a4083115f9124a9eefbc9e4/kernel/models/forms/CreateTagForm.php new file mode 100644 index 0000000..82fd893 --- /dev/null +++ b/resources/tmp/ad/6061f1739a4083115f9124a9eefbc9e4/kernel/models/forms/CreateTagForm.php @@ -0,0 +1,20 @@ + '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/6061f1739a4083115f9124a9eefbc9e4/kernel/routs/tag.php b/resources/tmp/ad/6061f1739a4083115f9124a9eefbc9e4/kernel/routs/tag.php new file mode 100644 index 0000000..6ec41fe --- /dev/null +++ b/resources/tmp/ad/6061f1739a4083115f9124a9eefbc9e4/kernel/routs/tag.php @@ -0,0 +1,18 @@ +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/6061f1739a4083115f9124a9eefbc9e4/kernel/services/TagService.php b/resources/tmp/ad/6061f1739a4083115f9124a9eefbc9e4/kernel/services/TagService.php new file mode 100644 index 0000000..9407f0a --- /dev/null +++ b/resources/tmp/ad/6061f1739a4083115f9124a9eefbc9e4/kernel/services/TagService.php @@ -0,0 +1,42 @@ +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/6061f1739a4083115f9124a9eefbc9e4/kernel/views/form.php b/resources/tmp/ad/6061f1739a4083115f9124a9eefbc9e4/kernel/views/form.php new file mode 100644 index 0000000..3a37b96 --- /dev/null +++ b/resources/tmp/ad/6061f1739a4083115f9124a9eefbc9e4/kernel/views/form.php @@ -0,0 +1,58 @@ +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/6061f1739a4083115f9124a9eefbc9e4/kernel/views/index.php b/resources/tmp/ad/6061f1739a4083115f9124a9eefbc9e4/kernel/views/index.php new file mode 100644 index 0000000..0d5503f --- /dev/null +++ b/resources/tmp/ad/6061f1739a4083115f9124a9eefbc9e4/kernel/views/index.php @@ -0,0 +1,39 @@ + $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/6061f1739a4083115f9124a9eefbc9e4/kernel/views/view.php b/resources/tmp/ad/6061f1739a4083115f9124a9eefbc9e4/kernel/views/view.php new file mode 100644 index 0000000..b09034f --- /dev/null +++ b/resources/tmp/ad/6061f1739a4083115f9124a9eefbc9e4/kernel/views/view.php @@ -0,0 +1,30 @@ + ["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/ad/7289057c248ba8f15a95ff2a8ffdb261/app/TagModule.php b/resources/tmp/ad/7289057c248ba8f15a95ff2a8ffdb261/app/TagModule.php new file mode 100644 index 0000000..b2f0ffd --- /dev/null +++ b/resources/tmp/ad/7289057c248ba8f15a95ff2a8ffdb261/app/TagModule.php @@ -0,0 +1,38 @@ +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/7289057c248ba8f15a95ff2a8ffdb261/app/controllers/TagController.php b/resources/tmp/ad/7289057c248ba8f15a95ff2a8ffdb261/app/controllers/TagController.php new file mode 100644 index 0000000..4598872 --- /dev/null +++ b/resources/tmp/ad/7289057c248ba8f15a95ff2a8ffdb261/app/controllers/TagController.php @@ -0,0 +1,8 @@ +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/7289057c248ba8f15a95ff2a8ffdb261/kernel/migrations/2024_10_08_093710_create_tag_table.php b/resources/tmp/ad/7289057c248ba8f15a95ff2a8ffdb261/kernel/migrations/2024_10_08_093710_create_tag_table.php new file mode 100644 index 0000000..37c4be5 --- /dev/null +++ b/resources/tmp/ad/7289057c248ba8f15a95ff2a8ffdb261/kernel/migrations/2024_10_08_093710_create_tag_table.php @@ -0,0 +1,31 @@ +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/7289057c248ba8f15a95ff2a8ffdb261/kernel/models/Tag.php b/resources/tmp/ad/7289057c248ba8f15a95ff2a8ffdb261/kernel/models/Tag.php new file mode 100644 index 0000000..49e1bb4 --- /dev/null +++ b/resources/tmp/ad/7289057c248ba8f15a95ff2a8ffdb261/kernel/models/Tag.php @@ -0,0 +1,46 @@ + 'Заголовок', + '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/7289057c248ba8f15a95ff2a8ffdb261/kernel/models/forms/CreateTagForm.php b/resources/tmp/ad/7289057c248ba8f15a95ff2a8ffdb261/kernel/models/forms/CreateTagForm.php new file mode 100644 index 0000000..82fd893 --- /dev/null +++ b/resources/tmp/ad/7289057c248ba8f15a95ff2a8ffdb261/kernel/models/forms/CreateTagForm.php @@ -0,0 +1,20 @@ + '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/7289057c248ba8f15a95ff2a8ffdb261/kernel/routs/tag.php b/resources/tmp/ad/7289057c248ba8f15a95ff2a8ffdb261/kernel/routs/tag.php new file mode 100644 index 0000000..6ec41fe --- /dev/null +++ b/resources/tmp/ad/7289057c248ba8f15a95ff2a8ffdb261/kernel/routs/tag.php @@ -0,0 +1,18 @@ +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/7289057c248ba8f15a95ff2a8ffdb261/kernel/services/TagService.php b/resources/tmp/ad/7289057c248ba8f15a95ff2a8ffdb261/kernel/services/TagService.php new file mode 100644 index 0000000..9407f0a --- /dev/null +++ b/resources/tmp/ad/7289057c248ba8f15a95ff2a8ffdb261/kernel/services/TagService.php @@ -0,0 +1,42 @@ +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/7289057c248ba8f15a95ff2a8ffdb261/kernel/views/form.php b/resources/tmp/ad/7289057c248ba8f15a95ff2a8ffdb261/kernel/views/form.php new file mode 100644 index 0000000..3a37b96 --- /dev/null +++ b/resources/tmp/ad/7289057c248ba8f15a95ff2a8ffdb261/kernel/views/form.php @@ -0,0 +1,58 @@ +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/7289057c248ba8f15a95ff2a8ffdb261/kernel/views/index.php b/resources/tmp/ad/7289057c248ba8f15a95ff2a8ffdb261/kernel/views/index.php new file mode 100644 index 0000000..0d5503f --- /dev/null +++ b/resources/tmp/ad/7289057c248ba8f15a95ff2a8ffdb261/kernel/views/index.php @@ -0,0 +1,39 @@ + $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/7289057c248ba8f15a95ff2a8ffdb261/kernel/views/view.php b/resources/tmp/ad/7289057c248ba8f15a95ff2a8ffdb261/kernel/views/view.php new file mode 100644 index 0000000..b09034f --- /dev/null +++ b/resources/tmp/ad/7289057c248ba8f15a95ff2a8ffdb261/kernel/views/view.php @@ -0,0 +1,30 @@ + ["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/ad/cb177f1a6276ef6231a7e09311a283d0/app/TagModule.php b/resources/tmp/ad/cb177f1a6276ef6231a7e09311a283d0/app/TagModule.php new file mode 100644 index 0000000..b2f0ffd --- /dev/null +++ b/resources/tmp/ad/cb177f1a6276ef6231a7e09311a283d0/app/TagModule.php @@ -0,0 +1,38 @@ +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/cb177f1a6276ef6231a7e09311a283d0/app/controllers/TagController.php b/resources/tmp/ad/cb177f1a6276ef6231a7e09311a283d0/app/controllers/TagController.php new file mode 100644 index 0000000..4598872 --- /dev/null +++ b/resources/tmp/ad/cb177f1a6276ef6231a7e09311a283d0/app/controllers/TagController.php @@ -0,0 +1,8 @@ +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/cb177f1a6276ef6231a7e09311a283d0/kernel/migrations/2024_10_08_093710_create_tag_table.php b/resources/tmp/ad/cb177f1a6276ef6231a7e09311a283d0/kernel/migrations/2024_10_08_093710_create_tag_table.php new file mode 100644 index 0000000..37c4be5 --- /dev/null +++ b/resources/tmp/ad/cb177f1a6276ef6231a7e09311a283d0/kernel/migrations/2024_10_08_093710_create_tag_table.php @@ -0,0 +1,31 @@ +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/cb177f1a6276ef6231a7e09311a283d0/kernel/models/Tag.php b/resources/tmp/ad/cb177f1a6276ef6231a7e09311a283d0/kernel/models/Tag.php new file mode 100644 index 0000000..49e1bb4 --- /dev/null +++ b/resources/tmp/ad/cb177f1a6276ef6231a7e09311a283d0/kernel/models/Tag.php @@ -0,0 +1,46 @@ + 'Заголовок', + '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/cb177f1a6276ef6231a7e09311a283d0/kernel/models/forms/CreateTagForm.php b/resources/tmp/ad/cb177f1a6276ef6231a7e09311a283d0/kernel/models/forms/CreateTagForm.php new file mode 100644 index 0000000..82fd893 --- /dev/null +++ b/resources/tmp/ad/cb177f1a6276ef6231a7e09311a283d0/kernel/models/forms/CreateTagForm.php @@ -0,0 +1,20 @@ + '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/cb177f1a6276ef6231a7e09311a283d0/kernel/routs/tag.php b/resources/tmp/ad/cb177f1a6276ef6231a7e09311a283d0/kernel/routs/tag.php new file mode 100644 index 0000000..6ec41fe --- /dev/null +++ b/resources/tmp/ad/cb177f1a6276ef6231a7e09311a283d0/kernel/routs/tag.php @@ -0,0 +1,18 @@ +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/cb177f1a6276ef6231a7e09311a283d0/kernel/services/TagService.php b/resources/tmp/ad/cb177f1a6276ef6231a7e09311a283d0/kernel/services/TagService.php new file mode 100644 index 0000000..9407f0a --- /dev/null +++ b/resources/tmp/ad/cb177f1a6276ef6231a7e09311a283d0/kernel/services/TagService.php @@ -0,0 +1,42 @@ +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/cb177f1a6276ef6231a7e09311a283d0/kernel/views/form.php b/resources/tmp/ad/cb177f1a6276ef6231a7e09311a283d0/kernel/views/form.php new file mode 100644 index 0000000..3a37b96 --- /dev/null +++ b/resources/tmp/ad/cb177f1a6276ef6231a7e09311a283d0/kernel/views/form.php @@ -0,0 +1,58 @@ +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/cb177f1a6276ef6231a7e09311a283d0/kernel/views/index.php b/resources/tmp/ad/cb177f1a6276ef6231a7e09311a283d0/kernel/views/index.php new file mode 100644 index 0000000..0d5503f --- /dev/null +++ b/resources/tmp/ad/cb177f1a6276ef6231a7e09311a283d0/kernel/views/index.php @@ -0,0 +1,39 @@ + $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/cb177f1a6276ef6231a7e09311a283d0/kernel/views/view.php b/resources/tmp/ad/cb177f1a6276ef6231a7e09311a283d0/kernel/views/view.php new file mode 100644 index 0000000..b09034f --- /dev/null +++ b/resources/tmp/ad/cb177f1a6276ef6231a7e09311a283d0/kernel/views/view.php @@ -0,0 +1,30 @@ + ["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/ad/fb7687573df162d45c5044239738988c/app/TagModule.php b/resources/tmp/ad/fb7687573df162d45c5044239738988c/app/TagModule.php new file mode 100644 index 0000000..b2f0ffd --- /dev/null +++ b/resources/tmp/ad/fb7687573df162d45c5044239738988c/app/TagModule.php @@ -0,0 +1,38 @@ +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/fb7687573df162d45c5044239738988c/app/controllers/TagController.php b/resources/tmp/ad/fb7687573df162d45c5044239738988c/app/controllers/TagController.php new file mode 100644 index 0000000..4598872 --- /dev/null +++ b/resources/tmp/ad/fb7687573df162d45c5044239738988c/app/controllers/TagController.php @@ -0,0 +1,8 @@ +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/fb7687573df162d45c5044239738988c/kernel/migrations/2024_10_08_093710_create_tag_table.php b/resources/tmp/ad/fb7687573df162d45c5044239738988c/kernel/migrations/2024_10_08_093710_create_tag_table.php new file mode 100644 index 0000000..37c4be5 --- /dev/null +++ b/resources/tmp/ad/fb7687573df162d45c5044239738988c/kernel/migrations/2024_10_08_093710_create_tag_table.php @@ -0,0 +1,31 @@ +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/fb7687573df162d45c5044239738988c/kernel/models/Tag.php b/resources/tmp/ad/fb7687573df162d45c5044239738988c/kernel/models/Tag.php new file mode 100644 index 0000000..49e1bb4 --- /dev/null +++ b/resources/tmp/ad/fb7687573df162d45c5044239738988c/kernel/models/Tag.php @@ -0,0 +1,46 @@ + 'Заголовок', + '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/fb7687573df162d45c5044239738988c/kernel/models/forms/CreateTagForm.php b/resources/tmp/ad/fb7687573df162d45c5044239738988c/kernel/models/forms/CreateTagForm.php new file mode 100644 index 0000000..82fd893 --- /dev/null +++ b/resources/tmp/ad/fb7687573df162d45c5044239738988c/kernel/models/forms/CreateTagForm.php @@ -0,0 +1,20 @@ + '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/fb7687573df162d45c5044239738988c/kernel/routs/tag.php b/resources/tmp/ad/fb7687573df162d45c5044239738988c/kernel/routs/tag.php new file mode 100644 index 0000000..6ec41fe --- /dev/null +++ b/resources/tmp/ad/fb7687573df162d45c5044239738988c/kernel/routs/tag.php @@ -0,0 +1,18 @@ +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/fb7687573df162d45c5044239738988c/kernel/services/TagService.php b/resources/tmp/ad/fb7687573df162d45c5044239738988c/kernel/services/TagService.php new file mode 100644 index 0000000..9407f0a --- /dev/null +++ b/resources/tmp/ad/fb7687573df162d45c5044239738988c/kernel/services/TagService.php @@ -0,0 +1,42 @@ +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/fb7687573df162d45c5044239738988c/kernel/views/form.php b/resources/tmp/ad/fb7687573df162d45c5044239738988c/kernel/views/form.php new file mode 100644 index 0000000..3a37b96 --- /dev/null +++ b/resources/tmp/ad/fb7687573df162d45c5044239738988c/kernel/views/form.php @@ -0,0 +1,58 @@ +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/fb7687573df162d45c5044239738988c/kernel/views/index.php b/resources/tmp/ad/fb7687573df162d45c5044239738988c/kernel/views/index.php new file mode 100644 index 0000000..0d5503f --- /dev/null +++ b/resources/tmp/ad/fb7687573df162d45c5044239738988c/kernel/views/index.php @@ -0,0 +1,39 @@ + $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/fb7687573df162d45c5044239738988c/kernel/views/view.php b/resources/tmp/ad/fb7687573df162d45c5044239738988c/kernel/views/view.php new file mode 100644 index 0000000..b09034f --- /dev/null +++ b/resources/tmp/ad/fb7687573df162d45c5044239738988c/kernel/views/view.php @@ -0,0 +1,30 @@ + ["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 index aca2888..0d175c2 100644 Binary files a/resources/tmp/modules/tag.itguild and b/resources/tmp/modules/tag.itguild differ