3 视图分离

在讲解session和kookie的应用之前,我们必须将代码进行适当的分离。如果把页面的html与php写在一起,那么就表示1个文件由2个人负责(网页设计师负责html代码,程序员负责php代码),若这2个人同时更新文件,则会造成混乱,为了方便管理,一般会把视图(前端html)分开放置,并由php加载。
这样我们通过浏览器访问的是php文件,html文件由php文件负责加载。


1 创建文件夹

回到我们的wlvsoft项目,由于现在都是针对后台编写功能,因此在wlvsoft目录下创建admin文件夹,将resource资源文件夹和相关文件放入admin中,并创建protected文件夹存放功能模块,目录结构如下图所示。


目录结构


在上图中,在protected文件夹下有三个文件夹,其中:

  • controller文件夹用来存放需要保护的PHP文件,目前我们仅仅有admin模块。
  • lib文件夹用来存放公共函数。
  • template文件夹用来存放html文件,目前也仅仅有admin功能模块。

接着,将login.html放入template/admin文件夹中,login.php放入controlle/admin文件夹中。然后通过:http://localhost/wlvsoft/admin/protected/template/admin/login.html 访问登陆界面,将会看到下图所示界面。


登录界面


应用于login.html界面的css、javascript和图片显示都没有效果,前面我们移动了resource文件夹,css、javascript和图片就存放在这里。因此我们初步判断是由于resource移动造成css、javascript和图片定位错误。修改login.html中的css、javascript、图片引用代码,如代码清单1所示。
代码清单1:login.html


……
<head>
……
<!-- Reset Stylesheet -->
<link rel="stylesheet" href="/wlvsoft/admin/resources/css/reset.css" type="text/css" media="screen" />
<!-- Main Stylesheet -->
<link rel="stylesheet" href="/wlvsoft/admin/resources/css/style.css" type="text/css" media="screen" />
……
<link rel="stylesheet" href="/wlvsoft/admin/resources/css/invalid.css" type="text/css" media="screen" />
<!--  Javascripts -->
<!-- jQuery -->
<script type="text/javascript" src="/wlvsoft/admin/resources/scripts/jquery-1.3.2.min.js"></script>
<!-- jQuery Configuration -->
<script type="text/javascript" src="/wlvsoft/admin/resources/scripts/simpla.jquery.configuration.js">
</script>
<!-- Facebox jQuery Plugin -->
<script type="text/javascript" src="/wlvsoft/admin/resources/scripts/facebox.js"></script>
<!-- jQuery WYSIWYG Plugin -->
<script type="text/javascript" src="/wlvsoft/admin/resources/scripts/jquery.wysiwyg.js"></script>
</head>
<body id="login">
<div id="login-wrapper" class="png_bg">
  <div id="login-top">
    <h1>Simpla Admin</h1>
    <!-- Logo (221px width) -->
<a href="http://www.865171.cn">
<img id="logo" src="/wlvsoft/admin/resources/images/logo.png" alt="Simpla Admin logo" />
</a>
 </div>
……

刷新浏览,登陆界面恢复原来的效果。但是输入用户名和密码登录,将会提示404错误(页面找不到),如下图所示界面。


404错误


仔细观察,发现单击登录请求的页面为:
http://localhost/wlvsoft/admin/protected/template/admin/login.php
也就说,单击登录时,提交的login.php页面会在当前目录中寻找,如如果寻找不到,提示404错误信息。前面我们将login.php移到controlle/admin文件夹中,因此,需要修改login.html页面form表单中的数据,如代码清单2所示。
代码清单2:login.html


……
<form action="/wlvsoft/admin/protected/controller/admin/login.php" method="post">
……

继续登录,将会调用login.php中的代码验证用户信息,如果输入正确,将会看到404错误。
查看浏览器路径,还是文件路径问题,开始的时候我们将index.html放入admin文件夹中,因此,验证跳转页面需要修改路径,如代码清单3所示。
代码清单3:login.php


//如果存在用户,跳转到后台首页面
    if($row){
        $url = "http://localhost/wlvsoft/admin/index.html";
        echo "<script language='javascript' type='text/javascript'>";
        echo "alert('登陆中...');";
        echo "window.location.href='{$url}'";
        echo "</script>";
    }
    else{
        $url = "http://localhost/wlvsoft/admin/protected/template/admin/login.html";
        echo "<script language='javascript' type='text/javascript'>";
        echo "alert('用户名或密码错误!');";
        echo "window.location.href='{$url}'";
        echo "</script>";
    }

注意,如果登陆成功,但是跳转的页面不对的话,很大可能是firefox缓存在作怪,清理一下缓存重新登陆就可以了。

2 加载视图

前面我们一直在浏览器中访问html文件,视图分离技术要求html页面由php文件加载。因此修改login.php代码,如代码清单4所示。
代码清单4:login.php


<?php
    ……
    include("D:/software/xampp/htdocs/wlvsoft/admin/protected/template/admin/login.html");
?>

当我们通过:http://localhost/wlvsoft/admin/protected/controller/admin/login.php
访问login.php文件的时候,将会显示登录界面。虽然我们没有直接访问login.html文件,但是却可以通过PHP的include嵌入视图来达到显示网页效果。

3 初始化文件

不知道大家有没有注意到login.html引入资源文件的一串路径?如果我将resource文件夹再一次移动位置,你会怎么做?继续修改login.html中的资源引用,还是像我一样将电脑关闭、睡觉。
我们希望这些路径应该像常量一样,在需要的地方拿来用,修改的时候只需修改一次,所有调用常量的地方都能跟着改变。下面是网页编程需要了解的定义:


常量:只要在定义值的时候定义常量的值(只能定义一次),任何时候不可修改(指不能在程序执行期间修改),为了区分常量与变量,常量的名字规范统一使用大写,而且不加$。
绝对路径:把地址写全,如:include(“D:/software/xampp/htdocs/wlvsoft/admin/protected/template/admin/login.html”);
相对路径:相对当前文件的路径,以这个的所在位置为中心,如:/wlvsoft/admin/resources/scripts/facebox.js


一般来说,将常量的定义域赋值统一放到一个文件中管理,在protected\lib文件夹中创建init.php文件,如代码清单5所示。
代码清单5:init.php


<?php
    //定义常量,存放管理员文件夹路径
    define("BASE_URL", "http://localhost/wlvsoft/admin/");
?>

代码清单5中定义一个全局变量:BASE_URL,值为:http://localhost/wlvsoft/admin。下面如何在login.html页面中应用init.php文件呢?
还记得前面我们是如何在login.php中用include导入login.html吧。修改login.php代码,如代码清单6所示。
代码清单6:login.php


<?php
    ……
    //导入init文件
    include("D:/software/xampp/htdocs/wlvsoft/admin/protected/lib/init.php");
    include("D:/software/xampp/htdocs/wlvsoft/admin/protected/template/admin/login.html");
?>

导入初始化文件后,就可以在login.html中使用里面定义的常量BASE_URL了,修改login.html代码,将/wlvsoft/admin/用

……
<link rel="stylesheet" href="<?php echo BASE_URL ?>resources/css/reset.css" type="text/css" media="screen" />
<!-- Main Stylesheet -->
<link rel="stylesheet" href="<?php echo BASE_URL ?>resources/css/style.css" type="text/css" media="screen" />
<link rel="stylesheet" href="<?php echo BASE_URL ?>resources/css/invalid.css" type="text/css" media="screen" />
<!—Javascripts -->
<!-- jQuery -->
<script type="text/javascript" 
src="<?php echo BASE_URL ?>resources/scripts/jquery-1.3.2.min.js"></script>
<!-- jQuery Configuration -->
<script type="text/javascript" 
src="<?php echo BASE_URL ?>resources/scripts/simpla.jquery.configuration.js"></script>
<!-- Facebox jQuery Plugin -->
<script type="text/javascript" 
src="<?php echo BASE_URL ?>resources/scripts/facebox.js"></script>
<!-- jQuery WYSIWYG Plugin -->
<script type="text/javascript" 
src="<?php echo BASE_URL ?>resources/scripts/jquery.wysiwyg.js"></script>
</head>
<body id="login">
<div id="login-wrapper" class="png_bg">
  <div id="login-top">
    <h1>Simpla Admin</h1>
    <!-- Logo (221px width) -->
<a href="http://www.865171.cn">
<img id="logo" src="<?php echo BASE_URL ?>resources/images/logo.png"
alt="Simpla Admin logo" />
</a>
 </div>
……

4 魔术常量

前面虽然解决了login.html中引用路径的问题,但是include导入路径的问题却还没有解决。如果我们的web项目部署的路径有所改动,那么include中的绝对路径也要跟着修改。为了解决include导入路径的问题,我们分析代码清单4中的代码,发现当web项目重新部署时,include包含的文件容易发生改变的路径为:D:/software/xampp/htdocs/wlvsoft/,即当前web项目的根目录。我们希望有一种动态获取当前项目路径的方法,好在PHP提供了魔术常量。
可以通过调用系统方法dirname(FILE)来获取文件当前目录,其中FILE 表示魔术常量。为了获取web项目的根目录,我们在根目录wlvsoft/下创建admin.php,如代码清单8所示。
代码清单8:admin.php


<?php

    //定义出一个“系统根路径”的常量
    //__FILE__表示文件所在绝对位置,即D:/software/xampp/htdocs/wlvsoft/cms/admin.php
    //dirname(__FILE__)表示文件所在目录,即D:/software/xampp/htdocs/wlvsoft
    define("ROOT", dirname(__FILE__));  //  __XXX__ : 魔术常量

    echo(ROOT);
?>

在浏览器中访问此文件,将会看到此文件的绝对路径,如下图所示。


访问绝对路径


通过运行可以知道,dirname(FILE)获取的是访问文件的绝对路径,这样我们就可以使用ROOT常量替换掉容易发生变化的路径:D:/software/xampp/htdocs/wlvsoft/了。
修改wlvsoft/下的admin.php,让其负责初始化工作,并跳转到login.php页面,如代码清单9所示。
代码清单9:admin.php


<?php

    //定义出一个“系统根路径”的常量
    //__FILE__表示文件所在绝对位置,即D:/software/xampp/htdocs/wlvsoft/cms/admin.php
    //dirname(__FILE__)表示文件所在目录,即D:/software/xampp/htdocs/wlvsoft
    define("ROOT", dirname(__FILE__));  //  __XXX__ : 魔术常量
    //加载初始化
    include(ROOT . "/admin/protected/lib/init.php");    
    //加载login.php
    include(ROOT . "/admin/protected/controller/admin/login.php");  
?>

既然在admin.php中包含了init.php初始化文件,那么在login.php中就可以将导入初始化文件语句去掉,如代码清单10所示。
代码清单10:login.php


<?php
    ……
    //导入init文件,admin.php中导入,这里注释掉
    //include("D:/software/xampp/htdocs/wlvsoft/admin/protected/lib/init.php");
    include(ROOT . "/admin/protected/template/admin/login.html");
?>

包含login.html的时候,我们使用了全局变量ROOT,这样不管项目部署的路径如何,程序都不用做任何路径的修改了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值