Выход из Smarty, чтобы сделать это вручную

Я сталкиваюсь с проблемой, что я не совсем уверен, как разрабатывать без фреймворка или шаблонизатора. Я начал программировать таким образом, и теперь я хочу перейти к основам.

Раньше я работал с этой схемой MVC, используя Codeigniter и Smarty в качестве движка шаблонов. То, что я хочу сделать сейчас, это использовать сырой php без обоих упомянутых инструментов.

Я не знаю, как «скопировать» концепцию «блока» и «расширяет» Смарти.

Я использовал для определения файла base.tpl с заголовком html, только тегом body и файлами base css и js (которые всегда используются на каждой странице сайта), например: (фрагмент)

 <!DOCTYPE html>
<head>
<meta charset="utf-8" />
<title>Dashboard</title>
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport" />
<meta content="" name="description" />
<meta content="" name="author" />

<!-- ================== BEGIN BASE CSS STYLE ================== -->
<link href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet">
<link href="{site_url()}assets/css/animate.min.css" rel="stylesheet" />
<!-- ================== END BASE CSS STYLE ================== -->

<!-- ================== BEGIN PAGE LEVEL CSS STYLE ================== -->
{block name='custom_css'}{/block}
<!-- ================== END PAGE LEVEL CSS STYLE ================== -->

<!-- ================== BEGIN BASE JS ================== -->
<script src="{site_url()}assets/plugins/pace/pace.min.js"></script>
<!-- ================== END BASE JS ================== -->
</head>
<body>
<div id="page-container" class="fade page-sidebar-fixed page-header-fixed">
<div id="header" class="header navbar navbar-default navbar-fixed-top">
<div class="container-fluid">
{include file='base/header.tpl'}
</div>
</div>
<!-- BEGIN PAGE -->
<div class="page-content">
<!-- BEGIN PAGE CONTAINER-->
<div class="container-fluid">
<!-- BEGIN PAGE HEADER-->
<div class="row-fluid">
<div class="span12">
<!-- BEGIN PAGE TITLE & BREADCRUMB-->
{include file='admin/base/breadcrumb.tpl'}
<!-- END PAGE TITLE & BREADCRUMB-->
</div>
</div>
<!-- END PAGE HEADER-->
{block name='content'}{/block}
</div>
<!-- END PAGE CONTAINER-->
</div>
<!-- END PAGE -->

и затем, когда мне нужно вызвать этот 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>

Я искал, но боюсь, что мне не хватает нужных слов для поиска, потому что я не нахожу ответы.

Я хотел бы руководствоваться, пожалуйста!

13

Решение

Другим способом может быть сделать что-то подобное. Я чувствую, что это, вероятно, ближе к тому, чем заканчивается механизм шаблонов, но с использованием вместо этого синтаксиса {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';

page.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
});

template.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>
1

Другие решения

Я не уверен, насколько умный это делает, и фактически никогда сам не использовал шаблонизатор. Но, может быть, это может быть, как это сделано.

Скажем, у нас есть:

index.php
page.php
template.php

Когда мы идем к index.php, он может запускать и выводить буфер и включать page.php. После включения захватывает выходной буфер и использует некоторые регулярные выражения для сопоставления и найденные в нем блоки и помещает их в переменные.

Теперь сделайте то же самое для template.php, найдите там все блоки и замените блоки на блоки, найденные в page.php.

Я не думаю, что именно так движки шаблонистов делают это. Но это один из возможных способов.

0

Очень маленький самодельный шаблонизатор
на основе регулярного выражения заменить с помощью хука массива
«вручную» разбирать шаблоны

(но я допускаю, что 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>

часть тела

    <body>
<div class='ui'>{username}</div>
</body>

использование

    <?php
// include engine function
define("TEMPLATE_DIR", __DIR__."templates/");
require_once("library/parse.php");

// just init $vars on top of index
$vars = [];

// and access and fill it anywhere
$vars = ["username" => $_SESSION["user"]];

// prepare the body including previous $vars declarations
$vars["body"] = parse($vars, 'body');

echo parse($vars, 'index');

Выход

    <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__

используемый в моем коде действителен для PHP> = 5.3.0 попробуйте
но вы можете использовать

dirname(__FILE__)

Для PHP < 5.3.0 попробуй

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector