Останнім часом дуже часто зустрічається ситуація що при спробі увійти в адмін панель інтернет магазину на 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.
Ну ось власне і все, тепер ви знаєте як побороти помилку входу в адмін панель пов'язану з оновленням курсу валют. Удачі вам.
Немає коментарів
Ви можете залишити коментар першим.