Создание собственного шаблона PHP - PullRequest
1 голос
/ 12 апреля 2011

Я создал собственную систему шаблонов PHP, и то, как я ее создал, кажется неэффективным. Тремя основными целями для моего шаблона было:

  1. Извлечение всех элементов HTML всего сайта из файла template.tpl.
  2. Уметь динамически назначать контент в template.tpl (например, <title> или <script>)
  3. Будьте максимально эффективными и масштабируемыми.

В итоге моя система шаблонов выглядела примерно так:

randomPage.php

<?php
// declare any page specific resources
$pageTitle = "Random Sub-Title";
$pageResources = "/css/someRandomCSS.css"
$pageContent = "/randomPage.tpl"
// include the generic page template
include dirname($_SERVER['DOCUMENT_ROOT']).'/includes/template.tpl'
?>

randomPage.tpl

<h1><?=$pageTitle?></h1>
<p>Some random page's content</p>

template.tpl

<!DOCTYPE html>
<html lang="en">
<head>
   <title>My Site -- <?=$pageTitle?></title>
   <link href="/css/styles.css" rel="stylesheet" type="text/css">
   <link href="<?=pageResources?>" rel="stylesheet" type="text/css">
</head>
<body>
   <? include $pageContent ?>
</body>
</html>

Основная проблема этой системы заключается в том, что для каждой веб-страницы мне нужно управлять двумя файлами: один для логики / данных, а другой для шаблона страницы. Это кажется мне в значительной степени неэффективным и не похоже на очень масштабируемый подход.

Недавно я наткнулся на интеллектуальную среду, которая позволила бы мне объединить мою систему из randomPage.php и randomPage.tpl в нечто вроде:

randomSmartyPage.php

{extends file="template.tpl"}
{block name=pageTitle}My Page Title{/block}
{block name=pageResources}
   <link href="/css/someRandomCSS.css" rel="stylesheet" text="text/css">
{/block}
{block name=pageContent}My HTML Page Body goes here{/block}

Увидев этот подход, я поднял три главных вопроса:

  1. Есть ли какие-то фундаментальные недостатки в том, как я подхожу к моей системе шаблонов?
  2. Можно ли изменить исходный код php, чтобы мне не приходилось создавать два файла для каждой веб-страницы?
  3. Было бы неплохо в этом случае использовать smarty (или, возможно, альтернативную платформу)?

Ответы [ 2 ]

8 голосов
/ 12 апреля 2011
  1. Ваш код на самом деле не использует никаких шаблонизаторов, кроме самого PHP, что нормально. Недостаток, который я вижу, это то, что ваш шаблон будет иметь доступ ко всем переменным, и те, которые вы для него создадите, будут глобальными.
  2. Два файла - это хорошая система: один для изменения того, что предварительно обрабатывается и передается в представление, а другой для самого представления, содержащий HTML или что-то еще. Это позволяет легко менять представления, например, представление для стандартного просмотра и представление для мобильного браузера для мобильных устройств.
  3. Это может быть хорошей идеей, но я твердо убежден, что с использованием PHP достаточно хорошо.

Вот пример, не проверенный. Он будет инкапсулировать все переменные, чтобы вы не загрязняли глобальное пространство имен.

index.php

function view($file, $vars) {
    ob_start();
    extract($vars);
    include dirname(__FILE__) . '/views/' . $file . '.php';
    $buffer = ob_get_contents();
    ob_end_clean();
    return $buffer;
}

echo view('home', array('content' => Home::getContent()));

вид / home.php

<h1>Home</h1>
<?php echo $content; ?>
2 голосов
/ 12 апреля 2011

Подход, который вы описываете, является частью MVC шаблона проектирования.Разделение различных аспектов вашего приложения.

То, что вы, кажется, уже поняли, это то, что PHP - это система шаблонов сама по себе , как и многие другие перед вами .

Посмотрите на этот эталонный тест для приблизительного сравнения популярных систем шаблонов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...