这个 PHP 文件是服务器上的所有交互的入口点。根据一个名为 action 的参数的存在性和值,脚本执行不同的功能。在深入具体操作之前,请注意这个文档中的 jQuery Mobile 结构,该结构包含多个 div 元素,每个元素都带有相应 data-role,用于页面、页眉、内容和页脚。
这个应用程序架构相当简单 — 页面每次加载时,其内容都将被 content div 中新生成的内容替代。在某种程度上,这可能带有欺骗性并返回一些旧的 web 应用程序习惯。也许是这样,但本教程的目标是在一个有用的真实世界场景中演示 JQM 的一些基本功能,因此,保持这个简单结构有助于实现所有目标。
要理解发生了什么事,我们从上到下仔细查看一下 index.php。
理解这个页面后,下一步是检查 utils.php 中包含的功能。特别是,您需要查看 showOpps 函数,该函数为用户界面生成一个商机列表,并引入一个新的 JQM 功能:listview,如 所示。
清单 8. listviewshowOpps 生成一个 listviewfunction showOpps() { global $mysql_link; $COL_OPPID= 0; $COL_PERSON= 1; $COL_CONTACT= 2; $COL_DESCRIPTION= 3; $sql ="select * from opportunities order by opp_id desc"; $result = mysql_query($sql,$mysql_link); if(mysql_num_rows($result)) { print("<a data-rel=\"dialog\" data-transition=\"pop\" href=\"index.php?action=addnew\">Add New Opportunity</a> <br/><br/>"); print("<ul data-role=\"listview\" data-filter=\"true\">"); while($row = mysql_fetch_row($result)) { print("<li data-ibm-jquery-contact=\"".$row[$COL_CONTACT]."\">"); print("<a data-rel=\"dialog\" data-transition=\"pop\" href=\"index.php?action=details&id=".$row[$COL_OPPID]."\">"); print("Person: ".$row[$COL_PERSON]."<br/>"); print("Contact: ".$row[$COL_CONTACT]."<br/>"); print("Description: ".$row[$COL_DESCRIPTION]); print("</a>"); print("</li>\n"); } print("</ul>"); } }
showOpps 函数跳到数据库,取出所有行,首先显示最新记录,然后将数据组织到一个 listview 中。注意这个代码清单中的 JQM 特性。
显示了添加新条目的对话框屏幕。这次,它在一个 iPod 上处于纵向显示模式(portrait mode)。
图 7. 添加一个新商机
图 8. 过滤后的结果
当用户输入一个词组时,将检查列表中的每个条目,查看是否存在该词组;如果不存在,将从列表中删除该条目,只留下匹配的条目。在 中,单词 “Lego” 只存在于一个条目中。 一个有趣的边注: 中的图像来自我的 MacBook 上运行的 WebKit (Safari)。Safari 和 Chrome 都是测试以移动为目标的 web 应用程序的桌面浏览器的不错选择。
图 9. 一条商机记录的细节
注意,不管这个屏幕图像来自那个设备,它都有相似的观感。这个教程在 Android 设备、iPod 和 Safari(WebKit nightly build)上都能很好地运行。可以看出,jQuery Mobile 的一些设计目标取得了成果。
当一条现有商机记录在对话框中显示(如 所示)之后,用户可以选择几个选项。这个页面的代码在 utils.php 中的 showOneOpp 函数中提供,如 所示:
清单 9. showOneOppfunction showOneOpp($id) { global $mysql_link; $COL_OPPID= 0; $COL_PERSON= 1; $COL_CONTACT= 2; $COL_DESCRIPTION= 3; $person = ""; $contact = ""; $description = ""; if ($id != -1) { $sql ="select * from opportunities where opp_id = " . $id; $result = mysql_query($sql,$mysql_link); if(mysql_num_rows($result)) { $row = mysql_fetch_row($result); $person = $row[$COL_PERSON]; $contact = $row[$COL_CONTACT]; $description = $row[$COL_DESCRIPTION]; } print("<a rel=\"external\" href=\"javascript:deleteEntry($id) \">Delete this entry</a>"); } print("<form method=\"post\" rel=\"external\" action=\"index.php\" onsubmit=\"return checkForm();\">"); print("<input type=\"hidden\" name=\"action\" value=\"upsert\"/>"); print("<input type=\"hidden\" name=\"id\" value=\"$id\"/>"); print("<fieldset>"); print("<div data-role=\"fieldcontain\">"); print("<label for=\"person\">Person</label>"); print("<input type=\"text\" name=\"person\" maxlength=\"100\" id=\"person\" value=\"$person\" />"); print("</div>"); print("<div data-role=\"fieldcontain\">"); print("<label for=\"contact\">Contact info</label>"); print("<input type=\"text\" name=\"contact\" maxlength=\"100\" id=\"contact\" value=\"$contact\" />"); print("</div>"); print("<div data-role=\"fieldcontain\">"); print("<label for=\"description\">Comments</label>"); print("<input type=\"text\" name=\"description\" maxlength=\"100\" id=\"description\" value=\"$description\" />"); print("</div>"); print("<fieldset>"); print("<button type=\"submit\" value=\"Save\">Save Opportunity </button>"); print("</form>\n"); }