Магазин Opencart меняет php-код

Есть ли какой-нибудь php-код для смены магазина? Так, например, если php обнаружит, что язык испанский, я бы хотел, чтобы он изменил весь магазин на другой магазин.

Таким образом, его можно использовать, например, в любое время при изменении языка - тогда также изменяется хранилище. Так, например, если кто-то просматривает store1 на английском языке и меняет язык на испанский, тогда автоматически store1 также меняется на store2 вместе с языком. Есть идеи?


person Milkli    schedule 22.08.2017    source источник
comment
Теоретически вы можете использовать перенаправление Javascript, которое выполняется при изменении события выбора языка. Я предполагаю, что URL-адреса магазинов разные?   -  person Daniel    schedule 23.08.2017
comment
Да, URL разные - магазины будут установлены на разных доменах или просто на некоторых поддоменах. Вероятно, вы правы с этим кодом Javascript, но мне кажется, что мне сложно его написать.   -  person Milkli    schedule 23.08.2017
comment
Почему бы вам не поделиться URL-адресом магазина, чтобы любой, кто ищет, мог поделиться своим мнением, или, по крайней мере, файл catalog/view/theme/<<themname>>/common/header.tpl (или .twigg), который должен отображать селектор языка. Я могу помочь с кодом для шаблона по умолчанию, но если вы его не используете и плохо разбираетесь в коде, вам все равно может быть сложно.   -  person Daniel    schedule 23.08.2017
comment
Я не могу поделиться URL-адресом, потому что у меня еще нет магазина и домена :) Я тестирую некоторые модули и решения с базовым шаблоном, и когда все, что я хочу, будет выполнено, будет создан новый магазин. Я считаю, что если бы у меня был фрагмент кода, работающий с базовым магазином и шаблоном по умолчанию, я мог бы применить его к любому новому магазину. Итак, если язык es, измените store на store1.example.com, если код языка aaa измените на store2... - это то, что мне нужно.   -  person Milkli    schedule 23.08.2017
comment
Хорошо, если вы уверены в реализации на основе примера, какую версию OC вы используете?   -  person Daniel    schedule 23.08.2017
comment
2.2, я куплю тебе чашку хорошего кофе, если это удастся   -  person Milkli    schedule 23.08.2017
comment
Поиграв с одним из моих тестовых сайтов, я подумал, что может быть проще иметь свою собственную HTML-разметку с полем со списком, каждое значение параметра будет иметь URL-адрес магазина, и после этого может быть простой сценарий. Как вы думаете?   -  person Daniel    schedule 23.08.2017
comment
Если бы существовало поле со списком для смены магазинов, нужно было бы удалять языковые изменения в магазине в верхней части любой страницы, а затем добавлять код для определенного изменения языка каждый раз при смене магазина. Это то же самое, но наоборот. Было бы проще добавить простой код для изменения хранилища каждый раз при смене языка. Но он должен сохранять определенные страницы, поэтому, когда у нас есть store1.example.com/product-aaa, мы должны получить после смены языка store2.example.com/product-aaa.   -  person Milkli    schedule 23.08.2017
comment
Это идеальное решение, я поиграл с существующим переключателем языка, и это не так просто. Попытка использовать event.preventDefault(); оказалась безуспешной. Я не знаю, как часто вы планируете добавлять или удалять языки, но это довольно простая задача по сравнению с написанием одной строки в заголовочном файле каждого шаблона магазина. Возможно, у кого-то есть лучшее решение?   -  person Daniel    schedule 23.08.2017


Ответы (1)


Если вы откроете файл: index.php или startup.php (в зависимости от используемой вами версии OpenCart), вы увидите, что есть код, который проверяет URL-адрес, который посетил пользователь, а затем выполняет поиск в базе данных, чтобы узнать, является ли это магазином по умолчанию. (store_id = 0) или другой магазин. Если это магазин по умолчанию, то ничего не меняется. Если это не так, то переменная сеанса (store_id) изменяется на указанный store_id, и весь opencart будет работать на основе этого store_id.

OpenCart 1.5.x index.php

// Store
if (isset($_SERVER['HTTPS']) && (($_SERVER['HTTPS'] == 'on') || ($_SERVER['HTTPS'] == '1'))) {
    $store_query = $db->query("SELECT * FROM " . DB_PREFIX . "store WHERE REPLACE(`ssl`, 'www.', '') = '" . $db->escape('https://' . str_replace('www.', '', $_SERVER['HTTP_HOST']) . rtrim(dirname($_SERVER['PHP_SELF']), '/.\\') . '/') . "'");
} else {
    $store_query = $db->query("SELECT * FROM " . DB_PREFIX . "store WHERE REPLACE(`url`, 'www.', '') = '" . $db->escape('http://' . str_replace('www.', '', $_SERVER['HTTP_HOST']) . rtrim(dirname($_SERVER['PHP_SELF']), '/.\\') . '/') . "'");
}

if ($store_query->num_rows) {
    $config->set('config_store_id', $store_query->row['store_id']);
} else {
    $config->set('config_store_id', 0);
}

OpenCart 2.x / 3.x - catalog/controller/startup/startup.php

// Store
        if ($this->request->server['HTTPS']) {
            $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "store WHERE REPLACE(`ssl`, 'www.', '') = '" . $this->db->escape('https://' . str_replace('www.', '', $_SERVER['HTTP_HOST']) . rtrim(dirname($_SERVER['PHP_SELF']), '/.\\') . '/') . "'");
        } else {
            $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "store WHERE REPLACE(`url`, 'www.', '') = '" . $this->db->escape('http://' . str_replace('www.', '', $_SERVER['HTTP_HOST']) . rtrim(dirname($_SERVER['PHP_SELF']), '/.\\') . '/') . "'");
        }

        if (isset($this->request->get['store_id'])) {
            $this->config->set('config_store_id', (int)$this->request->get['store_id']);
        } else if ($query->num_rows) {
            $this->config->set('config_store_id', $query->row['store_id']);
        } else {
            $this->config->set('config_store_id', 0);
        }

Таким образом, вы можете расширить этот код, и вы проверите язык браузера и на основе каждого языка измените store_id на тот, который вам нужен.

Ниже приведен пример кода, он не идеален, но он даст вам представление о том, как реализовать его самостоятельно.

$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);

switch ($lang){
    case "fr":
$this->config->set('config_store_id', 1);
        break;
    case "it":
$this->config->set('config_store_id', 2);
        break;
    case "en":
$this->config->set('config_store_id', 3);
        break;   
    case "el":
$this->config->set('config_store_id', 4);
        break;        
    default:
        //else default store
$this->config->set('config_store_id', 0);
        break;
}

Надеюсь, приведенный выше ответ поможет вам. Это просто, но вам нужно понимать, как работает OpenCart. Также мой совет... "Не ждите готовых расширений, попробуйте сделать свое." ;)

Ваше здоровье!

person Konstantinos    schedule 23.08.2017
comment
Константинос, это не совсем то, что я хотел, но работает очень хорошо и очень помогает. Очень вероятно, что я буду использовать его вместо того, что хотел раньше. Спасибо. Предварительно думал, что возможно можно не только магазины менять, но и поддомены. Магазины работают на разных субдоменах, таких как store1.example.com, store2.example.com. Поэтому, когда я нахожусь в магазине1 и меняю его на язык, который приписывается магазину2, да, он также меняется на магазин2, но на первом поддомене (store1.example.com). Вероятно, должен быть способ одновременно изменить его на store2.example.com. - person Milkli; 26.08.2017
comment
Даже если это может быть нормально в некоторых обстоятельствах, это не может быть применено, если я хотел бы иметь магазины в разных доменах, таких как example1.com и example1.fr. один домен или поддомен для одного языка для одного магазина и все вместе в админ панели. Ваше решение работает практически как один язык для магазина, но только в пределах одного домена. - person Milkli; 26.08.2017
comment
Вы можете изменить код в соответствии с вашими потребностями. Например, если вы не хотите использовать один и тот же код для каждого магазина, вы можете отфильтровать выбранный store_id, а затем перенаправить или нет. Или вы можете иметь массив и проверить, правильно ли language = en и store_id = 0, без перенаправления, но если language = en и store_id = 3, то перенаправьте на store_id = 0. - person Konstantinos; 29.08.2017