10天学会phpWeChat——第四天:大U函数U()的使用
在第三天,我们创建了一个“增强版”的文章模块,实现了数据从数据库到视图端展示的流程。但是我们仅仅是实现了数据列表的展示,对于文章详情等页面跳转并未涉及。
本文重点讲解phpWeChat一个十分重要的前端函数U()。
今天我们进入《10天学会phpWeChat》系列教程的第四天:大U函数U()的使用。
一、U()函数是干什么的?
根据phpWeChat官方手册的解释:http://wiki.phpwechat.com/38
函数:U($mod='',$action='index',$para=array())
参数:$mod 所在功能模块 $action 动作 $para 更多参数
功能:获取模块访问URL
举例1:
1 <?php 2 <a href="{U('news','index')}">链接</a> // 返回 <a href="index.php?m=news&a=index">链接</a> 3 ?>
举例2:
1 <?php 2 <a href="{U('news','show',array('id'=>'185'))}">链接</a> // 返回 <a href="index.php?m=news&a=show&id=185">链接</a> 3 ?>
根据以上的官方函数说明,我们可以清晰的认识到U()函数是一个自动生成前台URL地址的函数。
二、继续!丰富我们的hello world功能模块,增加文章详情展示
1、改造hello world模块的前端视图文件template/default/index.html
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 5 <title>无标题文档</title> 6 </head> 7 8 <body> 9 <ul> 10 {loop $data $r} 11 <li> 12 <h1><a href="{U('hello','detail',array('id'=>$r['id']))}">{$r['title']}</a></h1> 13 <p>{$r['content']}</p> 14 </li> 15 {/loop} 16 </ul> 17 </body> 18 </html>
如上面的代码所示,我们为文章标题增加了一个<a>链接,用于指向文章详情的跳转。刷新前端访问URL:http://www.example.com/index.php?m=hello&a=index,则呈现了如下效果:
如上图所示,跟昨天不同的是,每个新闻标题都成了一个<a>链接,在U()函数的自动生成下,每个新闻的链接指向都到了 http://www.example.com/index.php?m=hello&a=detail&id=文章ID。
此时如果访问这个地址,则出现模板不存在的提示。跟第二天讲的一样,我们需要编写a=detail时对应的控制器路由程序case 'detail':和对应的前端视图文件detail.html
2、在template/default/下新建一个detail.html文件,作为文章详情的视图文件。
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 5 <title>无标题文档</title> 6 </head> 7 8 <body> 9 这是文章详情的视图文件 10 </body> 11 </html>
访问文章详情地址:http://www.example.com/index.php?m=hello&a=detail&id=3 则正常出现了如图的显示:
3、编写文章详情模型读取方法
打开include/hello.class.php,我们新增dataGet()方法用于根据文章Id获取文章数据:
1 <?php 2 // +---------------------------------------------------------------------- 3 // | phpWeChat hello 操作类 Last modified 2016-12-28 00:02:22 4 // +---------------------------------------------------------------------- 5 // | Copyright (c) 2009-2016 phpWeChat http://www.phpwechat.com All rights reserved. 6 // +---------------------------------------------------------------------- 7 // | Author: 骑马的少年 <phpwechat@126.com> <http://www.phpwechat.com> 8 // +---------------------------------------------------------------------- 9 namespace wechat\Hello; 10 11 use phpWeChat\Area; 12 use phpWeChat\CaChe; 13 use phpWeChat\Config; 14 use phpWeChat\DataInput; 15 use phpWeChat\DataList; 16 use phpWeChat\Member; 17 use phpWeChat\Module; 18 use phpWeChat\MySql; 19 use phpWeChat\Order; 20 use phpWeChat\Upload; 21 22 class Hello 23 { 24 public static $mPageString=''; // 这个静态成员是系统自带,请勿删除 25 private static $mArticleTable='wechat_hello_article'; 26 27 static public function dataList() 28 { 29 //DB_PRE常量是phpWeChat自带常量,指数据表前缀。 30 31 $data=MySql::fetchAll("SELECT * FROM `".DB_PRE.self::$mArticleTable."` ORDER BY `id` DESC"); 32 33 return $data; 34 } 35 36 static public function dataGet($id) 37 { 38 //DB_PRE常量是phpWeChat自带常量,指数据表前缀。 39 40 $id=intval($id); 41 42 $data=MySql::fetchOne("SELECT * FROM `".DB_PRE.self::$mArticleTable."` WHERE `id` =".$id); 43 44 return $data; 45 } 46 } 47 ?>
4、编写文章详情控制器路由,新增case 'detail'规则
1 <?php 2 use wechat\hello\hello; 3 use phpWeChat\Area; 4 use phpWeChat\CaChe; 5 use phpWeChat\Config; 6 use phpWeChat\Member; 7 use phpWeChat\Module; 8 use phpWeChat\MySql; 9 use phpWeChat\Order; 10 use phpWeChat\Upload; 11 12 !defined('IN_APP') && exit('Access Denied!'); 13 14 switch($action) 15 { 16 case 'index': 17 //从数据表读取数据并赋给数组$data 18 $data=Hello::dataList(); 19 20 break; 21 case 'detail': 22 $data=Hello::dataGet($id); //$id 可以改成$_GET['id'] 23 break; 24 //以下 case 条件仅为 示例。您可以根据业务逻辑自由修改和拓展 25 26 //case 'index': 27 28 //在此写 index.php?m=hello&a=index 时的逻辑 29 30 //break; 31 32 //case 'list': 33 34 //在此写 index.php?m=hello&a=list 时的逻辑 35 36 //break; 37 38 //以此类推... 39 40 //case '...': 41 42 //在此写 index.php?m=hello&a=... 时的逻辑 43 44 //break; 45 46 default: 47 break; 48 } 49 ?>
5、将控制器获取的数据赋给视图文件,我们重新编写template/default/detail.html视图文件
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 5 <title>{$data['title']}</title> 6 </head> 7 8 <body> 9 这是文章详情的视图文件 10 <h1>{$data['title']}</h1> 11 <div> 12 {$data['content']} 13 </div> 14 </body> 15 </html>
我们再次访问文章详情链接:http://www.example.com/index.php?m=hello&a=detail&id=3 则成功实现了文章详情的展示。
至此,一个简单的前端文章列表展示加文章详情展示功能模块就做出来了。