В последнее время очень часто встречается ситуация что при попытке войти в админ панель интернет магазина на opencart страница зависает а потом выдает разнообразные ошибки, к примеру может выдать ошибку 500 или 504, то есть сработал таймаут по времени и соединение было сброшено.
С чем связанна ошибка входа в админ панель Opencart?
Все просто, если у вас в магазине несколько видов валют, то вам хочется чтоб курс валют обновлялся автоматически, есть специально такая функция которая обновляет при каждом входе в админку магазина курс валют из сервиса Yahoo. Можно или включить автоматическое обновление или же отключить его.
Если у вас автоматическое обновление валют в opencart включено то ваш магазин при заходе в админ панель пытается обновить курс валют и обращается к вышеуказанному сервису, который как раз и вызывает данную ошибку.
Если вам автоматическое обновление курса валют не нужно, Вы меняете курс валют самостоятельно, то самое простое решение это отключить обновление валют в админ панели opencart. Но так как вы не можете войти в админ панель чтобы отключить, то просто перейдите в любой другой раздел, и после перейдите в настройки и отключите обновление, к примеру можно зайти на страницу категорий так:
1 |
http://vach-domen.ru/admin/index.php?route=catalog/category&token=9dd715885c7c3d38fac8e4ada1bf4039 |
Так как в примере указан совсем иной токен то вас попросят пройти авторизацию снова, после авторизации вы попадете сразу в раздел категории, после идите в настройки и в разделе локализация отключите Автоматическое обновление валют, страница скорей всего опять зависнет, но не страшно настройки сохранятся и вы сможете после уже входить как обычно.
Но что делать если автоматическое обновление валют для Вас важно?
В таком случае есть несколько вариантов исправления данной ситуации, и сейчас мы рассмотрим каждый из методов как исправить ошибку входа в админ панель в opencart.
1. И так, рассмотрим первый вариант решения проблем с входом в админ панель:
Нашей задачей будет внести изменения в файл /admin/model/localisation/currency.php, нам потребуется добавить return в запрос вызова. ( PS: return возвращает результат работы функции в то место, где она была вызвана.)
И так мы открыли вышеуказанный файл и находим в нем примерно в 104 строке:
1 |
public function updateCurrencies($force = false) { |
и сразу же под данной строкой вставляем:
1 |
return; |
То есть мы полностью отключаем автоматическое обновление валют. ( Для тех кому автоматическое обновление все же нужно данный метод не подходит).
Обратите внимания - что в некоторых версиях код может отличатся немного, к примеру вышеуказанная функция updateCurrencies может быть без $force = false, но это не важно и return все равно вставляем под данной функцией.
2. Теперь давайте рассмотрим второй вариант решения проблем входа в админ панель магазина.
В данном примере мы указываем время при котором в случае зависания обновления из Yahoo разрывать и пропускать попытку обновления а сразу же переходить в административную панель магазина. Для этого метода открываем все тот же файл /admin/model/localisation/currency.php и в нем находим строку:
1 |
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); |
И стразу же после нее вставляем:
1 2 |
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 4); //Ждем 4 секунды, после переходим в админку curl_setopt($curl, CURLOPT_TIMEOUT,4); |
3. Ну и самым последним третьим вариантом будет не редактирование и подстраивание под сервис Yahoo, а полностью изменяем автоматическое обновление курсов валют opencart из Yahoo на ЦБРФ. То есть теперь Opencart будет обновляться из курсов Центрального банка России.
Данный метод был любезно предоставлен одним из пользователей русскоязычного форума Opencart.
И так, для того чтобы сделать обновление курсов валют с ЦБРФ в opencart, Вам потребуется все тот же /admin/model/localisation/currency.php , только мы не будем изменять какие то участки кода в нем а удаляем в нем все полностью и заменяем все содержимое кодом ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 |
<?php class ModelLocalisationCurrency extends Model { public function addCurrency($data) { $this->db->query("INSERT INTO " . DB_PREFIX . "currency SET title = '" . $this->db->escape($data['title']) . "', code = '" . $this->db->escape($data['code']) . "', symbol_left = '" . $this->db->escape($data['symbol_left']) . "', symbol_right = '" . $this->db->escape($data['symbol_right']) . "', decimal_place = '" . $this->db->escape($data['decimal_place']) . "', value = '" . $this->db->escape($data['value']) . "', status = '" . (int)$data['status'] . "', date_modified = NOW()"); $this->cache->delete('currency'); } public function editCurrency($currency_id, $data) { $this->db->query("UPDATE " . DB_PREFIX . "currency SET title = '" . $this->db->escape($data['title']) . "', code = '" . $this->db->escape($data['code']) . "', symbol_left = '" . $this->db->escape($data['symbol_left']) . "', symbol_right = '" . $this->db->escape($data['symbol_right']) . "', decimal_place = '" . $this->db->escape($data['decimal_place']) . "', value = '" . $this->db->escape($data['value']) . "', status = '" . (int)$data['status'] . "', date_modified = NOW() WHERE currency_id = '" . (int)$currency_id . "'"); $this->cache->delete('currency'); } public function deleteCurrency($currency_id) { $this->db->query("DELETE FROM " . DB_PREFIX . "currency WHERE currency_id = '" . (int)$currency_id . "'"); $this->cache->delete('currency'); } public function getCurrency($currency_id) { $query = $this->db->query("SELECT DISTINCT * FROM " . DB_PREFIX . "currency WHERE currency_id = '" . (int)$currency_id . "'"); return $query->row; } public function getCurrencyByCode($currency) { $query = $this->db->query("SELECT DISTINCT * FROM " . DB_PREFIX . "currency WHERE code = '" . $this->db->escape($currency) . "'"); return $query->row; } public function getCurrencies($data = array()) { if ($data) { $sql = "SELECT * FROM " . DB_PREFIX . "currency"; $sort_data = array( 'title', 'code', 'value', 'date_modified' ); if (isset($data['sort']) && in_array($data['sort'], $sort_data)) { $sql .= " ORDER BY " . $data['sort']; } else { $sql .= " ORDER BY title"; } if (isset($data['order']) && ($data['order'] == 'DESC')) { $sql .= " DESC"; } else { $sql .= " ASC"; } if (isset($data['start']) || isset($data['limit'])) { if ($data['start'] < 0) { $data['start'] = 0; } if ($data['limit'] < 1) { $data['limit'] = 20; } $sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit']; } $query = $this->db->query($sql); return $query->rows; } else { $currency_data = $this->cache->get('currency'); if (!$currency_data) { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "currency ORDER BY title ASC"); foreach ($query->rows as $result) { $currency_data[$result['code']] = array( 'currency_id' => $result['currency_id'], 'title' => $result['title'], 'code' => $result['code'], 'symbol_left' => $result['symbol_left'], 'symbol_right' => $result['symbol_right'], 'decimal_place' => $result['decimal_place'], 'value' => $result['value'], 'status' => $result['status'], 'date_modified' => $result['date_modified'] ); } $this->cache->set('currency', $currency_data); } return $currency_data; } } public function updateCurrencies() { $query = $this->db->query("SELECT date_modified FROM " . DB_PREFIX . "currency WHERE code != '" . $this->db->escape($this->config->get('config_currency')) . "'"); $cc_value = $this->db->query("SELECT value FROM " . DB_PREFIX . "currency WHERE code = '" . $this->db->escape($this->config->get('config_currency')) . "'"); $i = 0; foreach ($query->rows as $mdate) { if($this->db->escape(date('Y-m-d',strtotime($mdate['date_modified']))) < $this->db->escape(date('Y-m-d', strtotime('now')))) $i++; } $manual_update = isset($this->request->post['manual_update']) ? $this->request->post['manual_update'] : false; if ($i || $cc_value->row['value'] != 1.00000 || $manual_update) { $url = 'http://www.cbr.ru/scripts/XML_daily.asp'; $answer = $this->CheckHttpStatus($url); $this->log->write('Обновление валют: '); if ($answer != 200) { $this->log->write(" > не удалось загрузить курсы валют, ответ сервера:" . $answer); } else { if (extension_loaded('curl')) { $data = array(); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://www.cbr.ru/scripts/XML_daily.asp'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $content = curl_exec($ch); curl_close($ch); $doc = new DOMDocument(); $doc->loadXML($content); $root = $doc->documentElement; $curs_date = $root->getAttribute('Date'); $this->log->write(" > успешно загружены курсы валют на: ". $curs_date); $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "currency WHERE code != '" . $this->db->escape($this->config->get('config_currency')) . "'"); $valutes = $doc->getElementsByTagName("Valute"); $ret = array(); foreach( $valutes as $valute ) { $icn = $valute->childNodes; $code = $icn->item(1)->nodeValue; $nom = intval($icn->item(2)->nodeValue); $value = floatval(str_replace(",", "." , $icn->item(4)->nodeValue)); $ret[$code] = ($value/$nom); } $cur_val = $this->config->get('config_currency'); if ($cur_val == 'RUB') { foreach ($query->rows as $result) { if($ret[$result['code']]){ $value = 1 / $ret[$result['code']]; if ((float)$value) { $this->db->query("UPDATE " . DB_PREFIX . "currency SET value = '" . (float)$value . "', date_modified = NOW() WHERE code = '" . $this->db->escape($result['code']) . "'"); } } } } else { foreach ($query->rows as $result) { if($result['code'] == 'RUB') { $value = $ret[$cur_val]; if ((float)$value) { $this->db->query("UPDATE " . DB_PREFIX . "currency SET value = '" . (float)$value . "', date_modified = NOW() WHERE code = 'RUB'"); } } else { $value = $ret[$result['code']]; if ((float)$value) { $val = (float)$ret[$cur_val] / (float)$value; $this->db->query("UPDATE " . DB_PREFIX . "currency SET value = '" . $val . "', date_modified = NOW() WHERE code = '" . $this->db->escape($result['code']) . "'"); } } } } $this->db->query("UPDATE " . DB_PREFIX . "currency SET value = '1.00000', date_modified = NOW() WHERE code = '" . $this->db->escape($this->config->get('config_currency')) . "'"); $this->cache->delete('currency'); } } } } public function CheckHttpStatus($url) { $user_agent = 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_VERBOSE, false); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSLVERSION, 3); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $page = curl_exec($ch); $err = curl_error($ch); if (!empty($err)) return $err; $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); return $httpcode; } public function getTotalCurrencies() { $query = $this->db->query("SELECT COUNT(*) AS total FROM " . DB_PREFIX . "currency"); return $query->row['total']; } } ?> |
Теперь при каждом вашем входе в административную панель магазина, сайт будет обновлять курс валют из XML файла который формируется центральным банком России.
PS: Обратите внимание, для использования данного метода у вас на хостинге должны быть подключены к PHP такие модули как curl и simplexml.
Ну вот собственно и все, теперь вы знаете как побороть ошибку входа в админ панель связанную с обновлением курса валют. Удачи Вам.
2 комментария
не работает почему то на OC 1.5
Возможно проблема в другом. Нужно индивидуально смотреть пациента.