Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Опубликовано:

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

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

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

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

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

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

Рекомендованные сообщения

Опубликовано:

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}

Опубликовано:
  • Автор

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

Опубликовано:

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

Опубликовано:
  • Автор

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

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

 

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

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

Опубликовано:
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)

 

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

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

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

 

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

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

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

Опубликовано:

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

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

 

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

Опубликовано:
  • Автор
Где именно? Может Вам нужен виджет?

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

Опубликовано:

	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}

 

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

  • 2 недели спустя...
Опубликовано:
  • Автор

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

Создайте аккаунт или войдите в него для комментирования

Сейчас на странице 0

  • Нет пользователей, просматривающих эту страницу.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.