您的位置:首页 > 编程语言 > PHP开发

ThinkPHP框架基础知识三

2016-06-29 16:27 543 查看
一、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的时候会提示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: