Jump to content

Создание плагина

Featured Replies

  • Author
comment_160607

WaNted 

и всетаки

'{expression="\IPS\Theme::i()->getTemplate( 'plugins', 'core', 'global' )->phtml( $params )"}';

в этой конструкции не работает.

Хотелось бы передавать параметры в шаблон

 

  • Replies 94
  • Просмотров 8,7k
  • Created
  • Последний ответ

Лучшие авторы в теме

Most Popular Posts

  • Человеку, похоже, хочется вставить в шаблон готовый спагетти-код и совершенно не хочется заморачиваться с ООП, и разделением логики и представления. Вобщем-то, логично будет посоветовать подойти к воп

  • Там вообще ничего не нужно городить и вообще лезть редактировать этот файл в ручную. При создании Theme Hook достаточно в содержимом указать свой шаблон типа: {template="templateName" group="plugi

  • Нет. А чем Вам скобочки не угодили?

Posted Images

  • Author
comment_160609
31 минуту назад, WaNted сказал:

'content' => \IPS\Theme::i()->getTemplate( 'plugins', 'core', 'global' )->phtml( $params )

В самом шаблоне phtml: 


{expression="time()"}

 

не помогает. Получается если expression не в хуке, то результат кешируется. Кешируется сам хук без expression.

Вот такой вот замкнутый круг.

 

comment_160610

Всё правильно. Шаблон это функция, expression лишь выполняет и выводит результат функции php внутри шаблона. До этого вы передавали результат time() напрямую в content, что в итоге кэшировалось. Что бы такого не было, в Вашем случае, нужно динамические данные получать в самом шаблоне.

  • Author
comment_160611
8 минут назад, WaNted сказал:

Вашем случае, нужно динамические данные получать в самом шаблоне.

не удобно. Надо будет строчек 200 перевести в шаблонный {{php}}

Выше уже был спор на эту тему, не надо к нему возвращаться.

Изначально мне бы хотелось получить динамические данные в хуке. А потом передать их в шаблон. И чтобы это не кешировалось.

А можно как нибудь в хуке создать функцию и вызвать её в шаблоне?

comment_160612

Можно создать хук класса \IPS\core\modules\front\system\plugins и там статическую функцию, после чего вызывать её в шаблоне \IPS\core\modules\front\plugins::functionName().

Либо подумать как вызвать функцию которая находиться в том же классе что и hookData.

находится*

  • Author
comment_160613

Оставлю здесь заметку для себя чтобы не забыть.

создаем хук шаблона phtml шалон

хук темы

//<?php
/* To prevent PHP errors (extending class does not exist) revealing path */
if (!\defined('\IPS\SUITE_UNIQUE_KEY')) {
    exit;
}

class hook90 extends _HOOK_CLASS_ {
    /* !Hook Data - DO NOT REMOVE */
public static function hookData() {
 return array_merge_recursive( array (
  'globalTemplate' => 
  array (
    0 => 
    array (
      'selector' => '#ipsLayout_mainArea',
      'type' => 'add_inside_start',
      'content' => '{expression="\IPS\Theme::i()->getTemplate(\'plugins\',\'core\', \'global\')->test()"}',
    ),
  ),
), parent::hookData() );
}
/* End Hook Data */
}

В нем главное прописать

 '{expression="\IPS\Theme::i()->getTemplate(\'plugins\',\'core\', \'global\')->test()"}'

и можно про этот хук забыть.

Cоздаем хук кода с классом \IPS\core\modules\front\system\plugins

В нем создаем функцию (_test()), которая и будет выполнять классический php
 

//<?php
/* To prevent PHP errors (extending class does not exist) revealing path */
if (!\defined('\IPS\SUITE_UNIQUE_KEY')) {
    exit;
}

class hook91 extends _HOOK_CLASS_ {

    public function _test() {
        return time();
    }

}

в шаблоне phtml пишем
 

<ips:template parameters="" />

{{$plugins = new \IPS\core\modules\front\system\plugins; $time = $plugins->_test();}}                     
{$time}

По факту мы вызвали метод класса $plugins->_test(); который будет выполнен без кеширования.

 

поправьте если что не так или укажите недостатки

comment_160614

Использование expression там бессмысленно.

public static function _test()

{{$time = \IPS\coore\modules\front\system\plugins::_test();}}

 

  • Author
comment_160615
3 минуты назад, WaNted сказал:

Использование expression там бессмысленно.

насколько я понял если его не прописать в хуке шаблона, то весь плагин закешируется. Вся соль как раз в нем.

прямой вызов - \IPS\Theme::i()->getTemplate... кешируется

'{expression="\IPS\Theme::i()->getTemplate... не кешируется

а дальше финт ушами чтобы не писать большую часть php-кода на логике шаблона.

  • Author
comment_160616

Если до этого я хотел чтобы хук отображал шаблон передавая ему динамические данные, что было бы очень удобно.

то сейчас шаблон вызывает хук. Тоже сгодится.

Главное чтобы отсутствие кеширования при вызове с помощью expression  не являлось недокументированной возможностью. Иначе пофиксят этот баг и все полетит... к чертям.

 

 

comment_160617

Вот уберите и убедитесь что всё будет работать как надо. Кэшируется код шаблона, который парсится в обычный php, выполняются все функции и в итоге выводится чистым html. В Вашем случае всегда будет выполняться функция _test() в момент вывода.

  • Author
comment_160618

Это проверим. 

Тогда возникает вопрос. А на сколько времени кешируется плагин? Я вчера вечером засек время и с утра он ещё в кеше. Часов 8. 

В настройках форума для гостей 30 секунд. Для каких-то блоков 5 минут. Крон работает. 

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

 

  • Author
comment_160621

И все таки если в хуке шаблона

\IPS\Theme::i()->getTemplate('plugins', 'core', 'global')->test()

без expression, то результат кешируется.

А вот то же самое в хуке кода не кешируется.

 

 

 

comment_160626

\IPS\Theme::i()->getTemplate эта функция возвращает уже скомпилированный шаблона (html) сразу же в content и естественно кэшируется. {template="phtml" group="plugins" location="global" app="core"} шорткод той же самой функции, только тут уже шаблон компилируется в момент вывода, то что Вам нужно.

  • Author
comment_160627

уже нет сил проверять. Этот код выдает ошибку "отсутсвует файл phtml" хотя файл есть.

expression не дает кешироваться все остальные методы кешируются

 

  • Author
comment_160628

Все

{template="phtml" group="plugins" location="global" app="core"}  не кешируется

но через нее нельзя передать параметры. Но эта проблема решается через хуки кода.

А то что она вызывала ошибку, то это оказывается в данном форуме есть баг. Текст этого форума между буквами имеет null-байты и не может использоваться при копировании. Скопированный текст в редакторе может быть выглядеть без косяков и даже подсветка синтаксиса ничего не покажет, но при компиляции кода вызовет ошибку.

Надеюсь у моего форума такой проблемы нет

  • Author
comment_160653

И еще вопрос на злобу дня. У меня есть блок php кода в приложении Pages. Там стоит настройка "Не кешировать блок"

Но он иногда редко и рандомно кешируется. Из за этого некоторые пользователи получают недостоверную и чужую информацию. Я заметил что кеширование происходит если страница долго грузится. То есть некоторые пользователи иногда могут увидеть блок который отображался ранее другому пользователю.

Сейчас в моем плагине какое либо кеширование категорически запрещено. Если у пользователя долго грузится страница, он не должен видеть кешированного чужого блока. Пусть он вообще ничего не увидит, пусть хоть 502 страницу получает, но никакого кэша быть не должно.

С плагином не будет таких же ситуаций как с блоками Pages?

  • 2 месяца спустя...
  • Author
comment_160826

Столько годной информации пропало....

Новый вопрос. Хочу сделать отправку некоторых ЛС в свой телеграм. Как отправлять в телеграм я знаю, а вот как перехватывать ЛС пока не пойму.

Например мне надо чтобы входящие администратору улетали ему на телефон. То-есть пользователю с определенным ID.

 

 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.


Guest
Ответить в этой теме...

Последние посетители 0

  • No registered users viewing this page.