• 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 ThinkfenyePage($total,10);//此时从根命名空间开始写起。

         2.  放在Home模块新建文件夹下,如:Home/fenye/。

    • 使用时分页类要加上命名空间:namespace Home/fenye;
    • 在控制器下调用此文件:use Home/fenye/Page;    或者
      $page = new ThinkfenyePage($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 HomefenyePage($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 HomeController;
    use ThinkController;
    
    //检查是否登录
    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 HomeController;
    use ThinkController;
    use HomeRiZhiRiZhi;
    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 HomeController;   
    use HomeControllerCheckController;   
    class MainController extends CheckController     //继承父类
    {
        function Index()
        {
              echo "welcome";
        }
    }

    这样在访问Index的时候会提示:

  • 相关阅读:
    关于JS动态切换样式表
    关于header()函数重定向的问题
    微信团队讲课笔记 Android 开发(二)UI设计
    Effective C++ 笔记:4设计与声明
    某面试算法题_最短时间找出十包粉末中的两蓝粉末。
    VS2015 配置opengl的一些库
    URAL 1225 Flags 简单DP,一重循环
    POJ 1384 Piggy-Bank 完全背包分析
    POJ 1651 Multiplication Puzzle DP 类似矩阵链
    URAL 1183 Brackets Sequence DP 路径输出
  • 原文地址:https://www.cnblogs.com/xinghun/p/5627333.html
Copyright © 2020-2023  润新知