Skip to content
docsv0.2.0

ShellRenderHandler

Renderiza la superficie de Milpa Admin para una request ya autenticada y autorizada: el shell REAL de `milpa/live-web` (Tarea 5) con el form REAL de settings inyectado en `dashboard-main` (Tarea 6) — un `<form method=post action=/milpa/admin/settings>` sin JS (ADR#6: submit nativo, hidden CSRF, botón real), y el sidebar `brand` reflejando el `siteName` guardado en vez del literal `'Milpa Admin'` fijo de la Tarea 5. El hidden `csrf` del form y la cookie `Set-Cookie` que este handler emite comparten SIEMPRE el mismo valor — nunca derivado de `milpa_session` — y el nombre/campo (`milpa_admin_csrf`/`csrf`) es el par exacto que `Milpa\Auth\Http\CsrfGuard('milpa_admin_csrf', 'csrf')` de la Tarea 7 verifica. `dashboard-topbar` SÍ se compone ahora: su botón de toggle (`mui-topbar__nav-toggle`, `@click="navOpen = !navOpen"`) queda respaldado por el runtime Alpine (P5.3b) y se REVELA solo cuando el JS está vivo (`html.milpa-js`, ver AdminPage) — sin JS el sidebar queda visible y el toggle no aparece, así que no hay control muerto (ADR#5). El contenido del topbar (title) es server-truth y se ve siempre (ADR#8).

ShellRenderHandler::__construct()

public function __construct(Milpa\Live\Schema\FormDefinition $definition, array $values, string $csrf, bool $secure, Milpa\Live\Schema\ValidationResult $validation = new ValidationResult(), ?Milpa\Admin\Projection\FormBanner $banner = null, array $sections = [], string $activeSectionId = 'settings', ?string $brand = null):

Parameters

Parameters of __construct()
NameTypeDescription
$definitionMilpa\Live\Schema\FormDefinition
$valuesarray<string, mixed>los valores a mostrar en el form — los actuales de configuración en el GET ({@see \Milpa\Admin\Settings\SettingsStateProvider::state()}), o los de la SUMISIÓN cuando este handler se reusa para el redisplay inválido del POST de settings (Tarea 7) — nunca una mezcla de ambos
$csrfstring
$secureboolel flag `Secure` de la cookie CSRF, YA resuelto por el controller vía `Request::isSecure()` de Symfony (consciente de proxies de confianza); este handler no lo re-deriva de los headers PSR-7 crudos, que un cliente cualquiera podría falsificar con `X-Forwarded-Proto`
$validationValidationResultel resultado de validación a mostrar — siempre-ok en el GET (default, ningún error que mostrar todavía), o el `$submission->validation` real del bind cuando el POST de settings (Tarea 7) reusa este handler para el redisplay inválido (server-truth: los errores vienen SIEMPRE de la sumisión, nunca inventados aquí)
$banner?FormBannerel aviso form-level (P5.4) a pintar ANTES del `<form>` — `null` en el GET normal (default, ningún aviso todavía), o el `FormBanner` real que arma {@see \Milpa\Admin\Projection\ToolProjector}'s resultado de redisplay cuando una acción de tool falla (Tarea 6) — server-rendered (ADR#8), sin depender de JS para mostrarse
$sectionslist<AdminSection>las secciones descubiertas (ADR#12), YA ordenadas por {@see \Milpa\Admin\Section\AdminSectionDiscovery::sections()} — este handler NUNCA re-ordena. `[]` (default) cae al único item hardcoded pre-Tarea-5 (BC de construcción para cualquier caller que aún no las pase)
$activeSectionIdstringel id de la sección dueña de esta página, declarado por el controller — matchea por key estricto contra `$sections` (el componente emite `aria-current="page"` cuando coincide)
$brand?stringel nombre a pintar en el chrome (topbar title + sidebar brand) — SIEMPRE el `siteName` PERSISTIDO ({@see \Milpa\Admin\Settings\SettingsStateProvider::state()}), nunca el de la sumisión: un redisplay inválido manda `siteName=''` en `$values`, y derivar el brand de ahí blanquearía el chrome en cada rechazo. `null` (default) cae al `$values['siteName']` — correcto en el GET, donde `$values` YA es el persistido, y BC para callers que no lo pasen

ShellRenderHandler::handle()

public function handle(Psr\Http\Message\ServerRequestInterface $request): Psr\Http\Message\ResponseInterface

Pinta el shell del admin y emite la cookie CSRF que el POST verificará.

Parameters

Parameters of handle()
NameTypeDescription
$requestPsr\Http\Message\ServerRequestInterface