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