1

我决定重写我多年前制作的旧网站并使用模板系统。我决定使用 Latte 作为它生成 PHP 文件的工具,与每次都解析 tpl 的系统相比,它的速度非常快。但我不知道如何用拿铁调用函数并得到它的结果。

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

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

我希望它能够在渲染 TPL(或其父类 OFC)的类中调用一个函数,并在我需要它时返回它的输出(如果我什至确实需要它),因此我可以避免在初始化时对函数进行不必要的调用用于 TPL 解析的参数。

我尝试了很多谷歌,但我没有发现任何有用的东西。

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

谢谢。

.

Ps.:有人可以为拿铁创建标签吗?

4

2 回答 2

2

您可以通过这种方式简单地调用任何 php 函数:

{? echo 'hello'}

或在较新版本的拿铁咖啡中:

{php echo 'hello'}

此外,您可以传递将直接呈现的Nette\Utils \Html实例(与框架分离的小库,即使对于小型应用程序也充满了很棒的工具)。

或者如果您想直接使用自己的类渲染输出,只需__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>
于 2016-08-30T10:27:37.523 回答
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
}
于 2016-08-26T08:52:33.630 回答