multiwebsite-multidomainセットアップでWebサイトごとにメンテナンスモードを変換します


12

マルチWebサイトとマルチドメインのセットアップでWebサイトごとにメンテナンスモードを変換する

マルチウェブサイトおよびマルチドメイン環境でメンテナンスページを翻訳(ローカライズ)する適切な方法は何ですか?

セットアップの作成:

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

ストアは次の方法でアクセスできると仮定します。

私は簡単にそれに対するいくつかの解決策を見ることができますが、それらのすべては実際の素敵できれいな解決策よりも回避策のようです。

この問題をどのように解決しますか?


回答:


10

デフォルトでは、Magentoはエラーページに対してすぐに使用できる翻訳をサポートしていません。そのような機能を使用するには、カスタマイズが必要です。そのため、技術的には適切な方法はありません。

完全なスタックはエラー生成中に初期化されないため、通常の翻訳機能$this->__('foobar');はテンプレートでは機能しません。

エラーページの生成方法に関する詳細は、MageBaseで確認できます。

1つのオプションは、単純にコピーすることでerrors/、あなたの言語のあなたのサブディレクトリのそれぞれにukusなどとエンドユーザーのウェブサイトのエントリポイントの言語を反映するために、テンプレートを変更します。

index.php各ビューのサブ相対エラードキュメントを含めるように注意してください:

if (file_exists($maintenanceFile)) {
    include_once dirname(__FILE__) . '/errors/503.php';
    exit;
}

また、すべてのエラーのベーステンプレートがあることに注意してください。 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翻訳またはサードパーティのツールを追加するだけで、エラーページがエンドユーザーの言語に自動的に翻訳されます。

参照:


2

前述したように、メンテナンスページを翻訳する簡単な方法はありません。ただし、1つの回避策があります(独自の利点/欠点がいくつかあります)。次のようなメンテナンスモードの拡張機能を使用します。

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. URLにパラメーターを.htaccess追加する書き換えルールをいくつか 追加しskinます。例えば。

    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/defaulterrors/french

  3. テンプレートファイルをニーズに合わせて変更/翻訳する

少し遅れているかもしれませんが、ディレクトリをすべてのサブフォルダにコピーせずに、うまく機能するソリューションerror...

「欠点」:

  • 3つのコアファイルを編集する必要があります。コアでの編集を可能な限り回避するために、エラー/レポートページのインクルードパスを変更し、変更されたprocessor.phpを読み取るように拡張しましたlocal.xml
  • 依然としてすべての言語のテンプレートファイルが必要です(現時点では翻訳なし- おそらく後で

基本設定

このようなマルチウェブサイトのマルチストア設定、違いはMAGE_RUN_CODE、の.htaccess代わりに設定したことだけですindex.php。最初のドメイン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.phpenfr変更する必要がありました

$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.php503.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>最初のレベルで設定する代わりに、最初にWebサイトのrunco​​de / localeを探します

<?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 /画像の重複なし

  • Webサイト固有のCSS / imagesファイルを1つのディレクトリに配置し、<skin_base>ノードを追加しますlocal.xml
  • 変更ALLは、静的の中にリンクpage.phtmlすなわちからファイルhref="css/styles.css"<?php echo $this->getSkinBaseUrl('css/styles.css')?>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.