在本文中,您将会了解到关于在PHP上使用模板的新资讯,同时我们还将为您解释在php上使用模板的方法的相关在本文中,我们将带你探索在PHP上使用模板的奥秘,分析在php上使用模板的方法的特点,并给出一些
在本文中,您将会了解到关于在PHP上使用模板的新资讯,同时我们还将为您解释在php上使用模板的方法的相关在本文中,我们将带你探索在PHP上使用模板的奥秘,分析在php上使用模板的方法的特点,并给出一些关于CakePHP 在不同的模板上使用模型和控制器、Django 学习系列 7:使用模板解决 “不测试常量” 规则,使用模板重构、Nodejs中如何使用模板引擎?如何使用模板引擎渲染HTML?、PHP View,使用模板的实用技巧。
本文目录一览:- 在PHP上使用模板(在php上使用模板的方法)
- CakePHP 在不同的模板上使用模型和控制器
- Django 学习系列 7:使用模板解决 “不测试常量” 规则,使用模板重构
- Nodejs中如何使用模板引擎?如何使用模板引擎渲染HTML?
- PHP View,使用模板
在PHP上使用模板(在php上使用模板的方法)
<!-- template.PHP --> <?PHP function showheader() { ?> <head><body> <!-- some of style files and menus --> <div> <?PHP } ?> <?PHP function showfooter() { ?> </div></body></html> <?PHP } ?>
我使用这个文件作为这样的模板:
<?PHP include_once("template.PHP"); showheader(); ?> content text or photo or ... etc. <?PHP showfooter(); ?>
这就是全部…但如果我尝试在模板文件上使用连接,那就搞砸了!
我使用了一个外部文件:
<?PHP // // include_once connection file // query strings goes here // do { echo $row_table['id']; //example } while ($row_table = MysqL_fetch_assoc($table)); ?>
我使用这个文件作为include_once(“filename.PHP”);在模板文件上…此时它会出错…就像这个连接变量是什么,这个连接字符串是什么……等等它无法到达连接字符串……
顺便说一句,我使用另一个外部连接,如:
<?PHP global $hostname_conn,$database_conn,$username_conn,$password_conn,$conn; $hostname_conn = "localhost"; $database_conn = "test"; $username_conn = "****"; $password_conn = "****"; $conn = MysqL_pconnect($hostname_conn,$password_conn) or trigger_error(MysqL_error(),E_USER_ERROR); MysqL_query("SET NAMES 'utf8'"); ?>
我要哭了!问题是什么……你知道另一种使用模板的方法吗?
非常感谢…
PS:我将conn.PHP上的变量更改为全局(并且它没有工作),我更改include,include_once,require,require_once,其中我包含文件,但它没有给出任何东西.
解决方法
在获取数据时,不应打印出单个字符.
如果发生某些错误,请显示错误页面.
一旦获得所有数据而没有错误 – 是时候包含模板了.该模板还有两个PHP文件:页面本身的模板以及站点中所有页面共同共享的模板.
通过这种方式对事物进行分类,您将解决所有现在和将来的模板问题.
典型的脚本可能看起来像
<? //include our settings,connect to database etc. include dirname($_SERVER['DOCUMENT_ROOT']).'/cfg/settings.PHP'; //getting required data $DATA=dbgetarr("SELECT * FROM links"); $pagetitle = "Links to friend sites"; //etc //and then call a template: $tpl = "links.PHP"; include "template.PHP"; ?>
其中template.PHP是您的主要网站模板,包括常见部分,如页眉,页脚,菜单等:
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>My site. <?=$pagetitle?></title> </head> <body> <div id="page"> <? include $tpl ?> </div> </body> </html>
和links.PHP是实际的页面模板:
<h2><?=$pagetitle?></h2> <ul> <? foreach($DATA as $row): ?> <li><a href="<?=$row['link']?>" target="_blank"><?=$row['name']?></a></li> <? endforeach ?> <ul>
简单,清洁和可维护.
settings.PHP包含所有常用设置:
<?PHP $hostname_conn,$conn; $hostname_conn = "localhost"; $database_conn = "test"; $username_conn = "****"; $password_conn = "****"; $conn = MysqL_connect($hostname_conn,$password_conn) or trigger_error(MysqL_error(),E_USER_ERROR); MysqL_query("SET NAMES 'utf8'") or trigger_error(MysqL_error(),E_USER_ERROR); $tpl = "default.PHP"; $pagetitle = ""; function dbgetarr(){ $a = array(); $args = func_get_args(); $query = array_shift($args); $query = str_replace("%s","'%s'",$query); foreach ($args as $key => $val) { $args[$key] = MysqL_real_escape_string($val); } $query = vsprintf($query,$args); $res = MysqL_query($query); if (!$res) { trigger_error("dbget: ".MysqL_error()." in ".$query); } else { while($row = MysqL_fetch_assoc($res)) $a[]=$row; } return $a; } ?>
CakePHP 在不同的模板上使用模型和控制器
如何解决CakePHP 在不同的模板上使用模型和控制器?
我已经按照文档创建了表、实体、控制器,然后是显示数据的模板。在我的 /articles 站点上,我现在想显示用户数据。所以我的用户数据将位于 /articles 而不是 /users。
在 /templates/Articles/index.PHP 中,我现在可以使用 $articles
,但不能使用 $users
。
如何在我的页面中使用另一个控制器?
解决方法
我的目标是在发布文章的用户电子邮件中添加一行。
文章控制器.php
public function index(){
$articles = $this->Paginator->paginate($this->Articles->find());
$users = $this->Articles->Users->find('''')->all()->first();
$this->set(''users'',$users);
$this->set(compact(''articles''));
}
我的模板/文章/index.php
<?php foreach ($articles as $article): ?>
<tr>
<td>
<?= $this->Html->link($article->title,[''action'' => ''view'',$article->slug]) ?>
</td>
<td>
a
</td>
<td>
<?php echo $article->$users ?>
</td>
<td>
<?= $this->Html->link(''Edit'',[''action'' => ''edit'',$article->slug]) ?>
</td>
<td>
<?= $this->Form->postLink(
''Delete'',[''action'' => ''delete'',$article->slug],[''confirm'' => ''Are you sure?'']) ?>
</td>
</tr>
<?php endforeach; ?>
我的文章表.php
class ArticlesTable extends Table
{
public function initialize(array $config): void
{
$this->addBehavior(''Timestamp'');
$this->belongsToMany(''Tags'');
$this->hasOne(''Users'');
}
public function beforeSave(EventInterface $event,$entity,$options)
{
if ($entity->isNew() && !$entity->slug) {
$sluggedTitle = Text::slug($entity->title);
// trim slug to maximum length defined in schema
$entity->slug = substr($sluggedTitle,191);
}
}
}
Django 学习系列 7:使用模板解决 “不测试常量” 规则,使用模板重构
之前写的 lists/tests.py 中的单元测试,要查找特定的 HTML 字符串,但这不是测试 HTML 的高效方法。
单元测试规则之一 “不测试常量”,编写断言检测 HTML 字符串中是否有制定的字符串序列,不是单元测试应该做的。
单元测试要测试的其实时逻辑,流程控制和配置。
Python 代码中插入原始字符串不是处理 HTML 的正确方式,我们有更好的方式,就是使用模板。把 HTML 放在一个扩展名为.html 的文件中。
让视图函数返回一样的 HTML,但使用不同的处理方式,这个过程叫重构,即在功能不变的前提下改进代码。重构的首要原则时不能没有测试,检查一下测试是否通过,测试通过才能保证前后的表现一致。
$ python manage.py test
[...]
OK
把 HTML 字符串提取出来写入单独的文件,新建用于保存模板的文件夹 lists/templates, 然后新建文件 lists/templates/home.html
<html>
<title>To-Do lists</title>
</html>
高亮显示,漂亮多了
修改视图函数 lists/views.py
from django.shortcuts import render
# Create your views here.在这儿编写视图
def home_page(request):
return render(request, ''home.html'') # render函数中第一个参数是请求对象的,第二个参数是渲染的模板名
现在不构建 HttpResponse 对象了,转而使用 Django 中的 render 函数。Django 会自动在所有的应用目录中搜索名为 templates 的文件夹,然后根据模板中的内容构建一个 HttpResponse 对象
单元测试
python manage.py test
======================================================================
ERROR: test_home_page_returns_correct_html (lists.tests.HomePageTest) # 1
----------------------------------------------------------------------
Traceback (most recent call last):
File "/studydisk/Python_web_TDD/django1x/subperlists/lists/tests.py", line 19, in test_home_page_returns_correct_html
response = home_page(request) # 2
File "/studydisk/Python_web_TDD/django1x/subperlists/lists/views.py", line 5, in home_page
return render(request, ''home.html'') # 3
File "/root/anaconda3/envs/django1.0/lib/python3.5/site-packages/django/shortcuts.py", line 30, in render
content = loader.render_to_string(template_name, context, request, using=using)
File "/root/anaconda3/envs/django1.0/lib/python3.5/site-packages/django/template/loader.py", line 67, in render_to_string
template = get_template(template_name, using=using)
File "/root/anaconda3/envs/django1.0/lib/python3.5/site-packages/django/template/loader.py", line 25, in get_template
raise TemplateDoesNotExist(template_name, chain=chain)
django.template.exceptions.TemplateDoesNotExist: home.html # 4
----------------------------------------------------------------------
Ran 2 tests in 0.103s
FAILED (errors=1)
Destroying test database for alias ''default''...
分析错误
1、先看错误是什么测试无法找到模板(#4)
2、确认是哪个测试失败,显然时测试视图 HTML 的测试(#1)
3、找到导致失败的是测试中哪一行:调用 home_page 函数那行(# 2)
4、在应用的代码中找到导致失败的部分:调用 render 函数那段(#3)
为什么 Django 找不到模板呢?模板的确是在 lists/templates 文件夹中。
原因是还没有正式在 Django 中注册 lists 应用,执行 startapp 命令以及在项目文件夹中存放一个应用还不够,要告诉 Django 确实要开发一个应用,并把这个应用添加到文件 settings.py 中,这样才能保证。
打开 setting.py,找到变量 INSTALLED_APPS,把 lists 加进去。
INSTALLED_APPS = [
''django.contrib.admin'',
''django.contrib.auth'',
''django.contrib.contenttypes'',
''django.contrib.sessions'',
''django.contrib.messages'',
''django.contrib.staticfiles'',
''lists'',
]
再次运行测试
$ python manage.py test
[...]
OK
Nodejs中如何使用模板引擎?如何使用模板引擎渲染HTML?
本篇文章给大家介绍一下浏览器中使用模板引擎的方法、Node中使用模板引擎的方法,以及通过案例聊聊使用模板引擎渲染HTML的方法。【推荐学习:《nodejs 教程》】
使用readdir获取指定路径下的所有文件名
文件结构
实现代码
const fs = require('fs'); fs.readdir('G:/pink_code/Node_Study/02',(err,list) => { if (!err) { console.log(list); } })
代码输出
[ '01_http-helloWorld.js', '02_使用readdir获取指定路径下的所有文件名.js', 'www' ]
在浏览器中使用模板引擎
1. 安装art-template
npm install art-template
2. 通过script标签引入art-template
<script src=./node_modules/art-template/lib/template-web.js></script>
3. 使用模板引擎语法进行调用
<script src=./node_modules/art-template/lib/template-web.js></script> <script type='text/template' id = 'tpl'> 这是{{name}} </script> <script> const test = template('tpl',{ name: 'China' }); console.log(test); </script>
在Node中使用模板引擎
1. 安装art-template
npm install art-template
2. 在需要使用模板引擎的模块中加载art-template
3. 查文档,使用模板引擎的API
在Node中使用模板引擎的一个小案例
const template = require('art-template'); const test = template.render('hello {{name}}',{ name: 'NodeJs' }) console.log(test);
输出结果
hello NodeJs
一个使用模板引擎渲染HTML的小案例
HTML结构
<html dir=ltr> <head> <Meta charset=utf-8> <Meta name=google value=notranslate> <style> h1 { border-bottom: 1px solid #c0c0c0; margin-bottom: 10px; padding-bottom: 10px; white-space: Nowrap; } table { border-collapse: collapse; } th { cursor: pointer; } td.detailsColumn { -webkit-padding-start: 2em; text-align: end; white-space: Nowrap; } a.icon { -webkit-padding-start: 1.5em; text-decoration: none; user-select: auto; } a.icon:hover { text-decoration: underline; } a.file { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMAAAAAAABupgeRAAABHUlEQVR42o2RMW7DIBiF3498iHRJD5JKHurL+CRVBp+i2T16tTynF2gO0KSb5ZrBBl4HHDBuK/WXACH4eO9/CAAAbdvijzLGNE1TVZXfZuHg6XCAQESAZXbOKaXO57eiKG6ft9PrKQIkCQqFoIiQFBGlFIB5nvM8t9aOX2Nd18oDzjnPgCdpn/BH4zh2XZdlWVmWiUK4IgCBoFMUz9eP6zRN75cLgEQhcmTQIbl72O0f9865qLAAsURAAgKBJKEtgLXWvyjLuFsThCsstb8rBCaAQhDYWgIZ7myM+TUBjDHrHlZcbMYYk34cN0YSLcgS+wL0fe9TXDMbY33fR2AYBvyQ8L0Gk8MwREBrTfKe4TpTzwhArXWi8HI84h/1DfwI5mhxJamFAAAAAElFTkSuQmCC ) left top no-repeat; } a.dir { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAd5JREFUeNqMU79rFUEQ/vbuodFEEkzaimBpkUabFP4ldpaJhZXYm/RiZWsv/hkWFglBUyTIgyAIIfgIRjHv3r39MePM7N3LcbxAFvZ2b2bn22/mm3XMjF+HL3YW7q28YSIw8mBKoBihhhgCsoORot9d3/ywg3YowMXwNde/PzGnk2vn6PitrT+/PGeNaecg4+qNY3D43vy16A5wDDd4Aqg/ngmrjl/GoN0U5V1QquHQG3q+TPDVhVwyBffcmQGJmSVfyZk7R3SngI4JKfwDJ2+05zIg8gbiereTZRHhJ5KCMOwDFLjhoBTn2g0ghagfKeIYJDPFyibJVBtTREwq60SpYvh5++PpwatHsxSm9QRLSQpEVSd7/TYJUb49TX7gztpjjEffnoVw66+Ytovs14Yp7HaKmUXeX9rKUoMoLNW3srqI5fWn8JejrVkK0QcrkFLOgS39yoKUQe292WJ1guUHG8K2o8K00oO1BTvXoW4yasclUTgZYJY9aFNfAThX5CZRmczAV52oAPoupHhWRIUUAOoyUIlYVaAa/VbLbyiZUiyFbjQFNwiZQSGl4IDy9sO5Wrty0QLKhdZPxmgGcDo8ejn+c/6eiK9poz15Kw7Dr/vN/z6W7q++091/AQYA5mZ8GYJ9K0AAAAAASUVORK5CYII= ) left top no-repeat; } a.up { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmlJREFUeNpsU0toU0EUPfPysx/tTxuDH9SCWhUDooIbd7oRUUTMouqi2iIoCO6lceHWhegy4EJFinWjrlQUpVm0IIoFpVDEIthm0dpikpf3ZuZ6Z94nrXhhMjM3c8895977BBHB2PznK8WPtDgyWH5q77cPH8PpdXuhpQT4ifR9u5sfJb1bmw6VivahATDrxcRZ2njfoaMv+2j7mLDn93MPiNRMvGbL18L9IpF8h9/TN+EYkMffSiOXJ5+hkD+PdqcLpICWHOHc2CC+LEyA/K+cKQMnlQHJX8wqYG3MAJy88Wa4OLDvEqAEOpJd0LxHIMdHBziowSwVlF8D6QaicK01krw/JynwcKoEwZczewroTvZirlKJs5CqQ5CG8pb57FnJUA0LYCXMX5fibd+p8LWDDemcPZbzQyjvH+Ki1TlIciElA7ghwLKV4kRZstt2sANWRjYTAGzuP2hXZFpJ/GsxgGJ0ox1aoFWsDXyyxqCs26+ydmagFN/rRjymJ1898bzGzmQE0HCZpmk5A0RFIv8Pn0WYPsiu6t/Rsj6PauVTwffTSzGAGZhUG2F06hEc9ibS7OPMNp6ErYFlKavo7MkhmTqCxZ/jwzGA9Hx82H2BZSw1NTN9Gx8ycHkajU/7M+jInsDC7DiaEmo1bNl1AMr9ASFgqVu9MCTIzoGUimXVAnnaN0PdBBDCCYbEtMk6wkpQwIG0sn0PQIUF4GsTwLSIFKNqF6DVrQq+IWVrQDxAYQC/1SsYOI4pOxKZrfifiUSbDUisif7XlpGIPufXd/uvdvZm760M0no1FZcnrzUdjw7au3vu/BVgAFLXeuTxhTXVAAAAAElFTkSuQmCC ) left top no-repeat; } html[dir=rtl] a { background-position-x: right; } #parentDirLinkBox { margin-bottom: 10px; padding-bottom: 10px; } #listingParsingErrorBox { border: 1px solid black; background: #fae691; padding: 10px; display: none; } </style> <title id=title>C:\Users\HP\Desktop\共享文件\ 的索引</title> </head> <body> <div id=listingParsingErrorBox>糟糕!Google Chrome无法解读服务器所发送的数据。请<a href=http://code.google.com/p/chromium/issues/entry>报告错误</a>,并附上<a href=LOCATION>原始列表</a>。</div> <h1 id=header>C:\Users\HP\Desktop\共享文件\ 的索引</h1> <div id=parentDirLinkBox style=display: block;> <a id=parentDirLink class=icon up href=/C:/Users/HP/Desktop/%E5%85%B1%E4%BA%AB%E6%96%87%E4%BB%B6/..> <span id=parentDirText>[上级目录]</span> </a> </div> <table> <thead> <tr id=theader> <th id=nameColumnHeader tabindex=0 role=button>名称</th> <th id=sizeColumnHeader tabindex=0 role=button> 大小 </th> <th id=dateColumnHeader tabindex=0 role=button> 修改日期 </th> </tr> </thead> <tbody id=tbody> {{each files}} <tr> <td data-value={{$value}}><a class=icon file draggable=true href={{$value}}>{{$value}}</a> </td> <td data-value=193955>189 kB</td> <td data-value=1627464963>2021/7/28 下午5:36:03</td> </tr> {{/each}} </tbody> </table> </body> </html>
Node代码
const http = require('http'); const template = require('art-template'); const fs = require('fs'); const server = http.createServer(); server.on('request', (req, res) => { const url = req.url; // 文件路径 const filePath = 'G:/pink_code/Node_Study/02'; // 获取文件路径下所有的文件名 let listName; fs.readdir(filePath, (err, list) => { if (!err) { listName = list; } }) // 读取模板文件内容 fs.readFile('./www/template.html', (err, data) => { if (!err) { data = data.toString(); test = template.render(data,{ files: listName }) res.end(test); } else { console.log('读取文件出错', err); } }); }) // 监听3000端口 server.listen(3000, (err) => { if (!err) { console.log('服务器启动成功!'); } })
实现效果
更多编程相关知识,请访问:编程入门!!
PHP View,使用模板
好吧,我的问题很简单,但是很难接受该解决方案,但是无论如何..接下来,我有一个“微型框架”,可以编写单个方案,对我有很大帮助,可以加速但是,在某种程度上,问题仍然存在,在某种程度上,使用模板方案非常容易,也非常有趣,因为当您必须更改与可视化相关的任何内容时,模板只会更改,但是,及时渲染此模板,这是最好的方法?我目前正以这种方式工作:
<?PHP
class View {
private $vars;
public function __get ( $var ) {
if ( isset( $this->vars [ $var ] ) ) {
return $this->vars[ $var ];
}
}
public function assign ( $var , $value ) {
$this->vars [ $var ] = $value;
}
public function show ( $template ) {
include_once sprintf ( "%s\Templates\%s" , __DIR__ , $template ) ;
}
}
它不是完整的代码,我正在构建结构并正在审查该方案,因此我要执行以下操作..
<?PHP
require_once 'MVC/Views/View.PHP';
$View = new View ( ) ;
$View->assign( 'title' , 'MVC, View Layer' ) ;
$View->show ( 'test.phtml' );
和模板
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<Meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title><?PHP echo $this->title ?></title>
</head>
<body>
</body>
</html>
输出是正确的,所有工作都按预期进行,但是我的问题是:这是最好的方法吗?包括文件并让剧本解释用.phtml编写的代码
解决方法:
在许多框架中,我都看到了这种说法:
public function show ( $template ) {
ob_start();
require sprintf ( "%s\Templates\%s" , __DIR__ , $template ) ;
return ob_get_flush();
}
使用输出缓冲区,可以使模板评估为字符串,而不是直接在输出中发送模板.当您需要在评估模板后更改标题或进行后处理时,这可能会派上用场.
使用require代替include_once可以使您多次渲染同一模板(例如,如果您想要某种模板组合),并且在找不到模板文件时出错(include不会给出错误)情况).
我们今天的关于在PHP上使用模板和在php上使用模板的方法的分享已经告一段落,感谢您的关注,如果您想了解更多关于CakePHP 在不同的模板上使用模型和控制器、Django 学习系列 7:使用模板解决 “不测试常量” 规则,使用模板重构、Nodejs中如何使用模板引擎?如何使用模板引擎渲染HTML?、PHP View,使用模板的相关信息,请在本站查询。
本文标签: