Перевести режим обслуживания для каждого веб-сайта при настройке нескольких веб-сайтов и нескольких доменов
-
13-12-2019 - |
Вопрос
Перевести режим обслуживания для каждого веб-сайта при настройке нескольких веб-сайтов и нескольких доменов
Что правильный способ перевода (локализации) страницы обслуживания в среде с несколькими веб-сайтами и несколькими доменами?
Настройка сделана в:
- MAGENTO_ROOT/index.php
- MAGENTO_ROOT/uk/index.php
- MAGENTO_ROOT/us/index.php
- MAGENTO_ROOT/somecode/index.php
Предположим, что магазины доступны через:
- http://MagentoExample.com/index.php (по умолчанию)
- http://MagentoExample.uk/ (Великобритания)
- http://MagentoExample.us/ (нас)
- http://MagentoExample.com (какой-то)
Я легко вижу несколько решений для этой проблемы, но все они кажутся скорее обходным путем, чем настоящими красивыми и чистыми решениями.
Как вы решаете эту проблему?
Решение
По умолчанию Magento не поддерживает готовый перевод страниц с ошибками и требует некоторых настроек для реализации таких функций.Так что технически нет правильный способ сделать такое.
Поскольку полный стек НЕ инициализируется во время генерации ошибки, нормальная функциональность перевода $this->__('foobar');
не будет работать в шаблонах.
Некоторые подробности о том, как генерируются страницы ошибок, можно найти на MageBase:
Один из вариантов — просто скопировать errors/
в каждый из ваших подкаталогов на ваших языках uk
, us
, и т. д.и измените шаблоны, чтобы они отражали языки точки входа на веб-сайт конечного пользователя.
Просто отметьте свой index.php
каждого представления, чтобы включить дополнительные документы по относительным ошибкам:
if (file_exists($maintenanceFile)) {
include_once dirname(__FILE__) . '/errors/503.php';
exit;
}
Также имейте в виду, что существует базовый шаблон для всех ошибок, включая 404 в page.html
Вероятно, есть более элегантные решения, но поскольку вы уже дублируете index.php
для разных представлений еще несколько файлов не будут слишком загромождать.Вы также можете изменить шаблоны, включив в них CSS верхнего уровня и изображения, чтобы избежать некоторой избыточности.
Вы также можете создать языковой файл так же, как вы это делаете в стандартной локализации Magento, и прочитать значения с помощью process.php
файл, так как там задаются заголовок и некоторые другие данные, которые потребуют локализации.Простой пример использования Varien_File_Csv для чтения языкового файла .CSV:
$csvObject = new Varien_File_Csv();
$csvObject->getData($file);
Дополнительное примечание:Поскольку стек в текущий момент времени выполнения может не допускать Varien_File_Csv
включение класса с использованием внутренней функции PHP fgetcsv может быть лучшей альтернативой.
И проанализируйте языковой CSV-файл, необходимый для заполнения необходимых данных в process.php
файл.
Другой альтернативой было бы просто добавить Google Translate или другой сторонний инструмент для автоматического перевода страниц с ошибками на язык конечного пользователя.
Использованная литература:
Другие советы
Как уже упоминалось, прежде чем нет простого способа перевести страницу обслуживания.Однако для этого есть один обходной путь (у которого есть собственное количество преимуществ / недостатков) - используйте некоторые расширения режима обслуживания, такие как этот:
http://www.magentocommerce.com/magento-connect/store-Обслуживание .html
Это отображает страницу режима обслуживания после загрузки стека Magento, что означает, что вам нужно иметь соединение с базой данных и еще несколько других вещей.Из-за того, что это также медленнее и требует большего количества ресурсов.Но если для вас это не проблема, он делает страницу обслуживания полностью настраиваемой.
Обновлять:
Нашел другой способ перевода страницы обслуживания:
https://github.com/OpenMage/magento-lts/blob/1.9.3.x/errors/processor.php#L160-L162
if (isset($_GET['skin'])) {
$this->_setSkin($_GET['skin']);
}
Конструктор страницы обслуживания принимает skin
Параметр POST для изменения макета.Кажется, это намеренный способ, но он не задокументирован (пока)...
Добавьте несколько правил перезаписи в свой
.htaccess
который добавляетskin
параметр для вашего URL.Например.RewriteCond %{HTTP_HOST} ^french.example.com$ RewriteCond %{DOCUMENT_ROOT}/.maintenance.flag -f RewriteCond %{QUERY_STRING} !(^|&)skin=french(&|$) [NC] RewriteRule ^ %{REQUEST_URI}?skin=french[L]
Копировать
errors/default
кerrors/french
- Измените/переведите файлы шаблонов под свои нужды
Возможно, немного поздно, но хороший рабочее решение, без копирования error
каталог для каждой подпапки...
«Минусы»:
- вам нужно отредактировать три основных файла.Чтобы избежать правок в ядре, насколько это возможно, я просто изменил путь к страницам ошибок/отчетов и расширил
processor.php
прочитать модифицированныйlocal.xml
. - для каждого языка по-прежнему требуются файлы шаблонов (перевода на данный момент нет – может быть позже)
Базовая настройка
Настройка нескольких веб-сайтов и нескольких магазинов вот так, с той лишь разницей, что я установил MAGE_RUN_CODE
в .htaccess
вместо index.php
.Для 1-го домена я использую no RUN_CODE
все остальные так выглядят...
RewriteCond %{HTTP_HOST} ^www.example.com$
RewriteRule .* - [E=MAGE_RUN_CODE:website1]
RewriteCond %{HTTP_HOST} ^www.example.com$
RewriteRule .* - [E=MAGE_RUN_TYPE:website]
В дополнение к связанному ответу мне пришлось установить RewriteBase
в .htaccess
чтобы соответствовать каталогу локали и редактировать index.php
в en
, fr
и изменить
$maintenanceFile = 'maintenance.flag';
...
if (file_exists($maintenanceFile)) {
include_once dirname(__FILE__) . '/errors/503.php';
exit;
}
к
$maintenanceFile = '../maintenance.flag';
...
if (file_exists($maintenanceFile)) {
include_once '../errors/503.php';
exit;
}
Редактировать errors/404.php
, 503.php
и report.php
Заменять
require_once 'processor.php';
$processor = new Error_Processor();
с
require_once 'processor_multiwebsite.php';
$processor = new Error_Processor_Multiwebsite();
И добавьте это в errors/processor_multiwebsite.php
<?php
require_once 'processor.php';
class Error_Processor_Multiwebsite extends Error_Processor
{
const DEFAULT_RUNCODE = 'default';
const DEFAULT_LOCALE = 'default';
/**
* Magento run code
*
* @var string
*/
protected $_runCode;
/**
* Magento run code
*
* @var string
*/
protected $_locale;
public function __construct()
{
$this->_runCode = self::DEFAULT_RUNCODE;
if (isset($_SERVER['MAGE_RUN_CODE'])) {
$this->_runCode = $_SERVER['MAGE_RUN_CODE'];
}
$this->_locale = self::DEFAULT_LOCALE;
$path = array_filter(explode('/', str_replace('index.php', '', $_SERVER['SCRIPT_NAME'])));
if (end($path)) {
$this->_locale = end($path);
}
parent::__construct();
}
/**
* Retrieve skin URL
*
* @return string
*/
public function getSkinUrl()
{
$baseUrl = str_replace($this->_locale . '/', '', $this->getBaseUrl());
return $baseUrl . self::ERROR_DIR. '/' . $this->_config->skin . '/';
}
/**
* Retrieve skin base URL
*
* @return string
*/
public function getSkinBaseUrl($file)
{
return $this->_config->skin_base ? "../{$this->_config->skin_base}/{$file}" : $file;
}
/**
* Prepare config data
*/
protected function _prepareConfig()
{
parent::_prepareConfig();
$local = $this->_loadXml(self::MAGE_ERRORS_LOCAL_XML);
if (!is_null($local)) {
if ((string)$local->{$this->_runCode}->{$this->_locale}->skin) {
$this->_config->skin = (string)$local->{$this->_runCode}->{$this->_locale}->skin;
}
# add skin base URL
if ((string)$local->{$this->_runCode}->{$this->_locale}->skin_base) {
$this->_config->skin_base = (string)$local->{$this->_runCode}->{$this->_locale}->skin_base;
}
}
}
}
Новый local.xml
состав
Вместо установки<skin>
на первом уровне сначала найдите код/локаль веб-сайтов
<?xml version="1.0"?>
<config>
<!-- 1st domain w/o runcode -->
<default>
<!-- no locale sub dir -->
<default>
<skin>default-default</skin>
...
</default>
<en>
<skin>default-en</skin>
<skin_base>default-default</skin_base>
...
</en>
<fr>
<skin>default-fr</skin>
<skin_base>default-default</skin_base>
...
</fr>
</default>
<!-- runcode website1 -->
<website1>
<!-- no locale sub dir -->
<default>
<skin>website1-default</skin>
...
</default>
...
</website1>
</config>
Шаблоны
Добавлять 503.phtml
, ..., CSS для сопоставления каталогов <runcode>-<locale>
default-default
(язык по умолчанию для 1-го домена)default-en
default-fr
website1-default
(язык по умолчанию для второго домена)- ...
Никаких дубликатов CSS/изображений.
- поместите файлы CSS/изображений вашего сайта в один каталог и добавьте
<skin_base>
узел дляlocal.xml
- изменить ВСЕ статический ссылки в
page.phtml
файлы из i.e.href="css/styles.css"
к<?php echo $this->getSkinBaseUrl('css/styles.css')?>