First Commit
This commit is contained in:
+169
@@ -0,0 +1,169 @@
|
||||
<?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')));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\PageBuilder\Controllers;
|
||||
|
||||
use Kernel\View;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Modules\PageBuilder\Models\Page;
|
||||
use Modules\Auth\Models\User;
|
||||
use Twig\Error\LoaderError;
|
||||
|
||||
class PageController
|
||||
{
|
||||
protected View $view;
|
||||
|
||||
public function __construct(View $view)
|
||||
{
|
||||
$this->view = $view;
|
||||
}
|
||||
|
||||
/**
|
||||
* Displays a custom page by slug.
|
||||
*/
|
||||
public function show(Request $request, string $slug): Response
|
||||
{
|
||||
$query = Page::where('pages_slug', $slug);
|
||||
|
||||
// If not admin, display only published pages
|
||||
if (!$this->isAdmin()) {
|
||||
$query->published();
|
||||
}
|
||||
|
||||
$page = $query->first();
|
||||
|
||||
if (!$page) {
|
||||
return new Response('Página não encontrada', 404);
|
||||
}
|
||||
|
||||
return $this->renderPage($page);
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the page with error handling.
|
||||
*/
|
||||
private function renderPage(Page $page): Response
|
||||
{
|
||||
$data = [
|
||||
'page' => $page,
|
||||
'title' => $page->meta_title ?: $page->title,
|
||||
'meta_description' => $page->meta_description,
|
||||
'custom_css' => $page->getCustomCss(),
|
||||
'custom_js' => $page->getCustomJs(),
|
||||
'css_classes' => $page->getCssClasses()
|
||||
];
|
||||
|
||||
try {
|
||||
return new Response($this->view->render($page->getLayoutPath(), $data));
|
||||
} catch (LoaderError $e) {
|
||||
// If the template is not found, try the default layout
|
||||
error_log("Template error for page {$page->pages_slug}: " . $e->getMessage());
|
||||
return new Response($this->view->render('default.twig', $data));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the current user is admin.
|
||||
*/
|
||||
private function isAdmin(): bool
|
||||
{
|
||||
if (session_status() === PHP_SESSION_NONE) {
|
||||
session_start();
|
||||
}
|
||||
|
||||
if (!isset($_SESSION['user_id'])) {
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
$user = User::find($_SESSION['user_id']);
|
||||
return $user && ($user->isSuperAdmin() || $user->isAdmin());
|
||||
} catch (\Exception $e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user