Files
elixforms-web-pages/.agents/skills/php-project-architecture/SKILL.md
T

5.2 KiB

name, description
name description
elixforms-php-project-architecture Architettura e struttura della parte PHP del progetto elixForms Custom Pages. Descrive la cartella php/, la libreria common condivisa, il pattern delle pagine, le convenzioni di naming, e il deploy su Apache. Attiva questa skill quando lavori sulla parte PHP del progetto, crei nuove pagine PHP, modifichi l'architettura, o devi capire come è organizzato il codice PHP.

Architettura PHP del Progetto elixForms Custom Pages

Panoramica

La cartella php/ contiene le custom page elixForms realizzate in PHP 8.0+ puro (nessun framework). Ogni pagina è un file PHP autonomo che include la libreria common/ e produce HTML server-side con Bootstrap Italia.

Questa struttura è l'equivalente PHP del monorepo React in react/.

Struttura del Workspace

elixforms-custom-pages/
├── composer.json                ← Configurazione Composer e autoload PSR-4
├── vendor/                      ← Autoloader generato (non versionato)
├── react/                        ← Custom pages React (esistente)
└── php/                          ← Custom pages PHP
    ├── AGENTS.md                 ← Regole dell'agente PHP
    ├── common/                   ← Libreria condivisa PHP
    │   ├── ElixFormsComponent.php    ← Classe base astratta
    │   ├── ElixFormsElement.php      ← Wrapper layout label+input
    │   └── QueryParamHelper.php      ← Utility query string
    └── scelta-carriera/          ← Esempio di pagina custom
        └── index.php                 ← Entry point (classe + rendering)

Pattern Architetturale: Singolo File PHP per Pagina

Ogni pagina (es. scelta-carriera/) è un file PHP autonomo che:

  1. Carica l'autoloader Composer tramite vendor/autoload.php
  2. Definisce una classe che estende ElixFormsComponent
  3. Sovrascrive createCustomFormFields() per i campi specifici
  4. Istanzia e renderizza la pagina con echo $page->render()
  5. Genera HTML completo (dalla <!DOCTYPE html> al </html>)
  6. Non richiede build — servito direttamente da Apache

Namespace e Autoloading

Il progetto usa namespace PSR-4:

namespace ElixForms\Common;  // Per le classi in common/

L'autoloading PSR-4 è gestito da Composer:

require_once __DIR__ . '/../../vendor/autoload.php';

Requisiti PHP

  • Versione minima: PHP 8.0+
  • Funzionalità usate:
    • declare(strict_types=1) — strict typing
    • Typed properties (protected array $properties)
    • match expression (nel renderField)
    • Named arguments
    • Union types (int|null, string|null)
    • Arrow functions (fn() =>)

CSS Strategy

Le pagine PHP usano <link> tags per caricare i CSS (non bundle JS):

<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Titillium+Web:wght@300;400;600;700&display=swap">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-italia@2.18.2/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="https://console-unipr.elixforms.it/rwe2/css/design-bs/util.css">
<link rel="stylesheet" href="https://console-unipr.elixforms.it/rwe2/css/themes/blu-italia.css">

Nota: Stessi CSS del progetto React, ma caricati via <link> anziché @import url() nel JS bundle.

Integrazione con elixForms

Identica alla versione React:

  1. Query parameters: Parametri obbligatori passati nell'URL da elixForms
  2. Form POST: Il form fa submit a https://procedure.unipr.it/rwe2/ComeBackToElixAndSave
  3. Hidden inputs: I parametri query vengono inseriti come campi hidden nel form
  4. Encoding: accept-charset="ISO-8859-1" per compatibilità con il backend

Convenzioni di Naming

  • Cartelle pagina: kebab-case (es. scelta-carriera)
  • File entry point: sempre index.php
  • Classi PHP: PascalCase con suffisso Page (es. SceltaCarrieraPage)
  • Namespace: ElixForms\Common per la libreria condivisa
  • Configurazione: opzionale config.json nella cartella della pagina

Differenze con il Progetto React

Aspetto React (react/) PHP (php/)
Linguaggio TypeScript/JSX PHP 8.0+
Rendering Client-side Server-side
Build tool Vite (single bundle JS) Nessuno (file serviti direttamente)
Dipendenze npm (React, Vite, plugin) Composer (autoload PSR-4)
CSS loading @import url() + CSS injection plugin <link> tags
State management React state (this.setState) Stateless ($_GET)
Deploy Upload del bundle .js Upload dei file .php
Dev server npm run dev (Vite HMR) php -S / Docker

Deploy su Apache

  1. Eseguire composer install --no-dev --optimize-autoloader dalla root del repository
  2. Caricare sul server le cartelle php/ e vendor/, mantenendole allo stesso livello
  3. Configurazione Apache minima:
    • mod_php o php-fpm abilitato
    • DirectoryIndex index.php (default Apache)
  4. La pagina è accessibile via URL: https://server/php/nome-pagina/
  5. elixForms reindirizza l'utente alla pagina passando i parametri via query string