Переменная из плагина в шаблон

  • 12 Ответов
  • 1016 Просмотров

0 Пользователей и 1 Гость просматривают эту тему.

*

Andrey_by

  • *
  • 8
  • 0
  • Исчадие добра
Передаю из плагина переменную в шаблон, но шаблон её "видит" только после второй перезагрузки.
Нужно было перенести скрипты из шапки в футер, вот как я это реализовал:

1)Написал плагин /plugins/system/htmlmin/htmlmin.php , где примерно следующее:
Код
public function onBeforeCompileHead()
{
$app = JFactory::getApplication();
if($app instanceof JApplicationSite & $app->isSite())
{
#Тут из $app удаляем нужные скрипты и заносим их в $Array
#Далее передаём $Array в шаблон
JFactory::getApplication()->setUserState(
'htmlmin.onbeforecompilehead.scripts',
$Array
);
}
}

2)В футере шаблона сайта /templates/xxx/index.php подключил php файл:
Код
<?php include 'footer_script.php';?>

3)В файле footer_script.php ловлю переменную из плагина:
Код
$Array = JFactory::getApplication()->getUserStateFromRequest( 'htmlmin.onbeforecompilehead.scripts', '' );

Подскажите где ошибка?
Если нужно скину ссылку на сайт.
Спасибо)

*

robert

  • ********
  • 4002
  • 371
Re: Переменная из плагина в шаблон
« Ответ #1 : 18.08.2015, 22:34:40 »
Код: php-brief
public function getUserStateFromRequest($key, $request, $default = null, $type = 'none'){}
Посмотрите в /libraries/cms/application/cms.php. getUserStateFromRequest() используется, когда вы еще что-то передаете в $_REQUEST (2-я переменная, которой у вас нет).
В вашем случае используйте getUserState(), ее можно посмотреть в том же файле.
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

*

Andrey_by

  • *
  • 8
  • 0
  • Исчадие добра
Re: Переменная из плагина в шаблон
« Ответ #2 : 18.08.2015, 23:36:23 »
Сделал как Вы сказали, результат тотже, передаётся только после перезагрузки страницы...
Код
$Array= JFactory::getApplication()->getUserState( 'htmlmin.onbeforecompilehead.scripts', '' );
Может переменная в плагине передаётся уже после генерации страницы?
Код
onBeforeCompileHead()
Посмотрите пожалуйста сами, в режиме браузера "инкогнито" http://stock-travel.com/strany/frantsuzskaya-polineziya/romantika-ili-realnost-romanticheskaya-realnost-dlya-dvoikh-vlyublennykh-skazochnyy-ostrov-bora-bora.html
При первой загрузке нет скриптов после </footer>, после перезагрузки появляются... мистика

*

robert

  • ********
  • 4002
  • 371
Re: Переменная из плагина в шаблон
« Ответ #3 : 18.08.2015, 23:56:39 »
Приведите полный код плагина.
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

*

Andrey_by

  • *
  • 8
  • 0
  • Исчадие добра
Re: Переменная из плагина в шаблон
« Ответ #4 : 19.08.2015, 00:23:15 »
Сразу оговорюсь что я не программист)
Вот код:
Спойлер
[свернуть]

Где же я ошибку допустил?..
« Последнее редактирование: 19.08.2015, 00:28:52 от Andrey_by »

*

robert

  • ********
  • 4002
  • 371
Re: Переменная из плагина в шаблон
« Ответ #5 : 19.08.2015, 01:30:07 »
Похоже на то, что UserState недоступно в первый раз, потому что cookie сессии еще не установлено.
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

*

Andrey_by

  • *
  • 8
  • 0
  • Исчадие добра
Re: Переменная из плагина в шаблон
« Ответ #6 : 19.08.2015, 11:10:31 »
Подскажите пожалуйста, как выйти из этой ситуации? Как передать переменную уже при первом обращении к странице?

*

b2z

  • *****
  • 7449
  • 741
  • Разраблю понемногу
Re: Переменная из плагина в шаблон
« Ответ #7 : 19.08.2015, 11:22:03 »
Мое имхо - никак. Все это делается в рамках одного запроса (выполнения приложения) и внутри него Вы не сможете использовать сессию для передачи данных.

Но можно попробовать в head документа добавить Вашу переменную. Вот пример.

Типа
Код: php
$document = JFactory::getDocument();
$headData = $document->getHeadData();
$headData['myArray'] = $array;
$document->setHeadData($headData);

*

robert

  • ********
  • 4002
  • 371
Re: Переменная из плагина в шаблон
« Ответ #8 : 19.08.2015, 11:28:54 »
Попробуйте на onAfterRender использовать getBody(), регуляркой вставить нужное в нужном месте и потом setBody().
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

*

fsv

  • *******
  • 2502
  • 366
Re: Переменная из плагина в шаблон
« Ответ #9 : 19.08.2015, 17:31:26 »
Вот, как один из вариантов. Без плагина, с подключением файла. Не вникал/проверял, но по описанию что-то похожее (недавно на форуме ссылка на это была где-то). Только под себя подгоните (стили не переносите, массив исключений ваш добавьте).
Заказать разработку:    расширения Joomla  |   интерфейсы на javascript(jQuery)  |  мобильные приложения

*

Andrey_by

  • *
  • 8
  • 0
  • Исчадие добра
Re: Переменная из плагина в шаблон
« Ответ #10 : 19.08.2015, 19:25:18 »
Мое имхо - никак. Все это делается в рамках одного запроса (выполнения приложения) и внутри него Вы не сможете использовать сессию для передачи данных.

Но можно попробовать в head документа добавить Вашу переменную. Вот пример.

Типа
Код: php
$document = JFactory::getDocument();
$headData = $document->getHeadData();
$headData['myArray'] = $array;
$document->setHeadData($headData);
Такой способ не подходит, с setHeadData() нельзя добавить индекс массива ['myArray'].
Пробовал setBuffer в плагине, но оттуда не доходит до шаблона...
Регуляркой делать не хочется, так как плагин в принципе рабочий, только передать из него массив в шаблон както нужно...

*

robert

  • ********
  • 4002
  • 371
Re: Переменная из плагина в шаблон
« Ответ #11 : 19.08.2015, 22:38:56 »
Ну, во первых, плагин не совсем рабочий и передать переменную вам не удастся.
Во вторых, что не так с регуляркой? Вы ведь используете Joomla, а в ней регулярка сплошь и рядом, но вас это не беспокоит.
В конце концов, можно и без регулярки
Код: php-brief
$buffer=str_replace('</footer>','</footer>'.$blahblahblah,$buffer);
$app->setBody($buffer);
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

*

Andrey_by

  • *
  • 8
  • 0
  • Исчадие добра
Re: Переменная из плагина в шаблон
« Ответ #12 : 25.08.2015, 19:28:38 »
Спасибо robert, так и сделал. В onBeforeCompileHead передал все скрипты в _custom, а в onAfterRender вырезал их регуляркой и переставил в низ.