Files
2026-09-01 10:46:29 -03:00

170 lines
5.1 KiB
PHP
Executable File

<?php
namespace Modules\PageBuilder\Controllers;
use App\Controllers\BaseAdminController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Modules\PageBuilder\Models\Page;
use Modules\PageBuilder\Classes\Paginator;
use Illuminate\Support\Str;
class AdminController extends BaseAdminController
{
/**
* Lists all pages in the admin panel.
*/
public function index(Request $request): Response
{
$perPage = 15;
$currentPage = (int) $request->query->get('page', 1);
$total = Page::count();
$paginator = new Paginator($total, $perPage, $currentPage);
$pages = Page::with(['creator', 'updater'])
->orderBy('created_at', 'desc')
->skip($paginator->getOffset())
->take($perPage)
->get();
return $this->renderAdminView('@pagebuilder/admin/index.twig', [
'pages' => $pages,
'paginator' => $paginator->toArray(),
'title' => 'Gerenciar Páginas'
]);
}
/**
* Displays the page creation form.
*/
public function create(Request $request): Response
{
return $this->renderAdminView('@pagebuilder/admin/create.twig', [
'title' => 'Criar Nova Página'
]);
}
/**
* Stores a new page.
*/
public function store(Request $request): Response
{
$data = $request->request->all();
// Basic validation
if (empty($data['title']) || empty($data['slug']) || empty($data['content'])) {
$_SESSION['error'] = 'Preencha todos os campos obrigatórios (Título, Slug, Conteúdo).';
return new RedirectResponse(url('/admin/pages/create'));
}
// Check unique slug
if (Page::where('pages_slug', $data['slug'])->exists()) {
$_SESSION['error'] = 'Este slug já está sendo utilizado.';
return new RedirectResponse(url('/admin/pages/create'));
}
$data['slug'] = Str::slug($data['slug']);
$data['created_by'] = $_SESSION['user_id'] ?? null;
if (isset($data['is_published']) && $data['is_published']) {
$data['published_at'] = date('Y-m-d H:i:s');
} else {
$data['is_published'] = 0;
}
Page::create($data);
$_SESSION['success'] = 'Página criada com sucesso!';
return new RedirectResponse(url('/admin/pages'));
}
/**
* Displays the page edit form.
*/
public function edit(Request $request, int $id): Response
{
$page = Page::findOrFail($id);
return $this->renderAdminView('@pagebuilder/admin/edit.twig', [
'page' => $page,
'title' => 'Editar Página: ' . $page->title
]);
}
/**
* Updates an existing page.
*/
public function update(Request $request, int $id): Response
{
$page = Page::findOrFail($id);
$data = $request->request->all();
// Basic validation
if (empty($data['title']) || empty($data['slug']) || empty($data['content'])) {
$_SESSION['error'] = 'Preencha todos os campos obrigatórios.';
return new RedirectResponse(url("/admin/pages/{$id}/edit"));
}
// Check unique slug (ignoring the page itself)
if (Page::where('pages_slug', $data['slug'])->where('pages_id', '!=', $id)->exists()) {
$_SESSION['error'] = 'Este slug já está sendo utilizado.';
return new RedirectResponse(url("/admin/pages/{$id}/edit"));
}
$data['slug'] = Str::slug($data['slug']);
$data['updated_by'] = $_SESSION['user_id'] ?? null;
// Check if the page is being published now
if (!$page->is_published && isset($data['is_published']) && $data['is_published']) {
$data['published_at'] = date('Y-m-d H:i:s');
}
if (!isset($data['is_published'])) {
$data['is_published'] = 0;
}
$page->update($data);
$_SESSION['success'] = 'Página atualizada com sucesso!';
return new RedirectResponse(url('/admin/pages'));
}
/**
* Deletes a page.
*/
public function destroy(Request $request, int $id): Response
{
$page = Page::findOrFail($id);
$page->delete();
$_SESSION['success'] = 'Página excluída com sucesso!';
return new RedirectResponse(url('/admin/pages'));
}
/**
* Publishes a page.
*/
public function publish(Request $request, int $id): Response
{
$page = Page::findOrFail($id);
$page->publish();
$_SESSION['success'] = 'Página publicada com sucesso!';
return new RedirectResponse($request->headers->get('referer', url('/admin/pages')));
}
/**
* Sets a page as draft.
*/
public function unpublish(Request $request, int $id): Response
{
$page = Page::findOrFail($id);
$page->unpublish();
$_SESSION['success'] = 'Página definida como rascunho!';
return new RedirectResponse($request->headers->get('referer', url('/admin/pages')));
}
}