mirror of
https://github.com/fenom-template/fenom.git
synced 2023-08-10 21:13:07 +03:00
Fix #241 + tests
This commit is contained in:
parent
05cda5426d
commit
b92e0bbad3
@ -5,73 +5,12 @@ require_once __DIR__.'/../tests/tools.php';
|
|||||||
|
|
||||||
\Fenom::registerAutoload();
|
\Fenom::registerAutoload();
|
||||||
|
|
||||||
$vars = [
|
|
||||||
[
|
|
||||||
"id" => 1,
|
|
||||||
"name" => "Блаблабла",
|
|
||||||
"hidden_url" => "/"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"id" => 2,
|
|
||||||
"name" => "Каталог",
|
|
||||||
"hidden_url" => "/catalog"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"id" => 3,
|
|
||||||
"name" => "Сыромолочная группа",
|
|
||||||
"hidden_url" => "/catalog/cat_1.html"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"id" => 4,
|
|
||||||
"name" => "Сыры",
|
|
||||||
"hidden_url" => "/catalog/cat_2.html"
|
|
||||||
],
|
|
||||||
];
|
|
||||||
|
|
||||||
$fenom = Fenom::factory(__DIR__.'/templates', __DIR__.'/compiled');
|
$fenom = Fenom::factory(__DIR__.'/templates', __DIR__.'/compiled');
|
||||||
$fenom->setOptions(Fenom::AUTO_RELOAD | Fenom::FORCE_VERIFY);
|
$fenom->setOptions(Fenom::AUTO_RELOAD | Fenom::FORCE_VERIFY | Fenom::FORCE_INCLUDE);
|
||||||
//var_dump($fenom->compile("nested.tpl", [])->getTemplateCode());
|
//var_dump($fenom->compile("nested.tpl", [])->getTemplateCode());
|
||||||
//exit;
|
//exit;
|
||||||
var_dump($fenom->fetch('bug249/bread.tpl', ["arr" => $vars]));
|
var_dump($fenom->compile('bug241/recursive.tpl', false)->getBody());
|
||||||
//var_dump($fenom->compile('bug249/bread.tpl', false)->getBody());
|
//var_dump($fenom->compile('bug249/bread.tpl', false)->getBody());
|
||||||
//var_dump($fenom->compile("bug158/main.tpl", [])->getTemplateCode());
|
//var_dump($fenom->compile("bug158/main.tpl", [])->getTemplateCode());
|
||||||
//var_dump($fenom->display("bug158/main.tpl", []));
|
//var_dump($fenom->display("bug158/main.tpl", []));
|
||||||
// $fenom->getTemplate("problem.tpl");
|
// $fenom->getTemplate("problem.tpl");
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
* Array
|
|
||||||
(
|
|
||||||
[0] => Array
|
|
||||||
(
|
|
||||||
[id] => 1
|
|
||||||
[name] => Блаблабла
|
|
||||||
[hidden_url] => /
|
|
||||||
)
|
|
||||||
[1] => Array
|
|
||||||
(
|
|
||||||
[id] => 2
|
|
||||||
[name] => Каталог
|
|
||||||
[hidden_url] => /catalog/
|
|
||||||
)
|
|
||||||
[2] => Array
|
|
||||||
(
|
|
||||||
[orig_id] => 1
|
|
||||||
[hidden_url] => /catalog/cat_1.html
|
|
||||||
[name] => Сыромолочная группа
|
|
||||||
)
|
|
||||||
[3] => Array
|
|
||||||
(
|
|
||||||
[orig_id] => 2
|
|
||||||
[hidden_url] => /catalog/cat_2.html
|
|
||||||
[name] => Сыры
|
|
||||||
)
|
|
||||||
[4] => Array
|
|
||||||
(
|
|
||||||
[orig_id] => 6
|
|
||||||
[hidden_url] => /catalog/cat_6.html
|
|
||||||
[name] => Сыр плавленый
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
*/
|
|
3
sandbox/templates/bug241/recursive.tpl
Normal file
3
sandbox/templates/bug241/recursive.tpl
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{if $n < 10}
|
||||||
|
{include 'bug241/recursive.tpl' n=$n - 1}
|
||||||
|
{/if}
|
@ -944,9 +944,9 @@ class Fenom
|
|||||||
*
|
*
|
||||||
* @return Fenom\Template
|
* @return Fenom\Template
|
||||||
*/
|
*/
|
||||||
public function getRawTemplate()
|
public function getRawTemplate(Template $parent = null)
|
||||||
{
|
{
|
||||||
return new Template($this, $this->_options);
|
return new Template($this, $this->_options, $parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -38,13 +38,24 @@ class Compiler
|
|||||||
$p = $tpl->parseParams($tokens);
|
$p = $tpl->parseParams($tokens);
|
||||||
if ($name) {
|
if ($name) {
|
||||||
if ($tpl->getStorage()->getOptions() & \Fenom::FORCE_INCLUDE) {
|
if ($tpl->getStorage()->getOptions() & \Fenom::FORCE_INCLUDE) {
|
||||||
$inc = $tpl->getStorage()->compile($name, false);
|
$_t = $tpl;
|
||||||
$tpl->addDepend($inc);
|
$recursion = false;
|
||||||
$var = $tpl->tmpVar();
|
while($_t->parent) {
|
||||||
if ($p) {
|
if($_t->parent->getName() == $name) { // recursion detected
|
||||||
return $var . ' = $var; $var = ' . self::toArray($p) . ' + $var; ?>' . $inc->getBody() . '<?php $var = ' . $var . '; unset(' . $var . ');';
|
$recursion = true;
|
||||||
} else {
|
}
|
||||||
return $var . ' = $var; ?>' . $inc->getBody() . '<?php $var = ' . $var . '; unset(' . $var . ');';
|
$_t = $_t->parent;
|
||||||
|
}
|
||||||
|
if(!$recursion) {
|
||||||
|
$inc = $tpl->getStorage()->getRawTemplate($tpl);
|
||||||
|
$inc->load($name, true);
|
||||||
|
$tpl->addDepend($inc);
|
||||||
|
$var = $tpl->tmpVar();
|
||||||
|
if ($p) {
|
||||||
|
return $var . ' = $var; $var = ' . self::toArray($p) . ' + $var; ?>' . $inc->getBody() . '<?php $var = ' . $var . '; unset(' . $var . ');';
|
||||||
|
} else {
|
||||||
|
return $var . ' = $var; ?>' . $inc->getBody() . '<?php $var = ' . $var . '; unset(' . $var . ');';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} elseif (!$tpl->getStorage()->templateExists($name)) {
|
} elseif (!$tpl->getStorage()->templateExists($name)) {
|
||||||
throw new \LogicException("Template $name not found");
|
throw new \LogicException("Template $name not found");
|
||||||
|
@ -81,6 +81,12 @@ class Template extends Render
|
|||||||
|
|
||||||
public $extend_body = false;
|
public $extend_body = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parent template
|
||||||
|
* @var Template
|
||||||
|
*/
|
||||||
|
public $parent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Template PHP code
|
* Template PHP code
|
||||||
* @var string
|
* @var string
|
||||||
@ -121,10 +127,11 @@ class Template extends Render
|
|||||||
/**
|
/**
|
||||||
* @param Fenom $fenom Template storage
|
* @param Fenom $fenom Template storage
|
||||||
* @param int $options
|
* @param int $options
|
||||||
* @return \Fenom\Template
|
* @param Template $parent
|
||||||
*/
|
*/
|
||||||
public function __construct(Fenom $fenom, $options)
|
public function __construct(Fenom $fenom, $options, Template $parent = null)
|
||||||
{
|
{
|
||||||
|
$this->parent = $parent;
|
||||||
$this->_fenom = $fenom;
|
$this->_fenom = $fenom;
|
||||||
$this->_options = $options;
|
$this->_options = $options;
|
||||||
$this->_filters = $this->_fenom->getFilters();
|
$this->_filters = $this->_fenom->getFilters();
|
||||||
|
@ -116,6 +116,12 @@ class TestCase extends \PHPUnit_Framework_TestCase
|
|||||||
return filemtime(FENOM_RESOURCES . '/template/' . $name);
|
return filemtime(FENOM_RESOURCES . '/template/' . $name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function tpls(array $list) {
|
||||||
|
foreach($list as $name => $tpl) {
|
||||||
|
$this->tpl($name, $tpl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compile and execute template
|
* Compile and execute template
|
||||||
*
|
*
|
||||||
|
@ -268,48 +268,6 @@ class TemplateTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function providerInclude()
|
|
||||||
{
|
|
||||||
$a = array(
|
|
||||||
"name" => "welcome",
|
|
||||||
"tpl" => "welcome.tpl",
|
|
||||||
"fragment" => "come",
|
|
||||||
"pr_fragment" => "Come",
|
|
||||||
"pr_name" => "Welcome",
|
|
||||||
"username" => "Master",
|
|
||||||
"email" => "dev@null.net"
|
|
||||||
);
|
|
||||||
$result = 'Include <b>Welcome, Master (dev@null.net)</b> template';
|
|
||||||
$result2 = 'Include <b>Welcome, Flame (dev@null.net)</b> template';
|
|
||||||
$result3 = 'Include <b>Welcome, Master (flame@dev.null)</b> template';
|
|
||||||
$result4 = 'Include <b>Welcome, Flame (flame@dev.null)</b> template';
|
|
||||||
return array(
|
|
||||||
array('Include {include "welcome.tpl"} template', $a, $result),
|
|
||||||
array('Include {include "welcome.tpl"} template', $a, $result, Fenom::FORCE_INCLUDE),
|
|
||||||
array('Include {include $tpl} template', $a, $result),
|
|
||||||
array('Include {include "$tpl"} template', $a, $result),
|
|
||||||
array('Include {include "{$tpl}"} template', $a, $result),
|
|
||||||
array('Include {include "$name.tpl"} template', $a, $result),
|
|
||||||
array('Include {include "{$name}.tpl"} template', $a, $result),
|
|
||||||
array('Include {include "{$pr_name|lower}.tpl"} template', $a, $result),
|
|
||||||
array('Include {include "wel{$fragment}.tpl"} template', $a, $result),
|
|
||||||
array('Include {include "wel{$pr_fragment|lower}.tpl"} template', $a, $result),
|
|
||||||
array('Include {include "welcome.tpl" username="Flame"} template', $a, $result2),
|
|
||||||
array('Include {include "welcome.tpl" username="Flame"} template', $a, $result2, Fenom::FORCE_INCLUDE),
|
|
||||||
array('Include {include "welcome.tpl" email="flame@dev.null"} template', $a, $result3),
|
|
||||||
array(
|
|
||||||
'Include {include "welcome.tpl" email="flame@dev.null"} template',
|
|
||||||
$a,
|
|
||||||
$result3,
|
|
||||||
Fenom::FORCE_INCLUDE
|
|
||||||
),
|
|
||||||
array(
|
|
||||||
'Include {include "welcome.tpl" username="Flame" email="flame@dev.null"} template',
|
|
||||||
$a,
|
|
||||||
$result4
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function providerIncludeInvalid()
|
public static function providerIncludeInvalid()
|
||||||
{
|
{
|
||||||
@ -1195,12 +1153,66 @@ class TemplateTest extends TestCase
|
|||||||
$this->execError($code, $exception, $message, $options);
|
$this->execError($code, $exception, $message, $options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static function providerInclude()
|
||||||
|
{
|
||||||
|
$a = array(
|
||||||
|
"name" => "welcome",
|
||||||
|
"tpl" => "welcome.tpl",
|
||||||
|
"fragment" => "come",
|
||||||
|
"pr_fragment" => "Come",
|
||||||
|
"pr_name" => "Welcome",
|
||||||
|
"username" => "Master",
|
||||||
|
"email" => "dev@null.net"
|
||||||
|
);
|
||||||
|
|
||||||
|
$result = 'Include <b>Welcome, Master (dev@null.net)</b> template';
|
||||||
|
$result2 = 'Include <b>Welcome, Flame (dev@null.net)</b> template';
|
||||||
|
$result3 = 'Include <b>Welcome, Master (flame@dev.null)</b> template';
|
||||||
|
$result4 = 'Include <b>Welcome, Flame (flame@dev.null)</b> template';
|
||||||
|
|
||||||
|
$recursive_result = 'Include <b>Hello, Master (dev@null.net)</b> template';
|
||||||
|
$recursive_result2 = 'Include <b>Hello, Flame (dev@null.net)</b> template';
|
||||||
|
return array(
|
||||||
|
array('Include {include "welcome.tpl"} template', $a, $result),
|
||||||
|
array('Include {include "welcome.tpl"} template', $a, $result, Fenom::FORCE_INCLUDE),
|
||||||
|
array('Include {include "recursive.tpl"} template', $a, $recursive_result, Fenom::FORCE_INCLUDE),
|
||||||
|
array('Include {include $tpl} template', $a, $result),
|
||||||
|
array('Include {include "$tpl"} template', $a, $result),
|
||||||
|
array('Include {include "{$tpl}"} template', $a, $result),
|
||||||
|
array('Include {include "$name.tpl"} template', $a, $result),
|
||||||
|
array('Include {include "{$name}.tpl"} template', $a, $result),
|
||||||
|
array('Include {include "{$pr_name|lower}.tpl"} template', $a, $result),
|
||||||
|
array('Include {include "wel{$fragment}.tpl"} template', $a, $result),
|
||||||
|
array('Include {include "wel{$pr_fragment|lower}.tpl"} template', $a, $result),
|
||||||
|
array('Include {include "welcome.tpl" username="Flame"} template', $a, $result2),
|
||||||
|
array('Include {include "welcome.tpl" username="Flame"} template', $a, $result2, Fenom::FORCE_INCLUDE),
|
||||||
|
array('Include {include "recursive.tpl" username="Flame"} template', $a, $recursive_result2, Fenom::FORCE_INCLUDE),
|
||||||
|
array('Include {include "welcome.tpl" email="flame@dev.null"} template', $a, $result3),
|
||||||
|
array(
|
||||||
|
'Include {include "welcome.tpl" email="flame@dev.null"} template',
|
||||||
|
$a,
|
||||||
|
$result3,
|
||||||
|
Fenom::FORCE_INCLUDE
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'Include {include "welcome.tpl" username="Flame" email="flame@dev.null"} template',
|
||||||
|
$a,
|
||||||
|
$result4,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @group include
|
* @group dev
|
||||||
* @dataProvider providerInclude
|
* @dataProvider providerInclude
|
||||||
*/
|
*/
|
||||||
public function testInclude($code, $vars, $result, $options = 0)
|
public function testInclude($code, $vars, $result, $options = 0)
|
||||||
{
|
{
|
||||||
|
$this->tpls(array(
|
||||||
|
'welcome.tpl' => '<b>Welcome, {$username} ({$email})</b>',
|
||||||
|
'recursive.tpl' => '<b>Hello, {$username} ({$email}){if false}{include "recursive.tpl"}{/if}</b>'
|
||||||
|
));
|
||||||
$this->exec($code, $vars, $result, $options);
|
$this->exec($code, $vars, $result, $options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user