一 U方法
ThinkPHP有强大的URL解析功能,支持多种URL模式,但这也为前端开发带来了困难,如果URL模式改变了,但前端手工编码调用服务端的URL也要相应的改变,否则就有问题了,因此ThinkPHP提供了一个U方法来产生特定模块,特定方法的URL。
U('[项目://][路由@][分组名-模块/]操作? 参数1=值1[&参数N=值N]'):
U('Index/index'),产生一个指向Index Action的index方法的URL。
这个方法如果是在模板文件中,则应当如下调用
1: value="%{:U('Index/index')}%"
二 前端U方法技巧
前端url,有一些技巧,当动态生成链接时,比如一个商品列表,http://server/product/pid/23,其中23是产品id,php已经从数据库中查出数据,这时可以使用下面的代码直接赋值
1: <foreach name="products" item="p">
2:
3: <a title="%{$question.phrase}%?" href="__URL__/ViewOneProduct/pid/%$p._id%
4: </foreach>
上面这种方法,如果是U方法里就不能工作了,原因是不能在’’再次引用%{}%符号,这时可以向下面这样做:
1: href="%{:U('/ThinkTank/ViewOneQuestion/qid/')}%%{$item._id}%"
这是利用ThinkPHP的模板渲染能力把item._id直接输出。
上面的方法都是处理静态的URL。例如,搜索一个产品的详细信息,它依赖于用户在input中输入的产品id,在js的处理函数中,动态生产url,然后使用ajax方法调用服务器,这时问题出来了,在另外一个php框架禅道里,它提供了一个js方法用于在js输出一个特定模块的url,但ThinkPHP并没有提供这个方法,我在项目中使用了折中的方法,使用一个hidden域,把需要的URL先渲染出来,然后在js函数里,获取这个hidden域的值,并拼接参数。
1: <script type="text/javascript">
2: // 使用ajax异步post数据
3: $(document).ready(function() {
4: /* attach a submit handler to the form */
5: $("div.btn a").click(function(event) {
6:
7: /* stop form from submitting normally */
8: event.preventDefault();
9:
10: /* get some values from elements on the page: */
11: var linkbutton = $(this);
12: // 获取隐藏域分阶段的连接
13: var url = linkbutton.attr('action_url');
14:
15: var content = $('#txt_writer').val();
16: if (content == "") {
17: return;
18: }
19: // 发送到服务器
20: /* Send the data using post and put the results in a div */
21: $.post(
22: url,
23: {
24: txt_writer : content
25: },
26: function(data)
27: {
28: // 处理数据
29: },
30: "json"
31: ).error(function() {
32: alert('error');
33: });
34:
35: });
36: });
37: </script>