Jump to content
Дизайн и модификация IPS Community IPBSkinsBETA
Search In
  • More options...
Find results that contain...
Find results in...
Sign in to follow this  
AlexLub

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

Recommended Posts

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

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

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

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

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

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

Share this post


Link to post
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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
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"}

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

 

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

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

Share this post


Link to post
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)

 

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

Share this post


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

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

 

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

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

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

Share this post


Link to post
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);

Share this post


Link to post
Share on other sites
Где именно? Может Вам нужен виджет?

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

Share this post


Link to post
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}

 

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

Share this post


Link to post
Share on other sites

newbie, большое спасибо, все отлично работает!

Share this post


Link to post
Share on other sites

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
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...