# 顯示文章詳細頁
讓我們在我們的博客中添加另一個頁面,它將顯示一個指定博客帖子的內容。比如我在主頁三個文章里想查看其中一個文章詳細里面的內容。
我們需要創建一個新的渲染方法,它將獲取一個指定的博客文章并將其傳遞給模板。 用HomepagePresenter控制器顯示視圖不是很好,因為它關于一個博客所有帖子,而不是詳細一個頁面。 所以,讓我們創建一個新的控制器PostPresenter,并將其放置到app / presenters / PostPresenter.php。 它將需要一個數據庫連接,所以再次把數據庫注入代碼。
以上意思是增加一個控制器來顯示詳細文章,這個控制器是PostPresenter。
代碼以下
~~~
<?php
namespace App\Presenters;
use Nette;
use Nette\Application\UI\Form;
class PostPresenter extends Nette\Application\UI\Presenter
{
private $database;
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
public function renderShow($postId)
{
$this->template->post = $this->database->table('posts')->get($postId);
}
}
~~~
renderShow方法需要一個參數 - 要顯示的帖子的ID。 然后,它從數據庫加載帖子并將結果傳遞給模板。
在app / presenters / templates / Homepage / default.latte模板中 讓我們現在在主頁里修改:
本來是:

修改成
~~~
...
<h2><a href="{link Post:show $post->id}">{$post->title}</a></h2>
...
~~~
刷新主頁

{link}生成指向操作Post:show的URL地址。 此標注還將該標題的ID作為參數。
同樣,我們可以使用n:macro寫:
~~~
<h2><a n:href="Post:show $post->id">{$post->title}</a></h2>
~~~
屬性n:href是{link}標注的別名。
Post:show操作的模板尚不存在。 我們可以打開鏈接。 Tracy馬上就會顯示一個錯誤,為什么app / templates / Post / show.latte不存在。

如果您看到不同以上的錯誤報告,您可能需要在您的網絡服務器中打開mod_rewrite。
所以現在創建`app / templates / Post / show.latte這個內容:
并把以下內容放進去。
~~~
{block content}
//利用公共模板顯示網頁
<p><a n:href="Homepage:default">← back to posts list</a></p>
//返回主頁n:href這是nette框架自動生成URL
<div class="date">{$post->created_at|date:'F j, Y'}</div>
<h1 n:block="title">{$post->title}</h1>
//{block title}<h1>{$post->title}</h1>{/block}簡寫方法
//公共模板title標題被覆蓋。
<div class="post">{$post->content}</div>
~~~
再重新刷主頁點進去。現在就應正常了。

# 檢查帖子ID
如果有人改變了URL并插入了不存在的postId,會發生什么? 我們應該為用戶提供一個很好的“找不到頁面”的錯誤。 讓我們更新
app / presenters / PostPresenter.php中的render方法:
~~~
public function renderShow($postId)
{
$post = $this->database->table('posts')->get($postId);
if (!$post) {
$this->error('Post not found');
}
$this->template->post = $post;
}
~~~
這樣就安全多了。
- Nette簡介
- 快速開始
- 入門
- 主頁
- 顯示文章詳細頁
- 文章評論
- 創建和編輯帖子
- 權限驗證
- 程序員指南
- MVC應用程序和控制器
- URL路由
- Tracy - PHP調試器
- 調試器擴展
- 增強PHP語言
- HTTP請求和響應
- 數據庫
- 數據庫:ActiveRow
- 數據庫和表
- Sessions
- 用戶授權和權限
- 配置
- 依賴注入
- 獲取依賴關系
- DI容器擴展
- 組件
- 字符串處理
- 數組處理
- HTML元素
- 使用URL
- 表單
- 驗證器
- 模板
- AJAX & Snippets
- 發送電子郵件
- 圖像操作
- 緩存
- 本土化
- Nette Tester - 單元測試
- 與Travis CI的持續集成
- 分頁
- 自動加載
- 文件搜索:Finder
- 原子操作