ThinkSSL🔒 一键申购 5分钟快速签发 30天无理由退款 购买更放心 广告
# 创建和编辑帖子 多么美好的时光。 我们有一个超酷的新博客,人们在评论中争论,我们终于有更多的时间编程。 虽然我们喜欢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添加新帖子。 它是完全独立的,甚至正常的人都可以张贴在那里。 但等待,这可能不是确定,任何人,我的意思真的任何人在互联网上,可以发布在我们的博客。 需要某种形式的身份验证,以便只有已登录的用户才能发布。 我们将在下一章中添加。