fenom-template / fenom

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

Тег paste #268

Closed larfeus closed 6 years ago

larfeus commented 7 years ago

Шаблон:

{block 'b1'}
    <h3>test</h3>
{/block}

{block 'b2'}
    {paste 'b1'}
{/block}

Блок b1 выводится только один раз. Тег paste не работает.

Компиляция тега в Fenom\Compiler.php

/**
 * Tag {paste ...}
 *
 * @param Tokenizer $tokens
 * @param Tag $tag
 * @return string
 */
public static function tagPaste(Tokenizer $tokens, Tag $tag)
{
    $name = $tokens->get(T_CONSTANT_ENCAPSED_STRING);
    $tokens->next();

    // DEBUG
    dd($tokens, $tag->tpl->blocks, $name);

    if(isset($tag->tpl->blocks[$name])) {
        return "?>".substr($tag->tpl->blocks[$name]["block"], 1, -1)."<?php ";
    } else {
        return "";
    }
}

Получаем:

Tokenizer {#24 ▼
  +tokens: array:2 [▶]
  +p: 2
  +quotes: 0
  -_max: 1
  -_last_no: 1
}
array:1 [▼
  "b1" => array:4 [▶]
]
"'b1'"

В переменную $name название блока попадает с кавычками (см. T_CONSTANT_ENCAPSED_STRING http://php.net/manual/ru/tokens.php)

На рабочем проекте временное решение такое:

/**
 * Tag {paste ...}
 *
 * @param Tokenizer $tokens
 * @param Tag $tag
 * @return string
 */
public static function tagPaste(Tokenizer $tokens, Tag $tag)
{
    $tag->tpl->parsePlainArg($tokens, $name);
    if(isset($tag->tpl->blocks[$name])) {
        return "?>".substr($tag->tpl->blocks[$name]["block"], 1, -1)."<?php ";
    } else {
        return "";
    }
}
bzick commented 7 years ago

Вам бы оформить merge request, так было бы понятнее что меняете

bezumkin commented 6 years ago

Наверное, эту issue уже можно закрыть. https://github.com/fenom-template/fenom/pull/274