Как передать параметры из хука в шаблон? - Дизайн и модификация Invision Power Board

Перейти к содержимому

 

СвернутьПрикрепленные теги

Теги не найдены

Страница 1 из 1

Как передать параметры из хука в шаблон?

#1 Пользователь не на сайте   AlexLub ответил: »

 
 
  • Newbie
  • *
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 5
  • Регистрация: 11-Май 18
  • Репутация: 0
  • IPB version:4.1.x
 

Отправлено 11 Май 2018 - 15:16

Здравствуйте!
Я делаю плагин "Bitcoin калькулятор", мне нужно в хуке получить курс биткоина и передать его в качестве параметра в шаблон bitcoinCalculator.phtml, но данные не доходят.
В документации написано, что параметры надо передавать так:
\IPS\Theme::i()->getTemplate( 'plugins', 'core', 'global' )->filename( ... );

Но куда вставлять этот код не сказано.
Подскажите, как правильно передать параметры из хука в шаблон?
0

#2 Пользователь не на сайте   newbie ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins.ru Team
  • Сообщений: 3 049
  • Регистрация: 26-Октябрь 11
  • Репутация: 1 274
  • IPB version:I have no IPB
 

Отправлено 11 Май 2018 - 15:32

php

$bitcoinData = 12345;
$param2 = 'some value';

\IPS\Theme::i()->getTemplate( 'plugins', 'core', 'global' )->bitcoinCalculator($bitcoinData, $param2);


bitcoinCalculator.phtml
<ips:template parameters="$bitcoinData, $param2" />
{$bitcoinData}
Param 2 value is {$param2}

1

#3 Пользователь не на сайте   AlexLub ответил: »

 
 
  • Newbie
  • *
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 5
  • Регистрация: 11-Май 18
  • Репутация: 0
  • IPB version:4.1.x
 

Отправлено 11 Май 2018 - 17:06

Ну я так и делаю, но переменные пустые. При создании хука, я указываю namespase \IPS\core\modules\front\system\plugins, может нужно другой путь указывать? Или как правильно создать хук, чтобы привязать его к шаблону?
0

#4 Пользователь не на сайте   newbie ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins.ru Team
  • Сообщений: 3 049
  • Регистрация: 26-Октябрь 11
  • Репутация: 1 274
  • IPB version:I have no IPB
 

Отправлено 12 Май 2018 - 09:02

Предоставьте больше информации, что и как делаете.
0

#5 Пользователь не на сайте   AlexLub ответил: »

 
 
  • Newbie
  • *
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 5
  • Регистрация: 11-Май 18
  • Репутация: 0
  • IPB version:4.1.x
 

Отправлено 18 Май 2018 - 14:59

1. Создал плагин Bitcoin calculator.

2. Создал Code Hook
-IMG-

3. В хуке создал метод
//<?php

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

class hook75 extends _HOOK_CLASS_
{
	public function bitcoinCalculator() {
		try
		{
			if (\IPS\Db::i()->select('*', 'core_sys_conf_settings', 'conf_key="btc_calc"')->count()) {
				$cur_old = \IPS\Db::i()->select('conf_value', 'core_sys_conf_settings', 'conf_key="btc_calc"')->first();

				if ((time() - $cur_old['time']) > 600)
				{
					$tick = file_get_contents('https://api.coinmarketcap.com/v2/ticker/1/?convert=EUR');
					$data = json_decode($tick, TRUE);

					$currencies = array();

					$currencies['usd'] = round($data["data"]["quotes"]["USD"]["price"], 2);
					$currencies['eur'] = round($data["data"]["quotes"]["EUR"]["price"], 2);

					$tick = file_get_contents('https://api.coinmarketcap.com/v2/ticker/1/?convert=RUB');
					$data = json_decode($tick, TRUE);

					$currencies['rub'] = round($data["data"]["quotes"]["RUB"]["price"], 2);
					$currencies['time'] = time();

					\IPS\Db::i()->update('core_sys_conf_settings', array('conf_value' => $currencies), 'conf_value="btc_calc"');
				}
			}
			else{
				$tick = file_get_contents('https://api.coinmarketcap.com/v2/ticker/1/?convert=EUR');
				$data = json_decode($tick, TRUE);

				$currencies = array();

				$currencies['usd'] = round($data["data"]["quotes"]["USD"]["price"], 2);
				$currencies['eur'] = round($data["data"]["quotes"]["EUR"]["price"], 2);

				$tick = file_get_contents('https://api.coinmarketcap.com/v2/ticker/1/?convert=RUB');
				$data = json_decode($tick, TRUE);

				$currencies['rub'] = round($data["data"]["quotes"]["RUB"]["price"], 2);
				$currencies['time'] = time();

				\IPS\Db::i()->insert('core_sys_conf_settings', array('conf_key' => "btc_calc", 'conf_value' => $currencies, 'conf_default' => 0, 'conf_app' => 'core'));
			}

			\IPS\Theme::i()->getTemplate( 'plugins', 'core', 'global' )->bitcoinCalculator( $currencies );
		}
		catch ( \RuntimeException $e )
		{
			return call_user_func_array( 'parent::bitcoinCalculator', func_get_args() );
		}
	}
}


4. Создал шаблон bitcoinCalculator.phtml
<ips:template parameters="$currencies" />
<div id="calculator" class="calc">
    <form>
        <div id="calc-name">
            Bitcoin <span>калькулятор</span>
        </div>
        <div id="calc-btc">
            <label>BTC</label> <input type="text" id="btc" value="1" />
        </div>
        <div id="calc-rub">
            <label>RUB</label> <input type="text" id="rub" data-rub="{$currencies['rub']}" value="{$currencies['rub']}" />
        </div>
        <div id="calc-usd">
            <label>USD</label> <input type="text" id="usd" data-usd="{$currencies['usd']}" value="{$currencies['usd']}" />
        </div>
        <div id="calc-eur">
            <label>EUR</label> <input type="text" id="eur" data-eur="{$currencies['eur']}" value="{$currencies['eur']}" />
        </div>
    </form>
</div>


5. В шаблоне globalTemplate вставил свой шаблон
{template="bitcoinCalculator" group="plugins" location="global" app="core"}

Но инпуты остаются пустыми.

Пробовал в методе передать простые переменные, как в примере выше, но в шаблон они не доходят.
Что я делаю не так?
0

#6 Пользователь не на сайте   newbie ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins.ru Team
  • Сообщений: 3 049
  • Регистрация: 26-Октябрь 11
  • Репутация: 1 274
  • IPB version:I have no IPB
 

Отправлено 19 Май 2018 - 09:28

Цитата

3. В хуке создал метод
В таком случае Ваш калькулятор будет отображаться по адресу forum/index.php?app=core&module=system&controller=plugins&do=bitcoinCalculator

Цитата

5. В шаблоне globalTemplate вставил свой шаблон
Вы не передаете параметр
Должно быть
{template="bitcoinCalculator" group="plugins" location="global" app="core" params="'Здесь должны быть Ваши валюты ($currencies)'"}

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

А в чем идея хранить данные в настройке, а не в кеше?
К настройкам можно обращаться через \IPS\Settings::i()->

Да и массив $currencies у Вас будет заполнен либо, если нет записи в таблице с conf_key равным btc_calc, либо, если if ((time() - $cur_old['time']) > 600)

У Вас виджет будет? Если так, то лучше создать виджет, чем экшен и редактировать шаблон
0

#7 Пользователь не на сайте   AlexLub ответил: »

 
 
  • Newbie
  • *
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 5
  • Регистрация: 11-Май 18
  • Репутация: 0
  • IPB version:4.1.x
 

Отправлено 19 Май 2018 - 15:23

Цитата

В таком случае Ваш калькулятор будет отображаться по адресу forum/index.php?app=core&module=system&controller=plugins&do=bitcoinCalculator

А как правильно сделать, чтобы калькулятор отображался на всех страницах форума?

Цитата

А в чем идея хранить данные в настройке, а не в кеше?
К настройкам можно обращаться через \IPS\Settings::i()->

Я просто не знаю, как средствами движка кешировать данные, а в документации ответа не нашел. :rolleyes:
0

#8 Пользователь не на сайте   newbie ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins.ru Team
  • Сообщений: 3 049
  • Регистрация: 26-Октябрь 11
  • Репутация: 1 274
  • IPB version:I have no IPB
 

Отправлено 19 Май 2018 - 15:25

Просмотреть сообщениеAlexLub сказал(а):

А как правильно сделать, чтобы калькулятор отображался на всех страницах форума?

Где именно? Может Вам нужен виджет?

Цитата

Я просто не знаю, как средствами движка кешировать данные, а в документации ответа не нашел. :rolleyes:
Проверяем, есть ли кеш с ключом someData
if (isset(\IPS\Data\Store::i()->someData))

Если есть, то достаем данные из кеша
$someData = \IPS\Data\Store::i()->someData;

Если нет, то создаем
$someData = '1234';
\IPS\Data\Store::i()->someData = $someData;

Удаляем
unset(\IPS\Data\Store::i()->someData);

0

#9 Пользователь не на сайте   AlexLub ответил: »

 
 
  • Newbie
  • *
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 5
  • Регистрация: 11-Май 18
  • Репутация: 0
  • IPB version:4.1.x
 

Отправлено 19 Май 2018 - 16:46

Цитата

Где именно? Может Вам нужен виджет?

Не уверен, что виджет подойдет, в том месте нет области для вставки. Мне нужно вставить его в этом https://web-rocket.b...-kriptovalyute/ разделе и во всех его подразделах и темах. Сейчас калькулятор реализован костылем.
0

#10 Пользователь не на сайте   newbie ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins.ru Team
  • Сообщений: 3 049
  • Регистрация: 26-Октябрь 11
  • Репутация: 1 274
  • IPB version:I have no IPB
 

Отправлено 19 Май 2018 - 16:57

	public function _bitcoinCalculator(array $currencies)
	{
		$currenciesData = array();
		
		foreach ($currencies as $currency)
		{
			$cacheKey = 'btc_calc_' . $currency;
			
			if (!(isset(\IPS\Data\Store::i()->$cacheKey) and $cacheData = \IPS\Data\Store::i()->$cacheKey and ((time() - $cacheData['time']) < 600)))
			{
				$cacheData = array();

				try
				{
					$request = \IPS\Http\Url::external('https://api.coinmarketcap.com/v2/ticker/1/?convert=' . $currency)->request()->get()->decodeJson();

					$cacheData['usd'] = round($request['data']['quotes']['USD']['price'], 2);
					$cacheData[\strtolower($currency)] = round($request['data']['quotes'][\strtoupper($currency)]['price'], 2);
				}
				catch (\Exception $e)
				{
				}
				
				$cacheData['time'] = time();

				\IPS\Data\Store::i()->$cacheKey = $cacheData;
			}
			
			$currenciesData = array_merge($currenciesData, $cacheData);
		}

		return \IPS\Theme::i()->getTemplate('plugins', 'core', 'global')->bitcoinCalculator($currenciesData);
	}

В шаблоне используйте
{{$plugins = new \IPS\core\modules\front\system\plugins; $calculator = $plugins->_bitcoinCalculator(array('EUR', 'RUB'));}}						
{$calculator|raw}


Шаблон, думаю, сами подгоните.
0

Сообщить об этой теме:


Страница 1 из 1


Быстрый ответ

  

1 пользователей читают эту тему
0 зарегистрированных, 1 гостей, 0 скрытых


Контактная информация

Вопросы по работе сайта

+7 (917) 501-4765
C 10 до 20 в рабочие дни (время московское)

Техническая поддержка

Контактные данные специалистов

Дизайн форумов

IPB 3.x ¦ IPB 2.x

Бесплатные шаблоны

IPB 3.2 – 3.4 ¦ IPB 3.1 ¦ IPB 3.0 ¦ IPB 2.2 – 2.3 ¦ IPB 2.1 ¦ Клипарт
Лицензия на использование ¦ Ваша поддержка ¦ О проекте
Copyright © 2005-2018 IPBSkins.ru Team
При копировании материалов с сайта
прямая ссылка на источник обязательна