แปลโหมดการบำรุงรักษาต่อเว็บไซต์ในการตั้งค่าเว็บไซต์หลายเว็บไซต์


12

แปลโหมดบำรุงรักษาต่อเว็บไซต์ในการตั้งค่าโดเมนหลายเว็บไซต์

อะไรคือวิธีที่เหมาะสมในการแปล (แปล) หน้าการบำรุงรักษาในสภาพแวดล้อมหลายเว็บไซต์และหลายโดเมน?

การตั้งค่าถูกสร้างเป็น:

  • MAGENTO_ROOT / index.php
  • MAGENTO_ROOT / UK / 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

โดยค่าเริ่มต้นวีโอไอพีไม่สนับสนุนการแปลนอกกรอบสำหรับหน้าข้อผิดพลาดและต้องมีการปรับแต่งบางอย่างเพื่ออนุญาตสำหรับคุณสมบัติดังกล่าว ดังนั้นทางเทคนิคจึงไม่มีวิธีที่เหมาะสมในการทำเช่นนี้

เนื่องจากสแต็กเต็มไม่เริ่มต้นระหว่างการสร้างข้อผิดพลาดฟังก์ชันการแปลปกติ$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);

หมายเหตุเพิ่มเติม: เนื่องจาก stack ที่ ณ เวลาปัจจุบันอาจไม่อนุญาตให้มีการVarien_File_Csvรวมคลาสโดยใช้ฟังก์ชัน PHP ภายในfgetcsvอาจเป็นทางเลือกที่ดีกว่า

และแยกไฟล์ภาษา CSV ที่จำเป็นในการเติมข้อมูลที่ต้องการในprocess.phpไฟล์

อีกทางเลือกหนึ่งคือเพียงเพิ่ม Google แปลหรือเครื่องมือของบุคคลที่สามเพื่อแปลหน้าข้อผิดพลาดเป็นภาษาของผู้ใช้โดยอัตโนมัติ

อ้างอิง:


2

ดังที่ได้กล่าวไว้ก่อนหน้านี้ไม่มีวิธีที่ง่ายในการแปลหน้าบำรุงรักษา อย่างไรก็ตามมีวิธีแก้ไขปัญหาหนึ่งวิธี (ซึ่งมีจำนวนข้อดี / ข้อเสีย) - ใช้ส่วนขยายของโหมดการบำรุงรักษาบางส่วนเช่นอันนี้:

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

มันแสดงหน้าโหมดการบำรุงรักษาหลังจากโหลด Magento stack ซึ่งหมายความว่าคุณต้องมีการเชื่อมต่อฐานข้อมูลและสิ่งอื่น ๆ เพราะการที่มันช้าลงและต้องใช้ทรัพยากรมากขึ้น แต่ถ้ามันไม่ใช่ปัญหาสำหรับคุณก็จะแสดงหน้าการบำรุงรักษาที่ปรับแต่งได้อย่างเต็มที่


อะไรจะเป็นผลลัพธ์ถ้านั่นคือการเชื่อมต่อกับฐานข้อมูลจะถูกขัดจังหวะ?
เมื่อ

1
ฉันบอกว่ามันเป็นวิธีแก้ปัญหาและไม่เหมาะสำหรับทุกกรณี หากฐานข้อมูลไม่มี Magento จะแสดงข้อความแสดงข้อผิดพลาด
Pronto

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.phplocal.xml
  • มันยังคงต้องใช้ไฟล์เทมเพลตสำหรับทุกภาษา (ไม่มีการแปลในขณะนี้ - อาจจะภายหลัง )

การตั้งค่าพื้นฐาน

หลายเว็บไซต์หลายร้านตั้งค่าเช่นนี้เท่านั้นที่แตกต่างมันคือการที่ฉันได้ตั้ง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;
}

แก้ไข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>ในระดับแรกให้มองหาเว็บไซต์ runcode / 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 / ภาพที่ซ้ำกัน

  • ใส่ไฟล์ CSS / images เฉพาะเว็บไซต์ของคุณลงในไดเรกทอรีเดียวและเพิ่ม<skin_base>โหนดlocal.xml
  • เปลี่ยนลิงก์คงที่ทั้งหมดในpage.phtmlไฟล์จากเช่นhref="css/styles.css"เป็น<?php echo $this->getSkinBaseUrl('css/styles.css')?>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.