Перевести режим обслуживания для каждого веб-сайта при настройке нескольких веб-сайтов и нескольких доменов

magento.stackexchange https://magento.stackexchange.com//questions/88988

Вопрос

Перевести режим обслуживания для каждого веб-сайта при настройке нескольких веб-сайтов и нескольких доменов

Что правильный способ перевода (локализации) страницы обслуживания в среде с несколькими веб-сайтами и несколькими доменами?

Настройка сделана в:

  • MAGENTO_ROOT/index.php
  • MAGENTO_ROOT/uk/index.php
  • MAGENTO_ROOT/us/index.php
  • MAGENTO_ROOT/somecode/index.php

Предположим, что магазины доступны через:

Я легко вижу несколько решений для этой проблемы, но все они кажутся скорее обходным путем, чем настоящими красивыми и чистыми решениями.

Как вы решаете эту проблему?

Это было полезно?

Решение

По умолчанию 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 для изменения макета.Кажется, это намеренный способ, но он не задокументирован (пока)...

  1. Добавьте несколько правил перезаписи в свой .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]
    
  2. Копировать errors/default к errors/french

  3. Измените/переведите файлы шаблонов под свои нужды

Возможно, немного поздно, но хороший рабочее решение, без копирования 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')?>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top