Latte - функция вызова в TPL (в идеале с параметром) вместо переменной

Я решил переписать старый веб-сайт, который я сделал много лет назад, и использовать систему шаблонов. Я решил использовать Latte, так как он генерирует файлы PHP, что делает его очень быстрым по сравнению с системами, которые каждый раз анализируют tpl. Но я так и не смог понять, как вызвать функцию с латте и получить ее результат.

Я привык к нашей фирменной системе TPL, которая может вызывать любую функцию и даже передавать ей параметры, просто вызывая {function_name.param} или используя функциональные константы с {function::param}.

Возможно ли что-то подобное исключительно в Latte (я не использую Nette или какой-либо другой фреймворк)? Я не хочу вызывать каждую функцию в PHP и добавлять ее в массив параметров, которыми располагает TPL. Это просто делает его медленнее (да, я знаю, что мог бы использовать ifs там, а затем ifs в TPL, но это также бесполезное дублирование кода).

Я хочу, чтобы он мог вызывать функцию в классе, который отображает TPL (или его родительские классы OFC), и возвращать свой вывод, когда он мне нужен (если он мне вообще нужен), поэтому я могу избежать ненужных вызовов функций при инициализации параметры для разбора TPL.

Я пытался довольно много гуглить, но я не нашел ничего полезного.

Также должен отметить, что я вообще не собираюсь использовать какой-либо фреймворк, кроме Latte с Tracy и Tester для автоматического тестирования. Я не хочу использовать Nette или Symfony 2 и т. д., поскольку сайт не такой большой, и использование всего фреймворка сделает его еще более сложным, чем нужно.

Спасибо.

.

Ps.: Кто-нибудь может создать тег для латте?


person MiChAeLoKGB    schedule 25.08.2016    source источник


Ответы (2)


Вы можете просто вызвать любую функцию php следующим образом:

{? echo 'hello'}

или в более новых версиях латте:

{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>
person Tomáš Jacík    schedule 30.08.2016
comment
I LOVE YOU ‹3 Я читал их туториалы и много гуглил, но не смог найти этот простой код... {php echo test()} работает как шарм :) Я тоже взгляну на Utils :) - person MiChAeLoKGB; 30.08.2016
comment
Еще один вопрос. Как бы вы вызвали функцию из другого класса? Представьте, что я хочу вызвать функцию test, которая находится в классе с именем Random. Я играл с этим, и это работает, но действительно уродливо: {php $a = new Random; echo $a->test()}. Есть ли лучший способ? Или будет достаточно, чтобы мой основной класс расширил латте? Я думаю, тогда он сможет получить доступ к этим функциям. - person MiChAeLoKGB; 30.08.2016
comment
Спасибо за редактирование. Вот о чем я думал. Либо инициируйте их в TPL, либо передайте их как переменные в шаблон. Но это не очень хорошие подходы, ИМО. Но все же, мой последний вопрос: могу ли я просто расширить Latte своими классами, чтобы Latte мог использовать функции класса в TPL так же, как он может использовать глобальные функции? IDK, как это лучше объяснить, так как я новичок в латте. Я всегда программировал без чего-либо или с нашей собственной CRM / CMS, которая у нас есть на работе. Спасибо. - person MiChAeLoKGB; 30.08.2016
comment
Не расширяйте Latte, лучше создайте собственные макросы: latte.nette.org/ en/#toc-user-defined-macros или создайте фильтр: latte.nette .org/ru/#toc-фильтры - person Tomáš Jacík; 30.08.2016
comment
Я читал о макросах и фильтрах, когда решил попробовать, но я не думаю, что использование их для вызова функции — лучшая идея, так как они всегда будут инициировать класс и вызывать функцию... расширяя латте с форумов, но, возможно, они использовали конструктор от Нетте... Как лучше всего это сделать? Сейчас я пытаюсь выяснить, сколько производительности уходит на инициализацию классов (даже если вы их не используете). - person MiChAeLoKGB; 30.08.2016
comment
Расширение Latte непосредственно для добавления функциональности вашего приложения противоречит почти всем известным мне принципам проектирования. Действительно, не делай этого. Я полагаю, вы создаете экземпляр Latte (и все его фильтры и макросы вместе с ним) только один раз в своем приложении. Нет никаких потерь производительности, чтобы использовать еще несколько макросов. - person Tomáš Jacík; 30.08.2016
comment
Дело в том, что я хочу использовать один базовый класс, который будет обрабатывать рендеринг латте и некоторых других базовых вещей, а все остальные классы (ну, кроме класса db и т. д.) будут просто расширять его. Затем в каждом классе я просто хочу установить шаблон, который будет использоваться, и все. Я слишком привык к нашей системе, которая на самом деле использует функции из класса, который отображает его без повторной инициализации класса. Кроме того, я только что провел несколько тестов (1 000 000 запусков и использовал среднее время), и простая инициализация класса делает код в 3 раза медленнее, а использование функции из указанного класса замедляет это в 2 раза. - person MiChAeLoKGB; 30.08.2016
comment
Если я вас понимаю, вам просто нужно показать некоторый вывод в шаблоне латте прямо из вашего класса. Ищите мое редактирование исходного ответа. Если это не то, что вы хотели, попробуйте объяснить немного больше. И скажите мне, почему вы должны создавать фильтры Latte 1 000 000 раз :) Вам нужно создавать их только один раз, при создании экземпляра самого Latte. - person Tomáš Jacík; 30.08.2016
comment
Ну да, я хочу именно это. Дело в том, что я хочу избежать инициации класса, если мне это не нужно. Раньше я имел в виду, что среднее замедление просто при запуске класса составляет 3x. Я собираюсь взглянуть на ваше редактирование... Возможно, это то, что я пытался сказать раньше, но я по глупости использовал термин extends вместо implements. Я просто понятия не имею, как использовать его в шаблоне и как я мог использовать это для несколько функций? Документация по латте очень хреновая, IMO. - person MiChAeLoKGB; 30.08.2016
comment
Я думаю, что документация может быть отстойной, потому что вы пытаетесь использовать Latte для чего-то, для чего он не предназначен. Я до сих пор не понимаю вашего варианта использования и почему создание экземпляра класса является проблемой. Я действительно не могу помочь вам больше, если я не понимаю, чего вы пытаетесь достичь. Попробуйте предоставить пример кода. - person Tomáš Jacík; 02.09.2016

Попробуйте использовать что-то подобное, это то же самое, что и с javascript

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

Не уверен, что ваш TPL справится с этим, но вы увидите

Если это сработает, вы можете использовать больше воображения и использовать что-то вроде

{
some fluffy code
}
person Luboš Suk    schedule 26.08.2016
comment
Наверное, мы не поняли друг друга... Я не использую там ни CMS, ни Framework. У меня нет собственного способа вызова функций. Я хочу иметь возможность использовать Latte для вызова функции в PHP. Я только что упомянул, что наша рабочая CMS может это делать и даже передавать параметры функциям. И я хотел бы знать, возможно ли что-то подобное с латте. - person MiChAeLoKGB; 26.08.2016