# Forstå malsystemet PnP bruker et enkelt, men kraftig malsystem basert på PHP-inkluderinger. ## Filosofien Tradisjonelle templating-systemer introduserer nye språk og syntaks som må læres. PnP tar en annen tilnærming: **bruk PHP som det er**. Dette designvalget gir: - **Ingen læringskurve**: Hvis du kan PHP, kan du lage maler - **Full kraft**: Tilgang til alle PHP-funksjoner - **Null overhead**: Ingen kompilering eller parsing - **Lett feilsøking**: Standard PHP-feilmeldinger ## Malhierarki PnP har tre hovednivåer av maler: ### 1. Basismal (base.php) Inneholder den overordnede HTML-strukturen: ```php <?= $pageTitle ?? 'Min side' ?> ``` ### 2. Sidemal (page.php) Pakker inn enkeltinnhold: ```php
``` ### 3. Listemal (list.php) Viser samlinger av innhold: ```php

``` ## Dataflyt Når en forespørsel kommer inn, flyter data gjennom systemet slik: ``` Request → Router → Content → Page Template → Base Template → Response ``` 1. **Router**: Finner riktig innhold 2. **Content**: Konverterer markdown/HTML til HTML 3. **Page Template**: Pakker innholdet i `$content` 4. **Base Template**: Pakker alt i full HTML-struktur ## Fallback-kjede PnP følger en fallback-kjede for maler: ``` custom/templates/base.php ↓ (hvis ikke funnet) default/templates/base.php ``` Dette betyr: - Egendefinerte maler overstyrer standardmaler - Du trenger bare å lage egendefinerte maler for det du vil endre - Standardmaler fungerer som fallback ## Tilgjengelige variabler ### I base.php | Variabel | Type | Beskrivelse | |----------|------|-------------| | `$content` | string | Det rendrede innholdet | | `$navigation` | array | Navigasjonselementer | | `$currentLang` | string | Nåværende språk | | `$defaultLang` | string | Standardspråk | | `$homeLabel` | string | Label for hjem-lenken | | `$translations` | array | Oversettelser fra språkfiler | | `$pageTitle` | string | Sidens tittel | ### I page.php | Variabel | Type | Beskrivelse | |----------|------|-------------| | `$content` | string | Innholdet som skal vises | | `$metadata` | array | Metadata for siden | | `$pageTitle` | string | Sidens tittel | ### I list.php | Variabel | Type | Beskrivelse | |----------|------|-------------| | `$items` | array | Listeelementer | | `$metadata` | array | Metadata for mappen | | `$pageContent` | string | Valgfritt innhold fra page.md | ## Items-struktur I list.php er hvert element i `$items` et array med: ```php [ 'title' => 'Innleggstittel', 'date' => '15. januar 2025', 'url' => '/blogg/2025-01-15-innlegg', 'cover' => '/blogg/2025-01-15-innlegg/cover.jpg', // eller null 'summary' => 'Kort beskrivelse' // eller null ] ``` ## Sikkerhet i maler ### Escape output Bruk alltid `htmlspecialchars()` for brukerdata: ```php

``` ### Ikke escape HTML-innhold `$content` inneholder allerede HTML og skal ikke escapes: ```php ``` ## Beste praksis ### Bruk korte echo-tags ```php ``` ### Sjekk for eksistens ```php

``` ### Bruk ternary for fallbacks ```php <?= $pageTitle ?? 'Standard tittel' ?> ``` ### Hold logikk utenfor maler Forbered data i ruteren eller i egne funksjoner, ikke i malene: ```php 10; }); ?> ``` ## Egendefinerte maler For å lage egendefinerte maler: 1. Kopier standardmalen fra `/app/default/templates/` 2. Lim den inn i `/app/custom/templates/` 3. Endre etter behov Eksempel: ```bash cp app/default/templates/base.php app/custom/templates/base.php # Rediger app/custom/templates/base.php ``` ## Spesialiserte maler Du kan lage spesialiserte maler for spesifikke formål: ### list-grid.php En alternativ listevisning med grid-layout: ```php
``` PnP vil automatisk foretrekke `list-grid.php` over `list.php` hvis den eksisterer. ## Hvorfor dette systemet? Dette malsystemet vil fungere i flere tiår fordi: - Ingen proprietære templating-språk som kan bli utdaterte - Basert på standard PHP-funksjoner - Ingen kompilering eller cache-generering - Lett å debugge med standard PHP-verktøy - Ingen dependencies som kan bryte - Fullt SEO-vennlig (server-side rendering)