# 創建和編輯帖子
多么美好的時光。 我們有一個超酷的新博客,人們在評論中爭論,我們終于有更多的時間編程。 雖然我們喜歡Adminer,它不是那么舒服寫博客文章。 也許是我們應添加一個簡單的表單,直接從我們的應用程序添加新的帖子。 好的,我們開始吧。
讓我們從設計UI開始:
在首頁上,我們添加一個“寫新帖子”鏈接。
它將顯示一個帶有標題和文本區域的表單。
當您單擊保存按鈕時,它將保存博客帖子。
稍后,我們還將添加身份驗證,并僅允許已登錄的用戶添加新帖子。 但是我們需要寫什么代碼才能使它工作?
1、將鏈接添加到首頁模板(app / presenters / templates / Homepage / default.latte)
2、創建一個將顯示表單的新頁面(模板)
3、定義添加新帖子的表單
4、定義處理程序,將在表單提交時執行,這將保存帖子。
# 新增帖鏈接
您應該已經知道如何添加一個新的鏈接到首頁。 所以試試自己。
如果您不確定,請將此代碼添加到
app/presenters/templates/Homepage/default.latte:
~~~
<a n:href="Post:create">Write new post</a>
~~~
刷新主頁后應出現下圖

# 創建新帖子的頁面
我們剛剛創建的鏈接指向PostPresenter及其操作create。 我們可以添加一個新的方法renderCreate,但實際上沒有必要。 我們不需要從數據庫中提取任何數據并將其放入模板中,因此方法將為空。 在這種情況下,它不需要存在。
**如果你想,你可以有空的方法; 也許它以后會有一些代碼。 隨你便。**
讓我們創建模板(app / presenters / templates / Post / create.latte):
全部內容如以下
~~~
{block content}
<h1>New post</h1>
{control postForm}
~~~
一切都應該是顯而易見的。 最后一行試圖渲染我們要創建的表單。
# 保存帖子的表單
當我們添加了對評論的支持時,表單和組件已經被覆蓋。 如果你對該主題感到困惑,請查看表單和組件如何重新工作(文章評論這節),我們將在這里等待;)
現在將此方法添加到PostPresenter:
~~~
protected function createComponentPostForm()
{
$form = new Form;
$form->addText('title', 'Title:')
->setRequired();
$form->addTextArea('content', 'Content:')
->setRequired();
$form->addSubmit('send', 'Save and publish');
$form->onSuccess[] = [$this, 'postFormSucceeded'];
return $form;
}
~~~
# 從表單保存新帖子
通過添加處理程序方法繼續。
~~~
public function postFormSucceeded($form, $values)
{
$post = $this->database->table('posts')->insert($values);
$this->flashMessage("Post was published", 'success');
$this->redirect('show', $post->id);
}
~~~
# 編輯帖子
讓我們添加編輯現有帖子的功能。 它應該很簡單 - 我們已經有postForm,我們可以使用它編輯以及添加一個新的編輯頁面,并更新表單處理程序,它可以添加一個新帖子(如現在),或者編輯現有的帖子。
將以下方法添加到PostPresenter:
~~~
public function actionEdit($postId)
{
$post = $this->database->table('posts')->get($postId);
if (!$post) {
$this->error('Post not found');
}
$this['postForm']->setDefaults($post->toArray());
}
~~~
請注意,該方法稱為actionEdit(而不是renderEdit,正如您可能預期的那樣)。 渲染方法用于將數據傳遞到模板。 另一方面,操作可能做的更多,他們應該檢查頁面是否可以由當前訪問者或用戶顯示,他們應該做大部分繁重的工作,不屬于表單處理程序。 將數據傳遞到模板當然也可以在動作方法中工作,但是建議不要這樣做,因為分離職責。 當你將代碼分解為渲染和動作方法時,你的代碼就更加簡明了。
現在創建模板(app / presenters / templates / Post / edit.latte):
~~~
{block content}
<h1>Edit post</h1>
{control postForm}
~~~
讓我們擴展表單處理程序:
~~~
public function postFormSucceeded($form, $values)
{
$postId = $this->getParameter('postId');
if ($postId) {
$post = $this->database->table('posts')->get($postId);
$post->update($values);
} else {
$post = $this->database->table('posts')->insert($values);
}
$this->flashMessage('Post was published', 'success');
$this->redirect('show', $post->id);
}
~~~
當提供了postId參數時,表示正在編輯帖子。 在這種情況下,我們將檢查帖子是否真的存在,如果是,我們將在數據庫中更新它。 如果未提供postId,則意味著將添加一個新的網頁。
但postId來自哪里? 它是傳遞給actionEdit方法的參數。 您現在可以添加指向app / presenters / templates / Post / show.latte模板的鏈接:
~~~
<a n:href="edit $post->id">Edit this post</a>
~~~
博客工作,人們都在快速評論,我們不再依賴Adminer添加新帖子。 它是完全獨立的,甚至正常的人都可以張貼在那里。 但等待,這可能不是確定,任何人,我的意思真的任何人在互聯網上,可以發布在我們的博客。 需要某種形式的身份驗證,以便只有已登錄的用戶才能發布。 我們將在下一章中添加。
- Nette簡介
- 快速開始
- 入門
- 主頁
- 顯示文章詳細頁
- 文章評論
- 創建和編輯帖子
- 權限驗證
- 程序員指南
- MVC應用程序和控制器
- URL路由
- Tracy - PHP調試器
- 調試器擴展
- 增強PHP語言
- HTTP請求和響應
- 數據庫
- 數據庫:ActiveRow
- 數據庫和表
- Sessions
- 用戶授權和權限
- 配置
- 依賴注入
- 獲取依賴關系
- DI容器擴展
- 組件
- 字符串處理
- 數組處理
- HTML元素
- 使用URL
- 表單
- 驗證器
- 模板
- AJAX & Snippets
- 發送電子郵件
- 圖像操作
- 緩存
- 本土化
- Nette Tester - 單元測試
- 與Travis CI的持續集成
- 分頁
- 自動加載
- 文件搜索:Finder
- 原子操作