fenom-template / fenom

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

Бесконечный цикл #241

Closed nikola166 closed 8 years ago

nikola166 commented 8 years ago

Доброго времени суток. Поймал очень странный баг.

2 шаблона(цель: вывести дерево любой вложенности) 1ый Шалон (Переменная $list =>array('id' => 1 , 'name' => 'test', 'child' => array( и т.д.)))

<ul>
{foreach $list as $l}
<li>
   {$l['name']}
   {if !empty($l['child'])}
     {include '2ой шаблон'  child=$l['child']}
    {/if}
</li>
{/foreach}
<ul>

2ой Шалон

<ul>
{foreach $child as $с}
<li>
   {$с['name']}
   {if !empty($с['child'])}
     {include '2ой шаблон'  child=$с['child']}
    {/if}
</li>
{/foreach}
<ul>

Такая конструкция уходит в бесконечный цикл, и не понятно как с этим бороться. Еще наткнулся на баг вот такой: Если во втором шаблоне написать: (Переменная $children = null)

<ul>
{foreach $children as $с}
<li>
     {include '2ой шаблон'  children=$с['child']}
 </li>
 {/foreach}
 <ul>

Тоже уходит в бесконечный цикл, хотя по идеи не должен проводить foreach ни разу.

bzick commented 8 years ago

Какая версия Fenom используете? У меня не воспроизвелся баг по вашим шаблонам. У Вас в шаблоне кое где вместо "c" стоит русское "с". Пришлите примерные данные на которых у вас выходит в бесконечный цикл.

nikola166 commented 8 years ago

Версия "fenom/fenom": "^2.11". Точные данные дать не могу. Обычные данные:

$categoryList = array(
'id' => 1, 
'name' => 'Test', 
'child' => array(
        'id' => 2, 'name' => 'Test2', 
        'child' => array(
           'id' => 1, 
           'name' => 'Test', 
           'child' => array('id' => 3, 'name' => 'Test3',  'child' => array()
)
);
AlexeySachkov commented 8 years ago
{if $n < 10}
    {include 'recursive.tpl' n=$n - 1}
{/if}

Вот такая конструкция уводит компилятор в бесконечную рекурсию

https://github.com/fenom-template/fenom/blob/master/src/Fenom/Template.php#L243 - если начать печатать $tag, то получается примерно следующее:

if $categories?include "products/categories/recursive.tpl" n=10if $n < 10include 'products/categories/recursive.tpl' n=$n - 1if $n < 10include 'products/categories/recursive.tpl' n=$n - 1if $n < 10include 'products/categories/recursive.tpl' n=$n - 1if $n < 10include 'products/categories/recursive.tpl' n=$n - 1if $n < 10include 'products/categories/recursive.tpl' n=$n - 1if $n < 10include 'products/categories/recursive.tpl' n=$n - 1if $n < 10include 'products/categories/recursive.tpl' n=$n - 1if $n < 10include 'products/categories/recursive.tpl' n=$n - 1if $n < 10include 'products/categories/recursive.tpl' n=$n - 1if $n < 10include 'products/categories/recursive.tpl' n=$n - 1if $n < 10include 'products/categories/recursive.tpl' n=$n - 1if $n < 10include 'products/categories/recursive.tpl' n=$n - 1if $n < 10include 'products/categories/recursive.tpl' n=$n - 1if $n < 10include 'products/categories/recursive.tpl' n=$n - 1if $n < 10include 'products/categories/recursive.tpl' n=$n - 1if $n < 10include 'products/categories/recursive.tpl' n=$n - 1if $n < 10include 'products/categories/recursive.tpl' n=$n - 1if $n < 10include 'products/categories/recursive.tpl' n=$n - 1if $n < 10include 'products/categories/recursive.tpl' n=$n - 1if $n < 10include 'products/categories/recursive.tpl' n=$n - 1if $n < 10include 'products/categories/recursive.tpl' n=$n - 1if $n < 10include ...много повторений, пока стек не кончится

Версия 2.11.3. Хотя наверно косяк ещё мой, т.к. включена опция force_include

Если её выключить, шаблон компилируется, только вот дальше видимо входит в бесконечный цикл где-то ещё

bzick commented 8 years ago

Действительно баг есть. Перестала работать проверка, что этот шаблон подключен, когда включена опция force_include. Исправлю и добавлю тесты на проверку. Пока рекомендую force_include отключить до следующего релиза.

nikola166 commented 8 years ago

Спасибо

1 октября 2016 г., 17:03 пользователь Ivan Shalganov < notifications@github.com> написал:

Действительно баг есть. Перестала работать проверка что этот шаблон подключен когда включена опция force_include. Исправлю и добавлю тесты на проверку. Пока, рекомендую force_include отключить до следующего релиза.

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/fenom-template/fenom/issues/241#issuecomment-250911385, or mute the thread https://github.com/notifications/unsubscribe-auth/AIf2mNRUSJrc1d5RTIZIU3yA5ClkPCiWks5qvloagaJpZM4JP20H .

bzick commented 8 years ago

исправлено в 2.11.4