ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# 显示文章详细页 让我们在我们的博客中添加另一个页面,它将显示一个指定博客帖子的内容。比如我在主页三个文章里想查看其中一个文章详细里面的内容。 我们需要创建一个新的渲染方法,它将获取一个指定的博客文章并将其传递给模板。 用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; } ~~~ 这样就安全多了。