ThinkPHP框架基础知识三

一、JS文件与Css文件存放位置

其实JS与Css文件放在任意位置都可以找到,只要路径正确就行。

在TP框架中我们访问的所有文件都要走入口文件index.php,相当于访问的是index.php页面。

在模板文件中用到JS与Css文件,不能直接从模板文件去找,而是从index.php开始找相应的JS与Css文件。这是因为我们访问的不是具体的页面,而是index.php入口文件,而用src浏览调用的文件路径是从 模板文件找的,这样我们访问操作的时候这个路径就找不到JS和Css文件了,解决方法:

  1. 用绝对路径
  2. 从index.php找到文件的路径
  3. 将JS与Css文件放在Public文件夹下,这样就可以用TP框架的内置import标签、load标签等来加载文件。

二、第三方类的存放位置

  1. 放在初始命名空间(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赋值比较简单,直接使用:

  1. session('name','value'); //设置session

session取值

Session取值使用:

  1. $value = session('name');
  2. // 获取所有的session 3.2.2版本新增
  3. $value = session();

session删除

删除某个session的值使用:

  1. session('name',null); // 删除name

要删除所有的session,可以使用:

  1. session(null); // 清空当前的session

session判断

要判断一个session值是否已经设置,可以使用

  1. // 判断名称为name的session值是否已经设置
  2. session('?name');

Cookie设置

  1. cookie('name','value'); //设置cookie
  2. cookie('name','value',3600); // 指定cookie保存时间

Cookie获取

获取cookie很简单,无论是怎么设置的cookie,只需要使用:

  1. $value = cookie('name');

Cookie删除

删除某个cookie的值,使用:

  1. cookie('name',null);

要删除所有的Cookie值,可以使用:

  1. cookie(null); // 清空当前设定前缀的所有cookie值
  2. 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的时候会提示:

 

posted @ 2016-06-29 16:27  魅影星魂  阅读(301)  评论(0编辑  收藏  举报