- Moon.Wong
- 评论(0)

修改事项
现在我们可以向Cake待做事项中添新事项了。接下来我们要做的就是往应用中添加修改事项 的功能。这一点非常有必要,因为某个事项已经完成时,用户需要勾选一下,表明该事项已经完成。另外,如果用户对事项的标题不满意的话,他们也可以修改它。 为了向Cake待做事项这个应用中添加这些功能,我们需要在我们的Tasks控制器中添加另外一个操作,以及创建对应的视图。
动手时间:创建用来修改事项的表单
1,打开 tasks_controller.php文件,添加一个新操作,名为edit,代码如下:
$this->redirect(array('action'=>'index'), null, true);
}
if ($this->Task->save($this->data)) {
$this->Session->setFlash('The Task has been saved');
$this->redirect(array('action'=>'index'), null, true);
} else {
$this->Session->setFlash('The Task could not be saved.
Please, try again.');
}
2,在/CakeTooDoo/app/views/tasks目录中,创建一个名为"edit.ctp"的新文件,并向其中添加如下代码:
<legend>Edit Task</legend>
<?php
echo $form->hidden('id');
echo $form->input('title');
echo $form->input('done');
?>
</fieldset>
3,为了能从所有事项清单页面访问修改表单页面。我们应该在该页面添加一个连接到编辑事项页面的链接。打开/CakeTooDoo/app /views中index.ctp文件,然后将HTML注释部分<!-- different actions on tasks will be added here later --> 用如下代码替换:
<?php echo $html->link('Edit', array('action'=>'edit',$task['Task']['id'])); ?>
4,现在在浏览器中输入http://localhost/CakeTooDoo/tasks/index打开所有事项清单页面,点击里你想要编辑 事项的链接,这个链接会将你转跳到编辑事项的表单页面,具体见下面截图:
5,现在让我们在编辑事项的表单页面添加一个连接到所有事项清单页面和添加事项页面的链接。在CakeTooDoo/app/views目录下 edit.ctp文件的后面添加如下代码:
<?php echo $html->link('List All Tasks', array('action'=>'index')); ?><br />
<?php echo $html->link('Add Task', array('action'=>'add')); ?>
怎们回事?
我们在Tasks控制器中添加了一个新的操作,名为edit。然后,我们继续为这个操作添 加了对应的视图文件。随后,我们使用HTML助手为编辑事项页面添加了一些转跳到其他页面的链接。
当我们访问该页面时,我们需要告诉该操作我们需要修改哪个事项。我们是通过网址(URL) 向该操作传输对应事项的唯一ID来实现的。因此,如果我们想要编辑ID为2的事项的内容,我们则需要将我们的浏览器指向http://localhost /CakeTooDoo /tasks/edit/2。当浏览器发送出该请求时,Cake将该请求发送给Tasks控制器的edit操作,然后将id的值作为edit操作的一个参 数。如果我们检查下edit的操作,我们就会注意到该操作接受一个名为$id的参数。URL传输过来的ID就会存储在该参数之中。
当一个请求发送到edit操作时,该操作做的第一件事检查id值有没有提供。Cake为了 让用户编辑一个事项,它需要知道用户想要编辑事项的id。如果没有提供id的话,操作是不会继续执行下去的。因此,如果$id没有定义的话,它会向会话 (session)中添加一个错误提示信息。然后转跳到index操作,这个操作会显示目前所有事项的一个清单,除此之外还有一个错误提示信息。
如果$id有定义,edit操作会检查$this->data中是否存储有任何数 据。如果$this->data没有存储有数据,这意味着用户还没有编辑。因此,Cake会从Task模型提出需要的事项信息,然后将其存储 在$this->data,实现这一操作的代码段是这段: $this->data = $this->Task->find(array('id' => $id));一旦完成这步后,Cake会将编辑(edit)操作的视图提交给浏览器,用来展示task事项的信息。这个视图会 从$this->data获取事项信息然后展示出来。
编辑操作的视图跟添加操作的视图非常相似,只有一处不同。那就是该视图多出一行代码 echo $form->hidden('id');这行代码会输出一个隐藏的输入框HTML代码,它的值为当前事项的id值。
一旦用户编辑完, 然后点击保存按钮,编辑好的数据会重新发送给编辑操作,然后将相应的数据保存在$this->data中。因为$this->data有数 据,这意味着用户已经编辑并提交了修改好的数据。因此如果$this->data不为空的话,编辑操作将调用Task模型的save()函数来保存 数据:$this->Task->save($this->data). 我们在添加操作中使用过相同的函数。
| [ | 你可能想知道模型的save()函数是如何自己知道什么时候该添加一条新记录,什么时候只是修改一个已经存在的记录的。如果表单 数据有一个隐藏的id字段,这函数就知道,它需要做的就是编辑对应id的现有事项。如果没有找到id字段,这个函数会添加一个新的记录。 | ] |
一旦数据得以成功更新,Cake会将一个保存成功的信息存储在会话当中,然后转跳到 index操作。index页面会显示一个保存成功的信息。