Php 退出Smarty手动执行此操作

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

我面临的问题是,如果没有框架或模板引擎,我真的不确定如何开发。我开始用这种方式编码,现在我想讲一些基础知识

我曾经使用这个MVC模式,使用Codeigniter和Smarty作为模板引擎。我现在想做的是使用原始php,而不使用这两种工具

我不知道如何“复制”Smarty的“块”和“扩展”的概念

我曾经定义过一个base.tpl文件,它有html头,只有body标签,还有基本的css和js文件(这些文件总是在站点的每个页面中使用),比如:(snippet)


仪表板
{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__)