# 主頁
讓我們創建顯示您最近發布的主頁。
在我們開始之前,你應該至少知道一些關于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/

在這里我不喜歡用這個軟件來管理,所以我用其他數據庫管理軟件。我想你們也應和我一樣有自已喜歡數據庫管理軟件。
所以我們用軟件創建一個quickstart數據庫

創建一個名為posts的新表,注意一定要使用InnoDB類并添加以下列:
id int, click on autoincrement (AI)
title varchar, length 255
content text
created_at timestamp

使用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);

# 連接到數據庫
現在,當數據庫創建并且我們有一些帖子,現在我們要配置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文件里有代碼,所以我們先清空他,再粘貼以上代碼進去就可以了。

可能有些人不太了解這是什么意思。從private $database;看出來,這是要求這個HomepagePresenter類默認一開始通過數據庫配置(config.local.neon)連接到數據庫。如果不連接數據我們怎么查到數據庫里面的數據呢?!明白了吧,所以以后我們做一個控制器要連到數據庫時都要取以上的代碼!這就是數據庫連接。
# 從數據庫加載帖子
現在讓我們從數據庫中獲取這些帖子,并將它們傳遞給模板,然后再渲染HTML代碼。 這就是所謂的渲染方法
~~~
public function renderDefault()
{
$this->template->posts = $this->database->table('posts')
->order('created_at DESC')
->limit(5);
}
~~~
把以上代碼加進剛才網頁中。

以上代碼就是把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}
...
~~~

以上意思是公用模板。
{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}
~~~

我們刷新一下主頁

主頁顯示了文章。
列表不是很奇特或多彩,所以隨意添加一些閃亮的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
- 原子操作