извлекать шаблоны из базы данных / строки - PullRequest
0 голосов
/ 20 февраля 2012

Я храню свои шаблоны в виде файлов и хотел бы иметь возможность хранить их также в базе данных MySql.

Моя система шаблонов

//function of Template class, where $file is a path to a file 
function fetch() {
    ob_start();
    if (is_array($this->vars)) extract($this->vars);
    include($file);
    $contents = ob_get_contents();
    ob_end_clean();
    return $contents;
}

function set($name, $value) {
    $this->vars[$name] = is_object($value) ? $value->fetch() : $value;
}

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

$tpl    = & new Template('path/to/template');
$tpl->set('titel', $titel);

Пример шаблона:

<h1><?=titel?></h1>
<p>Lorem ipsum...</p>

Мой подход

  1. Выбор шаблона из базы данных в виде строки
  2. То, что я получил, выглядит как $ tpl = "<<em> h1> <</em>? = $ Titel?> ...";
  3. Теперь я хотел бы передать его в систему шаблонов, поэтому я расширил свой конструктор и функцию выборки:

function fetch () {

if (is_array($this->vars)) extract($this->vars);
ob_start();
if(is_file($file)){
    include($file);
}else{
        //first idea: eval ($file);
    //second idea: print $file;
}
$contents = ob_get_contents();
ob_end_clean();
return $contents;
}

'eval 'дает мне исключение Parsing, потому что он интерпретирует всю строку как php, а не только часть php.«Печать» действительно странная: она не печатает персонал между ними, но я вижу это в исходном коде страницы.Функция php игнорируется.

Так что же мне попробовать вместо этого?

Ответы [ 3 ]

1 голос
/ 27 февраля 2012

Если вы добавите '?>' к вашему eval, это должно сработать.

<?php
$string = 'hello <?php echo $variable; ?>';
$variable = "world";
eval('?>' . $string);

Но вы должны знать, что eval () довольно медленная вещь.Полученный в результате код операции не может быть кэширован в APC (или аналогичном).Вы должны найти способ кэшировать ваши шаблоны на диске.Во-первых, вам не придется извлекать их из базы данных каждый раз, когда они нужны.И вы можете использовать обычное кеширование кода операции (прозрачно выполняемое APC).

Каждый раз, когда я вижу какой-то недоделанный самодельный «шаблонизатор», я спрашиваю себя, почему автор не полагался на один из многих существующих шаблонизаторов?Большинство из них уже решило большинство проблем, которые вы могли бы иметь. Smarty (и Twig, phpTAL, ...) делают его настоящим очарованием, позволяющим извлекать исходные шаблоны из любого места (при этом пытаясь поддерживать оптимальную производительность).У вас есть какие-либо особые причины не использовать один из них?

1 голос
/ 27 февраля 2012

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

Примерно так: каждый файл имеет TTL (время истечения), скажем, 60 секунд. Настоящая причина состоит в том, чтобы избежать слишком сильного / часто ненужного удара по БД, вы быстро поймете, насколько быстрее доступ к файловой системе по сравнению с сетью и mysql, особенно если экземпляр mysql работает на удаленном сервере.

# implement a function that gets the contents of the file ( key here is the filename )
# from DB and saves them to disk.
function fectchFreshCopy( $filename ) {
    # mysql_connect(); ...
}


if (is_array($this->vars)) extract($this->vars);
ob_start();
# first check if the file exists already
if( file_exits($file) ) {
    # now check the timestamp of the files creation to know if it has expired:
    $mod_timestamp = filemtime( $file );
    if ( ( time() - $mod_timestamp ) >= 60 ) {
        # then the file has expired, lets fetch a fresh copy from DB
        # and save it to disk..
        fetchFreshCopy();
    }
}else{
    # the file doesnt exist at all, fetch and save it!
    fetchFreshCopy();
}

include( $file );
$contents = ob_get_contents();
ob_end_clean();
return $contents;
}

Ура, надеюсь, это полезно

1 голос
/ 27 февраля 2012

Возможно, не лучшее решение, но оно простое и должно работать:

  1. получить ваш шаблон из БД
  2. написать файл с шаблоном
  3. включить этот файл
  4. (необязательно: удалить файл)

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

...