# 主页
让我们创建显示您最近发布的主页。
在我们开始之前,你应该至少知道一些关于Model-View-Presenter设计模式的基础知识(类似于MVC):
模型(Model) - 数据操纵层。 它与应用程序的其余部分完全分离。 它只与控制器相接。
视图(View) - 前端定义层。 它使用模板向用户呈现所请求的数据。
控制器(Presenter) - 连接层。 Presenter连接模型和视图。 处理请求,请求Model的数据,然后将它们传递到当前的View,其他的框架叫 Controller。
在一个非常简单的应用程序,如我们的博客,Model层实际上只包括对数据库本身的查询 - 我们不需要任何额外的PHP代码。 我们只需要创建Presenter和View图层。 在Nette中,每个Presenter都有自己的Views,所以我们将同时继续。
# 使用Adminer创建数据库
要存储数据,我们将使用MySQL数据库,因为它是Web开发人员中最常见的选择。 但是如果你不喜欢它,你可以选择其他数据库。
让我们准备将存储我们的博客帖子的数据库。 我们可以非常简单地开始 - 只需使用一个表格的帖子。
要创建数据库,我们可以下载Adminer,或者您可以使用其他工具进行数据库管理。
让我们打开Adminer并创建一个名为quickstart的新数据库。
http://localhost/Nette/sandbox/www/adminer/
![](https://box.kancloud.cn/deb392835a365b49425f35437d9caa11_1366x599.png)
在这里我不喜欢用这个软件来管理,所以我用其他数据库管理软件。我想你们也应和我一样有自已喜欢数据库管理软件。
所以我们用软件创建一个quickstart数据库
![](https://box.kancloud.cn/389b0c6126f6e747586463a4fa670760_129x38.png)
创建一个名为posts的新表,注意一定要使用InnoDB类并添加以下列:
id int, click on autoincrement (AI)
title varchar, length 255
content text
created_at timestamp
![](https://box.kancloud.cn/243e8c4a25df37abce4cb44ef53af79e_828x485.png)
使用InnoDB表存储非常重要。 你会在稍后看到原因。 现在,只需选择并提交。 您可以点击立即保存。
在我们实现从我们的应用程序直接添加新帖子的功能之前,请尝试添加一些示例博客帖子。
INSERT INTO `posts` (`id`, `title`, `content`, `created_at`) VALUES
(1, 'Article One', 'Lorem ipusm dolor one', CURRENT_TIMESTAMP),
(2, 'Article Two', 'Lorem ipsum dolor two', CURRENT_TIMESTAMP),
(3, 'Article Three', 'Lorem ipsum dolor three', CURRENT_TIMESTAMP);
![](https://box.kancloud.cn/97f369844d44498923c9b5aac2341d92_1366x736.png)
# 连接到数据库
现在,当数据库创建并且我们有一些帖子,现在我们要配置Nette数据库连接选择。
首先,我们需要告诉我们的应用程序使用哪个数据库。 数据库连接配置存储在app / config / config.local.neon中。 设置连接DSN和您的凭据。 它应该看起来像这样:
database:
dsn: 'mysql:host=127.0.0.1;dbname=quickstart'
user: root
password: root
options:
lazy: yes
user和password是根据自已MYSQL来设置上去。
注意:在编辑此文件时,请注意缩进。 NEON格式接受空格和制表符,但不能同时接受空格和制表符。 Web项目中的配置文件使用选项卡作为默认值。
整个配置包括存储在app / confing /文件confing.neon和config.local.neon中。 文件config.neon包含应用程序的全局配置,config.local.neon仅包含特定于环境的参数(例如,开发和生产服务器之间的区别)。
# 数据库连接
我们主页是要显示所有文章,所以我们选做一个控制器来要求显示所有文单出来。
控制器(位于app / presenters / HomepagePresenter.php)(将列出文章)需要数据库连接。 要接收它,写一个这样的构造函数:
~~~
<?php
namespace App\Presenters;
use Nette;
use App\Model;
class HomepagePresenter extends Nette\Application\UI\Presenter
{
/** @var Nette\Database\Context */
private $database;
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
// ...
}
~~~
注意:因为 HomepagePresenter.php文件里有代码,所以我们先清空他,再粘贴以上代码进去就可以了。
![](https://box.kancloud.cn/c560eea1664a0ca4f8f6efad02b5b6d6_653x432.png)
可能有些人不太了解这是什么意思。从private $database;看出来,这是要求这个HomepagePresenter类默认一开始通过数据库配置(config.local.neon)连接到数据库。如果不连接数据我们怎么查到数据库里面的数据呢?!明白了吧,所以以后我们做一个控制器要连到数据库时都要取以上的代码!这就是数据库连接。
# 从数据库加载帖子
现在让我们从数据库中获取这些帖子,并将它们传递给模板,然后再渲染HTML代码。 这就是所谓的渲染方法
~~~
public function renderDefault()
{
$this->template->posts = $this->database->table('posts')
->order('created_at DESC')
->limit(5);
}
~~~
把以上代码加进刚才网页中。
![](https://box.kancloud.cn/133f43f42c64eee8763622e97a5b9e98_727x582.png)
以上代码就是把posts表中所有的贴子取出来,并按DESC排序,只显示5条。
控制器现在有一个render方法renderDefault()将数据传递到一个名为default的视图。控制器模板可以在中找到:
app/presenters/templates/{PresenterName}/{viewName}.latte
{PresenterName}:HomepagePresenter.php就是控制器前面Homepage。
{viewName}: renderDefault()就是后面Default。
所以模板视图就应在
app/presenters/templates/Homepage/Default.latte
在模板中,名为$ posts的变量现在可用,它包含数据库中的帖子。
# 模板
有一个用于整个页面的通用模板(称为布局,包括头,样式表,页脚,...),然后是每个视图的特定模板(例如,用于显示博客帖子的列表),其可以覆盖一些布局模板部分。
默认情况下,布局模板位于app/presenters/templates/@layout.latte中,其中包含:
~~~
...
{include content}
...
~~~
![](https://box.kancloud.cn/7f6feef7139a29f315051c39e2fd7212_382x207.png)
以上意思是公用模板。
{include content}在主模板中插入一个名为content的块。 您可以在每个视图的模板中定义它。 在这种情况下,我们将编辑文件app / presenters / templates / Hompeage / default.latte,如下所示:
{block content}
它定义了将插入到布局中的内容块。 如果刷新浏览器,您将看到一个包含文本“Hello word”的页面(源代码中还包含在@ layout.latte中定义的HTML标题和页脚)。
让我们显示博客文章 - 我们将编辑模板如下:
~~~
{block content}
<h1 n:block="title">Můj blog</h1>
{foreach $posts as $post}
<div class="post">
<div class="date">{$post->created_at|date:'F j, Y'}</div>
<h2>{$post->title}</h2>
<div>{$post->content}</div>
</div>
{/foreach}
{/block}
~~~
![](https://box.kancloud.cn/13a54772259ef405ddf7722546b0fe47_595x289.png)
我们刷新一下主页
![](https://box.kancloud.cn/d14a7c19612ce486514d41e106f62a9d_458x507.png)
主页显示了文章。
列表不是很奇特或多彩,所以随意添加一些闪亮的CSS到www / css / style.css。
{foreach}不断读取$ posts变量中传递给模板的所有帖子,并为每个帖子显示一段HTML代码。
| date: 被称为过滤器。 过滤器用于格式化输出。 此方法将给定的时间戳(例如2013-04-12)转换为漂亮且可读的日期格式(2013年4月12日)。 您可以在文档中找到更多预定义的过滤器(后面会一个一个说出来),或者如果需要,您可以添加自己的过滤器。
还有一件事。 我们可以使代码稍微更短,因此更简单。 我们可以用n:属性替换latte,如下所示:
~~~
<div n:foreach="$posts as $post" class="post">
<div class="date">{$post->created_at|date:'F j, Y'}</div>
<h2>{$post->title}</h2>
<div>{$post->content}</div>
</div>
~~~
n:foreach,只是用一个foreach块来包装div(它和前面的代码块完全一样)。
通过以上。我学习到了
**应用程序连接到数据库并显示一个简单的帖子列表。**
- Nette简介
- 快速开始
- 入门
- 主页
- 显示文章详细页
- 文章评论
- 创建和编辑帖子
- 权限验证
- 程序员指南
- MVC应用程序和控制器
- URL路由
- Tracy - PHP调试器
- 调试器扩展
- 增强PHP语言
- HTTP请求和响应
- 数据库
- 数据库:ActiveRow
- 数据库和表
- Sessions
- 用户授权和权限
- 配置
- 依赖注入
- 获取依赖关系
- DI容器扩展
- 组件
- 字符串处理
- 数组处理
- HTML元素
- 使用URL
- 表单
- 验证器
- 模板
- AJAX & Snippets
- 发送电子邮件
- 图像操作
- 缓存
- 本土化
- Nette Tester - 单元测试
- 与Travis CI的持续集成
- 分页
- 自动加载
- 文件搜索:Finder
- 原子操作