下面是模版式的HMTL代码,保存在 Todo/Entry/templates/index.chunk;
这个页面是主要的输入界面,没有必要包含任何的数据操作的代码。这个页面仅仅包含了一个简单的表单和二个文本输入框和一个确认按钮。
这是为登录界面要做的所有。访问/Todo/Entry的URL你会得到下面的图面:
我们已经得到了正确的结果。这个页面唯一需要的事件就是为Add按钮添加单击事件,而我们仅要做的就是为这个事件修改事件处理代码。按照习惯,处理所有表单事件(包括其它一些事件)的代码在类 Chunk 的 handleEvents() 方法里面。
下面是 Todo/Entry/EntryIndexPage.php 文件中的handleEvents()的代码:
protected function handleEvents()
{
//Check for Add button presses
if (Request::getParameter('Add') != null)
{
$oTask = new TaskWrapper();
$oTask->fillFromRequest();
$oTask->save();
$this->redirect('../');
}
}
代码:
//Check for Add button presses
if (Request::getParameter('Add') != null)
{
$oTask = new TaskWrapper();
$oTask->fillFromRequest();
$oTask->save();
$this->redirect('../');
}
处理了用户在登录页面点击Add 按钮后的事件。当事件发生时,应该创建一个新的任务。因为文件框的命名为Name 和 Due 和数据库中表的字段名字相符合,所以我们可以使用代码:
$oTask = new TaskWrapper();
$oTask->fillFromRequest();
来创建一个新的 TaskWrapper对象,并且从表单中得到数据。在这种情况下,仅有Name和Due是处理的数据,数据表字段也少,感觉不到其便利,但是可以想像一下在处理有很多个数据时的便利。在以前得在$oTask对象中处理用户请求,然后操作数据库等等,但在这里大多数情况下不需要这样做。
代码:
$oTask->save();
可以来完成这些。当TaskWrapper对象没有设置主键时,这个方法将向数据库插入一条记录。如果以下面的方式创建对象
$oTask = new TaskWrapper(12);
并且调用save()方法,将会修改主键值为12的记录。
注意一下$this->redirect()方法,这个方法将会跳转到主页面,可以看到所有的记录。现在还没有书写主页面程序,所以还不能看到保存过的数据。
Main Todo Page (主要 Todo 页面)
用创建输入时的方法创建主要页面。首先创建模版 Todo/templates/index.chunk, 文件内容为:
<html>
<body>
<h3>{Title}</h3>
<li flexy:foreach="arTasks,key,task">{task[Name]} - <i>{task[Due]}</i></li>
<p>
<a href="Entry/">Add Task</a>
</p>
</body>
</html>
注意一个内部的代码,请把所有注意力集中到标记<li>里面flexy中的foreach。foreach可以循环输出数组中的数据。其中arTasks是要输出的数组名,key是主键名,task则是数组中值输出的变量,这跟PHP中的foreach的三个参数很相似。
下面是功能相同的PHP代码:
<body>
<?php
$arTasks = array();
foreach ($arTasks as $key => $task)
{
?>
<li><?php echo $task['Name']; ?> - <i><?php echo $task['Due']; ?></i></li>
<?php
}
?>
</body>
这下你可以看到用WASP写PHP程序的最大好处,不需要写很复杂的PHP代码。这使HTML从大多数的显示逻辑上分离出来。大多数的HTML编辑器可以识别标记 flexy: 所以它不会妨碍页面设计。
在HTML代码在有另外一种类型的标记如: <h3>{Title}</h3>.
{Title}是一个动态标记,它将替换你在控制类里面设置的对就的占位符。下面是文件 Todo/TodoMainIndexPage.php 中的 draw()方法。
public function draw()
{
$this->setPlaceholder('Title', 'My Task List');
$oTasks = new TaskWrapper();
$oTasks->findAll();
$arTasks = array();
while ($oTasks->next())
{
$arTasks[$oTasks->getId()] = $oTasks->toArray();
// Reformat timestamp using WASP Dates utility package
$arTasks[$oTasks->getId()]['Date'] =
Dates::mysql2datetime($oTasks->getDue());
}
$this->setPlaceholder('arTasks', $arTasks);
parent::draw();
}
很明显,可以看到如何设置{Title}占位符。下面的代码:
$this->setPlaceholder('Title', 'My Task List);
可以动态的输出任务列表的名称。