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