Шаблонный класс PHP с переменными? - PullRequest
6 голосов
/ 02 апреля 2010

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

Мои HTML-файлы будут выглядеть так:

<html>
    <head>
        <title>{PAGE_TITLE}</title>
    </head>
    <body>
        <h1>{PAGE_HEADER}</h1>
        <p>Some random content that is likely not to be parsed with PHP.</p>
    </body>
</html>

Очевидно, я хочу заменить {PAGE_TITLE} и {PAGE_HEADER} чем-то, что я установил с помощью PHP. Как это:

<?php

    $pageElements = array(
                            '{PAGE_TITLE}' => 'Some random title.',
                            '{PAGE_HEADER}' => 'A page header!'
                         );

?>

И я бы использовал что-то вроде str_replace и загрузил замененный HTML в строку, а затем напечатал бы это на странице? Это то, к чему я сейчас стремлюсь ... есть ли у кого-нибудь совет или способ сделать это лучше?

Спасибо.

Ответы [ 5 ]

6 голосов
/ 02 апреля 2010

Ваша текущая стратегия будет работать, и она довольно проста. str_replace() эффективен и чист, и вы можете просто зациклить его, чтобы заменить точные совпадения тегов вашим переменным содержимым. Однако недостатком является то, что вы должны сначала загрузить все свои шаблоны в строки, и это может быть довольно неэффективно.

Альтернативный метод, который очень похож, вы можете просто использовать extract () . Извлечение возьмет набор пар ключ / значение и создаст из них переменные в локальной области видимости. Если вы include() шаблон в той же области, ваши переменные будут готовы к работе.

Примерно так:

function loadTemplate($template,$vars)
{
    extract($vars);
    include($template);
}

Ваш шаблон может быть просто обычным PHP.

<html>
    <head>
        <title><?php echo $PAGE_TITLE ?></title>
    </head>
    <body>
        <h1><?php echo $PAGE_HEADER ?></h1>
        <p>Some random content that is likely not to be parsed with PHP.</p>
    </body>
</html>

(Очевидно, вы могли бы использовать короткие теги для меньшего многословия шаблона, хотя я предпочитаю не делать этого из соображений совместимости.)

Тогда все, что вам нужно сделать, это:

$pageElements = array(
                        'PAGE_TITLE' => 'Some random title.',
                        'PAGE_HEADER' => 'A page header!'
                     );
loadTemplate('file.phtml',$pageElements);
5 голосов
/ 02 апреля 2010

Вас может заинтересовать mustache.php . Это действительно легкая реализация класса PHP Усы

Быстрый пример из README:

<?php
    include('Mustache.php');
    $m = new Mustache;
    echo $m->render('Hello {{planet}}', array('planet' => 'World!'));
    // "Hello World!"
?>

И более глубокий пример - это канонический шаблон Усы:

Hello {{name}}
You have just won ${{value}}!
{{#in_ca}}
Well, ${{taxed_value}}, after taxes.
{{/in_ca}}
2 голосов
/ 02 апреля 2010

PHP сам по себе является движком шаблона, если вы хотите быть очень простым. просто используйте include()

file.phtml:

<html>
    <head>
        <title><?=$tpl['PAGE_TITLE']?></title>
    </head>
    <body>
        <h1><?=$tpl['PAGE_HEADER']?></h1>
        <p>Some random content that is likely not to be parsed with PHP.</p>
    </body>
</html>

code.php:

tpl = Array 
(
'PAGE_HEADER' => "This is the lazy way to do it",
'PAGE_TITLE' => "I don't care because i am doing it this way anyways"
)
include("file.phtml")
0 голосов
/ 02 декабря 2013

Используйте этот класс Шаблонный движок с поддержкой блоков, циклов, ifset (также работает в циклах) и вращений. Работает быстро Наиболее подходит для малых и средних проектов.

http://www.phpclasses.org/package/1216-PHP-Template-engine-blocks-loops-ifset-rotations.html

0 голосов
/ 18 ноября 2010
function parseVars($vars, $file){

    $file = file_get_contents($file);
    foreach($vars as $key => $val){
        str_replace("{".$key."}", $val, $file);
    }

    echo $file;

}
...