Неопределенная переменная, Undefined variable: currencies in, при подключении конвертора валют из php в html
Доброго времени суток друзья! Не так давно углубился в изучении php и при воспроизведении кода, столкнулся с "Неопределенной переменной" в ошибке, никак не могу понять, как это получилось, где свернул не там...
Сама ошибка
<select tabindex="4" class="dropdown drop">
<br />
<b>Notice</b>: Undefined variable: currencies in <b>D:\OSPanel\domains\ishop.loc\app\widgets\currenc\Currency.php</b> on line <b>19</b><br />
<br />
<b>Notice</b>: Undefined variable: currency in <b>D:\OSPanel\domains\ishop.loc\app\widgets\currenc\Currency.php</b> on line <b>20</b><br />
<option value="" class="label"></option><!-- указываем код массива -->
<br />
<b>Warning</b>: Invalid argument supplied for foreach() in <b>D:\OSPanel\domains\ishop.loc\app\widgets\currenc\currency_tpl\currency.php</b> on line <b>2</b><br />
</select>
Подключенные php классы
<?php
namespace app\controllers;
use ishop\base\Controller;
use app\models\AppModel;
use app\widgets\currenc\Currency;
use ishop\App;
//подключаем и создаем подкласс Контроллера с базой, от которого будем плясать
class AppController extends Controller{
public function __construct($route){//выводим базы данных
parent::__construct($route);
new AppModel();
/*для удобства использования конвертора Currency создаем к нему доступ через основной контролер, результат работы записываем в реестр, для работы на протежении всего приложения*/
/*$curr = Currency::getCurrencies();//записываем метод назв валют в curr*/
/*setcookie('currency', 'EUR', time() + 3600*24*7, '/');//валюта по умолчанию*/
App::$app->setProperty('currencies', Currency::getCurrencies());//записываем в реестр валют который'currencies' библиотеку валют из метода
App::$app->setProperty('currency', Currency::getCurrency(App::$app->getProperty('currencies')));//выгружаем реестр методов в реестр активной валюты с помощью setProperty
/*debug(App::$app->getProperties());//распечатываем содержимое реестра*/
}
}
<?php
namespace app\widgets\currenc;
use ishop\App;
class Currency{
protected $tpl;
protected $currencies;
protected $currency;
public function __construct(){/*формируем конструктор в котором отображаем путь к файлу с функцией*/
$this->tpl = __DIR__ . '/currency_tpl/currency.php';
$this->run();//вызываем метод
}
protected function run(){ //создаем метод основной
$this->$currencies = App::$app->getProperty('currencies');
$this->$currency = App::$app->getProperty('currency');
echo $this->getHtml();
}
public static function getCurrencies(){//список валют
return \R::getAssoc("SELECT code, title, symbol_left, symbol_right, value, base FROM currency ORDER BY base DESC");//возвращаем в метод из библиотеки, данные по столбцам меняя их порядокк с пр на лев
}
public static function getCurrency($currencies){//активная валюта
if(isset($_COOKIE['currency']) && array_key_exists($_COOKIE['currency'], $currencies)){//если в куки в реесторе валют есть ключь currency
$key = $_COOKIE['currency'];//помещаем тогда в массив
}else{
$key = key($currencies);//если нет то берем из ключа выбранной валюты
}
$currency = $currencies[$key];//и помещаем $key(выбранная валюта) вместе со всеми данными из нее в $currency
$currency['code'] = $key;//присваеваем выбр валюте погоняло 'code'
return $currency;//возвращаем записанный массив
}
protected function getHtml(){//формирует html разметку
ob_start();//буферизация, для не отображения самой функции
require_once $this->tpl;//подключаем шаблон с прописаным путем
return ob_get_clean();//возвращаем проработанные данные обратно
}
}
<option value="" class="label"><?=$this->currency['code'];?></option><!-- указываем код массива -->
<?php foreach($this->currencies as $k => $v): ?><!-- проходимся по реестору -->
<?php if($k != $this->currency['code']): ?>проверяем какая валюта активная
<option value="<?=$k;?>"><?=$k;?></option><!-- показываем ключ -->
<?php endif; ?>
<?php endforeach; ?>
html шаблон
<div class="col-md-6 top-header-left">
<div class="drop">
<div class="box">
<select tabindex="4" class="dropdown drop">
<?php new \app\widgets\currenc\Currency(); ?>
</select>
</div>
Ответы (1 шт):
Автор решения: Simon
→ Ссылка
ну как минимум при беглом осмотре, вот это:
protected function run(){ //создаем метод основной
$this->$currencies = App::$app->getProperty('currencies');
$this->$currency = App::$app->getProperty('currency');
echo $this->getHtml();
}
имеет лишние $, должно быть:
protected function run(){
$this->currencies = App::$app->getProperty('currencies');
$this->currency = App::$app->getProperty('currency');
echo $this->getHtml();
}