Php 退出Smarty手动执行此操作
我面临的问题是,如果没有框架或模板引擎,我真的不确定如何开发。我开始用这种方式编码,现在我想讲一些基础知识 我曾经使用这个MVC模式,使用Codeigniter和Smarty作为模板引擎。我现在想做的是使用原始php,而不使用这两种工具 我不知道如何“复制”Smarty的“块”和“扩展”的概念 我曾经定义过一个base.tpl文件,它有html头,只有body标签,还有基本的css和js文件(这些文件总是在站点的每个页面中使用),比如:(snippet)Php 退出Smarty手动执行此操作,php,html,include,smarty,extends,Php,Html,Include,Smarty,Extends,我面临的问题是,如果没有框架或模板引擎,我真的不确定如何开发。我开始用这种方式编码,现在我想讲一些基础知识 我曾经使用这个MVC模式,使用Codeigniter和Smarty作为模板引擎。我现在想做的是使用原始php,而不使用这两种工具 我不知道如何“复制”Smarty的“块”和“扩展”的概念 我曾经定义过一个base.tpl文件,它有html头,只有body标签,还有基本的css和js文件(这些文件总是在站点的每个页面中使用),比如:(snippet) 仪表板 {block name='cu
仪表板
{block name='custom_css'}{/block}
{include file='base/header.tpl'}
{include file='admin/base/breadcrumb.tpl'}
{block name='content'}{/block}
然后当我需要给这个base.tpl打电话时,我做了这样的事情:
{extends file='base/base.tpl'}
{block name='custom_css}
<link href="{site_url()}assets/css/pages/blog.css" rel="stylesheet" type="text/css"/>
{/block}
{block name='content'}
<div class="row">
<div class="col-md-3 col-sm-6">
<div class="widget widget-stats bg-green">
<div class="stats-icon stats-icon-lg"><i class="fa fa-globe fa-fw"></i></div>
<div class="stats-title">TODAY'S VISITS</div>
<div class="stats-number">7,842,900</div>
<div class="stats-progress progress">
<div class="progress-bar" style="width: 70.1%;"></div>
</div>
<div class="stats-desc">Better than last week (70.1%)</div>
</div>
</div>
{extends file='base/base.tpl'}
{block name='custom_css}
{/block}
{block name='content'}
今天的访问
7,842,900
比上周好(70.1%)
我一直在寻找,但我很震惊,我找不到合适的词,因为我找不到答案
请引导我 我不确定smarty是如何做到这一点的,实际上我自己也从未使用过模板引擎。但可能就是这样 假设我们有:
index.php
page.php
template.php
当我们转到index.php时,它可以启动并输出缓冲区,并包括page.php。在include之后,捕获输出缓冲区并使用一些正则表达式来匹配在其中找到的和块,并将它们放入变量中
现在对template.php执行同样的操作,并在其中找到所有块,然后用page.php中找到的块替换这些块
我并不认为模板引擎就是这样做的。但这是一种可能的方法 另一种方法是这样做。我觉得这可能更接近模板引擎的最终结果,但是使用了{block}语法 index.php
<?php
$blocks = array();
function add_block($name, $callback){
global $blocks;
ob_start();
$callback();
$output = ob_get_flush();
$blocks[$name] = $output;
}
function get_block($name){
global $blocks;
if(!empty($blocks[$name])){
return $blocks[$name];
}
return '';
}
//stop any errors from being output.
ob_start();
//include the page code
include 'page.php';
$cleanup = ob_end_clean();
//now output the template
include 'template.php';
<?php
add_block('head', function(){
?><script type="text/javascript">/* Some JS */</script><?php
});
add_block('body', function(){
?><p>Some body text goes here</p><?php
});
<html>
<head>
<title>Site Title</title>
<?php echo get_block('head'); ?>
</head>
<body>
<?php echo get_block('body'); ?>
</body>
<?php echo get_block('after_body'); ?>
</html>
一个非常小的自制模板引擎 基于正则表达式,使用数组挂钩替换 “手动”解析模板的步骤 (但我承认,smarty更实用) 任何问题,请在这里回答我 正则表达式匹配整个文件的项,如{term-}, 并将其替换为一个php条件,该条件将在渲染时执行 如果在$vars中找不到“标记”,它将被一个空字符串替换 引擎
function parse($vars, $tpl)
{
return preg_replace
(
'#\{([a-z0-9\-_]*?)\}#Ssie',
'( ( isset($vars[\'\1\']) )
? $vars[\'\1\']
: \'\'
);',
file_get_contents(TEMPLATE_DIR.$tpl)
);
}
部分索引
<html>
<head>...</head>
{body}
</html>
要使用常量,可以使用“按如下方式执行”:
$empty = (DEBUG) ? "_EMPTY_" : "";
return preg_replace
(
'#\{([a-z0-9\-_]*?)\}#Ssie',
'( ( isset($vars[\'\1\']) )
? $vars[\'\1\']
: ( defined(\'_\'.strtoupper(\'\1\').\'_\')
? constant(\'_\'.strtoupper(\'\1\').\'_\')
: $empty
)
);',
$out
);
注:
__DIR__
在我的代码中使用的PHP>=5.3.0是有效的,请尝试
但是你可以用
dirname(__FILE__)
对于PHP<5.3.0,请尝试如果wrappingI很抱歉我没有遵循这个回音,那么这只是一些问题。上面所做的一切(取第一个块)是根据标准
name='custom_css'
确定在页面上回音什么,所以它只不过是如果($name='custom_css'){echo'some css here';}
@Limon对你得到的所有答案给予一些反馈怎么样?已经一个月了。你尝试了什么?
<html>
<head>...</head>
<body>
<div class='ui'>Stack Overflow :)</div>
</body>
</html>
$out = file_get_contents(TEMPLATE_DIR.$tpl);
$out = str_replace("{{}}", "{}", $out);
$empty = (DEBUG) ? "_EMPTY_" : "";
return preg_replace
(
'#\{([a-z0-9\-_]*?)\}#Ssie',
'( ( isset($vars[\'\1\']) )
? $vars[\'\1\']
: ( defined(\'_\'.strtoupper(\'\1\').\'_\')
? constant(\'_\'.strtoupper(\'\1\').\'_\')
: $empty
)
);',
$out
);
__DIR__
dirname(__FILE__)