ThinkPHP框架基础知识三
一、JS文件与Css文件存放位置
其实JS与Css文件放在任意位置都可以找到,只要路径正确就行。
在TP框架中我们访问的所有文件都要走入口文件index.php,相当于访问的是index.php页面。
在模板文件中用到JS与Css文件,不能直接从模板文件去找,而是从index.php开始找相应的JS与Css文件。这是因为我们访问的不是具体的页面,而是index.php入口文件,而用src浏览调用的文件路径是从 模板文件找的,这样我们访问操作的时候这个路径就找不到JS和Css文件了,解决方法:
- 用绝对路径
- 从index.php找到文件的路径
- 将JS与Css文件放在Public文件夹下,这样就可以用TP框架的内置import标签、load标签等来加载文件。
二、第三方类的存放位置
- 放在初始命名空间(tp/ThinkPHP/Library/)下的文件夹中,例如Think/下,但是其中已经有一个Page.class.php了,所以我们可以新建一个文件夹fenye,将我们的分页类文件放在里面,注意文件名与类名必须要一致。
- 使用时分页类要加上命名空间:namespace Think/fenye;
- 在控制器下调用此文件:use Think/fenye/Page; 或者
$page = new \Think\fenye\Page($total,10);//此时从根命名空间开始写起。
2. 放在Home模块新建文件夹下,如:Home/fenye/。
- 使用时分页类要加上命名空间:namespace Home/fenye;
- 在控制器下调用此文件:use Home/fenye/Page; 或者
$page = new \Think\fenye\Page($total,10);//此时从根命名空间开始写起。
以分页类Page.class.php为例,我们调用分页类将Info表分页显示
在TP框架模型中分页查询有一个limit连贯操作,我们可以用下面这种方法实现分页查询
$info= M('Info');
$info->limit(10,25)->select();其中的参数可以用分页类中的$page->limit来获得。这就需要修改一下分页类:
分页方法:
//分页查询 function FenYe() { $model = D("Info"); $total = $model->count(); $page = new \Home\fenye\Page($total,3); //若不用命名空间,在new的时候从根开始写起
//原生SQL语句 query方法用于查询,execute方法用于增删改 /*$sql = "select * from Info ".$page->limit; $attr = $model->query($sql);*/ //var_dump($attr); //用limit方法连贯操作 //var_dump($page->limit); $attr = $model->limit($page->limit)->select(); $xinxi = $page->fpage(); //分页信息
$this->assign("shuju",$attr); $this->assign("xinxi",$xinxi); $this->display(); }
模板页面:
<h1>Info表</h1> <table width="100%" border="1" cellpadding="0" cellspacing="0"> <tr> <td>代号</td> <td>姓名</td> <td>性别</td> <td>民族</td> <td>生日</td> </tr> <foreach name="shuju" item="v"> <tr> <td><{$v.code}></td> <td><{$v.name}></td> <td><{$v.sex}></td> <td><{$v.nation}></td> <td><{$v.birthday}></td> </tr> </foreach> </table> <div><{$xinxi}></div><!--分页信息-->
请求FenYe方法:
三、会话控制session与cookie
session赋值
Session赋值比较简单,直接使用:
session('name','value'); //设置session
session取值
Session取值使用:
$value = session('name');
// 获取所有的session 3.2.2版本新增
$value = session();
session删除
删除某个session的值使用:
session('name',null); // 删除name
要删除所有的session,可以使用:
session(null); // 清空当前的session
session判断
要判断一个session值是否已经设置,可以使用
// 判断名称为name的session值是否已经设置
session('?name');
Cookie设置
cookie('name','value'); //设置cookie
cookie('name','value',3600); // 指定cookie保存时间
Cookie获取
获取cookie很简单,无论是怎么设置的cookie,只需要使用:
$value = cookie('name');
Cookie删除
删除某个cookie的值,使用:
cookie('name',null);
要删除所有的Cookie值,可以使用:
cookie(null); // 清空当前设定前缀的所有cookie值
cookie(null,'think_'); // 清空指定前缀的所有cookie值
四、控制登录
在做项目时,因为每个页面都要用到登录控制,只要不登录就无法访问页面。
防止用户绕过登录直接访问操作方法
做一个控制器的父类,在父类里面做一个构造方法,在里面判断session里面有没有值,如果没有值就跳向登录
检查是否登录的父类CheckController.class,php:
<?php namespace Home\Controller; use Think\Controller; //检查是否登录 class CheckController extends Controller { function __construct() { parent::__construct(); //如果不调用父类的构造函数,就将父类构造函数重写,会覆盖父类的构造函数,会出错 if(!session("?uid")) //如果session没有存uid值 { $this->error("未登录",U("Login/Login")); //返回登录页面 exit(); } } }
登录方法Login:因为Login也没有存session,所以不能继承CheckController,否则会陷入死循环。
<?php namespace Home\Controller; use Think\Controller; use Home\RiZhi\RiZhi; class LoginController extends Controller { function Login() { if(empty($_POST)) { $this->display(); } else {if($_POST["uid"]!="" && $_POST["pwd"]!="") { $model = D("Users"); $uid = $_POST["uid"]; $pwd = $_POST["pwd"]; $attr = $model->field("Pwd")->find($uid); //var_dump($attr); if($pwd==$attr["pwd"]) { session("uid",$uid); // 跳转页面之前将$uid存入session $this->success("登录成功!","Main"); } else { $this->error("登录失败!"); } } else { $this->error("用户名或者密码不能为空!"); }
其他控制器都可以继承CheckController父类,例如Main控制器:
<?php namespace Home\Controller; use Home\Controller\CheckController; class MainController extends CheckController //继承父类 { function Index() { echo "welcome"; } }
这样在访问Index的时候会提示: