Опубликовано: 11 мая 20187 г Здравствуйте!Я делаю плагин "Bitcoin калькулятор", мне нужно в хуке получить курс биткоина и передать его в качестве параметра в шаблон bitcoinCalculator.phtml, но данные не доходят.В документации написано, что параметры надо передавать так:\IPS\Theme::i()->getTemplate( 'plugins', 'core', 'global' )->filename( ... );Но куда вставлять этот код не сказано.Подскажите, как правильно передать параметры из хука в шаблон?
Опубликовано: 11 мая 20187 г 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}
Опубликовано: 11 мая 20187 г Автор Ну я так и делаю, но переменные пустые. При создании хука, я указываю namespase \IPS\core\modules\front\system\plugins, может нужно другой путь указывать? Или как правильно создать хук, чтобы привязать его к шаблону?
Опубликовано: 18 мая 20187 г Автор 1. Создал плагин Bitcoin calculator. 2. Создал Code Hook 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"}Но инпуты остаются пустыми. Пробовал в методе передать простые переменные, как в примере выше, но в шаблон они не доходят.Что я делаю не так?
Опубликовано: 19 мая 20187 г 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) У Вас виджет будет? Если так, то лучше создать виджет, чем экшен и редактировать шаблон
Опубликовано: 19 мая 20187 г Автор В таком случае Ваш калькулятор будет отображаться по адресу forum/index.php?app=core&module=system&controller=plugins&do=bitcoinCalculatorА как правильно сделать, чтобы калькулятор отображался на всех страницах форума? А в чем идея хранить данные в настройке, а не в кеше?К настройкам можно обращаться через \IPS\Settings::i()->Я просто не знаю, как средствами движка кешировать данные, а в документации ответа не нашел. :rolleyes:
Опубликовано: 19 мая 20187 г А как правильно сделать, чтобы калькулятор отображался на всех страницах форума?Где именно? Может Вам нужен виджет? Я просто не знаю, как средствами движка кешировать данные, а в документации ответа не нашел. :rolleyes: Проверяем, есть ли кеш с ключом someDataif (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);
Опубликовано: 19 мая 20187 г Автор Где именно? Может Вам нужен виджет?Не уверен, что виджет подойдет, в том месте нет области для вставки. Мне нужно вставить его в этом https://web-rocket.biz/forum/24-forum-o-kriptovalyute/ разделе и во всех его подразделах и темах. Сейчас калькулятор реализован костылем.
Опубликовано: 19 мая 20187 г 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} Шаблон, думаю, сами подгоните.
Здравствуйте!
Я делаю плагин "Bitcoin калькулятор", мне нужно в хуке получить курс биткоина и передать его в качестве параметра в шаблон bitcoinCalculator.phtml, но данные не доходят.
В документации написано, что параметры надо передавать так:
Но куда вставлять этот код не сказано.
Подскажите, как правильно передать параметры из хука в шаблон?