thinkphp个人总结学习方法

时间:2024.5.13

本文档适合了解点框架的人群学习!

下载入口文件:

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是思想层--是知其然知其所以然的阶段--高级。

更多相关推荐:
入党个人学习总结

20xx年x月,我非常有幸地参加了这次轻纺与食品学院、经济学院联合党校的培训,老师深入浅出地讲解了中国共 产 党章程等党的基本理论知识,结合社会主义发展与共产主义运动的历史,让我进一步明确了方向,端正了入党动机,牢…

电大个人学习总结

第一篇:回望过去的日子,不禁让我感慨万千:这一段时光不但让充实了自我,而且也让我结交了许多良师益友;这段岁月不仅仅只是难忘,而是让我刻苦铭心。年华虽逝坚,带不走的记忆却历历在目。在思想上,我持明礼诚信、爱国守法…

个人学习总结

时光如逝,岁月如流,一转眼的时光,1年的学习生活已经过去了.,在小五学年的学期末,特写此文以总结一学期的学习好与坏.期末考试的好与坏都看这一年的努力多少,我这一学期的表现都会在这里展现.这一年来.在老师和同学们…

个人学习总结

为期四天的香港医管局进修学院「宁养服务」社工人员和资深义工交流课程已圆满完成,作为一名宁养义工,在学习香港宁养服务的相关经验之后,我获益匪浅。香港宁养服务的发展具有其独特性,历经几十年的发展,至今已具备一套完善…

个人学习总结

11月x日,我们班于厚德3103教室开展以学习和践行《国旗法》,做新时代的爱国者为主题的团日活动。活动的形式以观看负责人之前搜集好的国旗法资料为主。借此提高同学们对国旗的认识,增强我们的国家观念,发扬爱国主义…

个人学习总结

时间过得真快,转眼间又快到这个学期的最后阶段了。回顾一下过去,刚来到学校报到的那一天还历历在目,怪不得人们常说日月如梭!总结一下这个学期的各方面情况,大概可以归纳以下几个要点。一、在学习上,比起第一学期有了很大…

“上好课”专题个人学习总结

20xx年临沧市中小学教师全员培训“上好课”专题个人总结自20xx年x月临沧市中小学教师继续教育远程全员培训工作启动以来,我参加了第一个专题“备好课”、第二个专题“上好课”的培训学习。通过连续两次培训,教会了我…

个人学习总结

个人学习总结个人学习总结一大学生活是如此的丰富如此的多彩生活让我充满了乐趣我也觉得很充实当然这就离不开我们的组织部了在团总支这个大家庭里我很快乐在那里我认识了更多的朋友学到了更多在平时学习和生活中学不到的东西同...

UG个人学习总结

UG学习总结毕业设计学习笔记UGNX6.0F8视图快速摆正保存当前视图View-layout设置布局艺术外观时才会显示材质局部着色:ObjectDisplayCtrl+J对象的现实与隐藏有两种方法:1.图层2.…

20xx年度小继教个人学习总结.doc新建 Microsoft Word 97 - 20xx Document

20xx年春季学期小继教学习总结王培江通过这一次的这次网络平台的学习我感触很深受益匪浅使我学到了以前不了解的很多东西教学方式是直接影响学习方式形成完善以及改变的重要因素是转变学生学习方式的根本在促进教师教学方式...

20xx年度中继教个人学习总结

20xx年度中继教个人学习总结长顺县代化中学杨昌相作为一名普通的中学老师在中继教学习过程中我向达标这个目标看齐认真参加了中继教的一切培训和活动圆满地完成了学校规定的中继教任务提高了自己的教学能力并形成了自己新的...

个人学习总结

个人学习总结来源58com发布时间20xx0225个人学习总结XX年xx月xx日至xx月xx日我受学校委托参加了西宁市教育局组织的第二批中小学校长及骨干教师共25人到上海徐汇区进行为期一至二个月的学习培训活动我...

个人学习总结ppt(363篇)