AlexLub Posted May 11, 2018 Share Posted May 11, 2018 Здравствуйте!Я делаю плагин "Bitcoin калькулятор", мне нужно в хуке получить курс биткоина и передать его в качестве параметра в шаблон bitcoinCalculator.phtml, но данные не доходят.В документации написано, что параметры надо передавать так:\IPS\Theme::i()->getTemplate( 'plugins', 'core', 'global' )->filename( ... );Но куда вставлять этот код не сказано.Подскажите, как правильно передать параметры из хука в шаблон? Link to comment Share on other sites More sharing options...
newbie Posted May 11, 2018 Share Posted May 11, 2018 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 Link to comment Share on other sites More sharing options...
AlexLub Posted May 11, 2018 Author Share Posted May 11, 2018 Ну я так и делаю, но переменные пустые. При создании хука, я указываю namespase \IPS\core\modules\front\system\plugins, может нужно другой путь указывать? Или как правильно создать хук, чтобы привязать его к шаблону? Link to comment Share on other sites More sharing options...
newbie Posted May 12, 2018 Share Posted May 12, 2018 Предоставьте больше информации, что и как делаете. Link to comment Share on other sites More sharing options...
AlexLub Posted May 18, 2018 Author Share Posted May 18, 2018 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"}Но инпуты остаются пустыми. Пробовал в методе передать простые переменные, как в примере выше, но в шаблон они не доходят.Что я делаю не так? Link to comment Share on other sites More sharing options...
newbie Posted May 19, 2018 Share Posted May 19, 2018 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 More sharing options...
AlexLub Posted May 19, 2018 Author Share Posted May 19, 2018 В таком случае Ваш калькулятор будет отображаться по адресу forum/index.php?app=core&module=system&controller=plugins&do=bitcoinCalculatorА как правильно сделать, чтобы калькулятор отображался на всех страницах форума? А в чем идея хранить данные в настройке, а не в кеше?К настройкам можно обращаться через \IPS\Settings::i()->Я просто не знаю, как средствами движка кешировать данные, а в документации ответа не нашел. :rolleyes: Link to comment Share on other sites More sharing options...
newbie Posted May 19, 2018 Share Posted May 19, 2018 А как правильно сделать, чтобы калькулятор отображался на всех страницах форума?Где именно? Может Вам нужен виджет? Я просто не знаю, как средствами движка кешировать данные, а в документации ответа не нашел. :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); Link to comment Share on other sites More sharing options...
AlexLub Posted May 19, 2018 Author Share Posted May 19, 2018 Где именно? Может Вам нужен виджет?Не уверен, что виджет подойдет, в том месте нет области для вставки. Мне нужно вставить его в этом https://web-rocket.biz/forum/24-forum-o-kriptovalyute/ разделе и во всех его подразделах и темах. Сейчас калькулятор реализован костылем. Link to comment Share on other sites More sharing options...
newbie Posted May 19, 2018 Share Posted May 19, 2018 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 More sharing options...
AlexLub Posted May 28, 2018 Author Share Posted May 28, 2018 newbie, большое спасибо, все отлично работает! Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now