-
-
Notifications
You must be signed in to change notification settings - Fork 277
Expand file tree
/
Copy pathsingle-post.texy
More file actions
124 lines (80 loc) · 5.65 KB
/
single-post.texy
File metadata and controls
124 lines (80 loc) · 5.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
Bejegyzés oldala
****************
.[perex]
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 .{file:app/Presentation/Post/PostPresenter.php}
<?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 |https://github.com/nette-examples/quickstart/blob/v4.0/config/common.neon#L6-L7] 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.
```latte .{file:app/Presentation/Home/default.latte}
...
<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:
```latte .{file:app/Presentation/Home/default.latte}
...
<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 |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:
```latte .{file:app/Presentation/Post/show.latte}
{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:
```latte
{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:
```php .{file:app/Presentation/Post/PostPresenter.php}
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.
{{priority: -1}}