GVKun编程网logo

在PHP上使用模板(在php上使用模板的方法)

16

在本文中,您将会了解到关于在PHP上使用模板的新资讯,同时我们还将为您解释在php上使用模板的方法的相关在本文中,我们将带你探索在PHP上使用模板的奥秘,分析在php上使用模板的方法的特点,并给出一些

在本文中,您将会了解到关于在PHP上使用模板的新资讯,同时我们还将为您解释在php上使用模板的方法的相关在本文中,我们将带你探索在PHP上使用模板的奥秘,分析在php上使用模板的方法的特点,并给出一些关于CakePHP 在不同的模板上使用模型和控制器、Django 学习系列 7:使用模板解决 “不测试常量” 规则,使用模板重构、Nodejs中如何使用模板引擎?如何使用模板引擎渲染HTML?、PHP View,使用模板的实用技巧。

本文目录一览:

在PHP上使用模板(在php上使用模板的方法)

在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文件:(1)第一个获取数据,(2)第二个显示数据.

在获取数据时,不应打印出单个字符.
如果发生某些错误,请显示错误页面.

一旦获得所有数据而没有错误 – 是时候包含模板了.该模板还有两个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 在不同的模板上使用模型和控制器

如何解决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:使用模板解决 “不测试常量” 规则,使用模板重构

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?

Nodejs中如何使用模板引擎?如何使用模板引擎渲染HTML?

本篇文章给大家介绍一下浏览器中使用模板引擎的方法、Node中使用模板引擎的方法,以及通过案例聊聊使用模板引擎渲染HTML的方法。

【推荐学习:《nodejs 教程》】

使用readdir获取指定路径下的所有文件名

文件结构

1.png

实现代码

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('服务器启动成功!');
    }
})

实现效果

2.png

更多编程相关知识,请访问:编程入门!!

PHP View,使用模板

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,使用模板的相关信息,请在本站查询。

本文标签: