# 显示文章详细页
让我们在我们的博客中添加另一个页面,它将显示一个指定博客帖子的内容。比如我在主页三个文章里想查看其中一个文章详细里面的内容。
我们需要创建一个新的渲染方法,它将获取一个指定的博客文章并将其传递给模板。 用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模板中 让我们现在在主页里修改:
本来是:
![](https://box.kancloud.cn/bdd43af45074981e34bd563c7b3f8911_605x317.png)
修改成
~~~
...
<h2><a href="{link Post:show $post->id}">{$post->title}</a></h2>
...
~~~
刷新主页
![](https://box.kancloud.cn/86cb8c2c312842d7b32dd363f5a43a5c_668x662.png)
{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不存在。
![](https://box.kancloud.cn/90adf9f61e69d81c912ca96a844e8720_1366x599.png)
如果您看到不同以上的错误报告,您可能需要在您的网络服务器中打开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>
~~~
再重新刷主页点进去。现在就应正常了。
![](https://box.kancloud.cn/45303bda9a84618325c75f197f356794_738x455.png)
# 检查帖子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
- 原子操作