feat(admin): add category and attribute controllers

This commit is contained in:
dualfroz committed 2026-08-25 20:25:00 +02:00
1 parent d63bbcb29a
commit d9cb77c6fe
2 files changed
+159

No files matched your search

@@ -0,0 +1,57 @@
<?php
namespace Bazaar\Controllers\Admin;
use Bazaar\Controllers\Controller;
use Bazaar\Core\Response;
final class AttributeController extends Controller
{
public function index(): Response
{
return $this->view('admin.attributes.index', [
'attributes' => $this->ctx->attributes->withValues(),
], 'admin.layout');
}
public function store(): Response
{
$name = trim((string) $this->ctx->request->input('name', ''));
if ($name === '') {
$this->ctx->session->flash('error', 'Attribute name is required.');
return $this->redirect('/admin/attributes');
}
$slug = slugify($name);
if ($this->ctx->attributes->findBySlug($slug) === null) {
$this->ctx->attributes->create($name, $slug);
$this->ctx->session->flash('success', 'Attribute created.');
} else {
$this->ctx->session->flash('error', 'That attribute already exists.');
}
return $this->redirect('/admin/attributes');
}
public function storeValue(string $id): Response
{
$attributeId = (int) $id;
$attribute = $this->ctx->attributes->find($attributeId);
if ($attribute === null) {
return $this->notFound();
}
$value = trim((string) $this->ctx->request->input('value', ''));
if ($value === '') {
$this->ctx->session->flash('error', 'Value is required.');
return $this->redirect('/admin/attributes');
}
$slug = slugify($value);
if ($this->ctx->attributes->findValueBySlug($attributeId, $slug) === null) {
$this->ctx->attributes->createValue($attributeId, $value, $slug);
$this->ctx->session->flash('success', 'Value added.');
} else {
$this->ctx->session->flash('error', 'That value already exists for this attribute.');
}
return $this->redirect('/admin/attributes');
}
}
@@ -0,0 +1,102 @@
<?php
namespace Bazaar\Controllers\Admin;
use Bazaar\Controllers\Controller;
use Bazaar\Core\Response;
final class CategoryController extends Controller
{
public function index(): Response
{
return $this->view('admin.categories.index', [
'categories' => $this->ctx->categories->withProductCounts(),
], 'admin.layout');
}
public function create(): Response
{
return $this->view('admin.categories.form', [
'category' => null,
'errors' => [],
], 'admin.layout');
}
public function store(): Response
{
[$fields, $errors] = $this->validate();
if ($errors !== []) {
return $this->view('admin.categories.form', [
'category' => $fields,
'errors' => $errors,
], 'admin.layout', 422);
}
$this->ctx->categories->create($fields['name'], $fields['slug'], $fields['description']);
$this->ctx->session->flash('success', 'Category created.');
return $this->redirect('/admin/categories');
}
public function edit(string $id): Response
{
$category = $this->ctx->categories->find((int) $id);
if ($category === null) {
return $this->notFound();
}
return $this->view('admin.categories.form', [
'category' => $category,
'errors' => [],
], 'admin.layout');
}
public function update(string $id): Response
{
$category = $this->ctx->categories->find((int) $id);
if ($category === null) {
return $this->notFound();
}
[$fields, $errors] = $this->validate();
if ($errors !== []) {
return $this->view('admin.categories.form', [
'category' => array_merge($category, $fields),
'errors' => $errors,
], 'admin.layout', 422);
}
$this->ctx->categories->update((int) $id, $fields['name'], $fields['slug'], $fields['description']);
$this->ctx->session->flash('success', 'Category updated.');
return $this->redirect('/admin/categories');
}
public function destroy(string $id): Response
{
$this->ctx->categories->delete((int) $id);
$this->ctx->session->flash('success', 'Category deleted.');
return $this->redirect('/admin/categories');
}
private function validate(): array
{
$request = $this->ctx->request;
$name = trim((string) $request->input('name', ''));
$slug = trim((string) $request->input('slug', ''));
if ($slug === '') {
$slug = slugify($name);
}
$errors = [];
if ($name === '') {
$errors['name'] = 'Name is required.';
}
$fields = [
'name' => $name,
'slug' => $slug,
'description' => trim((string) $request->input('description', '')),
];
return [$fields, $errors];
}
}