本文档适合了解点框架的人群学习!
下载入口文件:
define('APP_DEBUG',true); #开发是建议大家设为调试模式 define('THINK_PATH', dirname(__FILE__).'/ThinkPHP/'); #设置 你的框架目录地址
define('APP_NAME','home');#设置你的项目名称
define('APP_PATH', dirname($_SERVER
['SCRIPT_FILENAME']).'/'.APP_NAME.'/');#设置你的项目地址 require_once THINK_PATH.'ThinkPHP.php'; #加载框架核心文 件
项目目录介绍:
home
--Common 你的函数库
---Conf 你的配置文件
--- Lang 你的语言包文件 通常我们使用数组方式来实现 国际化
---Lib 你项目逻辑实现文件目录 在该目录下面,包含你 的控制器,你的模型,你的第三方 当然你也可以将第三方的放置在 ThinkPHP 框架中 我们通常这么做
------Action 你的控制器
------Model 你的模型
------widget 你的组件
Runtime Thinkphp为你项目编译的文件在这里 ---Tpl 你模板在这里
Public 你的公告资料目录
---css
---js
---images
Uploads 你的上传文件目录
ThinkPHP 框架目录
做个简单的新闻发布:
创建你的数据库:
create database cms;
选择你的数据库
use cms;
创建你的表
create table think_news(
id int primary key auto_increment, #id
title varchar(120) not null, #标题
content text not null, #内容
sendtime datetime not null, #发送时间
author varchar(30) not null, #作者
fromto varchar(30) not null, #来自
hits int not null default 0 #点击量
)engine=myisam charset=utf8;
插入测试数据
mysql> insert into think_news values(null,'my one
news','hello word',now(),'admin','admin',default),(null,'my 2 news','hello words dddddddddddd0',now
(),'admin','admin',default);
链接数据库:
配置你的数据库:
//数据库配置信息
'DB_TYPE' => 'mysql', // 数据库类型
'DB_HOST' => 'localhost', // 服务器地址
'DB_NAME' => 'cms', // 数据库名
'DB_USER' => 'root', // 用户名
'DB_PWD' => 'test123', // 密码
'DB_PORT' => 3306, // 端口
'DB_PREFIX' => 'think_', // 数据库表前缀,目的:区分多个 数据库的表
//模板相关配置
'TMPL_PARSE_STRING' =>array(
'__PUBLIC__' => '/Public', // 更改默认的__PUBLIC__ 替换规则
'__JS__' => '/Public/js', // 增加新的JS类库路径替换 规则
'__CSS__' => '/Public/css', // 增加新的JS类库路径替 换规则
'__IMAGES__' => '/Public/images', // 增加新的JS类库 路径替换规则
'__UPLOAD__' => '/Uploads', // 增加新的上传路径替换 规则
),
编写你的模型:
编写模型的文件命名规则:
表名Model.php 首字母大写,驼峰命名法
class NewsModel extends Model {
// 定义你的字段
protected $fields=array
('id','title','content','sendtime','author','fromto','hits'
);
}
编写你的控制器:
class IndexAction extends Action {
public function index(){
//链接数据库
$News=D('News'); //实例化模型类 NewsModel $id=$this->_param('id'); //获取你的参数
$data=$News->where('id='.$id)->find(); //查询返回 数据
$this->assign('newsbody',$data); //装载变量 $this->display('default:Index:index'); //发送到 default/Index/index.html 中
}
}
访问你的url 路由:
http://127.0.0.1/index.php/Index/index/id/2
编写你的视图:
Tpl/deault/Index/index.html
<!DOCTYPE html>
<html>
<head>
<title></title>
<css href="__CSS__/main.css" />
</head>
<body>
<div class="content">
<h2><p class="title">{$newsbody.title}</p></h2>
<p class="title">
作者:<span>{$newsbody.author}</span> 发表时间:<span>{$newsbody.sendtime}</span> 来源:<span >{$newsbody.fromto}</span> 点击量:<span>{$newsbody.hits}</span></p> <hr style="border: 1px solid #000000;">
<div class="body">
{$newsbody.content}
</div>
</div>
</body>
</html>
名词解释:
ORM: O-object(对象) R-Relation(关系) M-Model(模型) - 简 单理解为: 提供了一套对象与关系型数据库连接的一种映射中间件 。我们在操作对象的属性也即是在操作数据库表中的字段列。它的 主要目的在对数据库操作的一种持久化。使程序员最大限度的离开 sql语句,通过对象模型来操纵你的数据库。ORM对性能的影响是极其 有限的.
其他名词参见手册
-----------------------------------------------------------
-----------------------------------------------------------
--------
紧接着上一天,来实现curd.
<?php
// 本类由系统自动生成,仅供测试用途
class IndexAction extends Action {
public function index(){
$this->display('default:Index:index'); #导航首页
}
public function newsList(){
$Model=M('News');
$newsList=$Model->field('id,title')->select();
$this->assign('newsList',$newsList);
$this->display('default:Index:list'); #显示所有新 闻的标题
}
public function show(){
//链接数据库
$News=D('News'); //实例化模型类 NewsModel $id=$this->_param('id');
$data=$News->where('id='.$id)->find();
$this->assign('newsbody',$data);
$this->display('default:Index:show'); #依据id 显 示具体的新闻内容
}
public function addNews(){
$this->display('default:Index:addNews'); #添加新 闻模板
}
}
Tpl/default/Index/index.html 导航模板
<div class="content">
<a href="{:U('Index/newsList')}">显示新闻</a> <!-- {:U('Index/newsList')} 在模板中使用U方法实现你的url --> <a href="">发布新闻</a>
<a href="">管理新闻</a>
</div>
Tpl/default/Index/list.html 新闻列表模板
<ul>
<volist name="newsList" id="vo">
<li><a href="{:U('Index/show',array('id'=>$vo
[id]))}" id="{$vo.id}">{$vo.title}</a></li>
</volist>
</ul>
Tpl/deautl/Index/show.html (上面有案例) 新闻显示模板
Tpl/default/Index/addNews.html 添加新闻模板 带编辑器和时 间插件
<!DOCTYPE html>
<html>
<head>
<title></title>
<css href="__CSS__/main.css" />
<css
href="__PLUGS__/kindeditor/themes/default/default.css"/> </head>
<body>
<form action="{:U('AddNews/index')}" method="post" name="from1"> #数据提交到添加新闻类的index方法中 <p><lable>标题:</lable><input type="text" name="title" size="20" /></p>
<p><lable>作者:</lable><input type="text" name='author' size="20" /></p>
<p><lable>时间:</lable><input class="Wdate" type="text" name='sendtime' onClick="WdatePicker
({dateFmt:'yyyy/MM/dd/ HH:mm:ss'})" /></p>
<p><lable>来源:</lable><input type="text" name='fromto' size="20" /></p>
<p>
<textarea name="content"
style="width:600px;height:300px;visibility:hidden;">请发布 你的内容:</textarea>
</p>
<p><input type="submit" name="sub" value="提交" /></p>
</form>
<js href="__PLUGS__/My97DatePicker/WdatePicker.js" /> <js href="__PLUGS__/kindeditor/kindeditor-min.js" /> <js href="__PLUGS__/kindeditor/lang/zh_CN.js" />
<script>
var editor;
KindEditor.ready(function(K){
editor = K.create('textarea[name="content"]', { allowFileManager : true
});
});
</script>
</body>
</html>
--------------------
class AddNewsAction extends Action{
public function _before_index(){ #在index之前执行该方 法
//在提交之前先自动验证
if($this->isPost()){
header("content-type: text/html;
charset=utf8");
$News=D("News");
$validate = array(
array('title','require','标题必须必须填写 !',1),
array('author','require','作者必须填 写!',1),
array('fromto','require','来源必须 现!',1),
);
$News->setProperty("_validate",$validate); $result=$News->create();
if($result){
// 获取数据
$newsData['title']=$this->_post ('title');
$newsData['content']=$this->_post ('content');
$newsData['sendtime']=$this->_post ('sendtime');
$newsData['author']=$this->_post ('author');
$newsData['fromto']=$this->_post ('fromto');
$newsId=$News->add($newsData); if( ! $newsId){
$this->error("插入失
败",__APP__.'Index/addNews',3); #3秒后跳转
}else{
$this->success("添加新闻成功", __APP__.'/Index/index',3);
}
}else{
exit($News->getError());
}
}
}
public function index(){}
class NewsModel extends Model {
protected $fields=array
('id','title','content','sendtime','author','fromto','hits'
);
//自动填充
protected $_auto = array (
array('hits','createDefault',3,'callback'), // 对
u_time字段在更新的时候写入当前时间戳
);
//实现函数createTime
public function createDefault(){
return 'default';
}
}
空模块操作
class EmptyAction extends Action{
public function index(){
$this->error('你访问的模块:'.MODULE_NAME.'不存在'); }
}
空操作: 模块下面没有Action,系统自动执行下面的方法 public function _empty(){
$this->error('你访问的操作不存在');
}
比如访问如下url
http://127.0.0.1/index.php/Index/show/id/1
/**
* 优化系统自带的系统提示错误
*/
<!DOCTYPE html>
<head>
<meta charset=utf-8" />
<title>页面提示</title>
<script type="text/javascript">
function refresh(){
location.href = "{$jumpUrl}";
}
setTimeout("refresh()",{$waitSecond}000); </script>
<style type="text/css">
*{margin:0px;padding:0px;font-size:12px;font- family:Arial,Verdana;}
#wrapper
{width:450px;height:200px;background:#F5F5F5;border:1px solid #D2D2D2;position:absolute;top:40%;left:50%;margin- top:-100px;margin-left:-225px;}
p.msg-title{width:100%;height:30px;line- height:30px;text-align:center;color:#EE7A38;margin- top:40px;font:14px
Arial,Verdana;font-weight:bold;}
p.message{width:100%;height:40px;line- height:40px;text-align:center;color:blue;margin-
top:5px;margin-bottom:5px;}
p.error{width:100%;height:40px;line-
height:40px;text-align:center;color:red;margin-
top:5px;margin-bottom:5px;}
p.notice{width:100%;height:25px;line-
height:25px;text-align:center;}
</style>
</head>
<body>
<div id="wrapper">
<p class="msg-title">{$msgTitle}</p>
<present name="message">
<p class="message">{$message}</p>
</present>
<present name="error">
<p class="error">{$error}</p>
</present>
<present name="closeWin">
<p class="notice">系统将在 <span
style="color:blue;font-weight:bold">{$waitSecond}</span> 秒 后自动关闭,如果不想等待,
直接点击 <a href="{$jumpUrl}">这里</a> 关闭</p> </present>
<notpresent name="closeWin">
<p class="notice">系统将在 <span
style="color:blue;font-weight:bold">{$waitSecond}</span> 秒 后自动跳转,如果不想等待,
直接点击 <a href="{$jumpUrl}">这里</a> 关闭</p> </notpresent>
</div>
</body>
</html>
用上面的代码替换Thinkphp 自带的D:\Zend\www\ThinkPHP\Tpl \dispatch_jump.tpl
--后面同学们自己完成修改、删除的操作吧---要看手册哦--- -----------------------------------------------------------
-----------------------------------------------------------
-----------------------------------------------------------
-------
url 伪静态的配置:
'URL_HTML_SUFFIX'=>'html'
注意: tinkphp 简称TP框架,在3.1之后 如果使用 {:u("模 块/动作",array("参数"=>"值"))} 会自动增加 .html 伪静态后缀 名
url 重写 去掉index.php
1.打开你apache 重写
LoadModule rewrite_module
modules/mod_rewrite.so 去掉前面的 #
2. 修改全文的
AllowOverride None 修改为 AllowOverride All
3. 创建.htaccess 文件
D:\wwwroot>copy con .htaccess
^Z
已复制 1 个文件。
D:\wwwroot>
4. 将下面的内容添加到你的.htaccess 文件中
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
如果出现错误请换成下面的内容
<ifmodule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]
</ifmodule>
5. 重启你的apache
thinkphp 提供的rest路由支持:
rest:简单的讲就是把所有的请求的内容都当成一个资源 resource,那么每个资源都对应一个唯一的标示,然后呢,我们来定 义一个资源的连接器对资源进行操作,如果用户请求的资源发生了改 变,但是所请求的资源标示符不发生改变(需要正则来实现) REST是 设计风格
在你的配置文件中添加如下配置
'URL_ROUTER_ON'=> true, //开启路由
'URL_ROUTER_ON'=>true, //开启路由
'REST_METHOD_LIST' =>'get,post,put', // 允许的请 求类型列表
'REST_DEFAULT_METHOD' =>'get', // 默认请求类型 'REST_DEFAULT_TYPE' =>'html', // 默认的资源类型 'REST_CONTENT_TYPE_LIST' =>'html,xml,json', // REST允许 请求的资源类型列表
下面来实现rest的路由规则:
'URL_ROUTE_RULES' => array( //定义路由规则数组 'new/:year\d/:month\d' =>
'News/test',//http://127.0.0.1/thinkapp/index.php/new/2013/
2
'news/:id\d' =>
'News/read',//http://127.0.0.1/thinkapp/index.php/news/2
'new/:name' =>
'News/read',//http://127.0.0.1/thinkapp/index.php/new/abc
),
比如我们要请求新闻列表: http://127.0.0.1/Index/newsList 'URL_ROUTE_RULES' => array( //定义路由规则数组 'list/:name' => 'Index/newsList',
#http://127.0.0.1/news/list --对应IndexAction类下面的
NewsList方法
'add/:name'=>'Index/addNews', #http://127.0.0.1/index/addNews
'manage/:name'=>'Index/manage',
#http://127.0.0.1/index/manage
'show/:id\d'=>"Index/show", #
http://127.0.0.1/show/3 - 依据id 来显示不同的新闻对应 IndexAction类下面的show方法
),
去重新更改我们的视图
<a href="list/news">新闻列表</a>
<a href="add/news">发布新闻</a>
<a href="manage/news">管理新闻</a>
<li><a href="/show/{$vo.id}" id="{$vo.id}">{$vo.title} </a></li>
thinkphp 中应用ajax 的实现
下载 jquery.min.js
下载 jquery.form.js
我们再来实现一个用户注册与登录
-----------------------------------------
<?php
class UserAction extends Action{
public function index(){ #显示界面
$this->display("default:User:index");
}
public function checkName(){
if($this->_post('name')=='admin'){
$this->ajaxReturn($_POST['name'],'用户名正 确',1);
}else{
$this->ajaxReturn($this->_post('name'),'用户名 错误',0);
}
}
public function checkLogin(){
if($this->_post('username') == 'admin'){
$this->ajaxReturn($this->_post('username'),'用 户名正确~',1);
// $this->success('用户名正确~');
}else{
$this->ajaxReturn($this->_post('username'),'用
户名错误!',0);
//$this->error('用户名错误!');
}
}
}
---------------------------------------
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<form action="/checkLogin/user" method="post"
name="form1" id="registryFrom">
<p>
<label>用户名</label>
<input type="text" id="uname" name="username"/> <span id="result"></span>
</p>
<p><label>密码</label><input type="password" name="userpwd" /></p>
<p><label>邮件</label><input type="text" name="email" /></p>
<input type="hidden" name="ajax" value="1"> <!--- 如果使用thinkphp的ajax 就必须隐藏域--->
<p><input type="submit" name='sub' id="registry" value="注册" /></p>
</form>
<js href="__JS__/jquery-1.8.3.min.js" />
<js href="__JS__/jquery.form.js" />
<script type="text/javascript">
$(document).ready(function(){
//检查用户
$('#uname').bind('blur',function(){
var val=$(this).val()
$.post('/check/name',{'name':val},function (data){
$('#result').html(data.data
+':'+data.info).show();
if(data.status == 0){
$('#uname').focus(); //子从新获取光 标
}
})
});
//jquery表单ajax提交用户数据检测--使用jquery.form 表单插件
$('#registryFrom').ajaxForm({
beforeSubmit: checkForm, //在提交之前,前 端数据验证 返回 callback
success: complete, // 在提交之后,服 务器端数据验证返回 callback
dataType: 'json'
})
})
function checkForm(){
var val=$('#uname').val();
if(val == ''){ //如果用户名为空
$('#result').html('用户名不能为空!').show(); $("#result").fadeOut(4000);
$('#uname').focus();
return false;
}
//可以在此添加其它判断
return true;
}
function complete(data){
if(data.status==1){
$('#result').html(data.data
+':'+data.info).show();
}else{
$('#result').html(data.data
+':'+data.info).show();
}
}
</script>
</body>
</html>
-------------------------------layout布局与extend模板继
承---------------------------------
我们新建一个app
app.php
在app/Tpl/Public/
header.html
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<block name="title"><title>标题</title></block> </head>
<body>
<block name="menu">菜单</block>
footer.html
<block name="footer">底部</block>
</body>
</html>
main.html
<block name="left">左边分栏</block>
<block name="main">主内容:</block>
<block name="right">右边分栏</block>
我们把基本的页面布局做好。然后编写你的控制器 在app/Lib/Action/
IndexAction.class.php
class IndexAction extends Action {
public function index(){
$this->display();
}
}
在app/Tpl/Index/index.html
<layout name="layout" />
这是首页的内容
在浏览器输入:http://127.0.0.1/app.php
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<title>标题</title>
</head> <!---将头部的内容加载过来---> <body>
菜单
<div id="main" class="main" >
这是首页的内容 <!----这个是具体的内容哦,------->
</div>
底部 <!---将尾部的内容加载过来--->
</body>
</html>
大家想一想: layout 的应用场景是那种类型的网站呢?--结构单 一的网站
在一个网站中我们允许有多个layout出现。我们来看一下的案例: class NewAction extends Action{
public function index(){
$this->display();
}
}
Tpl/new_layout.html
<div id="main" class="main" >
<div class="left">这是左边</div>
<div class="left">这是右边{__CONTENT__}</div> </div>
<include file="Public:footer" />
Tpl/New/index.html
<layout name="new_layout" />
这是新闻内容模板 --我显示在右边哦。
模板继承--非常适用的一个功能哦
比如我们有模块Shop
class ShopAction extends Action{
public function index(){
$this->assign('title','我是新的title');
$this->assign('shoplist',array
('id'=>'1','title'=>'111111111','content'=>'hello word!'));
$this->display();
}
}
Tpl/Public/shopBase.html --------这是shop模块下的基本布局 模板---该模板的目的就是把功能区块分离出来.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<block name="title"><title>标题</title></block> </head>
<body>
<block name="menu">菜单</block>
<block name="left">左边分栏</block>
<block name="main">主内容</block>
<block name="right">右边分栏</block>
<block name="footer">底部</block>
</body>
</html>
Tpl/Shop/index.html---这是shop模块下的某个子页面之一
<extend name="Public:shopBase" />
<block name="title"><title>{$title}</title></block> <!--改 变 title 部分-->
<block name="menu"> <!--改变menu 部分--> <a href="/" >首页</a>
<a href="/info/" >资讯</a>
<a href="/bbs/" >论坛</a>
</block>
<br />
<block name="left">
<br />
这是左边的内容
</block>
<block name="main">
这是中间的内容
<a href="/new/{$shoplist.id}">{$shoplist.title} </a>{$shoplist.content}
</volist>
</block>
<block name="right">
这是右边的内容
</block>
<block name="footer">
<br />
@ footer
</block>
在浏览器中输入: http://127.0.0.1/app.php/Shop/index
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>我是新的title</title>
</head>
<body>
<!--改变menu 部分-->
<a href="/" >首页</a>
<a href="/info/" >资讯</a>
<a href="/bbs/" >论坛</a>
<br />
这是左边的内容
这是中间的内容
<a href="/new/1">111111111</a>hello word! </volist>
这是右边的内容
<br />
@ footer
</body>
</html>
大家想一想:block的应用场景是那种类型的网站呢?--按模块来布 局,每个模块的功能布局有简单的差异或者数据替换较为复杂的页 面
最后给大家的忠告: 在实际的开发环境中,我们的模板页面是多变化 的,也有可能是单一的,具体怎么应用就看你的页面布局的规则来自 己审视吧。
函数库: Common
在一个项目中,我们肯定有一些自己写的公共的应用函数,我们按 照thinkphp的规则将这些函数库放置在 app/Common/
common.php是全局必须加载的基础函数库,在任何时候都可以直接 调用;
functions.php是框架标准模式的公共函数库,其他模式可以替换加 载自己的公共函数库或者对公共函数库中的函数进行重新定义; 当然你也可以写自己的扩展函数库哦。
比如:
user.php ---专门针对用户的一些函数库
function test(){
return 'testUser';
}
我们在控制器中去调用这个函数吧。
load("@.user");
echo test(); //输出 testUser
widget 扩展:
什么是widget: 简单的讲,就是一些小的div,在网站上应用一般 就是不常用跟新的栏目,或者是一些js组件.我们通常称为小部件 如何用:
在你的 app/Lib/Widget/TestWidget.class.php
class TestWidget extends Action {
public function hello($name=''){
echo ("hello,".$name."!");
}
}
在你的项目模板文件中
<p>
在这里调用我们的widget<br />
{:R('Test/hello',array('ThinkPHP'),'Widget')}
</p>
session 应用:
'SESSION_AUTO_START' =>true, #打开session
session('name','value'); //设置session
$value = session('name'); // 取值
session('name',null); // 删除name
session('?name'); // 判断session['name'] 是否存在
-----------------------------------------------------------
---
数据库常用操作方法:
curd: 注意数据必须是数组,并且键值必须是字段名 $user->create() 通常用于数据验证
添加(add)
$user->add($data);
或者使用data方法连贯操作
$user->data($data)->add();
如果你的主键是自动增长类型,并且如果插入数据成功的话,Add方 法的返回值就是最新插入的主键值,可以直接获取。
读取数据(Read)
$list = $user->where('status=1')->order('create_time')-
>limit(10)->select();
相当于: select * from 表名 where status=1 order by
create_time limit 10;
$thinklist=$user->where('status=1 AND name="think"')->find
();
相当于: select * from 表名 where status=1 AND name="think
$nickname = $user->where('id=3')->getField('nickname');
相当于: select nickname from 表名 where id=3;
$list = $User->getField('id,nickname');
相当于: select id,nickname from 表名;
更新数据(Update)
$user->where('id=5')->save($data); // 根据条件保存修改的数 据
或者
$data['id'] = 5;
$data['name'] = 'ThinkPHP';
$data['email'] = 'ThinkPHP@gmail.com';
$user->save($data); // 根据条件保存修改的数据
$User->where('id=5')->data($data)->save(); // 根据条件保存
修改的数据
相当于: update 表名 set
name="ThinkPHP",email="ThinkPHP@gmail.com" where id=5;
删除数据(Delete)
删除所有状态为0的5 个用户数据 按照创建时间排序
$User->where('status=0')->order('create_time')->limit
('5')->delete();
相当于: delete from 表名 where status=0 oreder by
create_time limit 5;
sql查询:
查询操作:
$Model = new Model() // 实例化一个model对象 没有对应任何数 据表
$Model->query("select * from think_user where status=1");
添加、修改、删除操作
$Model->execute("update think_user set name='thinkPHP'
where status=1");
自动获取表名:
$model = M("user");
$model->query('select * from __TABLE__ where status>1');
其他高级方法
查询锁定
ThinkPHP支持查询或者更新的锁定,只需要在查询或者更新之前使 用lock方法即可。
查询锁定使用:
$list = $User->lock(true)->where('status=1')->order
('create_time')->limit(10)->select();
更新锁定使用:
$list = $User->lock(true)->where('status=1')->data($data)-
>save();
事物支持:
启动事务:$User->startTrans()
提交事务:$User->commit()
事务回滚:$User->rollback()
比如:在user模型中启动事物,向info表插入用户数据如果成功就提
交否则就回滚
// 在User模型中启动事务
$User->startTrans()
// 进行相关的业务逻辑操作
$Info = M("Info"); // 实例化Info对象
$Info->save($User); // 保存用户信息
if (操作成功){
// 提交事务
$User->commit()
}else{
// 事务回滚
$User->rollback()
}
其他模型参见手册
------------------------------------
常用变量、常量
. 网站根目录地址
: 当前项目(入口文件)地址
__URL__ : <form method="post" action="__URL__/insert"> __PUBLIC__ : 网站公共目录,而非主题下的目录 <link href='__PUBLIC__/Css/common.css'>
__CURRENT__ : 当前模块的模板目录
APP_PATH : 当前项目目录
LIB_PATH : 项目类库目录
LANG_PATH : 项目语言文件目录
COMMON_PATH : 项目公共文件目录
APP_PUBLIC_PATH :项目公共文件目录
APP_TMPL_PATH : 项目模板目录
TEMPLATE_PATH :当前模版路径
WEB_PUBLIC_PATH :网站公共目录
__URL__ 当前模块
__APP__ 当前项目
--------------------------------------
视图:
模板赋值
$array['name'] = 'thinkphp';
$array['email'] = 'liu21st@gmail.com';
$array['phone'] = '12335678';
$this->assign($array);
输出:
$this->display('login');
$content = $this->fetch(); 加载模块不输出返回字符串
模板引擎:
thinkphp默认提供类似于smarty的thinkTemplate,除此以外还支 持phpTempalte,smartyTemplate获取其他模板引擎
输出变量:
注意:{ 和 $ 符号之间不能有空格 ,后面参数的空格就没有问 题
$name = 'ThinkPHP';
$this->assign('name',$name);
使用内置的模板引擎输出变量,只需要在模版文件使用: {$name}
$User = M('user');
$this->assign('oneUser',$oneUser);
//数组结构:
array(6)
{"id"=>'1',"u_name"=>"test","u_pwd"=>"test123","u_sex"=>"m" ,"u_email"=>"lyle_zhang@163.com",
"u_time"=>"2013-02-26 13:48:15"
}
在模板中输出:
用户id: {$oneUser.id}
用户email: {$oneUser.u_email}
索引数组结构:
$arr=array('aaa','bbb','ccc','dddd');
$this->assign('myarr',$arr);
在模板中输出:
{$myarr[0]} {$myarr[1]} {$myarr[2]}
数组结构二维数组 那么就需要循环了:
$userName=$user->field('u_name ')->where('id=1')->select
();
$this->assign('userName',$userName);
array(1) {
[0]=>
array(1) {
["u_name"]=>
string(4) "test"
}
}
在模板中输出:
<foreach name="userName" item="vo">
<empty name="vo.u_name">没有查询到你的姓名<else />你 的姓名是: {$vo.u_name}</empty>
</foreach>
默认值输出
{$变量|default="默认值"}
比如:
{$myarr[0]|default="默认值"}
包含文件
<include file="./Tpl/default/Public/header.html" />
<include file="Public:header" />
导入文件
<js href="__PUBLIC__/Js/Common.js" />
<css href="../Public/Css/common.css" />
循环: 通常用于二维数组
foreach循环:
foreach 标签是没有id属性的,只有item属性,这个标签是和 smarty一致的用法
属性
name(必须):要输出的数据模板变量 assign所发送的数组
item(必须):循环单元变量
key(可选):循环的key变量,默认值为key
示例:
<foreach name="list" item="vo">
{$vo.id}
{$vo.name}
</foreach>
<foreach name="smsArrays[$vo['id']]" item='sub'>
<if condition="$sub['sms_price'] gt '0'">
单价:{$sub.sms_price}元
</if>
</foreach>
volist循环
name(必须):要输出的数据模板变量 assign 发送的变量
id(必须):循环变量
offset(可选):要输出数据的offset
length(可选):输出数据的长度
key(可选):循环的key变量,默认值为i
mod(可选):对key值取模,默认为2
empty(可选):如果数据为空显示的字符串
volist标签主要用于在模板中循环输出数据集或者多维数组。 通常模型的select和findall方法返回的结果是一个二维数组,可 以直接使用volist标签进行输出。
$User = M('User');
$list = $User->select();
$this->assign('list',$list);
<volist name="list" id="vo">
{$vo.id} {$vo.u_name}
</volist>
Volist标签的name属性表示模板赋值的变量名称,因此不可随意在 模板文件中改变。
id表示当前的循环变量,可以随意指定,但确保不要和name属性冲
突.
支持输出部分数据,例如输出list数组中的第5~15条记录
<volist name="list" id="vo" offset="5" length='10'>
{$vo.name}
</volist>
输出偶数记录 当前的循环索引 % 2 == 0的数据
<volist name="list" id="vo" mod="2" >
<eq name="mod" value="1">{$vo.name}</eq>
</volist>
Mod属性还用于控制一定记录的换行.
<volist name="list" id="vo" mod="5" >
{$vo.name} <eq name="mod" value="4"><br/></eq> </volist>
输出key
<volist name="list" id="vo" key="k" >
{$k}.{$vo.name}
</volist>
比较标签 注意name的值不加 $ 符号
<eq name="name" value="value">value</eq> // name 变量的值等 于 value 就输出
<neq name="name" value="value">value</neq> // name 变量的值 不等于 value 就输出
<gt name="name" value="5">value</gt> // name 变量的值大于 5 就输出
<egt name="name" value="5">value</egt> // name 变量的值大于 等于 5 就输出
<lt name="name" value="5">value</lt> // name 变量的值小于 5 就输出
<elt name="name" value="5">value</elt> // name 变量的值小于 等于 5 就输出
其实上面的所有标签都是 compare 标签的别名
// 其中 type 属性的值就是上面列出的判断标签名称
<compare name="name" value="5" type="eq">value</compare> // name 变量的值等于 5 就输出
比如:
<volist name="userName" id="vo">
<compare name="vo.u_name" value="test" type="eq">你的 名字是test</compare> // 注意这个案例
</volist>
If标签
<if condition="$name eq 1 "> value1
<elseif condition="$name eq 2" />value2
<else /> value3
</if>
--------------------------------------------------
使用tinkphp的第三方插件--参见手册
import("ORG.Util.Page");// 导入分页类
$count = $user->count();// 查询满足要求的总记录数
$Page = new Page($count,5);// 实例化分页类 传入总记录 数和每页显示的记录数
$show = $Page->show();// 分页显示输出
// 进行分页数据查询 注意limit方法的参数要使用Page类的属性 $list = $user->order('id')->limit($Page->firstRow.','.
$Page->listRows)->select();
$this->assign('userList',$list);// 赋值数据集
$this->assign('page',$show);// 赋值分页输出
$this->display();
分组配置:
index.php 设定项目
<?php
define('APP_DEBUG',TRUE);//调试模式
// 加载框架入口文件
require_once 'ThinkPHP/ThinkPHP.php';
?>
进入项目配置文件 conf/config.php
/**
* 公共配置文件
*/
return array (
'URL_MODEL' => 1, // 如果你的环境不支持
PATHINFO 请设置为3
/* --------------数据库配
置----------------------------- */
'DB_TYPE' => 'mysql',
'DB_HOST' => 'localhost',
'DB_NAME' => 'news_db',
'DB_USER' => 'root',
'DB_PWD' => 'test123',
'DB_PORT' => '3306',
'DB_PREFIX' => 'news_',
/*--------------分组配
置-----------------------------*/
'APP_GROUP_LIST' => 'Home,Admin', 'DEFAULT_GROUP' => 'Home',
'APP_GROUP_MODE' => 1,
'SHOW_PAGE_TRACE' => 1, // 显示调试信息
/*---------------------URL 伪静
态-----------------------------*/
'URL_HTML_SUFFIX'=>'html'
);
目录结构:
/myapp
------Common
------Conf
------Lang
------Lib
------Modules
---------Admin
------------Action
--------------IndexAction.class.php
------------Conf
------------Model
------------ORG
------------Tpl
---------Home
-----------Action
--------------IndexAction.class.php
-----------Common
-----------Conf
-----------Model
-----------ORG
-----------Tpl
------Public
--------js
--------css
--------images
------Runtime
------ThinkPHP
------Tpl
------index.php
url:
http://127.0.0.1/news_sys/index.php/Module/model/action/参
数
http://127.0.0.1/fzapp/index.php/Home/Index/index
常见错误:
Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 16 bytes) in D:\AppServ\www\fzapp
\ThinkPHP\Common\common.php on line 508
解决方案:在ThinkPHP\Common\common.php文件前面加上如下代码 。
ini_set ('memory_limit', '128M');
--------------------------------------------------------
总结:如何学习框架:
1.不管懂不懂先看手册
2.编写简单的CRUD操作
3.再看一次手册
4.依据手册写一些小的demo
5.在你的项目中去应用吧。
6.再看手册,并可能的去看源代码,去看它是如何实现一些效果或 者功能的。
7.总结,逐步的转换成你的编程思想,向年薪20w或者创业的路奋 斗吧.
1-5 是应用层--拿来主义
6-7是思想层--是知其然知其所以然的阶段--高级。