Если заявления в шаблонной системе - PullRequest
3 голосов
/ 09 февраля 2011

Как мне проанализировать, скажем, {if $var > 2} или {if $var} в файле .tpl в моей собственной версии шаблонного класса.Я не хочу использовать Smarty, так как мне не нужны все их плагины.Я просто хочу включить, если, для и foreach заявления.

Ответы [ 6 ]

13 голосов
/ 09 февраля 2011

Пожалуйста, используйте php. Просто вставьте в ваш файл TPL:

<?php if ($var > 2) .... ?> 

Это намного проще, меньше кода и намного быстрее, чем парсинг файла в php

7 голосов
/ 17 февраля 2011

используйте

<? if( condition ) :
    ....
    ....
else : 
    ....
    ....
endif; ?>

Разница между if () {} и if (): endif;

6 голосов
/ 17 февраля 2011

Вы уже получили ответ с вашим последним вопросом: если утверждения в шаблонах php с использованием tpl
Но так как вы не уйдете иначе, позвольте мне быстро ответить на него и затем упомянуть, какие из них будутВаши определенные следующие камни преткновения.

// handle {if}...{/if} blocks
$content =
preg_replace_callback('#\{if\s(.+?)}(.+?)\{/if}#s', "tmpl_if", $content);

function tmpl_if ($match) {
    list($uu, $if, $inner_content) = $match;

    // eval for the lazy!
    $if = create_function("", "extract(\$GLOBALS['tvars']); return ($if);");

    // a real templating engine would chain to other/central handlers
    if ( $if() ) {
        return $inner_content;
    }
    # else return empty content
}

Использование такого регулярного выражения приведет к путанице во вложенном if.Но вы не спрашивали об этом, поэтому я не буду об этом упоминать.И, как указано в комментарии, вам на самом деле нужно подключиться к центральной функции, которая выполняет дальнейшие замены ({foreach} / {include} / и т. Д.) Вместо просто return $content, как здесь.

Это выполнимо, но быстро становится громоздким.И именно поэтому все другие движки шаблонов (которые вы отказываетесь проверять) на самом деле конвертируют .tpl файлы в .php скрипты.Это намного проще, потому что PHP уже может обрабатывать все те управляющие структуры, которые вы пытаетесь имитировать с помощью вашего собственного шаблонного класса.

5 голосов
/ 03 февраля 2015

На самом деле это довольно просто, если вам не нужны вложенные условия.

$template = '<b>{foo}</b>{if bar} lorem ipsum {bar}{/if}....';

$markers = array(
    'foo' => 'hello',
    'bar' => 'dolor sit amet',  
);

// 1. replace all markers 
foreach($markers as $marker => $value)
    $template = str_replace('{'. $marker .'}', $value, $template);

//2. process if conditions
$template = preg_replace_callback('#\{if\s(.+?)}(.+?)\{/if}#s', function($matches) use ($markers) {

    list($condition, $variable, $content) = $matches;

    if(isset($markers[$variable]) && $markers[$variable]) {
        // if the variable exists in the markers and is "truthy", return the content
        return $content;
    }

}, $template);
0 голосов
/ 08 мая 2017

Есть пример кода php, который анализирует следующую temaplate (php 5.3 +):

[IF {post_content}]Post content is filled![ENDIF]
[IF {post_content}]Post content is filled![ELSE]{post_content}[ENDIF]

Код:

$tags = array('post_content'=>'POST_CONTENT');

$message = '1: [IF {post_content}]Post content: {post_content}![ENDIF]
            2: [IF {post_content}]Post content is filled![ELSE]Post content is empty![ENDIF]';

$matches = array();

preg_match_all('/\[IF \{([^\}]*)\}\](.[^\]]+)(?:\[ELSE\](.+?))?\[ENDIF\]/s', $message, $matches);

if ( empty($matches) ) {
    return $message;
}

$math_tag = '';
foreach ( $matches[0] as $m_index => $match )
{
    $math_tag =  trim($matches[1][$m_index]);

    if ( !empty($tags[$math_tag]) ) {
        // IF value is not empty
        $message = str_replace($match, $matches[2][$m_index], $message);
    } elseif( empty($tags[$math_tag]) && $matches[3][$m_index] ) {
        // ELSE
        $message = str_replace($match, $matches[3][$m_index], $message);
    } else {
        // IF NO ELSE condition - REMOVE ALL
        $message = str_replace($match, '', $message);
    }
}

foreach($tags as $tag => $value)
   $message = str_replace('{'. $tag .'}', $value, $message);

echo $message;
0 голосов
/ 23 февраля 2011

Вы можете использовать следующий формат в файле шаблона (.tpl).,

{if $url == 'error'}
Error message Invalid Login!
{/if} 
...