fenom-template / fenom

Template Engine for PHP. Maintainers wanted!
Other
446 stars 108 forks source link

html не соответсует шаблону #215

Closed boctopr closed 8 years ago

boctopr commented 8 years ago

html не соответствует шаблону, при выключенной опции AUTO_STRIP при замене {команд} образуются лишние отступы, при включенном режиме лишние пробелы

Пример:


<meta name="viewport" content="width=device-width, initial-scale=1">
{include "favicon.tpl"}

<meta name="viewport" content="width=device-width, initial-scale=1">

        <link rel="apple-touch-icon" sizes="57x57"      href="/resource/favicon/apple-touch-icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60"      href="/resource/favicon/apple-touch-icon-60x60.png">
pafnuty commented 8 years ago

А что у вас прописано в favicon.tpl?

boctopr commented 8 years ago

А что у вас прописано в favicon.tpl? Теги прижатые к левому краю без отступов и пробелов.

<link rel="apple-touch-icon" sizes="57x57"      href="{$path_favicon}apple-touch-icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60"      href="{$path_favicon}apple-touch-icon-60x60.png">
pafnuty commented 8 years ago

Скорее всего в скомпилированном php коде проставляются пробелы или переносы. Но не думаю, что это играет какую то роль при выводе в браузер.

boctopr commented 8 years ago

Страдает чувство перфекционизма, а также ругаются всякие PageSpeed, YSlow то что файл html можно минифицировать на пару пару десятков байт (если проект большой)

Пример с багом

<!DOCTYPE html>
<html>
<head>
    {include "favicon.tpl"}
</head>
<body>
</body>
</html>

Пример без бага

<!DOCTYPE html>
<html>
<head>
{include "favicon.tpl"}
</head>
<body>
</body>
</html>

На этом примере файл инклюдиться сразу за табом и происходит смещение, но это не единственная команда {foreach} и другие ведут себя также

Если невозможно(лень) исправить в архитектуре приложения, возможно ли сделать повторный strip компилированного шаблона?

pafnuty commented 8 years ago

На уровне шаблона можно попробовать так:

{filter|strip|replace:["\n","\t"]:""|strip}
...
{/filter}

Лучше конечно сжимать скомпилированный php код, но лучше уточнить у @bzick насколько это возможно.

goelfy commented 8 years ago

Или на уровне кода сделать так:

$fenom->addPreFilter(function(\Fenom\Template $fenom, $str){
    // Обработка строки
    return $str;
});

Это реализовывает идею @pafnuty. Данный метод передаст строку с шаблоном на обработку до его компиляции. Или можно воспользоваться методом addPostFilter, который даст возможность обработать код после компиляции.