Форум русской поддержки Joomla!® CMS
08.12.2016, 00:21:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

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

 (Прочитано 858 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Andrey_by
Новичок
*

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 8


Исчадие добра


« : 18.08.2015, 18:19:26 »

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

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
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3586


« Ответ #1 : 18.08.2015, 21:34:40 »

Код
public function getUserStateFromRequest($key, $request, $default = null, $type = 'none'){}
Посмотрите в /libraries/cms/application/cms.php. getUserStateFromRequest() используется, когда вы еще что-то передаете в $_REQUEST (2-я переменная, которой у вас нет).
В вашем случае используйте getUserState(), ее можно посмотреть в том же файле.
Записан
Andrey_by
Новичок
*

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 8


Исчадие добра


« Ответ #2 : 18.08.2015, 22: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
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3586


« Ответ #3 : 18.08.2015, 22:56:39 »

Приведите полный код плагина.
Записан
Andrey_by
Новичок
*

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 8


Исчадие добра


« Ответ #4 : 18.08.2015, 23:23:15 »

Сразу оговорюсь что я не программист)
Вот код:
Показать текстовый блок

Где же я ошибку допустил?..
« Последнее редактирование: 18.08.2015, 23:28:52 от Andrey_by » Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3586


« Ответ #5 : 19.08.2015, 00:30:07 »

Похоже на то, что UserState недоступно в первый раз, потому что cookie сессии еще не установлено.
Записан
Andrey_by
Новичок
*

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 8


Исчадие добра


« Ответ #6 : 19.08.2015, 10:10:31 »

Подскажите пожалуйста, как выйти из этой ситуации? Как передать переменную уже при первом обращении к странице?
Записан
b2z
Support Team
*****

Репутация: +710/-0
Offline Offline

Пол: Мужской
Сообщений: 7537


Разраблю понемногу


« Ответ #7 : 19.08.2015, 10:22:03 »

Мое имхо - никак. Все это делается в рамках одного запроса (выполнения приложения) и внутри него Вы не сможете использовать сессию для передачи данных.

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

Типа
Код
$document = JFactory::getDocument();
$headData = $document->getHeadData();
$headData['myArray'] = $array;
$document->setHeadData($headData);
« Последнее редактирование: 19.08.2015, 10:29:37 от b2z » Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3586


« Ответ #8 : 19.08.2015, 10:28:54 »

Попробуйте на onAfterRender использовать getBody(), регуляркой вставить нужное в нужном месте и потом setBody().
Записан
fsv
Практически профи
*******

Репутация: +330/-2
Offline Offline

Пол: Мужской
Сообщений: 2243


« Ответ #9 : 19.08.2015, 16:31:26 »

Вот, как один из вариантов. Без плагина, с подключением файла. Не вникал/проверял, но по описанию что-то похожее (недавно на форуме ссылка на это была где-то). Только под себя подгоните (стили не переносите, массив исключений ваш добавьте).
Записан
Andrey_by
Новичок
*

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 8


Исчадие добра


« Ответ #10 : 19.08.2015, 18:25:18 »

Мое имхо - никак. Все это делается в рамках одного запроса (выполнения приложения) и внутри него Вы не сможете использовать сессию для передачи данных.

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

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

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3586


« Ответ #11 : 19.08.2015, 21:38:56 »

Ну, во первых, плагин не совсем рабочий и передать переменную вам не удастся.
Во вторых, что не так с регуляркой? Вы ведь используете Joomla, а в ней регулярка сплошь и рядом, но вас это не беспокоит.
В конце концов, можно и без регулярки
Код
$buffer=str_replace('</footer>','</footer>'.$blahblahblah,$buffer);
$app->setBody($buffer);
 
Записан
Andrey_by
Новичок
*

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 8


Исчадие добра


« Ответ #12 : 25.08.2015, 18:28:38 »

Спасибо robert, так и сделал. В onBeforeCompileHead передал все скрипты в _custom, а в onAfterRender вырезал их регуляркой и переставил в низ.
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet