1.创建应用
应用程序首页 index.php 入口文件
<?php
//框架文件目录
define('THINK_PATH','./ThinkPHP/');
//项目名称
define('APP_NAME','Home');
//项目目录
define('APP_PATH','./Home/');
//开启调试模式
define('APP_DEBUG',true);
//包含框架文件
require(THINK_PATH.'ThinkPHP.php');
//经典写法
//require('/TP/ThinkPHP.php');
后台应用页面 admin.php
<?php
//框架文件目录
define('THINK_PATH','./ThinkPHP/');
//项目名称
define('APP_NAME','Admin');
//项目目录
define('APP_PATH','./Admin/');
//开启调试模式
define('APP_DEBUG',true);
//包含框架文件
require(THINK_PATH.'ThinkPHP.php');
//经典写法
//require('/TP/ThinkPHP.php');
2.文件结构
一级目录
Home 前台应用
Home 目录结构
3.函数和类库
系统函数库
common.php 全局加载,随时可以使用
functions.php 框架标准模式的函数库,其他模式可以加载自己的函数库
runtime.php 运行时文件,仅在调试模式和编译过程会被加载
项目函数库
common.php 在项目加载的时候运行,并且合并到项目编译统一缓存
扩展函数库
扩展函数库文件也放在公共目录里面
例如Common/user.php
文件内容
<?php
function userInfo(){
echo "userInfo".time();
}
控制器调用
public function index(){
load("@.user");
userInfo();
exit;
$this->display();
}
类库操作
import("Think.Util.Array");
import("ORG.Util.Array");
ThinkPHP的约定是Think、ORG、Com包的导入作为基类库导入
import("MyApp.Action.UserAction");
import("MyApp.Model.InfoModel");
导入当前项目可以简化形式为
import("@.Action.UserAction");
import("@.Model.InfoModel");
不能导入带点号的文件
import("ORG.User.Info");
翻译成
ORG/User/Info.class.php
而不是
ORG/User.Info.class.php
改成形式为
import("ORG.User#Info");
导入第三方类库
Vendor\Zend\Filter\Dir.php,
导入形式
Vendor('Zend.Filter.Dir');
4.控制器操作
定义实例
http://localhost/App/index.php/User/add
UserAction.class.php
class UserAction extends Action{
public function add(){
}
}
空操作
空操作是指系统在找不到指定的操作方法的时候,会定位到空操作(_empty)方法来执行,利用这个机制,我们可以实现错误页面和一些URL的优化。
public function _empty($name){
echo $name;exit; //$name 为不存在的方法名称
}
空模块
空模块的概念是指当系统找不到指定的模块名称的时候,系统会尝试定位空模块(EmptyAction),利用这个机制我们可以用来定制错误页面和进行URL的优化。
EmptyAction.class.php
EmptyAction.class.php
<?php
class EmptyAction extends Action{
public function index(){
echo '====='.MODULE_NAME.'====='.time(); //MODULE_NAME 当前请求的模块名称
exit;
}
}
URL伪静态配置
'URL_HTML_SUFFIX'=>'html'
支持多个格式形式
'URL_HTML_SUFFIX'=>'html|shmtl|xml' // 多个用 | 分割
URL生成
public function index(){
echo U("Add/user");
echo "<br />";
echo U("Add/user",array("a"=>1,"b"=>2));
exit;
$this->display();
}
URL大小写设置
'URL_CASE_INSENSITIVE' =>true
跨模块调用
A('[项目名://][分组名/]模块名')
A方法还支持跨分组或者跨项目调用,默认情况下是调用当前项目下面的模块
public function index(){
$pay = A("Pay");
$pay->pay();
$this->display();
}
R('[项目名://][分组名/]模块名/操作名',array('参数1','参数2'…))
R方法还支持对调用的操作方法需要传入参数
public function index(){
R("Pay/pay");
$this->display();
}
PayAction.class.php 文件内容
<?php
class PayAction extends Action{
public function pay(){
echo "PayAction".time();exit;
}
}
页面跳转
系统内置了两个跳转方法,sucess和error
$this->sucess('成功','User/list')
$this->error('失败');
重定向
$this->redirect('New/list',array('id'=>1),5,'页面跳转中...')
获取URL产生
$_GET['_URL_'] 获取从控制器开始的字符串 按照/ 转换的数组
VAR_URL_PARAMS参数,默认值是:
'VAR_URL_PARAMS' => '_URL_', // PATHINFO URL参数变量
public function index(){
print_r($_GET['_URL_']); //返回数据位 Array ( [0] => Index [1] => index [2] => 1 [3] => 2 [4] => 3 )
exit;
$this->display();
}
AJAX返回
默认是JSON格式返回
$this->ajaxReturn(返回数据,提示信息,操作状态);
实例
$this->ajaxReturn($result,"新增成功!",1); //$result 数组 字符串 整形
Action绑定参数
调用地址 http://localhost/tp/index.php/Index/index/id/2/id2/3
控制器里面的方法
public function index($id,$id2){
echo $id.'=='.$id2;exit; //输出结果 2==3
$this->display();
}
5.模型操作
如果没有创建模型文件使用M方法 如果创建了,使用D方法
D方法还可以支持跨项目和分组调用,需要使用:
//实例化Admin项目的User模型
D('Admin://User')
//实例化Admin分组的User模型
D('Admin/User')
$User = D("user");
$User = M("user");
实例化空模型类
如果打算使用原生态的SQL查询的话,可以实例化空模型类
$Model = new Model();
快捷方式
$Model = M();
$Model->query("select * from think_user");
ActiveRecord
1.创建数据
$User=M('user');
$User->name='name1';
$User->email='email1';
$User->add();
表单创建数据
如果使用了create方法创建数据对象的话,仍然可以在创建完成后进行赋值
$User=D("User");
$User->create();//创建User数据对象,默认通过表单提交的数据进行创建
//增加或者更改其中的属性
$User->status=1;
$User->create_time=time();
//把数据对象添加到数据库
$User->add();
2.查询数据
$User = M("User"); // 实例化User对象
// 查找id为8的用户数据
$User->where('id=8')->find();
select() //方法
3.更新数据
$User->id = 1;
$User->name = 'name2';
$User->save();
4.删除数据
$User->delete('1,2');
自动验证
protected $_validate = array(
array('verify','require','验证码必须!'), //默认情况下用正则进行验证
array('name','','帐号名称已经存在!',0,'unique',1), // 在新增的时候验证name字段是否唯一
array('value',array(1,2,3),'值的范围不正确!',2,'in'), // 当值不为空的时候判断是否在一个范围内
array('repassword','password','确认密码不正确',0,'confirm'), // 验证确认密码是否和密码一致
array('password','checkPwd','密码格式不正确',0,'function'), // 自定义函数验证密码格式
);
自动完成
protected $_auto = array (
array('status','1'), // 新增的时候把status字段设置为1
array('password','md5',1,'function') , // 对password字段在新增的时候使md5函数处理
array('name','getName',1,'callback'), // 对name字段在新增的时候回调getName方法
array('create_time','time',2,'function'), // 对create_time字段在更新的时候写入当前时间戳
);
查询语句 *******
6.视图操作
保存位置
Tpl目录下面
例如User模块
实例
Tpl/User/add.html
Tpl/User/list.html
模板赋值
$this->assign('key','value');
或者
$this->assign(array('a'=>1,'b'=>2));
模板输出
display('模块名:操作名')
display('主题名:模块名:操作名')
直接输出内容
$this->show($content);
模板替换
__PUBLIC__:会被替换成当前网站的公共目录 通常是 /Public/
__ROOT__: 会替换成当前网站的地址(不含域名)
__APP__: 会替换成当前项目的URL地址 (不含域名)
__URL__: 会替换成当前模块的URL地址(不含域名)
__ACTION__:会替换成当前操作的URL地址 (不含域名)
__SELF__: 会替换成当前的页面URL
添加自己的字符串替换规则
只需要在项目的配置文件中
'TMPL_PARSE_STRING'=>array(
'__JS__'=>'/Public/Js/',
'__CSS__'=>'/Public/Css/'
),
获取模板内容
$content = $this->fetch('模板文件名称')
7.模板引擎
变量在模板里面的输出
$this->assign("name","name1");
index.html
{$name}
定界符修改
'TMPL_L_DELIM'=>'<{',
'TMPL_R_DELIM'=>'}>',
系统变量的使用
get
<{$Think.get.id}>
post
<{$Think.post.name}>
cookie
<{$Think.cookie.name}>
具体实例
$Think.server 获取$_SERVER {$Think.server.php_self}
$Think.get 获取$_GET {$Think.get.id}
$Think.post 获取$_POST {$Think.post.name}
$Think.request 获取$_REQUEST {$Think.request.user_id}
$Think.cookie 获取$_COOKIE {$Think.cookie.username}
$Think.session 获取$_SESSION {$Think.session.user_id}
$Think.config 获取系统配置参数 {$Think.config.app_status}
$Think.lang 获取系统语言变量 {$Think.lang.user_type}
$Think.const 获取系统常量 {$Think.const.app_name}或{$Think.APP_NAME}
$Think.env 获取环境变量 {$Think.env.HOSTNAME}
$Think.version 获取框架版本号 {$Think.version}
$Think.now 获取当前时间 {$Think.now}
$Think.template 获取当前模板 {$Think.template}
$Think.ldelim 获取模板左界定符 {$Think.ldelim}
$Think.rdelim 获取模板右界定符 {$Think.rdelim}
可以相互转换的形式
get post cookie session server
<{$Think.cookie.name}><br />
<{$_COOKIE.name}>
输出项目的配置参数
{$Think.config.db_charset}
函数的使用
{$varname|function1|function2=arg1,arg2,### }
###表示模板变量本身的参数位置
支持多个函数,函数之间支持空格
实例
{$webTitle|md5|strtoupper|substr=0,3}
{$create_time|date="Y-m-d",###}
默认值输出
{$Think.post.name|default="名称为空"}
可以使用运算符
“+”“ ” “*” “/”和“%“
文件包含
<include file="header" /> 包含当前模块下面的header.html模板
<include file="Public:header"> 包含Public模块下面的header.html模板
<include file="主题名:模块名:操作名" />
<include file="$变量名" />
<include file="header" title="ThinkPHP框架"keywords="开源WEB开发框架"/>
在header文件里面可以这样使用
[title] [keywords]
文件导入
形式1 import
<import type='css' file="Css.common" /> 默认type为js
效果
<link rel="stylesheet" type="text/css" href="/Public/Css/common.css" />
形式2 load
<load href="__PUBLIC__/Js/Common.js" />
<load href="__PUBLIC__/Css/common.css" />
循环标签的使用
Volist标签
<volist name="list" id="vo">
{$vo.id}
{$vo.name}
</volist>
Foreach标签
<foreach name="list" item="vo">
{$vo.id}
{$vo.name}
</foreach>
比较标签
三元运算
范围判断标签
Empty标签
IF标签
控制器内容
public function index(){
$this->assign("value",11);
$this->display();
}
模板内容
<if condition=' $value gt 10 '>
大于10
<elseif condition=' $value eq 10' />
等于10
<else />
小于10
</if>
8.日志操作
EMERG 严重错误,导致系统崩溃无法使用
ALERT 警戒性错误, 必须被立即修改的错误
CRIT 临界值错误, 超过临界值的错误
ERR 一般性错误
WARN 警告性错误, 需要发出警告的错误
NOTICE 通知,程序可以运行但是还不够完美的错误
INFO 信息,程序输出信息
DEBUG 调试,用于调试信息
SQL SQL语句,该级别只在调试模式开启时有效
'LOG_RECORD' => true, // 开启日志记录
'LOG_LEVEL' =>'EMERG,ALERT,CRIT,ERR', // 只记录EMERG ALERT CRIT ERR 错误
记录方式 默认为文件方式记录
手动记录
Log::write($message,$level=self::ERR,$type='',$destination='',$extra='')
Log::record方法必须结合Log::save方法才能完成日志记录,因为record方法只是把日志信息保存到内存,并没有真正写入日志,直到调用Log::save方法。
Log::record('测试调试错误信息', Log::DEBUG);
Log::record('调试的SQL:'.$SQL, Log::SQL);
Log::save();