thinkphp5中.htaccess 的定义,通过这个模式,也适用于其他.htaccess定义

<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine On

#index.php/admin/users/index.html
RewriteRule ^(.*)list\.html$ $1/admin/users/index\.html

#index.php/admin/users/update/id/1.html
RewriteRule ^(.*)show_([0-9]+)\.html$ $1/admin/users/update/id/$2

#index.php/admin/users/index.html?page=2
RewriteRule ^(.*)p_([0-9]+)\.html$ $1/admin/users/index/page/$2
# http://127.0.0.1/tc/004_oop/tp5/public/p_2.html

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>


关注公众号,了解更多it技术(it问答网

tp5分页效果,中间数字化的设置。

核心分页默认文件的路径:tp5\thinkphp\library\think\paginator\driver\Bootstrap.php

 /**
     * 页码按钮
     * @return string
     */
	 /*
    protected function getLinks()
    {
}

这个函数是我们要修改替换的!

我这里推荐一个:http://www.thinkphp.cn/code/3000.html

 public $rollPage=1;//侧面显示个数
protected function getLinks()
 {
 if ($this->simple)
 return '';
 
 $block = [
 'first' => null,
 'slider' => null,
 'last' => null
 ];
 
 $side = $this->rollPage;
 $window = $side * 2;
 
 if ($this->lastPage < $window +1) {
 $block['slider'] = $this->getUrlRange(1, $this->lastPage);
 
 } elseif ($this->currentPage <= $window-1) {
 
 $block['slider'] = $this->getUrlRange(1, $window + 1);
 } elseif ($this->currentPage > ($this->lastPage - $window+1)) {
 $block['slider'] = $this->getUrlRange($this->lastPage - ($window), $this->lastPage);
 
 } else {
 
 $block['slider'] = $this->getUrlRange($this->currentPage - $side, $this->currentPage + $side);
 }
 
 $html = '';
 
 if (is_array($block['first'])) {
 $html .= $this->getUrlLinks($block['first']);
 }
 
 if (is_array($block['slider'])) {
 
 $html .= $this->getUrlLinks($block['slider']);
 }
 
 if (is_array($block['last'])) {
 $html .= $this->getUrlLinks($block['last']);
 }
 
 return $html;
 }

控制器中如何智能化设置呢?注意上面的:public $rollPage=1;//侧面显示个数

我们在控制器中的引用是这样的:

$list=$obj->where($tj)->paginate(2,false, [
                ‘query’ => Request::instance()->param(),//不丢失已存在的url参数
            ]);
$list->rollPage=2;//一定要放在$list->paginate 之后哦。这里就是重新对分页栏每页显示的页数进行定义了。

关注公众号,了解更多it技术(it问答网

tp5分页效果 上一篇,下一篇的自定义修改。

核心分页默认文件的路径:tp5\thinkphp\library\think\paginator\driver\Bootstrap.php

对应的上一个方法名:

 /**
     * 上一页按钮
     * @param string $text
     * @return string
     */
    protected function getPreviousButton($text = "&laquo;")
    {

}

 /**
 * 下一页按钮
 * @param string $text
 * @return string
 */
 protected function getNextButton($text = '&raquo;')
 {
详细略
}

提示:你可以直接设置$text="默认值为上一篇/下一篇",但是这样就写死了,我们希望通过视图的方式直接修改上一篇或者下一篇的具体内容。
视图代码:	
{$list->render("上一个","下一个")} ;//注意,默认这样传值是不对的,我们还需要按如下流程操作。
在tp5\thinkphp\library\think\paginator\driver\Bootstrap.php 文件中
搜索: public function render()
修改:
 public function render($a="",$b="")
 {
 if ($this->hasPages()) {
 if ($this->simple) {
 return sprintf(
 '<ul class="pager">%s %s</ul>',
 $this->getPreviousButton($a),
 $this->getNextButton($b)
 );
 } else {
 return sprintf(
 '<ul class="pagination">%s %s %s</ul>',
 $this->getPreviousButton($a),
 $this->getLinks(),
 $this->getNextButton($b)
 );
 }
 }
 }

 

 

 


关注公众号,了解更多it技术(it问答网

tp5快速上手笔记-徐多蔚,合肥php老师

tp5:
项目开发中,tp5线上手册路径:
https://www.kancloud.cn/manual/thinkphp5/118003
文件夹命名是小写
控制器文件名:驼峰法【首字母大写规则】
命名更精简:如Index.php
单独口文件,默认是index模块,index控制器中的index方法。
tp5中默认只支持pathinfo url路径;入口文件在站点根目录的public/index.php
tp5/public/index.php/模块名/控制器名/方法名
tp5/public/index.php/index/index/index
如何渲染视图?
开启debug模式方便我们调试。 app项目文件夹下的config.php
‘app_debug’              => true,
1、继承核心控制器类;【导入核心类】
use think\Controller;
2、使用return函数;
3、使用$this->fetch(参数)渲染视图。
参数若省略:默认找的视图路径是模块下的view文件夹中的和控制器同名的文件夹中的文件【和方法同名的文件】
视图中默认的扩展名.html
打开配置项搜索: // 模板后缀
 ‘view_suffix’  => ‘html’,
若我们希望修改默认的渲染视图路径,我们可以把参数修改。
如:/a   含义就是view文件夹下的a.html
/a/a  含义就是view文件下的a文件夹中的a.html
tp5视图中,数组的循环推荐2种写法。
写法一:
{foreach $xdw as $k=>$v}
{$k}
{/foreach}
 
写法二:
{foreach name="list" item="vo" key="k" }
   {$k}|{$vo}
{/foreach}

 

公共视图文件的包含:
{include file=”head” /}
如何创建自己的方法,又如何访问?
tp5中用户自定义函数存放:
tp5\application\common.php
 
public function abc(){
//echo 666;
//echo $_GET['aaa'];
$arr=$this->request->param();
var_dump($arr);
}

 

访问的路径写法,默认只支持pathinfo模式
index.php/模块名/控制器名/方法名
若在访问的时候,需要进行传值。传值写法格式如下:
格式一:
index.php/模块名/控制器名/方法名/?aaa=1&bbb=2
格式二:
index.php/模块名/控制器名/方法名/aaa/1/bbb/2
我们可以使用tp5中内置的取值函数获取传递过来的参数。
$this->request->param();
tp5中$_GET[] 不太好用。提示:若是上方格式二传值,则get不到值。
提示:
tp5中,没有U方法了,我们用url实现。
没有I方法了,我们用input实现。
input('get.id'); // I('get.id');
input('post.name'); // I('post.name');

提示:tp5中的input(“get.”)只能获得表单提交过来的数据,不能得到url get传值哦。

tp5中用url代替了U方法。
{:url(‘模块名/控制器名/方法名’)}
tp5中数据库的操作【增、删、改、查】
1、配置数据库的参数;
项目文件夹[application]/database.php 文件中。
2、在控制器中先把Db类文件导入到页面命名空间中。如 :
use think\Db;
3、执行增、删、改、查
查询操作:
$data=Db::name(‘user’)->find();
print_r($data);
$data=Db::name(‘users’)->where(‘id=88’)->select();
$data=Db::name(‘users’)->query($sql);//提示$sql是自己定义的
提示:在自定义sql定义中,有可能涉及到表前缀,如何获得配置文件中的表前缀呢?    config(‘database.prefix’)
    删除:
$data=Db::name(‘users’)->where(‘id=88’)->delete();//删除,返回影响的实际记录数。
   tp5增加:
$data=Db::name(‘users’)->insert($data);//插入记录,insert ;//$data是实际影响的记录数。
   更新:
//更新用update
$data=Db::name(‘users’)->where(‘id’, 86)->update($data);//$data是实际影响的记录数。

tp5获取插入的数据的自增id

insertGetId方法新增数据并返回主键值使用getLastInsID方法:

Db::name(‘user’)->insert($data);

 $userId = Db::name(‘user’)->getLastInsID();

// 使用insertGetId方法

Db::name(‘user’)->insertGetId($data);

经典子查询+分页:
	$a=config("database.prefix")."administrators";
	$b=config("database.prefix")."administrators_groups";
			
	//https://www.kancloud.cn/manual/thinkphp5/118083
	$arr=$this->db->table($a)->alias('a')->join("$b b",'a.gid = b.id','left')->where($tj)->paginate(config('admin888.pagesizenum'),false, [
                'query' => Request::instance()->param(),//不丢失已存在的url参数
            ]);

 

tp5中 $this->success 跳转时间默认是3S【注:tp3中成功默认时间是1s】
tp3修改时间格式:
$this->success(“登录ok”,url(“Admin/Index/succ”),10);
tp5修改格式:
$this->success(“登录ok”,url(“Admin/Index/succ”),”,10);
tp5中,session的使用。不能使用默认的$_SESSION来定义和取值了,我们需要使用框架中内置的session类来处理。
使用之前记得先导入。
use think\Session;
设置session Session::set(“username”,$name);
获得session值 Session::get(“username”);
tp5中的视图魔术常量 __ROOT__  代替了tp3.2.3中 __PUBLIC__
TP5使用验证码的方法:
方案一:tp5框架内置的验证码
1、{:captcha_src()} 这个是验证码的路径;在视图可直接引用即可。
2、控制器验证:
if(!captcha_check($yzm)){
$this->error(“验证码错误”,url(‘index/index’));
}
方案二:自定义类文件方法
如何自定义类文件。
核心文件夹:www\tp5.171219\thinkphp\library\think
提示:
1、类文件内容中的命名空间不能省略:
namespace think;
2、类名和对应的文件名必须保持一致。
文件名:Yzm.php
class Yzm{
}
控制器中如何使用用户自定义的类?
1、导入  use think\Yzm;
2、$obj=new Yzm();
   $obj->CreateImg();
3、验证码中值的传递,使用session传值。
Session::set(“code”,$cm);
Session::get(“code”);
提示:验证码类文件中可以直接使用Session::set(“code”,$cm);原因是我们在控制器那里已经导入了Session类。
另外,我们也可以灵活使用扩展类的方式实现。

1、在根目录 extend 中创建 Mess.php类文件;
code:

<?php
class Mess{

	function xdw(){
		echo "xuduowei";
	}
}
?>

2、在对应的引用的控制器中
use Mess;
$Mess=new Mess();
$Mess->xdw();

 

=============================================
一:模拟线上站点,创建虚拟域名;
a: 【baidu.com】
phpstudy->其他选项菜单->站点域名管理->
站点管理->设置好后->新增->保存设置并生成配置文件
b:确保服务重新启动;
c:修改host
C:\Windows\System32\drivers\etc\hosts
确保去掉只读属性;
使用编辑器打开。
按照如下格式写入配置信息:
127.0.0.1       baidu.com
提示:若线下开发的搬到线上运营,有可能会出现样式丢失问题【路径惹的祸】。
\tp5\application\config.php
更前曾经的模板替换字符串:如
 ‘view_replace_str’       => [ ‘__ROOT__’ => ‘http://www.xuduowei.com/’,],
防跳墙的构架:
class Index extends Common{
}
Common:
<?php
namespace app\admin\controller;
use think\Controller;
class Common extends Controller
{
    public function _initialize(){
echo 666;
}
}
=======================
tp5中获得当前模块,控制器,方法的写法和tp3是不一样的。
1、导入 use think\Request;
2、方法中实例化 $request= Request::instance();
3、使用实例化对象中的方法。
echo $request->module();//这个是模块的;
echo $request->controller();//控制器名的。
echo $request->action();//得到方法的。
tp5中的分页:
1、不需要我们传递总记录数;
$arr=$obj->where($tj)->paginate(2);
2、搜索分页
use think\Request;
$arr=$obj->where($tj)->paginate(2,false, [
                ‘query’ => Request::instance()->param(),//不丢失已存在的url参数
            ]);
用户删除传值[get方式]:
<a class=”button border-red” href=”javascript:void(0)” onclick=”return del(‘<?php echo url(‘admin/Users/del?id=’.$rs[‘id’]);?>’)”><span class=”icon-trash-o”></span> 删除</a>
url(‘admin/Users/del?id=’.$rs[‘id’]) 这个是ok的。
url(‘admin/Users/del/id/’.$rs[‘id’]) 这个是不对的。
其他扩展:调用其他模块或者控制器的方法:
    action(‘admin/Common/auto’);//注意这个不推荐在后台模块开发中使用,因为后台模块开发涉及到权限问题,这个action是控制器层面的,所以在控制器相互调用中有可能无权限操作。这个应用场景更多的再前端模块使用。

tp5中:
1、模型的载入;

方法一:直接在控制器中实例化:
$obj=new \app\admin\model\Index2; //提示第一个\是不能省略的。否则报错!
echo $obj->index();

方法二:use 导入,后实例化。

use \app\admin\model\Index2;
控制方法中:

$obj=new Index2;
echo $obj->index();

===============================
tp5高级:

TP5隐藏后台方法【目的是希望后台模块不在url中暴露模块名,这样更安全;第一步是定义单入口模式,绑定对应模块;第二步就是即使暴露出来了,也禁止访问。】

一、增加后台模块入口文件public/boss.php

// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
define('BIND_MODULE','admin');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';

二、修改配置文件禁用后台模块访问application/config.php

// 禁止访问模块
    'deny_module_list'       => ['common','admin'],

thinkphp修改数据表时怎么实现字段自加1-PHP框架开发

$User->where('id=5')->setInc('score',3); // 用户的积分加3
$User->where('id=5')->setInc('score'); // 用户的积分加1
$User->where('id=5')->setDec('score',5); // 用户的积分减5
$User->where('id=5')->setDec('score'); // 用户的积分减1

 


关注公众号,了解更多it技术(it问答网

tp3.2.3-php文章管理系统-融合权限分配,可精确到按钮;开发作者:徐多蔚,xuduowei,徐老师

后台进入:

http://www.xuduowei.com/tc/php2/index.php/Admin

用户的模块管理,增,删,改,查,分页,搜索分页,权限分配。

本项目仅仅只有后端部分,部门核心功能:
登录,验证码,分页,搜索分页,权限分配,可精确到按钮思路!

 

 


关注公众号,了解更多it技术(it问答网

tp3快速上手笔记-徐多蔚

文件夹及文件【控制器,模型】命名才用驼峰法[首字母大写]
URL:
url访问方式:
index.php?m=home&c=index&a=abc
m:模块;  默认模块是home
c:控制器;默认控制器是index
a:方法。 默认方法是index
tp采用的是单入口文件!
tp3.2.3版本中支持以下4种格式。其中有2种是最最重要。
URL模式 URL_MODEL设置
普通模式 0
PATHINFO模式 1 [标准] =============重要。
REWRITE模式 2
兼容模式 3
配置文件中:’URL_MODEL’=>1, //0:普通模式;1:pathinfo模式【默认的】
I(‘post.’)     //所有的值
I(‘post.name’)
 
 
 
 
I(‘get.’) //所有的值
I(‘get.name’)
get方式传值:
index.php?m=home&c=news&a=newslist&abc=1&cde=2
index.php/home/news/newslist/?abc=1&cde=2
index.php/home/news/newslist/abc/1/cde/2
get方式取值:
方法一:
$_GET[‘abc’];
方法二:
I(‘get.’);数组类型
I(‘get.变量名’); 得到的就是具体的变量值
视图的渲染:
$this->display(‘/视图文件名’);//注意没有扩展名
格式:$this->display(‘/视图文件名’); //找View视图文件夹下的 视图文件名
============================================
格式:$this->display(‘视图文件名’); //默认找View视图文件夹下,和控制器同名的文件夹中的视图文件名
如何定义模板变量且赋值?
{$xdw}
针对数组的定义和引用!
控制器文件code:
$arr=array(‘a’=>2,’b’=>3,’c’=>4);
$this->assign(“xdw”,$arr);
视图文件code:
{$xdw.b} 或者  {$xdw[‘b’]}  //比smarty更智能。
tp3.2.3视图中,如何循环数组?
<foreach name=”xdw” item=”vo” key=”k” >
{$k}|{$vo} <br/>
</foreach>
提示:xdw 就是定义的模板变量名,vo就是循环值,k就是索引下标值或键名。
===========================================
在视图文件中,如何调用系统函数和自定义函数?
调用系统函数:
1、系统函数;
格式如:{$list.abc|substr=1,1}
或 {$list.abc|substr=###,1,1}
提示:若###省略,则把对应的变量值做为第一个参数值传递。
2、自定义函数
a、在哪里定义
   函数可以放到
ThinkPHP\Common\functions.php
ThinkPHP\ThinkPHP.php
b、如何引用 借鉴 系统函数引用方法。
==========================================
数据库如何操作?
tp3.2.3中配置文件有2种类型;1、全局配置文件;2、模块配置文件。
1、全局配置文件:
App\Common\Conf\config.php   有效于全部模块
2、模块配置文件:
App\Home\Conf\config.php     仅有效于当前模块
增、删、改、查
 
$obj=M();//若用query方法执行一个完整的sql,则这里可以M()。
$arr=$obj->query(“select * from obj_liuyan_cs”);
print_r($arr);
查:
增加:
$obj=M(“表名”);
$obj->add($arr);//返回值是增加后的主索引值,如:id值。
修改::==============================================
return $obj->where($where)->save($arr);//返回的值是实际更新的记录数。
删除::==============================================
return $users->where($where)->delete();//返回值是删除的真实记录数。
查询:
$obj=M(‘表名’);
$obj->query($sql); //$sql为完全自定义的sql。
$users=M(“ceshi”);
$arr=$users->where(“id=2”)->find();//结果是1维数组;只能是一条。
$arr=$users->where(“id=2”)->select();//结果是2维数组;
多表查询格式,也可以套用到单表中。
$rs=$obj->table(‘users u’)
->field(‘u.id,u.username’)
->order(‘id desc’)
->where()
->limit(1,1)
->select();
===============================
左右连接,子查询:
$obj=M();
$rs=$obj->table(‘users u’)
->field(‘u.sfzid,c.cardnum,(select pay from pays where cardid=c.id) as pay’)
->join(‘left JOIN cards as c ON c.uid=u.id’)
->select();
==================2018/1/10
php开发中,有3类元素是不可以重名的。
1、常量;
2、方法【函数】;
3、类。
命名空间:1、全局空间;2、子空间
命名空间就是帮助我们解决重名问题!
在php中如何声明命名空间呢?
我们可以用namespace来定义命名空间。
注意:namespace前方不可以有输出,否则报错!
page.php code:
function abc(){
echo ‘2’;
}
=========================
include(“page.php”);
function abc(){
echo ‘1’;
}
结果报错,提示重复定义abc();
我们可以在开头定义命名空间,如下:
namespace a;
include(“page.php”);
function abc(){
  echo ‘1’;
}
这就不会报错了,原因是,page.php被include包含进来,page.php中的内容在全局空间中。
namespace a;
include(“page.php”);
function abc(){
  echo ‘1’;
}
abc();//结果是1,默认执行的是当前命名空间里的方法。
如果要执行全局空间的,怎么办?
\abc();//结果是2
访问当前命名空间元素有2种方式:
方式一:直接引用,如abc();
方式二:完整路径引用,如\a\abc();
我们可以声明命名空间的时候,进行多级创建。
如 namespace a\a1;
完整的引用路径:\a\a1\abc();
注意:namespace 一定要放在页面开头,前方不可以有任何的输出!
命名空间中常量特殊!
需要用const 定义。
=====================================
导入类到命名空间中的顺序:
include(“page.php”);
use xdw3;
================================
一个页面中可以定义多个命名空间的!!
namespace xdw\xdw1{
}
namespace xdw\xdw2{
}
提示::一个页面中若定义了多个命名空间,则{}之外不可以有任何代码的执行。
tp3.2.3框架中如何创建模型及如何使用?
创建模型的方法:
页面命名:UsersModel.class.php
内容如下:
namespace 模块名\Model;
use Think\Model;
class UsersModel extends Model {
    public function index(){
 echo 1234;
    }
}
模型在控制器中的引用:
方法一:
$obj=new \模块名\Model\UsersModel(…)
$obj->index();
$obj=new \模块名\Model\UsersModel
$obj->index();
方法二:
先导入,后直接实例化:
use \Admin\Model\UsersModel;
$obj=new UsersModel();
$obj->index();
提示:模型的命名即表名,配置的默认库中要有这个表才可以。否则会报错的。因为模型存在的意义就是对表的操作。表都没有,创建模型有啥意义呢?
模型中主要是进行值的返回!输出动作在控制器里操作!
切记:模型不可以直接被访问,只能通过控制器间接的访问操作。
V
C
M
项目构架!
项目中一般分前端模块[Home]和后端模块[Admin]
__PUBLIC__
表单提交的动作页面,不推荐使用:
?m=admin&c=index&a=checklogin
也不推荐使用
/admin/index/checklogin
{:U(‘admin/index/checklogin’)}
admin:模块名;
index:控制器名;
checklogin:方法名。
I(“post.”);
tp中内置的页面跳转方法:
$this->success(‘success’, U(‘index/succ_page’),$time);
$this->error(‘error’, U(‘index/index’),$time);
提示:$time的单位是秒。
$time可省略,若省略,则调用默认时间。
默认success时间是 1s;error时间是3s。
9:21 2018/1/11
U方法可以传递参数:
 
{:U(‘index/page?filename=pass&t=2’)}
取值:
方法一【内置自动取值,函数参数名和U传递过来的变量名一致】:
function page($filename,$t){
   echo $filename;
}
方法二【手动通过I(‘get.’)取值】
function page(){
   echo I(“get.filename”);
}
tp3.2.3中用户信息的跟踪【会话机制】
session在tp3.2.3中默认已经开启了,所以不需要再次开启
可直接使用
$_SESSION[‘session名’]=值;
tp3.2.3中,内置了session处理。
定义:
session(‘name’,’value’);  //设置session
取值:
$value = session(‘name’);
删除单个:
session(‘name’,null); // 删除name
删除所有:
session(null); // 清空当前的session
MODULE_NAME 当前模块名
CONTROLLER_NAME 当前控制器名
ACTION_NAME     当前方法名
========================================
tp3.2.3中使用框架验证码。
使用方法,打开手册,搜索验证码。
1、
复制
$Verify = new \Think\Verify();
$Verify->entry();
到我们自定义的控制器方法中。
如下:
//生成验证码
function CreateYzm(){
$Verify = new \Think\Verify();
$Verify->entry();
}
2、
使用
打开对应的视图文件,如login.html
{:U(‘index/CreateYzm’);}把这个作为src的属性值。
3、
判断正误
使用内置方法进行判断。
// 检测输入的验证码是否正确,$code为用户输入的验证码字符串
function check_verify($code, $id = ”){
$verify = new \Think\Verify();
return $verify->check($code, $id);
}
在对应的控制器中使用此方法判断正确true与失败false
$this->check_verify(‘表单传值’);
实现登录页面刷新验证码技术:::
document.getElementById(‘imgyzm’).src=”yzm.php?”+new Date().getTime();
onclick=”this.src=this.src+’?'”
我们如何使用自己定义类的验证码呢?
1、自定义类为切入点。【怎么定义自定义类】
www\tp1214\ThinkPHP\Library\Think
创建一个文件,格式 类名.class.php
类文件内容格式:
namespace Think;
class Yzm{
function CreateImg(){
echo 666;
}
}
验证码有2种解决方案。
1、tp内置验证码技术
2、diy验证码技术。
2、如何使用自定义类。
提示:若我们在登录页面对应的控制器中设置了防跳墙方法。则对应的方法如:【index,验证码方法,判断登录方法】要进行过滤。
9:03 2018/1/12
提示:tp项目开发中,建议:每一个功能块都对应一个控制器。
修改密码流程:
1、/*判断2次输入的新密码一致*/
2、//新密码和老密码不能一样
2.1 判断时间
3、/*要先判断老密码输入正确后,才能进行新密码的修改。*/
扩展:我们需要实现一个功能,如:1天内最多只允许修改3次
密码。
select unix_timestamp();得到当前的时间戳的。
select count(id) as cc from obj_users_log where uid=1 and type=2 and unix_timestamp(updatetime)>(unix_timestamp()-3600*24)
========================================
tp3.2.3中分页类的使用。
$obj=M(‘users’);
$num=3;
$count=$obj->count();
$Page= new \Think\Page($count,$num);
分页样式的修改:
$arr=$obj->order(‘id desc’)->limit(“$Page->firstRow,$Page->listRows”)->select();
$Page->setConfig(‘prev’,’上一页’);
//一定要放到$Page->show();之上才有效!
$Page->setConfig(‘next’,’下一页’);
$show= $Page->show();// 分页显示输出
$this->assign(‘show’,$show);
$this->assign(‘arrlist’,$arr);
$this->display(“/list”);
搜索分页:
注意事项:
$arra[‘keywords’]=$keywords;
//$Page->parameter=$arra;  //$Page->parameter,放到show之上
 $Page->parameter = array_map(‘urlencode’,$arra); //若不这样,搜索的时候若有’将报错的。
$show= $Page->show();// 分页显示输出
完整sql:
select count(a.id) from obj_users_group_role a,obj_users_role b where a.groupid=2 and b.mokuai=’Admin’ and b.kongzhiqi=’Users’ and b.fangfa=’index’ and a.roleid=b.id
echo “模块名是:”.MODULE_NAME.”控制器是:”.CONTROLLER_NAME.”方法是:”.ACTION_NAME;
select a.*,b.groupid from obj_users_role a left join  obj_users_group_role b on a.id=b.roleid
魔术方法:
function _empty(){
echo ‘errordddddddddd’;
}
EmptyController.class.php  空控制器执行文件。
 tp3.2.3视图中条件的判断:
<if condition=”$v.groupname eq ” “>无分组<else />{$v.groupname}</if>
<if condition=”($name eq 1) OR ($name gt 100) “>
value1
<elseif condition=”$name eq 2″/>value2<else /> value3
</if>
在condition属性中可以支持eq等判断表达式,同上面的比较标签,但是不支持带有”>”、”<”等符号的用法,因为会混淆模板解析,所以下面的用法是错误的:
<if condition=”$id < 5 “>value1
    <else /> value2
</if>
必须改成:
<if condition=”$id lt 5 “>value1
<else /> value2
</if>
tp3.2.3中借助大 U方法传递参数:如:id
<?php echo U(‘users/del/?id=’.$v[‘id’]);?>
或者 <?php echo U(‘users/del?id=’.$v[‘id’]);?> 多个参数用&分割
<a class=”button border-red” href=”<?php echo U(‘users/del/?id=’.$v[‘id’]);?>” ><span class=”icon-trash-o”></span> 删除</a>
tp3.2.3中的缓存:
支持的缓存类型众多,常见常用的文件缓存设置方式:
1、页面静态缓存;
全局配置中
'HTML_CACHE_ON'     =>    true, // 开启静态缓存
'HTML_CACHE_TIME'   =>    60,   // 全局静态缓存有效期(秒)
'HTML_FILE_SUFFIX'  =>    '.html', // 设置静态缓存文件后缀
	'HTML_CACHE_RULES'  =>     array(  // 定义静态缓存规则
	 // 定义整个Users控制器 生成的路径App/html/Users/  html会自动生成
	'Users:'      =>       'Users/{:action}_{id}',
)

参考:https://www.cnblogs.com/chinalorin/p/5855254.html

2、局部数据缓存

会按照缓存初始化时候的参数进行缓存数据,也可以在缓存设置的时候改变参数,例如:

// 缓存数据300秒
S(‘name’,$value,300);
甚至改变之前的缓存方式或者更多的参数:

// 采用文件方式缓存数据300秒
S(‘name’,$value,array(‘type’=>’file’,’expire’=>300));
如果你在缓存设置的时候采用上面的数组方式传入参数的话,会影响到后面的缓存存取。

缓存读取
// 读取缓存
$value = S(‘name’);
缓存读取的是前面缓存设置的值,这个值会受缓存初始化或者缓存设置的时候传入的参数影响。 如果缓存标识不存在或者已经过期,则返回false,否则返回缓存值。

缓存删除
// 删除缓存
S(‘name’,null);
删除缓存标识为name的缓存数据。

实战项目部分案例:
方案一:
if(S('Users_index')){
			$arr=S('Users_index');
		}else{
			$arr=$obj->table(C("DB_PREFIX")."users as a")
				->field("a.*,b.groupname")
				->where($tj)
				->join('left JOIN '.C("DB_PREFIX").'users_group as b ON b.id=a.gid')
				->limit($Page->firstRow.','.$Page->listRows)
				->select();
			S('Users_index',$arr,array('type'=>'file','expire'=>10));
		}


或者直接按如下写法:
方案二:推荐使用,效果和方案一一样的,但是写法更简单。
$arr=$obj->table(C("DB_PREFIX")."users as a")
				->field("a.*,b.groupname")
				->where($tj)
				->join('left JOIN '.C("DB_PREFIX").'users_group as b ON b.id=a.gid')
				->limit($Page->firstRow.','.$Page->listRows)
				->cache('Users_index',10)
				->select();

 

提示:生成的文件缓存存储在:App\Runtime\Temp 目录中。

 提示:若同时开启了页面静态缓存和局部数据缓存,则以页面缓存优先!

关注公众号,了解更多it技术(it问答网