Latte - 在TPL中调用函数(理想情况下使用参数)而不是变量

时间:2016-08-25 18:12:05

标签: php template-engine nette latte

我决定改写几年前制作的旧网站并使用模板系统。我决定使用Latte作为生成PHP文件,与每次解析tpl的系统相比,它真的很快。但是我无法弄明白,如何用latte调用函数并得到它的结果。

我习惯于我们的自定义公司TPL系统,它可以调用任何函数,甚至可以通过调用{function_name.param}或使用函数常量{function::param}来传递参数。

像这样的东西可能纯粹在Latte(我不使用Nette或任何其他框架)吗?我不想在PHP中调用每个函数,并将其添加到TPL必须处理的参数数组中。这只会让它变慢(是的,我知道我可以在那里使用ifs然后在TPL中使用ifs,但这也是一个无用的代码重复)。

我希望它能够在类中调用一个呈现TPL(或其父类OFC)的函数,并在需要时返回它的输出(如果我甚至需要它),所以我可以避免不必要的调用初始化TPL解析参数时的函数。

我试着谷歌很多,但我找不到任何有用的东西。

我还应该提一下,我根本不会使用任何框架,除了带有Tracy和Tester的Latte进行自动测试。我不想使用Nette或Symfony 2等,因为网站不是那么大,使用整个框架只会使它变得比它需要的更复杂。

感谢。

Ps。:有人可以为Latte创建标签吗?

2 个答案:

答案 0 :(得分:2)

你可以这样简单地调用任何php函数:

{? echo 'hello'}

或更新版本的Latte:

{php echo 'hello'}

此外,您可以传递Nette\Utils \ Html的实例(与框架分离的小型lib,甚至是小型应用程序的完整工具),这些实例将直接呈现。

或者如果您想直接使用自己的类呈现输出,只需使用__toString()接口实现IHtmlString函数:

class MyOwnClassRenderableByLatte implements \Latte\Runtime\IHtmlString
{
    function __toString()
    {
        return 'Hi';
    }
}

模板示例包括您以后的问题:

{php
    // You can instantiate needed classes in one synoptical block
    // in the head of template file or reather instantiate them
    // outside of template and pass them as template variables
    $a = new ClassA();
    $b = new ClassB();
}

<div>{$a->someFunction()}</div>
<div>
    {* Or you can instantiate class inplace this way,
       but I wouldn't recommend it. BTW: This is Latte comment.
    *}
    {php (new ClassC())->otherFunction()}
</div>

答案 1 :(得分:0)

尝试使用类似这样的内容,与javascript相同

{some code} //is for latte expression
{ some other code} //with space after first bracket its no more latte expression

不确定您的TPL是否会处理它,但您会看到

如果它可以工作,你可以使用更多的想象力并使用类似

的东西
{
some fluffy code
}