ThinkPHP开发小记

thinkphp

2013-09-26 16:36

已3.2版本为例子

---------------------------------------------------------------------------------------------------------------------------------------------------------

网站目录 d:/www

复制ThinkPHP完整包到d:/www下

index.php 配置如下

 

define('THINK_PATH','./ThinkPHP/'); //核心位置
define('APP_NAME','hello');              //项目名字
define('APP_PATH', './home/');          //项目位置
define('APP_DEBUG', 'true');              //开启调试
require THINK_PATH.'ThinkPHP.php';        //载入核心文件

 

复制\ThinkPHP\Conf\convention.php  配置信息到\home\Conf\config.php

 /* URL设置 */
    'URL_CASE_INSENSITIVE'  =>  true,   // 默认false 表示URL区分大小写 true则表示不区分大小写
    'URL_MODEL'             => 1,       // (PATHINFO 模式)

详细配置 http://hi.baidu.com/code__/item/4b0da60035889494a2df4312

 

调试错误 可以加入

ThinkPHP\Conf\debug.php

SHOW_PAGE_TRACE 显示页面Trace信息

SHOW_RUN_TIME 是否显示运行时间  false
SHOW_ADV_TIME 是否显示详细的运行时间  false
SHOW_DB_TIMES 是否显示数据库查询和写入次数  false
SHOW_CACHE_TIMES 是否显示缓存操作次数  false
SHOW_USE_MEM 是否显示内存开销  false
SHOW_LOAD_FILE 是否显示加载文件数  false
SHOW_FUN_TIMES 是否显示函数调用次数  false

 

EmptyAction.class.php    //空模块定义

前置方法和后置方法  _before_和_after_

空方法 _empty

<?php
class EmptyAction extends Action {
    public function index(){
        $this->show('404');
    }    
    
     public function_empty(){   //空方法定义
        $this->show('404');
    }    
}
?>

模板

--------------------------------------------------------------------------------------------------------------

直接输出变量

$name = 'ThinkPHP';
$this->assign('name',$name);
$this->display();

 模板 Hello,{$name}!

系统变量输出  {$Think.server.script_name} // 输出$_SERVER['SCRIPT_NAME']变量 

常量输出 {$Think.const.MODULE_NAME}

调用函数 {:md5('aaa')}

默认值 {$name|default="名称为空"}

 

模板的位置 和调用 home\view\模块\方法.html

程序里的调用

$this->display();                     //当前方法

$this->display("list");               //当前模块下的list.html

$this->display("news:list");          //news模块下的list.html

$this->display("./home/tpl/aaa/www.html");//绝对目录的模板调用

$this->display("news:list","utf8","text/html"); //输入其他编码或者格式

模板赋值 $this->name="哈哈";  $this->assign("name",array("abc"=>"123","ab"=>"呵呵"));  支持数组

模版页{$name}    数组形式{$name.abc} {$name['abc']}

 循环数组

 <volist name="list" id="data">
{$data.id}:{$data.name}<br/>
</volist>

__ROOT__: 会替换成当前网站的地址(不含域名)
__APP__: 会替换成当前应用的URL地址 (不含域名)
__MODULE__:会替换成当前模块的URL地址 (不含域名)
__CONTROLLER__(__或者__URL__ 兼容考虑): 会替换成当前控制器的URL地址(不含域名)
__ACTION__:会替换成当前操作的URL地址 (不含域名)
__SELF__: 会替换成当前的页面URL
__PUBLIC__:会被替换成当前网站的公共目录 通常是 /Public/

 

模板的布局

1  <include file="./home/view/模块/方法.html" />    //绝对目录的模板调用

2  <include file="list" />                       //当前模块下的list

3  <include file="news/list" />                 // news模块下的list.html

4 <include file="$tt" />                        //变量动态调用

5 <include file="list,content" />               //组合调用

6 layout布局 模板<layout name="tp" />我是SSS  会调用\home\Tpl\tp.html

head<br>                      //  <include file="list" /> 也可以正常使用include
{__CONTENT__}  这里是你的内容    
<br>foot

---------------------------------------------------------------------------------------------------------------------------- 

CRUD数据操作

查询多条

$news=M("News");
$list=$news->where("id>1")->order("id desc")->select();

print_r($list);

查询一条  $list=$news->find($id);

删除

    $news=M("News");

      if ($news->where("id=$_GET[id]")->delete())
         { $this->success("删除OK",'__APP__/index/www',5); }

        else
         { $this->error("删除NO",'__APP__/index/www',5);   }

增加

  $news=M("News");

  if(IS_POST){   

               $date['title']=$_POST['title'];
               $date['content']=$_POST['content'];
               $date['asdasdasd']=$_POST['content'];  //不存在的字段不会写入
             if ($news->add($date))

                { $this->success("添加OK",'__APP__/index/www',5);   }

             else
                { $this->error("添加NO",'__APP__/index/www',5);   }
         }

$this->display();

修改

    $news=M("News");
          if(IS_POST){
               $date['title']=$_POST['title'];
               $date['content']=$_POST['content'];
               $date['id']=$_POST['id'];
             if ($news->save($date))

                { $this->success("修改OK",'__APP__/index/www',5);  }

                else
                { $this->error("修改NO",'__APP__/index/www',5);  }
          }
    $id=$_GET[id];
    $list=$news->find($id);
    $this->assign("d",$list);
    $this->display();

表单令牌

配置     或者 程序定义   C('TOKEN_ON',false);

'TOKEN_ON'=>true,  // 是否开启令牌验证
'TOKEN_NAME'=>'__hash__',    // 令牌验证的表单隐藏字段名称
'TOKEN_TYPE'=>'md5',  //令牌哈希验证规则 默认为MD5

if (!$User->autoCheckToken($_POST)){
// 令牌验证错误
}

模型

字段映射  自动验证  自动完成

class NewsModel extends Model{
    protected $_map = array(
        'a1' =>'title', // 把表单中name映射到数据表的username字段
        'a2'  =>'content', // 把表单中的mail映射到数据表的email字段
    );
    
     protected $_validate = array(
    array('title','require','标题必须填写!'), //默认情况下用正则进行验证
    array('content','require','内容必须填写!'), //默认情况下用正则进行验证

  );
  protected $_auto = array (
        array('tel','138000',2) ,           // 对tel字段在编辑的更改为138000
        array('title','md5',3,'function') , // 对title字段在新增和编辑的时候使md5函数处理
        array('date','time',1,'function') , // 对date字段在新增的时候使time函数处理
    );

}

            $news=D("News");
            if(IS_POST){
                if( $list=$news->create()){
                    if ($news->save())
                        {$this->success("修改OK",'__APP__/index/www',5);}
                    else
                        {$this->error("修改NO",'__APP__/index/www',5);}
            }else{

                 $this->error($news->getError());  }
            }

字段映射  调用时候 处理

$list=$news->find($id);
$data = $news->parseFieldsMap($list);

网页跳转模块中

$this->redirect("index/www");

公共部分调用

R方法  

R("模块/方法");

A方法

A("模块")->方法1();
A("模块")->方法2();

\home\Common\common.php  存放公共函数

分页

 --------------------------------------------------------------------------------------------------------------------

$User = M('User'); // 实例化User对象
// 进行分页数据查询 注意page方法的参数的前面部分是当前的页数使用 $_GET[p]获取
$list = $User->where('status=1')->order('create_time')->page($_GET['p'].',25')->select();
$this->assign('list',$list);// 赋值数据集
$count      = $User->where('status=1')->count();// 查询满足要求的总记录数
$Page       = new \Think\Page($count,25);// 实例化分页类 传入总记录数和每页显示的记录数
$show       = $Page->show();// 分页显示输出
$this->assign('page',$show);// 赋值分页输出
$this->display(); // 输出模板

 

多表查询

$list=$news->table('ms_news  n,ms_class as p')->where("1")->order("n.id desc")->field('n.*,p.*')->select();

跨库查询

$Model->table('db_name.think_user')->where('status>1')->select();

切换表查询

$Model->table('think_user')->where('status>1')->select();

 

多语言 

\home\Conf\tags.php 加入    'app_begin' => array('CheckLang')

'LANG_SWITCH_ON'   => true,   // 默认关闭多语言包功能

'LANG_AUTO_DETECT' => true, // 自动侦测语言 开启多语言功能后有效

'LANG_LIST'        => 'zh-cn,en-us', // 允许切换的语言列表 用逗号分隔

'VAR_LANGUAGE'     => 'l', // 默认语言切换变量

建立\home\Lang\zh-cn\common.php    

<?   return array(
        'abc'=>'欢迎使用ThinkPHP',
    );?>

模版直接使用   {$Think.lang.abc}   程序里取值  L("abc")

程序里定义 L('define2','语言'); $value = L('define2');

 

缓存

F("DATA","值");  设置
F("DATA",null);  清空
$abc=F("DATA");   取值
F("user/data","asd"); 写入到\home\Runtime\Data\user\data.php

S 和F一样  带有时间  F("DATA","值",3600);  设置 秒

 

静态缓存

     'HTML_CACHE_ON'=>TRUE ,       //打开静态缓存
     'HTML_PATH' =>'__APP__/html',     //设置已经生成的静态页保存路径
     'HTML_CACHE_TIME'=>'60',        //设置默认缓存有效时间
    'HTML_CACHE_RULES'=> array(
    'Index'    => array('{p}' ),                     //index模块
    'Index/edit'    => array('{id}' ),              //index/方法 以id位名称
    '*'        => array('{$_SERVER.REQUEST_URI}'),  //所有
)

安全取值
I('post.name','','htmlspecialchars'); // 采用htmlspecialchars方法对$_POST['name'] 进行过滤,如果不存在则返回空字符串
I('session.user_id',0); // 获取$_SESSION['user_id'] 如果不存在则默认为0
I('cookie.'); // 获取整个 $_COOKIE 数组
I('server.REQUEST_METHOD'); // 获取 $_SERVER['REQUEST_METHOD']

------------------------------------------------------------------------------------------------------------------------------------------

SESSION

session('name','value');  //设置session

$value = session('name');  //取值session

$value = session();  // 获取所有的session 3.2.2版本新增

session('name',null); // 删除name

session(null); // 清空当前的session

 

 COOKIE

cookie('name','value');  //设置cookie

cookie('name','value',3600); // 指定cookie保存时间

cookie('name',array('value1','value2'));   保存数组

$value = cookie('name');

 $value = cookie();  //获取全部cookie

cookie('name',null); //删除某个
cookie(null); // 清空所有cookie值

-----------------------------------------------------------------------------------------------------------------------------------------

验证码

Public function verify(){

import('ORG.Util.Image');

Image::buildImageVerify();

}

默认名字是 verify    
// buildImageVerify($length=4, $mode=1, $type='png', $width=48, $height=22, $verifyName='verify'

if($_SESSION['verify'] != md5($_POST['yzm'])) {     //默认session是md5加密的

   $this->error('验证码错误!');

}

U 函数输出路径

U('Blog/cate','cate_id=1&status=1')

U('Blog/cate',array('cate_id'=>1,'status'=>1))

模板里输入  {:} 

路由功能

'URL_ROUTER_ON'   => true, //开启路由

'URL_ROUTE_RULES' => array( //定义路由规则

   'Edit/:id\d'=>'Index/Edit',                //  edit/1   =  index/edit/id/1

   'Www/:p\d'=>'Index/Www',                   //  www/1    = index/www/p/1        必须大写第一字母

),

 公共类库

Think目录:系统核心类库
Org目录:第三方公共类库

这些目录下面的类库都可以自动加载,你只要把相应的类库放入目录中,然后添加或者修改命名空间定义。 你可以在Org/Util/目录下面添加一个Image.class.php 文件,然后添加命名空间如下

namespace Org\Util;
class Image {
}

$image = new \Org\Util\Image;

-----------------------------------------------------------------------------------------------------

调试

只需要在入口文件中增加一行常量定义代码: define('APP_DEBUG', true);  // 开启调试模式

在开启调试模式的状态下,系统会首先导入框架默认的调试模式配置文件,该文件位于系统目录的Conf\debug.php。

 显示页面Trace信息
'SHOW_PAGE_TRACE' =>true,


-----------------------------------------------------------------------------------------------

变单上传

//系统设置
    public function xtsz(){


if(IS_POST){



$upload = new \Think\Upload();// 实例化上传类
$upload->maxSize  = 3145728 ;// 设置附件上传大小
$upload->rootPath='./';  //文件上传保存的根路径
$upload->savePath =  '/Public/Uploads/';// 设置附件上传目录     
$upload->exts  = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
$info   =   $upload->upload();
if(!$info) {// 上传错误提示错误信息
if(!$upload->getError()=='没有文件被上传!'){
$this->error($upload->getError());
exit;
}
}else{// 上传成功

if($info['bjimg']["savename"]){$_POST['bjimg']=$info['bjimg']["savepath"].$info['bjimg']["savename"]; }
if($info['img']["savename"]){$_POST['img']=$info['img']["savepath"].$info['img']["savename"]; }
}
 
$db=M('system');
if($db->save($_POST)){
                    $this->success('设置成功!'); 

              }else{
                    $this->error('设置失败!');                    
               }
  exit;  
}

$db=M('system');
$this->rs=$db->where("id=1")->find();

       $this->display();
    }