# 创建和编辑帖子
多么美好的时光。 我们有一个超酷的新博客,人们在评论中争论,我们终于有更多的时间编程。 虽然我们喜欢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>
~~~
刷新主页后应出现下图
![](https://box.kancloud.cn/a49731a5247a45b8b7e660e45d34f6b8_522x467.png)
# 创建新帖子的页面
我们刚刚创建的链接指向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
- 原子操作