首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

创建一个移动友好的待办事项列表应用程序(5)

创建一个移动友好的待办事项列表应用程序(5)

创建和删除任务就像可以添加和删除任务列表一样,也可在列表中添加和删除任务。以下是用于此用途的新 /add-item 和 /delete-item 路由:
清单 8. 任务添加和删除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php

// ... other routes

$app->get('/add-task/:tid', 'authenticate', function ($tid) use ($app) {
  $app->render('add-task.php', array('id' => $tid));   
});

$app->post('/add-task', 'authenticate', function () use ($app) {
  if (isset($_POST['submit'])) {
    $title = trim(htmlentities($_POST['title']));
    $due = trim(htmlentities($_POST['due']));
    $id = trim(htmlentities($_POST['id']));
    if (empty($title)) {
      $title = 'Untitled Task';
    }
    if (empty($due)) {
      $due = 'tomorrow';
    }
    $task = new Google_Task();
    $task->setTitle($title);
    $task->setDue(date(DATE_RFC3339, strtotime($due)));
    $result = $app->tasksService->tasks->insert($id, $task);
    $app->redirect('/index');
  }
});

$app->get('/delete-task/:lid/:tid', 'authenticate', function ($lid, $tid) use ($app) {
  $app->tasksService->tasks->delete($lid, $tid);
  $app->redirect('/index');
});




每个任务都必须与一个任务列表相关联,所以 /add-task 路由回调被设置为接收一个任务列表标识符作为 GET 请求参数。然后,它会呈现 $APP_ROOT/templates/add-task.php 模板,其中包含一个添加新任务的表单,该模板如此清单中所述:
清单 9. 任务创建表单
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<!DOCTYPE html>
<html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.2/
    jquery.mobile-1.3.2.min.css" />
  <link rel="stylesheet" type="text/css" href="http://dev.jtsage.com/cdn/
    datebox/latest/jqm-datebox.min.css" />
  <script src="//code.jquery.com/jquery-1.9.1.min.js"></script>
  <script src="//code.jquery.com/mobile/1.3.2/
    jquery.mobile-1.3.2.min.js"></script>
  <script src="//dev.jtsage.com/cdn/datebox/latest/
    jqm-datebox.core.min.js"></script>
  <script src="//dev.jtsage.com/cdn/datebox/latest/
    jqm-datebox.mode.calbox.min.js"></script>
  <script src="//dev.jtsage.com/cdn/datebox/i18n
    /jquery.mobile.datebox.i18n.en_US.utf8.js"></script>
</head>
<body>
    <div data-role="page">
      <div data-role="header">
      Add Task
      </div>
      <div data-role="content">
        <div data-role="collapsible-set">
          <form method="post" action="/add-task">
            <input name="id" type="hidden" value="<?php echo $id; ?>" />
            <label for="title">Title:</label>
            <input name="title" id="title" data-clear-btn="true" type="text"/>
            <label for="due">Due:</label>
            <input name="due" id="due" type="date" data-role="datebox"
              data-options='{"mode": "calbox", "useFocus": true,
              "themeDateToday": "e"}' />
            <input name="submit" value="Save" type="submit"
              data-icon="check" data-inline="true" data-theme="a" />
            <a href="/index" data-role="button" data-inline="true"
              data-icon="back" data-theme="a">Back</a>
          </form>
      </div>
    </div>
</body>
</html>




清单 9 包含一个具有两个可见字段的表单,一个字段用于任务标题,另一个字段用于任务截止日期。为了简化日期输入,日期输入字段被配置为使用 jQuery Mobile DateBox 插件,该插件显示一个图形化的日期选取器,以便通过单击来输入日期                。因为任务必须与一个任务列表有关联,所以作为 GET 参数而收到的任务列表标识符也在表单中被指定为一个隐藏字段。
提交表单后,输入其中的数据就会被清除,并用于初始化一个 Google_Task 对象。然后这个对象与隐藏的任务列表标识符一起传递给服务对象的 insert() 方法,该方法负责通过 GEST 调用将它添加到 Google Tasks 系统中。最后,像 /add-task 回调一样,/delete-task 路由回调被配置为同时接收任务列表标识符和任务标识符。然后,它使用服务对象的 delete() 方法来从指定的任务列表中删除指定的任务。
在设置了路由和业务登录后,剩下的任务就是更新索引页面、添加任务添加和删除按钮。因为我很快就会介绍如何更新任务的状态,所以现在正好为此功能添加一个按钮。以下是修订后的模板:
清单 10. 索引页面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
<!DOCTYPE html>
<html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.2/
    jquery.mobile-1.3.2.min.css" />
  <link rel="stylesheet" type="text/css"
    href="http://dev.jtsage.com/cdn/datebox/latest/jqm-datebox.min.css" />
  <script src="//code.jquery.com/jquery-1.9.1.min.js"></script>
  <script src="//code.jquery.com/mobile/1.3.2/
    jquery.mobile-1.3.2.min.js"></script>
  <script src="//dev.jtsage.com/cdn/datebox/latest/
    jqm-datebox.core.min.js"></script>
  <script src="//dev.jtsage.com/cdn/datebox/latest/
    jqm-datebox.mode.calbox.min.js"></script>
  <script src="//dev.jtsage.com/cdn/datebox/i18n/
    jquery.mobile.datebox.i18n.en_US.utf8.js"></script>
</head>
<body>
    <div data-role="page">
      <div data-role="header">
      Tasks
      </div>
      <div data-role="content">
      <div data-role="collapsible-set" data-inset="false">
        <?php foreach ($lists['items'] as $list): ?>
          <?php $id = $list['id']; ?>
          <div data-role="collapsible">
            <h2><?php echo $list['title']; ?></h2>
            <ul data-role="listview">
              <?php if (isset($tasks[$id]['items'])): ?>
                <?php foreach ($tasks[$id]['items'] as $task): ?>
                <li>               
                  <div class="ui-grid-b">
                    <div class="ui-block-a">
                      <?php if ($task['status'] == 'needsAction'): ?>
                      <h3><?php echo $task['title']; ?></h3>
                      <?php else: ?>
                      <h3 style="text-decoration:line-through">
                        <?php echo $task['title']; ?></h3>
                      <?php endif; ?>
                      <?php if (isset($task['due']) &&
                        ($task['status'] == 'needsAction')): ?>
                      <p>Due on <?php echo date('d M Y',
                        strtotime($task['due'])); ?></p>
                      <?php endif; ?>                    
                      <?php if (isset($task['completed']) &&
                        ($task['status'] == 'completed')): ?>
                      <p>Completed on <?php echo
                        date('d M Y', strtotime($task['completed'])); ?></p>
                      <?php endif; ?>                    
                    </div>                    
                    <div class="ui-block-b"></div>                    
                    <div class="ui-block-c">
                      <?php if ($task['status'] == 'needsAction'): ?>
                      <a href="/update-task/<?php echo $id; ?>/
                        <?php echo $task['id']; ?>" data-inline="true"
                        data-role="button" data-icon="check"
                        data-theme="a">Done!</a>
                      <?php endif; ?>
                      <a href="/delete-task/
                        <?php echo $id; ?>/<?php echo $task['id']; ?>"
                        data-inline="true" data-role="button" data-icon="delete"
                        data-theme="a">Remove task</a>
                    </div>
                  </div>
                </li>
                <?php endforeach; ?>
              <?php endif; ?>
            </ul> <br/>
            <a href="/add-task/<?php echo $id; ?>"
              data-inline="true" data-role="button" data-icon="plus"
              data-theme="a">Add new task</a>
            <a href="/delete-list/<?php echo $id; ?>"
              data-inline="true" data-role="button" data-icon="delete"
              data-theme="a">Remove list</a>
          </div>
        <?php endforeach; ?>
        </div>
        <a href="/add-list" data-inline="true" data-role="button"
          data-icon="plus" data-theme="b">Add new list</a>
      </div>
    </div>
</body>
</html>




如清单 10 所示,每个任务列表的标记都已更新,将每个列表转换为一个两列网格。左侧列包含任务标题和截止日期。右侧列包含可为该任务执行的操作,比如更新它还是删除它。最后还有一个新按钮,该按钮支持使用新任务更新此列表。
向任务列表添加新任务的过程类似于:
返回列表