跟老姚学前端,课程体系更完善,10%基础 + 90%实战演练,快人一步学编程

扫一扫浏览

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

未结贴
1 4620
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视频教程 87205
父元素flex之后,子元素高度自适应问题 10976
一张纸的厚度是0.01毫米,则该纸对折30次后是多厚(据说超过珠穆朗玛峰的高度)php实现 10055
thinkphp5隐藏默认模块的一些问题 9527
api接口文档插件easydoc的基本用法,快速搞定接口文档 9480
omnicore rpc api中文手册【usdt】 9306
PHP如何判断字符串是否为json格式 9221
教你如果处理高并发数据不同步的问题php篇 9065
关于thinkphp5.0.x getshell漏洞的说明 8881
使用宝塔linux面板创建FTP无法连接的解决办法(阿里云或腾讯云) 8764
月度热议HOT COMMENTS
【全套视频】thinkphp5视频教程 71
tpframe 后续版本你希望有的功能是什么(分享贴) 12
权限那里怎么一登录别的账号就报错啊 9
关于tpframe的一点话题 6
cms插件在分类排序的时候JSON错误 6
基于tpframe v3.x 的微信公众号插件已批量上线 5
tpframe插件tcms插件v2.2已发布上线,欢迎下载使用 5
tpframe6.0马上就要跟大家见面了,一次全新的升级 5
透析thinkphp5升级版开发框架tpframe 3
新增的管理员没有权限操作CMS模块。 3
爆料早知道: