Jump to content

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


AlexLub
 Share

Recommended Posts

Здравствуйте!

Я делаю плагин "Bitcoin калькулятор", мне нужно в хуке получить курс биткоина и передать его в качестве параметра в шаблон bitcoinCalculator.phtml, но данные не доходят.

В документации написано, что параметры надо передавать так:

\IPS\Theme::i()->getTemplate( 'plugins', 'core', 'global' )->filename( ... );

Но куда вставлять этот код не сказано.

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

Link to comment
Share on other sites

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}

  • Upvote 1
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

 

2. Создал Code Hook

3ea26a7860601578cf82d1df5078376a-full.png

 

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"}

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

 

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

Что я делаю не так?

Link to comment
Share on other sites

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)

 

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

Link to comment
Share on other sites

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

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

 

А в чем идея хранить данные в настройке, а не в кеше?

К настройкам можно обращаться через \IPS\Settings::i()->

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

Link to comment
Share on other sites

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

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

 

Я просто не знаю, как средствами движка кешировать данные, а в документации ответа не нашел. :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);

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

	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}

 

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

Link to comment
Share on other sites

  • 2 weeks later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...