Skip to content

Admin

Administrace Petrovo CMS je dnes rozdělená na dvě vrstvy:

  • app/Modules/* obsahuje aplikační logiku, controllery, služby a routy
  • app/admin/* obsahuje sdílené šablony a několik legacy wrapperů pro nástroje

To je důležitý rozdíl proti starší struktuře, kde byly moduly přímo v app/admin/modules.

Autentizace administrace

Administrace už nepoužívá lokální hesla. Přihlášení běží přes centrální passkey autoritu a CMS po callbacku páruje identitu podle emailu administrátora.

Podrobný popis je v sekci Admin Auth (Passkey).

Aktuální struktura

app/Modules/
├── Admin/
│   ├── Auth/
│   ├── Group/
│   ├── Permission/
│   └── User/
├── Block/
├── Category/
├── CookieBar/
├── Cube/
├── Gallery/
├── I18n/
├── LogForm/
├── Menu/
├── News/
├── Newsletter/
├── Page/
├── Redirection/
├── Setting/
├── Superadmin/
└── User/

app/admin/
├── templates/
│   ├── wrapper.tpl
│   ├── login.tpl
│   ├── logged-out.tpl
│   ├── emergency-login.tpl
│   └── _*.tpl
├── adminneo.php
├── files.gallery.php
└── tools/

Jak se admin routuje

Hlavní vstup je v app/routes/admin.php.

Tam se děje:

  • definice pipeline PIPE_ADMIN a PIPE_TOOLS
  • dashboard route /ADMIN
  • připojení routerů ze app/Modules/*/router.php

Submoduly uvnitř domén pak typicky používají vlastní routes.php, které si rodičovský router.php includuje. Příklad:

  • app/Modules/Admin/router.php
  • app/Modules/Admin/User/routes.php
  • app/Modules/Menu/router.php
  • app/Modules/Menu/Node/routes.php

Middleware pipeline

PIPE_ADMIN skládá hlavně tyto middleware:

  • proxy
  • session expiration
  • CSRF
  • admin auth
  • permission check
  • logging
  • IP blacklist
  • response headers

PIPE_TOOLS je lehčí varianta pro nástroje jako adminneo a files.gallery.

Jak vypadá admin modul

Běžný admin modul už dnes typicky žije v app/Modules/{Module} nebo app/Modules/{Domain}/{Module}.

Příklad jednoduchého modulu:

app/Modules/Admin/User/
├── UserController.php
├── UserService.php
├── UserListService.php
├── UserData.php
├── data.yaml
├── listing.tpl
└── routes.php

Role souborů:

  • *Controller.php obsluhuje HTTP akce
  • *Service.php drží business logiku a zápisy do DB
  • *ListService.php připravuje listing a filtry
  • data.yaml definuje admin formulář
  • listing.tpl vykresluje seznam
  • routes.php nebo router.php registruje routy

Základní controller pattern

Admin controllery běžně dědí z App\Modules\AdminBaseController.

Ten poskytuje:

  • načtení data.yaml přes initModule(__DIR__, self::PAGE)
  • společné metody list() a filter()
  • práci se session pro filtry a stránkování
  • orchestrace validace přes handleFormSubmit()

Typický pattern v controlleru:

class ExampleController extends AdminBaseController
{
    const string PAGE = 'examples';

    public function __construct()
    {
        $this->service = new ExampleService();
        $this->listService = new ExampleListService();
        $this->initModule(__DIR__, self::PAGE);
    }
}

Routovací pattern modulu

Typický modul registruje:

  • GET /ADMIN/{page} pro listing
  • POST /ADMIN/{page}/filter pro filtrování
  • GET /ADMIN/{page}/{id} pro formulář
  • POST /ADMIN/{page} pro create
  • POST /ADMIN/{page}/{id} pro update
  • DELETE /ADMIN/{page}/{id} pro delete

Modul může přidat i vlastní akce, například:

  • POST /ADMIN/admins/{id}/invite
  • POST /ADMIN/admins/{id}/activate
  • POST /ADMIN/pages/{id}/noindex
  • GET|POST /ADMIN/pages/{id}/duplicate

data.yaml a formuláře

data.yaml je zdroj pravdy pro admin formulář.

Definuje zejména:

  • titulky formuláře
  • sekce a fieldsety
  • textová pole, textarea, selecty, checkboxy
  • vícejazyčná pole
  • validační pravidla
  • speciální elementy jako dropzone

Controller do formuláře předává:

  • uložená data
  • selects
  • parsované yamlFields

Vykreslení dělá AdminForm.

Šablony a wrapper

Sdílené admin šablony jsou v app/admin/templates/.

Nejdůležitější:

  • wrapper.tpl je hlavní shell administrace
  • login.tpl je fallback stránka login flow
  • logged-out.tpl je potvrzovací stránka po odhlášení
  • _menu.tpl, _dashboard.tpl, _pagination.tpl a další jsou sdílené partialy

Pro plnou stránku se běžně používá App\Modules\Html::wrap(...).

Speciální admin sekce

Auth modul

app/Modules/Admin/Auth/ řeší:

  • /ADMIN/login
  • /ADMIN/logged-out
  • POST /ADMIN/logout

Je to samostatný modul, ale bez klasického data.yaml formuláře.

Admin nástroje

Legacy nástroje běží přes samostatné wrappery:

  • /ADMIN/adminneo.*
  • /ADMIN/files.gallery.*

Ty používají pipeline PIPE_TOOLS.

Vytvoření nového modulu

Základní scaffold vytvoří:

./console make:module

Generator vytvoří:

  • controller
  • service
  • list service
  • data.yaml
  • listing.tpl
  • route file

Navíc:

  • doplní router pro submodul, pokud vzniká uvnitř domény
  • přidá položku do admin menu
  • založí odpovídající admin permission v databázi

Scaffold je startovní kostra. Service a ListService obsahují záměrně TODO místa pro doplnění konkrétní DB logiky.

Co je dobré vědět

  • auth a autorizace jsou oddělené: identitu potvrzuje passkey autorita, oprávnění zůstávají v CMS
  • email je pro admin login klíčový identifikátor
  • app/admin/* už není centrum business logiky, ale hlavně prezentační a legacy vrstva
  • při čtení admin kódu je potřeba sledovat jak app/routes/admin.php, tak příslušný modulový router.php nebo routes.php