Страница за индивидуално вписване
Нека да добавим още една страница към нашия блог, за да покажем съдържанието на един конкретен запис в блога.
Трябва да създадем нов метод за визуализация, който да вземе един
конкретен запис в блога и да го предаде на шаблона. Това визуализиране
в HomePresenter
не е много приятно, защото става дума за запис в блог, а
не за начална страница. Така че нека създадем нов клас PostPresenter
и
да го поставим в app/Presentation/Post/
. Тя ще се нуждае от връзка с база
данни, така че поставете отново кода за инжектиране на
зависимости* там.
PostPresenter
трябва да изглежда по следния начин:
Трябва да зададем правилното пространство от имена
App\Presentation\Post
за нашия презентатор. Това зависи от картографирането на
водещия.
Методът renderShow
изисква един аргумент – ID на публикацията на
водещия. След това той зарежда тази публикация от базата данни и
предава резултата на шаблона.
В шаблона Home/default.latte
добавяме връзка към действието
Post:show
:
Тагът {link}
генерира URL адрес, който насочва към действието
Post:show
. Този таг също така предава идентификатора на
публикацията като аргумент.
Можем да напишем същото накратко, като използваме n:attribute:
Атрибутът n:href
е подобен на тага {link}
.
Шаблонът за действието Post:show
все още не съществува. Можем да
отворим връзка към тази публикация. Tracy ще
покаже грешка, че app/Presentation/Post/show.latte
не съществува. Ако видите
друг отчет за грешка, вероятно трябва да активирате mod_rewrite на уеб
сървъра си.
Затова ще създадем Post/show.latte
с това съдържание:
Обмислете някои точки.
Първият ред започва дефиницията на именния блок, наречен
content
, който видяхме по-рано. Той ще се появи в шаблона на
разположението.
Вторият ред съдържа обратна връзка към списъка с публикации в блога,
така че потребителят да може да навигира плавно напред-назад из нашия
блог. Отново използваме атрибута n:href
, така че Nette ще се погрижи
да генерира URL адреса вместо нас. Връзката сочи към действието
default
на водещия Home
(може да напишете просто
n:href="Home:"
, тъй като действието default
може да бъде
пропуснато).
Третият ред форматира времевия печат на публикацията, като използва
филтъра date
, както вече знаем.
Четвъртият ред показва заглавието на записа в блога като
заглавие <h1>
. Има една част, която може би не познавате, а
именно n:block="title"
. Можете ли да познаете какво прави? Ако сте
прочели внимателно предишните части, споменахме n: атрибуты
. Ето
още един пример. Това е равносилно на:
Просто казано, той заменя блок, наречен title
. Блокът е
дефиниран в шаблона за оформление (/app/Presentation/@layout.latte:11
) и,
както в случая на пренаписване на ООП, се пренаписва тук. Следователно
<title>
страници ще съдържа заглавието на показаната
публикация. Премахнахме заглавието на страницата и всичко, от което се
нуждаехме, беше n:block="title"
. Чудесно, нали?
Петият и последен ред на шаблона показва пълното съдържание на публикацията ви.
Проверка на ID на публикацията
Какво ще стане, ако някой промени URL адреса и вмъкне несъществуващ
id
? Трябва да предоставим на потребителя хубава страница за
грешка „Страницата не е намерена“. Нека да актуализираме метода
render
във файла PostPresenter.php
:
Ако публикацията не може да бъде намерена, при извикване на
$this->error(...)
ще се покаже страница 404 с хубаво и ясно съобщение.
Обърнете внимание, че в режим на разработка няма да видите страницата
за грешки. Вместо това Трейси ще покаже изключение с пълна информация,
което е доста удобно за разработка. Можете да проверите и двата режима,
като просто промените стойността, подадена на setDebugMode
в
Bootstrap.php
.
За да обобщим
Имаме база данни с вписвания в блога и уеб приложение с два изгледа: първият показва обобщение на всички скорошни вписвания, а вторият – едно конкретно вписване.