thinkphp 杂乱笔记(1)

配备方式可用多个单入口表示前后台
thinkphp
Uploads
public

Home(前台)
Admin(后台)
index.php(前台入口文件)
admin.php(后台进口文件)
上边多个门类目录

也足以用分组开式,此时简化了一个档期的顺序目录
Thinkphp
App(Home/Admin)
public
Uploads
index.php(入口文件)

那时候的布局目录为
app/Config/Home/config.php
app/Config/Admin/config.php
还得开启用分组配置文件:
'APP_GROUP_LSIT' => 'Home,Admin',//项目分组织设立定
'DEFAULT_GROUP' => 'Home', //私下认可分组

Import('@.Action.UserInfo') // APP_NAME/lib/Action/UserInfo.class.php
Import('@.Model.User'); // APP_NAME/lib/Model/User.class.php
Import(APP_NAME'.Model.UserModel'); // APP_NAME/lib/model/UserModel.class.php

Import('Think.Core.test'); // Thinkphp/lib/Core/test.class.php
Import('ORG.Util.Array'); // Thinkphp/Extend/Library/ORG/Util/Array.class.php
Import('COM.Util.Arr'); // Thinkphp/Extend/Library/COM/Util/Arr.class.php
Import('ORG.Util.Pp#ok'); // Thinkphp/Extend/Library/ORG/Util/Pp.ok.class.php

别称导入
在ThinkPHP/Conf/alias.php中定义 如:
return array(
    'rbac' => LIB_PATH . 'Common/Rabc.class.php',
    'page' => LIB_PATH. 'Common/Page.class.php'
);
则:
import('rabc'); // LIB_PATH . 'Common/Rabc.class.php',
import('page'); // LIB_PATH. 'Common/Page.class.php'

手动载入/当中$baseUrl未有起效用
load($name, $baseUrl='', $ext='.php')方法
load('@.user');// APP_NAME/Common/user.php
@.user代表加载当前项目标user函数文件,那样就能够直接user.php扩张函数库中的函数了

load('user');
表示导入 ThinkPHP/Extend/Function/user.php

导入第三方类库
其三方类库统一放置在系统扩张目录下的Vendor 目录,况且使用vendor 方法导入
Vendor('Zend.Filter.Dir'); // ThinkPHP/Extend/Vendor/Zend/Filter/Dir.php
Vendor('Zend.Filter.Dir', dirname(), '.class.php'); // ThinkPHP/Extend/Vendor/Zend/Filter/Dir.class.php



URL_PATHINFO_DEPR == '/', ','

概念了项目和分组
ITEM = 'app'
GROUP_LIST = 'admin, home'

config.php
'APP_GROUP_LIST' => 'Home,Admin', //项目分组织设立定
'DEFAULT_GROUP'  => 'Home', //暗许分组


日增了操作方法增多后缀功用,如
config.php
'ACTION_SUFFIX' => 'Act'
localhost/index.php/m/a/变成了访问里面包车型客车 aAct方法了

模块定义:UserAction.class.php
class UserAction extends Action
{
  public function add()
  {
    this->display();//未有赋值,则默许加载模板 Tpl/User/add.html
    this->display('Test/add'); // 则加载 Tpl/Test/add.html
  }
}

空操作:
在调节器中定义 _empty() 方法,当在近些日子调控器中找不到有关的办法时,会友善调用那一个办法
class TestAction extends Action
{
   protected function _empty($name)
   {

   }
}
同理可设置中央空调整器,当不设有时,就调用 class EmptyAction extends Action{}

URL路由
平整路由
在布局文件 config.php中
'URL_ROUTER_ON' => true,
'URL_ROUTE_RULES' = array(
    'news/:id' => 'News/read',
    'news/read/:id' => '/news/:1'
);
当 localhost/index.php/news/1 会去访谈 News模块下的 read方法,并传到参数为id = 1,即
localhsot/index.php/News/read/id/1

当localhost/index.php/news/read/10 会再度定向 localhsot/index.php/read/id/8
正则路由
务必是以"/"开端和甘休

UPRADOL重写,去index.php,可依据手册就能够

URL生成,用U方法
U('[分组/模块/操作]?参数' [,'参数1', '伪静态后缀', '是或不是跳转', '呈现域名']);
U('User/add') // 生成User模块下的 add 操作 URAV4L
U('User/read?id=1') // User 模块下的 read操作,并传到参数 id=1
U('Admin/User/select') // Admin分组下的 User模块 select 操作
其次个参数能够是数组可能是字符串
U('Blog/cate', array('cate_id' => 1, 'status' => 1))
U('Blog/cate', 'cate_id=1&status=1');
U('Blog/cate?cate_id=1&status=1')
上述多个等价

还帮助路由成效
一旦在模板文件中使用U方法的话,必要动用
{:U('[分组/模块/操作]?参数' [,'参数1', '伪静态后缀', '是或不是跳转', '显示域名'])}

U酷路泽L 大小写可陈设,让其忽视,用U方法直接自动识别

跨模块调用:
如在 index模块调用 blog模块的 test方法,:
class IndexAction extends Action
{
   public function index()
   {
      $blog = new BlogAction();
      $blog->test();
      //......
   }
}
还足以用A方法来调用:
A('[项目名://][分组/]模块名');
class IndexAction extends Action
{
  public function index()
  {
    $blog = A('Blog');
    $blog->test();
    //....
  }
}
A('User') // 调用当前项指标 User 模块
A('Admin://User') // 调用 Admin项目下的 User模块
A('Admin/User') //Admin分组的 User模块
A('Admin://Tool/User') // Admin 项目 Tool分组下的 User 模块

Haval表示调用三个模块下的某部操作方法:
R('[项目名://][分组名/]模块名/操作名', array(param1, param2...))

Odyssey('User/info', array(15))表示调用 User模块下的 info方法并传到参数 15

页面跳转
职业有成时:在操作方法中用 $this->success('提醒音信', '跳转页面');
战败时:$this->error('fail');可定制,具体看手册

重定向 redirect();
在操作方法中用 $this->redirect('U大切诺基L', array($params), time, '提醒音信');

赢得系统变量(可用PHP中的 $_GET,$_POST, $_SESSION, $_COOKIE ...)
也可在 action 中调用如下方法
$this->方法名('变量名'[,过滤方法][,默认值]);
措施名称为:_get,_post,_param,_put,_request,_session, _cookie...可看手册
$this->_get('name'); 获取 $_GET['name']的值,同不日常间调用配置文件中暗中同意的过滤方法
$this->_get('id', 'strip_tag', 0); 调用 strip_tags过滤id值,若无值,则为0,如果没有设置暗许值,则为null.

$this->_get(); 获取全部变量值
$this->_get('name', 'strip_tags, htmlspecialchars', 0);// 先用 strip_tags,再用htmlspecials方法过滤

闭馆过滤方法:
$this->_get('name', false); 或者 $this->_get('name', '');

推断诉求类型:(GET,POST,PUT,DELETE,HEADE,AJAX)
在Action的操作方法中:
class UserAction extends Action
{
  public function index()
  {
     if($this->isPost()) // 是否为post提交,同时 isGet(),isPut().看手册
     {

     }else
     {

     }

  }
}

获取URL参数
不奇怪情况下.localhost/index.php/User/index/id/1
在UserAction.class.php的index方法中,
$_GET['_URL_'][0] // User
$_GET['_URL_'][1] // Index
$_GET['_URL_'][2] // id
....
也可用
$this->_param(1); // index
$this->_param('id'); // 1

ajax 返回
必须是ajax
调用
$this->ajaxReturn("重返数据", "提醒信息", 操作状态 );

Action参数绑定
原理是把UKoleosL中的参数(不包含分组,模块,操作)和调整器中的方法参数绑定,UENCOREL:


class BlogAction extends Action
{
  public function read($id = 0)
  {
    // id = 5
    $Blog = M('Blog');
    $Blog->find($id);
  }
 
  public function archive($year=2014, month=07)
  {
        $year = $year; // 2012
    $month = $month; //03
    //.....
  }
}

多层调整器帮衬
A('User', 'Event'); // Lib/event/UserEvent.class.php
A('User', 'Api') // Lib/Api/UserApi.class.php

模型相关

法则定义:
一旦表前缀为:think_
模型名(类名)  对应的表名
UserModel        think_user
UserTypeModel    think_user_type
假使不适合上述法则,要在模型里面定义相关属性
tableName 不包蕴前缀的表名
trueTableName 富含前缀的表名
dbName 定义模型当前对应的数据库
如:
class UsersModel
{
   protected $tableName = 'user'; // 表示这些模型其实对应的表为 think_user;
}
class UsersModel
{
  protected $dbName = 'db'; // 定义对应的数据库
  protected $trueTableName = 'top_test'; // 表示对应的是 top_test的表
}

模型实例化
能够不用进行别的模型定义,就能够回顾利用CU奥迪Q3D了,唯有当要落到实处部分政工逻辑封装时才用到
简单的CURD:
实例化User模型
$User = new Model('User');
$User = M('user');
$User->select();

也能够在model中定义三个接续 model的类,实现相应的逻辑(自定义的可能别的公共类)
class UserModel extends Model
{
  //....
}

$user = new UserModel('Admin');
或者 $user = M("UserModel:Admin"[, '表前缀', '配置文件']);

D方法可支撑跨种类和分组调用
D('Admin://User'); // 实例化 Admin项目的 User模型
D('Admin/User');   // 实例化 Admin 分组的 User模型

实例化空模型(使用原生态SQL)
$tt = new Model();
或者 $tt = M();
$res = $tt->query("select * from think_test");可帮衬多表查询
$res = $tt->query("select * form think_test, think_user");

字段定义:
$田野s = $User->getDbFields(); // 获取表的具有字段
若是想每一遍获得的字段不是从表的组织中得到,大概想获得钦定的字段,可在 Model中定义
class UserModel extends Model
{
 //此时用 getDbFields()只获得里面钦定的那有的
  protected  $fields = array('id, name', '_pk' => 'id', '_autoinc' => true);
  //...
}

获取主键
$model->getPk();

质量访问:可透过数量或对象属特性局
$User = D('User');
$data = $User->find(1);
print_r($data->name); 或者 print_r($data['name']);

跨库操作
class UserModel extends Model
{
  protected $dbName = 'user'; //对应的是 user数据库下的 user表
  protected $tablePrefix = 'other_'; //差异不平时间,定义前缀
}

class Info Model extends Model
{
  protected $dbName = 'info'; //对应的是 info数据库下的 info表
}

举行询问时,会自行管理
$User = D('User');
$User->select(); // select * from user.think_user

一经未有定义模型,用M方法时,可用:
$user = M('user.User', 'other_');

创造数量:
$User = M('User');
//依照表单的 post创设对象,
$User->create();
$User->add();

依然最佳用这种,可过滤
$User = M('User');
$data['name'] = 'lin3615';
$data['pwd'] = 'xxx22';
$User->create($data);
$User->add();

或者
$User = M('User');
$data['name'] = 'lin3615';
$data['pwd'] = 'xxx22';
$User->data($data)->add();

字段映射:
能够在表单中潜藏真实的数据表的字段新闻,能够平素交给,会活动转变
class UserModel extends Model
{
  protected $_map = array(
    'name' => 'username', // 表单中的 name 字段映射为数据表的字段 username
    'mail' => 'email'  // 表单中的 mail 字段映射为数据表的字段 email
  );
}

用 parseFieldsMap() 方法了可把从数据表的字段映射为钦点的小名字段:
$User = M('User');
$data = $User->find(1); // 此时为数据表的真实字段
$data = $User->parseFieldsMap($data); // 就能够映射为 name和mail这段

$User->where('status=1')->order(id desc)->limit(10)->select();
当对表单提交的多寡时用
$this->_post(); $this->_param();等时,会融洽调用系统安排的过滤函数
用$_POST(); $_REQUEST();则不会自行调用过滤函数

活动验证
对表单的字段验证
在 Model类里面定义 $_validate属性,是三个二维数组
array(验证字段,验证准绳,错误提示[,验证条件,附加条件,验证时间]);
class TestModel extends Model
{
  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'), //自定义函数验证密码格式(checkPwd)
  );
}
当使用系统 create方法时会自动验证
$User = D('User');
if(!$User->create())
{
  //假若验证战败!
  exit($User->getError());
}else
{
  // 通过
}
可以动态退换验证法规
$User = D('User');
$validate = array(array('verify', 'require', '验证码必须')); // 仅仅供给打开验证码的辨证
$User->setProperty('_validate', $validate);
$result = $User->create();
if(!$result)
{
  // 失败
   exit($User->getError());
}else
{
   // 成功验证
}

手动验证
$validate = array(array('verify', 'require', '验证码必须'));
$this->validate($validate)->create();

平凡单个可用 check('验证数据', '验证法规', '验证类型');
$model->check($value, 'email');
$model->check($value, '1,2,3', 'in');

命名范围:
固然对三翻五次贯操作实行李包裹装,用_scope属性定义,用scope方法调用
class NewsModel extends Model
{
  protected $_scope = array(
   'normal' => array(
            'where' => array('status' => 1),
            ),

   'latest' => array(
        'order' => 'create_time desc',
        'limit' => 10,
    ),
  );
}
$_scope格式化:是几个数组:
'命名范围标识名' => array('属性名'=>'值', '属性名' => '值', ...);
属性名满含:where,田野,order,table ....(看手册)
用scope()方法调用
$model->scope('normal')->select;
// select * from think_news where status = 1;

$model->scope('latest')->select();
// select * from think_new order by create_time desc limit 10

能够调用多少个命名范围
$model->scope('normal')->scope('latest')->select(); 或者
$model->scope('normal,latest')->select();
$sql = "select * from think_news where status=1 order by create_time desc limit 10";
假定命名范围存在冲突,前面包车型大巴会覆盖前边的,假使不设有命名范围,则会忽略

默许命名范围
protected $_scope = array(
    'default' => array(),
    );
调用default时,能够不加default
$model->scope()->select()与 $model->scope('default')->select();相同

取名范围调解
$model->scope('normal,latest', array('limit'=>5))->select();
自定义命名范围
$model->scope(array('field'=>'id,title', 'limit'=>5))->select();

贯通操作混合使用
protected $_scope = array(
    'normal' => array(
        'where' => array(),
        'field'=>'id, title',
        'limit' => 10,
    ),
);

自动实现:
在 model类定义 $_auto属性,可活动完成多少管理效果
array('填充字段',填充内容[,填充条件,附加条件]);
class MessageModel extends Model
{
  protected $_auto = array(
      array('status', 1), // 新添时把status字段为1
      array('password', 'md5', 1, 'function'), //对password字段在增加产量的时候使md5函数管理
      array('name', 'getName',1, 'callback'), // 对name字段在疯长的时候回调getName方法
      ....
     );
}
非得调用 create 方法才生效和电动验证同样,当调用 create()时,会自动调用

能够动态设置:
$auto = array(
    array('password', 'md5', 1, 'function'),    
    );
$user->setProperty('_auto', $auto);
$user->create();

还可动态设置准则
$this->auto($auto)->create();

$user = M('User');
$user->where(type=1 and status = 1)->select();
select * from user where type=1 and status = 1;

$User=M('User');
$condition['name'] = 'thinkphp';
$condition['stauts'] = 1;
$condition['_logic'] = 'OR';
$user->where($condition)->select();
select * from user where name='thinkphp' or status = '1';

选择对象情势
$user = M('User');
$condition = new stdClass();
$condition->name = 'thinkphp';
$condition->status = 1;
$User->where($condition)->select();

表明式查询
$map['字段名'] = array('表达式', '查询条件');
表达式: EQ,NEQ,GT,EGT,LT,ELT,LIKE,[NOT]BETWEEN,[NOT]IN, EXP表明式查询,帮助SQL语法

$map['id'] = array('eq', 100);和 $map['id'] = 100等效,表示 id = 100
....
表达式查询  EXP
$map['id'] = array('in', '1,2,3');与 $map['id'] = array('exp', 'in(1,2,3)');等效
exp查询的基准不会被当成字符串,所今后边的查询条件能够使用其余SQL协助的语法,满含动用函数和字段名称。查询表达式不仅仅可用于查询条件,也得以用来数据更新
$User = M();
$data['score'] = array('exp', 'score 1');
$User->where('id=5')->save($data);

即刻查询
$User = M('User');
$map['name|title'] = 'thinkphp';
$User->where($map)->select();
询问条件为 name=thinkphp or title = thinkphp

$user = M();
$map['status&title'] = array(1,'thinkphp', '_multi'=>true);
$user->where($map)->select();
status=1 and title='think'
_multi=>true必须放在最终,能&,|不可能同一时间接选举拔

高级模型
提供越多的询问功用和模型巩固成效,但要承继高等的模型或动态模型
class UserModel extends AdvModel
{

}
基本功模型类内置有数量自动完毕作用,当独有用 create()方法时才生效,用高端模型则不用create(),就能够完成
在 Model类中增添 $_filter属性
protected $_filter = array(
    '过滤字段' => array('写入法则', '读取准绳',是还是不是传入整个数据对象),
);
中间法则即为多个函数
也得以系列化字段, 用 $serializeField属性
protected $serializeField = array(
    'info' => array('name', 'email', 'address'),    
    );
此刻会把 name,email,address的值连串化后保存在 数据表的 info字段中,读取时会自动反连串化
class UserModel extends AdvModel
{
   protected $_filter = array(
    'id' => array('md5', 'md5'),
    );
   protected $serializeField = array(
    'info' => array('name', 'email', 'address'),
    ).    
}

$User = D('User');
$User->name = 'thinkphp';
$User->email = 'ssss@qq.com';
$User->address = 'gd';
$User->add();//自动连串化后保存在数据库

读取时:
$User = D('User');
$data = $User->select()->find(1);
//自动反系列化
$data['name']; //'thinkphp';
$data->['address']; //'gd';

多表查询
$model->table(
'think_blog Blog,
think_category Category,
think_user user')
->field(
 'Blog.id, Blog.name,Blog.title,
 Category.title as category_name,
 User.name as username')
 ->order('Blog.id desc')
 ->where('Blog.category_id=Category.id and Blog.user_id = User.id')
 ->select();
)

可用视图查询达成多表查询作用,得继续 ViewModel模型
class BlogViewModel extends ViewModel
{
  public $viewFields = array(
    'Blog' => array('id', 'name', 'title'), // 表示从 blog中取id,name,title字段
    'Category' => array('title'=>'category_name', '_on'=>'Blog.Category_id = category.id'),//表示category表中的title字段小名字为 category_name, 连接条件是Blog.Category_id = category.id
    'User'=>array('name'=>'username', '_on'=>'Blog.user_id = User.id'),
  );
}
举个例子表名不平等,如 blog对应的为myblog,则在 'blog' => array()中增添项:
'_as' => 'myblog'
SQL语句为:
select Blog.id as id,
blog.name as name,
blog.title as title,
category.title as category_name,
User.name as username from think_blog blog join think_category category
join think_user user
where blog.category_id = category.id and user.id = blog.user_id;

福寿双全视图查询结果时:
$model = D('BlogView');
$model->field('id,name,title,category_name,username')->where('id> 10')->order('id desc')->select();

波及模型:
就是一次在几个表完毕CU昂科威D
多样关系类型 HAS_ONE, BELONGS_TO, HAS_MANY, MANY_TO_MANY,关联的定义格式:
不能够不承袭 RelationModel类
class UserModel extends RelationModel
{
  protected $_link = array(
    '关联1'=>array(
          '关联属性1' => '定义',
          ....
          '关联属性N'=>'定义',
    ),
    '关联2'=>array(
          '关联属性1' => '定义',
          ....
          '关联属性N'=>'定义',
    ),
    ......
  );
}
如在操作 User表时,同时涉嫌和操作 record,card这两张表时,假设为一对一的关联,即HAS_ONE:
HAS_ONE关联的性质有:
mapping_type:关联类型,此为 HAS_ONE
class_name:要提到的模型名,如 record,card(分别定义为 class RecordModel extends Model{} ..),即会自行关联到对应的数据表 User(id,name,pwd), record(id, score, userid), card(id, userid, accout)
mapping_name:关联映射名,用于获取数据,假诺轻松,则用 关联1可怜定义来取值
foreign_key:关联外键,此为那一个型的键,即 User表中的键
condition:关联条件
mapping_田野s:要涉及的字段,即那几个关联表的字段
as_田野(field)s:倘诺设置了,直接把里面包车型大巴字段值和User的字段作为同级数据项,不然正是作为下一流数组项
class UserModel extends RelationModel
{
    protected $_link = array(
        'test1' => array(
            'mapping_type' => HAS_ONE,
            'class_name' => 'Record',
            'mapping_name' => 'Record', // 当作为二级数组项时,表示的下标同 User字段同一流别
            'foreign_key' => 'id',
            'condition' => 'id>0',
            'mapping_fields' => 'score',
            'as_fields' => 'score:uus',
            ),
        'Yes' => array(
                'mapping_type' => HAS_ONE,
                'class_name' => 'card',
                'mapping_name' => 'aa',
                'foreign_key' => 'id',
                'mapping_fields' => 'id,accout',
                //'as_fields' =>'id:cardid',
            ),

    );
}
$User = D('User');
$User->relation(true)->select();
以上是 HAS_ONE的询问利用,CUOdysseyD其实大概
如增添时
$User = D('User');
$data = array();
$data['user'] = 'xx';
$data['test1'] = array(
            'score' => 100,
        );
//以下的涉嫌下标一定是mapping_name 的值,假使这么些未有设,则用 上级的关联合签字
$data['aa'] = array(
            'id' => '',
            'accout' => '90',
        );

$result = $User->relation(true)->add($data);
BELONGS_TO与MANY_TO_MANY看手册

动态切换模型(如从基础到高端模型,视图模型)
$User = M('User'); // 实例化User对象 是基础模型类的实例
//动态切换成高等模型类
$User->switchModel('Adv')->select();
//动态切换成视图模型类
$User->switchModel('View')->select();

能够写成:
$User->M('AdvModel:User'); // 实例化User对象 是基础模型类的实例
$User->select();

一旦要传播参数:
$User = D('User');
// 动态切换来视图模型类 并传播viewFields属性
$UserView = $User->switchModel('View', array('viewFields'));

动态赋值:
$User = M('User');
// 动态切换来关系模型类 并传播data属性
$advUser = $User->switchModel('Relation');
// 或然在切换模型后再动态赋值给新的模子
$advUser->setProperty('_link', $link);
// 查找关周密据
$user = $advUser->relation(true)->find(1);

多层模型支撑:
支撑自定义分层,可是中间还中一而再基类 Model
D("User");//实例化的是 Lib/Model/UserModel.class.php
D('User', 'Logic'); //实例化是 Lib/Logic/UserLogic.class.php
能够配备 DEFAULT_M_LAYECRUISER修改模型名(该参数暗许值为Model)

视图
私下认可的沙盘文件定义准则:
模板目录/[分组名/][模板主旨/]模块名/操作名 模板后缀
模板目录暗中认可是项目目录下的Tpl,私下认可模板大旨为空,是为切换多模板矶设计,多模板时,有 DEFAULT_THEME参数中装置暗许模板
在各类模板核心上面,是以类别的模块名字为目录,然后是各种模块的具体操作模板文件,如:
User模块下的 add操作,对应的模板文件私下认可正是
Tpl/User/add.html
暗许后缀为 .html,可在 TMPL_TEMPLATE_SUFFIX来安顿成其它的
就算项目运行了分组功用,如 User模块属于 Home 分组,则私下认可模板对应是:
Tpl/Home/User/add.html
也得以布置模板目录档期的顺序分隔符: TMPL_FILE_DEPR,如 TMPL_FILE_DEPR => '_'
Tpl/Home/User_add.html

模板赋值,用 assign();方法

模板输出:用display();
脚下模块其余操作,如当前的edit操作模板;
$this->display('edit'); //不用模板文件路线和后缀

调用另外模块的操作:(Member模块下的read操作模板)
$this->display("Member:read");

display('主题名:模块名:操作名');
如 Xp主旨的User模块的edit操作模板
$this->display('Xp:User:edit');

一向全路径输出模板
display('模板文件名');要内定后缀名
如:当前的 Public 目录上边包车型地铁Menu.html模板文件;
$this->display('./Public/menu.html');

$this->display('Member:read', 'utf-8', 'text/html');

模板替换(看手册)

获取内容:
$this->fetch([模板:操作]);
用法与$this->display();相似,不过其是获得display();渲染后的模版内容,调节器中来操作

模板引擎
放到和原生的PHP,可在 TMPL_ENGINE_TYPE => 'PHP'以达到最好的功效

模板引擎:
变量输出(看手册)
{$name}
{$user['username']}  {$user['email']}
{$user->username} {$user->email} {$user.username}
{$user['sub']['name']] // 三级数组

系统变量,(看手册)
{$Think.}以$Think. 开头的,如:
{$Think.server.script_name}

使用函数:
{$varname|function1|function2=arg1,arg2,###}
{$webTtitle|md5|strtoupper|substr=0,3}
编译后:
<?php echo substr(strtoupper(md5($webTitle)), 0, 3); ?>
小心函数的概念和平运动用种种的对应关系,日常来讲函数的第三个参数就是近来的变量或许前叁个函数调用的归来结果,若是你的变量并非函数的率先个参数,要求利用固定符号
如上面:
md5()的参数是 $webTitle;
strtoupper();的参数是 md5($webTitle);
substr();参数是 strtoupper(md5($webTitle));

{$create_time|date="Y-m-d", ###}
date的第四个变量才是函数的参数,则用 ###意味着,则编写翻译后为:
<?php echo date('Y-m-d', $create_time); ?>
还提供了在模板文件中央市直机关接选取PHP文件定义的函数方法
格式:{:function(...)}
{:U('User/insert')} ==> <?php echo U('User/insert'); ?>
还足以实行函数,但不出口
格式:{~function(..)}
{~say_hell('tp')} ==> <?php say_hell('tp'); ?>

默许值输出,当海市蜃楼时就能够输出暗中认可值
{$变量|default="默认值"}
{$lin|default="hi,lin3615"}当$lin未有值时,则输出 hi,lin3615

选择用运算符:

  • {$a $b}
  • {$a-$b}
    ....
    汇总运算 {$a $b*10/5 $c-$d}
    不辅助点法和常规函数用法
    {$user['score'] 10}
    {$user['score']*$user['score']}

放到标签(看手册)

涵盖文件(include)
能够应用Include标签来含有外界的模板文件,
文件名要用完整的,相对项目根目录
<include file="完整模板文件名" />
<include file="./Tpl/Public/header.html" />

<include file="操作名" />
<include file="read" />
一定于含有于同一模块下的read操作中的模板,如:
class UserAction extends Action
{
  public function index()
  {

  }

  public function read()
  {
    $this->display();
  }
}
<include file="read" />
这会儿一定于含有 Tpl/User/read.html

<include file="模块名:操作名" />都是相对的模版模块
<include file="Blog:read" />
即为 Tpl/Blog/read.html

含有别的模板要旨的模块操作模板
<include file="主题名:模块名:操作名" />
<include file="blue:User:read" />

也可用变量
<include file="$tplName" />

也可传递变量
<include file="read" title="this is title" keyword="keyword..." />
read.html代码
[title]
[keyword]
可被替换

可引进多少个文件
<include file="file1, file2" />

导入文本:
<import type="js" file="js" />
<import type="css" file="stysheet" />
type:私下认可值为 js.还足以是css
那会儿一定于(根目录)
<script type="text/javascript" src="Public/js.js"></script>
<import type="js" file="js" basepath="./Common/javascript" />
相对于
<script type="text/javascript" src="./Common/javascript/js.js"></script>

load标签导入 js/css文件
<load />
<load />
自动识别,间接根目录
<js />
相当于
<script type="text/javascript" src="Public/js/js.js"></script>

<css />
相当于
<link rel="stylesheet" type="text/css" />

Volist标签首要用于在模板中循环输出数据集或许多维数组。(看手册)
<Volist name="list" id="vo" offset="5" length="10" key="i" mod="5" empty="不存在">
   {$vo.name}
   {$vo.id}
   <eq name="mod" value="4"></eq>
</Volist>

foreach标签 也是用于循环输出
<foreach name="list" item="vo" key="i">
{$vo.name}
</foreach>

For标签用于落实for循环
<for start="开始值" end="结束值" comparison="" step="" name="">

</for>

<for start="1" end="100">
{$i]
</for>
相当于
for($i=1; $i < 100; $i )
{
   echo $i;
}

switch标签:
<switch name="变量">
  <case value="" break="0或1">输出内容</case>
  <case value="">输出内容2</case>
  <default />内容
</switch>

正如标签(eq,equal,notequal,neq,gt,lt,....)
<相比标签 name="变量" value="值">内容</比较标签>
<eq name="name" value="value">value</eq>
<equal name="name" value="value">value</equal>

<eq name="name" value="value">相等<else />不相等</eq>

<compare name="name" value="5" type="eq">value</compare>

伊利运算
{$status ? 'yes' : 'no'}

界定标签
<in name="id" value="1,2,3">xxx</in>
<notin name="id" value="1,2,3">yyy</notin>
<between name="id" value="1,2">xxx</between>// 当中value独有是八个值时期
<notbetween name="id" value="1,10">aaaaa</notbetween>

<range name="id" value="1,2,3" type="in"></range>

present 标签,决断是或不是赋值
<present name="name">name已经赋值</present>
<notpresent name="name">name还向来不赋值</notpresent>

empty标签,推断是或不是为空,同理defined
<empty name="name">name为空</empty>
<notempty name="name">name不为空</notempty>

Define 标签,实行常量定义
<define name="LIN" value="3615" />
在运作模板的时候 定义了二个LIN的常量

assign标签赋值
<assign name="var" value="lin3615" />
在运维模板的时候 赋值了叁个var的变量,值是lin3615

if标签,条件判定,不能够用古板的 <,>=,!=...
<if condition="($name eq 1) or ($name gt 100)">
xx
<else if condition="$name eq 2" />
222
<else />
ssss
</if>

标签嵌套,一般的价签都得以嵌套,暗许嵌套时最多为三级,通过TAG_NESTED_LEVEL配置参数设置嵌套品级

选取php代码,在里头的非PHP标签不起成效
php标签
<php>
echo 'hi, lin3615';
</php>
原生态 php
<?php echo 'hi,lin3615';?>
设若设置了TMPL_DENY_PHP参数为true,就不能够在模板中行使原生的PHP代码,不过如故支撑PHP标签输出

模板布局
实则便是把相应的源委放在模板里面作渲染输出(只输出模板里面包车型客车)
两种布局模板
先是种方式是 以布局模板为输入的办法
该措施索要配备开启LAYOUT_ON 参数(暗中同意不张开),并且安装布局入口文件名LAYOUT_NAME(默认为layout)。
class UserAction extends Action
{
  public function add()
  {
    $this->display('add');
  }
}
在不开启LAYOUT_ON布局模板从前,会直接渲染Tpl/User/add.html 模板文件,开启之后,把add.html内容会渲染Tpl/layout.html 模板中,并把layout.html中的{__CONTENT__}替换为add.html中的内容
layout.html
其余内容(如引进底部内容,样式表....)
{__CONTENT__}

设若没有须求动用布局模板,可在模板文件add.html中隐含 {__NOLAYOUT__}即可

其次种格局是以当下出口模板为输入的主意
这种格局的入口依然在User/add.html 模板,然则大家可以修改下add模板文件的剧情,在头顶扩张下边包车型大巴布局标签:
<layout name="layout" />
layout.html中的内容与第一种的剧情一模二样

模板承继
实质上正是概念贰个基础模板(或是布局),相关内容用<block>标签来分别,每一个区块由<block name=""></block>组成,name属性应当要独一
如定义二个基础的沙盘:
base.html
<block name="title"><title>the header</title></block>
............
<block name="jsfiel"><include file="js.js" /></block>

在index.html中援引上边包车型客车块时(用到承接):
<extend name="base" />
<block name="title"><title>{$title}</title></block>
<block name="jsfile"></block>

literal标签:原样输出(幸免模板解析)
<literal>
    <if condition="" >
    sssss
    </if>
</literal>

<php><literal><if condition=""></if></literal></php>

模板注释
格式:{/* 注释内容 */} 或 {// 注释内容}

避免JS混淆(即解析)
1.{}在分隔符之间留空格
2.<literal>JS代码</literal>
3.修改暗中认可分隔符


本文由金沙澳门官网-www.js333com-金沙js333com发布于金沙澳门官网计算机,转载请注明出处:thinkphp 杂乱笔记(1)

您可能还会对下面的文章感兴趣: