扫一扫浏览

模板文件取内容的几种方式,以及它们的优势、劣势

未结贴
1 458
yaosean未认证 2018-12-27 11:47:05
收藏

tpframe或其它框架的时候,你们都是用什么方式来取内容的呢?每种框架的模式多少有点区别,下面我简单介绍一下几种在模板显示内容的几种方式

第一种:直接连接数据库读取模式

我们常见的就是php原生模式,直接在.php文件里面写html代码,连接数据库取内容,然后进行相应的数据显示,类似于这样的:

<?php
$db = array(
    'host' => '127.0.0.1',         //设置服务器地址
    'port' => '3306',              //设端口 
    'dbname' => 'test',             //设置数据库名      
    'username' => 'root',           //设置账号
    'password' => 'root',      //设置密码
    'charset' => 'utf8',             //设置编码格式
    'dsn' => 'mysql:host=127.0.0.1;dbname=test;port=3306;charset=utf8',   //这里不知道为什么,也需要这样再写一遍。
);
//连接
$options = array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 		//默认是PDO::ERRMODE_SILENT, 0, (忽略错误模式)
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 	// 默认是PDO::FETCH_BOTH, 4
);
try{
    $pdo = new PDO($db['dsn'], $db['username'], $db['password'], $options);
}catch(PDOException $e){
    die('数据库连接失败:' . $e->getMessage());
}
$stmt = $pdo->prepare("select * from posts where title = ?");
$stmt->bindValue(1,'zhangsan');
$stmt->execute();  //执行一条预处理语句 .成功时返回 TRUE, 失败时返回 FALSE 
$rows = $stmt->fetchAll();
?>
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
<?php
foreach ($rows as $key => $value) {
	// 这里面进行处理
}
?>
</body>
</html>
<?php
unset($pdo);
?>

这样的方式运行效率无疑肯定是非常好的,但有非常多的不足,缺占谁用谁知道,我就不在这里说了,因为就有了框架这个玩意

第二种:MVC正常模式

我所谓的MVC正常模式就是指每个MVC框架默认呈现的方式,model取数据,controller转发数据,view显示数据

我想你可能经常使用的就是这种方式,也是大部分人在喜欢用的方式,针对这种我就提一个问题,对于每个页面或大部分页面都要用到的数据,你是怎么处理的呢?

曾经有人给我说每个控制器都去调模型取,是的,没问题,这样不是每个控制器都写了大量的重复代码了吗,因此很多框架采用的方式是用的公共函数,定义一个公共函数实现相应的功能,然后在模板里面直接调用函数,这种方式要比写在控制器里面科学一点

但有些人就问了,我不想写函数,太low了,一定要写类怎么办或其它方式怎么办,接下来的两种方式就可以实现

第三种:模板标签

用过dedecms的人都知道模板标签的好处,在相关的模板调用相应的模板标签就能随便取到我想要的数据,是不是很方便呢,tpframe也定义了这样的模板标签,通过{tpf:posts num='1'}{/tpf:posts} 就能取到一条内容,具体源码可以看tpfcore\taglib\Tpf.php

这样你在模板里面想显示想要的内容的时候,就可以直接通过模板标签来获取,任何地方都可以调取,不限模板位置

第四种:模板从逻辑里直接拉取

这种模式就是在模板里面直接取数据,跟第一种模式类似,只是这种只数据相关的逻辑独立了出去,达到模板不通过控制器转发就能取数据的目的,同时逻辑也得到了共用(多个模板都要取相应的数据情况),所以这也是我比较喜欢的一种模式,tpframe就实现了这样的模式,例如取文章,所先我们要定义好相应的取文章逻辑功能,例如在 app\frontend\logic\Posts里定义如下逻辑:

public function getPosts($data=[]){
	return self::getList($data);
}

这里只是举例说明一下,实际情况你可以写得更灵活

接着在你的模板里面就可以像这样来调用这个逻辑

<ul class="list-unstyled">
    {volist name=':Core::loadAction("Posts/getTpfPosts",["data"=>["where"=>["isdelete"=>0,"type"=>1],"field"=>"__POSTS__.id,__POSTS__.title,__POSTS__.updatetime,__POSTS__.author,__POSTS__.source,__POSTS__.view,__POSTS__.reply,__USER__.headimg","join"=>["join"=>"__USER__","condition"=>"__POSTS__.uid=__USER__.id"],"order"=>"updatetime DESC","limit"=>10]])' id="vo"}
    <li>
        <p class="clearfix">
            <a href="{:url('Posts/show',['id'=>$vo.id])}" class="pull-left" target="_blank">{$vo.title|StringHelper::msubstr=0,36}</a>
            <span class="text-muted pull-right">{$vo.updatetime|date='m-d H:i',###}</span>
        </p>
    </li>
    {/volist}
</ul>

看上去有点复杂,实际上很简单,用的是模型里面灵活的getList方法来获取数据,里面用到了Core里面的loadAction方法来直接调用逻辑,参数data表示直接向逻辑方法的参数data传递参数,里面的参数就是取数据要用到的

这种方式是最灵活的,类似于标签去取数据,只是这种我们少了运用标签的那一步,比标签更灵活

后面三种方式在tpframe框架里面都是可以运用的,根据习惯你可以选择当中的一种,如果你有更好的方法或建议可给我们留言~,先介绍在这里

文章由tpframe社区发布,禁止转载,谢谢合作

  • 打豆豆 打豆豆 133
    2018-12-28 16:10:37

    学习了,希望出更多的干货

    回复
最近热帖 HOT TOPIC
【全套视频】thinkphp5视频教程 1264
thinkphp5隐藏默认模块的一些问题 1151
TPFrame框架robot模块重磅来袭,内附2.1版本 1078
教你如果处理高并发数据不同步的问题php篇 1077
tpframe安装教程 1067
tpframe新建主题 1015
slide模块发布 1005
tpframe应用目录结构 1001
thinkphp5自动完成操作,两次运行的详解 982
TPFrame 2.1 beta版本正式发布,全部插件式开发到来 939
月度热议HOT COMMENTS
tpframe 后续版本你希望有的功能是什么(分享贴) 12
关于tpframe的一点话题 6
cms插件在分类排序的时候JSON错误 6
新增的管理员没有权限操作CMS模块。 3
api接口文档插件easydoc的基本用法,快速搞定接口文档 3
thinkphp5自动完成操作,两次运行的详解 2
tpframe-curd操作之添加数据 2
tpframe能带给你的,让你快速搞定各服务端(api,pc,mobile,wechat)代码的框架 2
slide模块发布 2
透析thinkphp5升级版开发框架tpframe 2
爆料早知道:又拍云存储插件上线我有好想法