ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 主页 让我们创建显示您最近发布的主页。 在我们开始之前,你应该至少知道一些关于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(它和前面的代码块完全一样)。 通过以上。我学习到了 **应用程序连接到数据库并显示一个简单的帖子列表。**