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

12

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

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

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

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

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

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

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

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

Ссылки:

B00MER
источник
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')?>
sv3n
источник