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


12

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

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

Установка сделана в:

  • MAGENTO_ROOT / index.php
  • MAGENTO_ROOT / ик / index.php
  • MAGENTO_ROOT / нам / index.php
  • MAGENTO_ROOT / somecode / index.php

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

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

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


Вы пытались использовать эти расширения? magentocommerce.com/magento-connect/… magentocommerce.com/magento-connect/easy-site-maintenance.html
MagenX

Ответы:


10

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

Ссылки:


2

Как упоминалось ранее, нет простого способа перевести страницу обслуживания. Однако для этого есть один обходной путь (который имеет свои преимущества / недостатки) - используйте некоторые расширения режима обслуживания, такие как этот:

http://www.magentocommerce.com/magento-connect/store-maintenance.html

Он отображает страницу режима обслуживания ПОСЛЕ загрузки стека Magento, а это значит, что вам нужно подключение к базе данных и несколько других вещей. Из-за этого он также медленнее и требует больше ресурсов. Но если для вас это не проблема, страница технического обслуживания полностью настраивается.


Каким будет выход, если соединение с базой данных будет прервано?
versedi

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

2

Обновить:

Найден другой способ для переведенной страницы обслуживания:

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каталога в каждую подпапку ...

"Downsides":

  • Вы должны отредактировать три основных файла. Чтобы максимально избежать внесения изменений в ядро, я просто изменил путь страниц с сообщениями об ошибках и отчетами и расширил их, processor.phpчтобы прочитать измененные local.xml.
  • все еще требуются файлы шаблонов для каждого языка (без перевода на данный момент - возможно, позже )

Базовая настройка

Multi-сайт мульти-магазин установка , как это, только differnce является то , что я поставил MAGE_RUN_CODEв .htaccessвместо index.php. Для 1-го домена я не использую 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;
}

Edit 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 (2-й домен по умолчанию язык)
  • ...

Нет повторяющихся CSS / изображений

  • поместите файлы CSS / изображений вашего сайта в один каталог и добавьте <skin_base>узел вlocal.xml
  • изменить ВСЕ статические ссылки в page.phtmlфайлах с т.е. href="css/styles.css"на<?php echo $this->getSkinBaseUrl('css/styles.css')?>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.