В последнее время очень часто встречается ситуация что при попытке войти в админ панель интернет магазина на 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
Возможно проблема в другом. Нужно индивидуально смотреть пациента.