Bejegyzés oldala
Most létrehozunk egy másik blogoldalt, amely egy konkrét bejegyzést fog megjeleníteni.
Létre kell hoznunk egy új render metódust, amely lekér egy konkrét cikket, és átadja a sablonnak. Ennek a metódusnak a
HomePresenter-ben való elhelyezése nem túl elegáns, mivel egy cikkről beszélünk, nem a kezdőlapról. Hozzunk
létre tehát egy PostPresenter-t az app/Presentation/Post/-ban. Ennek a presenternek is csatlakoznia
kell az adatbázishoz, ezért itt is írunk egy konstruktort, amely adatbázis-kapcsolatot igényel.
A PostPresenter tehát így nézhet ki:
<?php
namespace App\Presentation\Post;
use Nette;
use Nette\Application\UI\Form;
final class PostPresenter extends Nette\Application\UI\Presenter
{
public function __construct(
private Nette\Database\Explorer $database,
) {
}
public function renderShow(int $id): void
{
$this->template->post = $this->database
->table('posts')
->get($id);
}
}
Nem szabad elfelejtenünk megadni a helyes App\Presentation\Post névteret, amely a presenter leképezés beállításainak
van alárendelve.
A renderShow metódus egy argumentumot igényel – egy konkrét cikk azonosítóját, amelyet meg kell
jeleníteni. Ezután betölti ezt a cikket az adatbázisból, és átadja a sablonnak.
A Home/default.latte sablonba beillesztünk egy linket a Post:show akcióra.
...
<h2><a href="{link Post:show $post->id}">{$post->title}</a></h2>
...
A {link} tag egy URL címet generál, amely a Post:show akcióra mutat. Átadja a bejegyzés
azonosítóját is argumentumként.
Ugyanezt rövidebben is leírhatjuk egy n:attribútum segítségével:
...
<h2><a n:href="Post:show $post->id">{$post->title}</a></h2>
...
Az n:href attribútum a {link} tag megfelelője.
A Post:show akcióhoz azonban még nem létezik sablon. Kipróbálhatjuk megnyitni a linket ehhez a bejegyzéshez.
A Tracy hibát fog megjeleníteni, mert a Post/show.latte sablon még nem
létezik. Ha más hibaüzenetet lát, valószínűleg engedélyeznie kell a mod_rewrite-ot a webszerveren.
Hozzunk létre tehát egy Post/show.latte sablont ezzel a tartalommal:
{block content}
<p><a n:href="Home:default">← vissza a bejegyzések listájához</a></p>
<div class="date">{$post->created_at|date:'F j, Y'}</div>
<h1 n:block="title">{$post->title}</h1>
<div class="post">{$post->content}</div>
Most nézzük át a sablon egyes részeit.
Az első sor a “content” nevű blokk definíciójával kezdődik, ugyanúgy, mint a kezdőlapon. Ez a blokk ismét a fő
sablonban lesz megjelenítve. Ahogy láthatja, hiányzik a {/block} záró tag. Ez ugyanis nem kötelező.
A következő sorban egy link található vissza a blogbejegyzések listájához, így a felhasználó egyszerűen mozoghat a
cikkek listája és egy konkrét cikk között. Mivel az n:href attribútumot használjuk, a Nette maga gondoskodik a
linkek generálásáról. A link a Home presenter default akciójára mutat (írhatjuk úgy is, hogy
n:href="Home:", mert a default nevű akció elhagyható, automatikusan kiegészül).
A harmadik sor formázza a dátum kiírását a már ismert szűrő segítségével.
A negyedik sor a blog címsorát jeleníti meg a <h1> HTML tagben. Ez a tag tartalmaz egy
attribútumot, amelyet talán nem ismer (n:block="title"). Kitalálja, mit csinál? Ha figyelmesen olvasta az előző
részt, akkor már tudja, hogy ez egy n:atribut. Ez egy másik példa rájuk, amely ekvivalens ezzel:
{block title}<h1>{$post->title}</h1>{/block}
Egyszerűen fogalmazva, ez a blokk újradefiniálja a title nevű blokkot. Ez a blokk már definiálva van a fő
layout sablonban (/app/Presentation/@layout.latte:11), és ahogy az OOP metódusok felülírásánál,
ugyanúgy ez a blokk a fő sablonban felülíródik. Tehát az oldal <title>-je most a megjelenített
bejegyzés címsorát tartalmazza, és ehhez csak egy egyszerű n:block="title" attribútumot kellett használnunk.
Nagyszerű, ugye?
A sablon ötödik és utolsó sora egy konkrét bejegyzés teljes tartalmát jeleníti meg.
Bejegyzésazonosító ellenőrzése
Mi történik, ha valaki megváltoztatja az azonosítót az URL-ben, és beilleszt egy nem létező id-t? Egy
szép „Az oldal nem található” hibaüzenetet kellene megjelenítenünk a felhasználónak. Módosítsuk tehát egy kicsit a
render metódust a PostPresenter-ben:
public function renderShow(int $id): void
{
$post = $this->database
->table('posts')
->get($id);
if (!$post) {
$this->error('Az oldal nem található');
}
$this->template->post = $post;
}
Ha a bejegyzés nem található, a $this->error(...) hívásával egy 404-es hibaoldalt jelenítünk meg
érthető üzenettel. Figyeljen arra, hogy fejlesztői módban (localhost) ezt a hibaoldalt nem fogja látni. Helyette a Tracy
jelenik meg a kivétel részleteivel, ami elég előnyös a fejlesztéshez. Ha mindkét módot meg akarjuk jeleníteni, csak meg
kell változtatnunk a setDebugMode metódus argumentumát a Bootstrap.php fájlban.
Összegzés
Van egy adatbázisunk bejegyzésekkel és egy webalkalmazásunk, amelynek két nézete van – az első az összes bejegyzés áttekintését mutatja, a második pedig egy konkrét bejegyzést.