storeviews หรือเว็บไซต์ต่าง ๆ ในโฟลเดอร์ย่อย


29

ลูกค้าต้องการให้ร้านค้าหลายร้านของเขาตั้งค่าเช่นนี้:

นี่เป็นตัวอย่าง แต่อาจมีโฟลเดอร์ย่อยที่แตกต่างกันมากมาย วิธีที่ดีที่สุดในการจัดการโฟลเดอร์ย่อยต่างๆสำหรับมุมมอง / เว็บไซต์ของร้านค้าที่ต่างกันคืออะไร

ฉันรู้ว่าหนึ่งในวิธีการแก้ปัญหาคือการสร้างโฟลเดอร์ย่อยที่เรียกว่าde, enฯลฯ และคัดลอก index.php และ .htaccess ลงในโฟลเดอร์ย่อยที่สอดคล้องกัน

อาจมีการแก้ไขปัญหาบางอย่าง (symlink สำหรับ index.php, การกำหนดค่า vHost แทนการใช้. htaccess) เพื่อลดการทำสำเนาไฟล์ แต่ฉันต้องการหาวิธีแก้ปัญหาที่ฉันไม่ต้องทำการเปลี่ยนแปลงใด ๆ ในระบบไฟล์ แต่เพียง จัดการทุกอย่างโดยการกำหนดค่า


UPDATE

เราตรวจสอบด้วยการสนับสนุนระดับองค์กรว่าวิธีที่ดีที่สุดในการทำเช่นนี้คือการสร้างโฟลเดอร์ย่อย

เราลงเอยด้วยการทำเช่นนี้:

  • สร้างไดเรกทอรี "languagefolders"
  • สร้างสำเนาของ index.php ภายในไดเรกทอรีพร้อมด้วย. htaccess และ symlink ที่ปรับปรุงแล้วไปยังโฟลเดอร์ Magento (แอพ /, errors /, ... )
  • สร้าง symlink "de", "en" ฯลฯ ภายในไดเรกทอรีรากของ Magento ที่ชี้ไปยังไดเรกทอรี "languagefolders"

วิธีนี้เราสามารถเพิ่มภาษาใหม่โดยสร้าง symlink ใหม่ (เช่น "fr")


เราทำเพียงแค่นี้เท่านั้นที่จะพบว่าเว็บไซต์ไม่สามารถหาผลิตภัณฑ์หรือหมวดหมู่ใด ๆ (Magento 404 / ไม่มีเส้นทางไปยังหน้า) คุณพบสิ่งนี้ด้วยหรือไม่
snh_nl

ไม่ไกลเท่าที่ฉันจำได้ขอโทษ คุณสร้างดัชนีทั้งหมดอีกครั้งหรือไม่
Matthias Zeis

เราใช้ nginx และการอัปเดตเป็นสิ่งที่จำเป็นสำหรับ conf เพื่อให้สามารถใช้งานได้ ฉันจะอัปเดตความคิดเห็นของฉัน
snh_nl

2 สิ่งที่แปลกมาก 1) / checkout ส่งคืน 404 และ 2) ตัวเลือกภาษา: ถ้าฉันคลิกที่ภาษาอังกฤษจากนั้นคลิกที่ภาษาอังกฤษอีกครั้งเราจะเห็นว่า uri ยังคงเพิ่ม / en / en / en / ฯลฯ .... คุณเลือก URL ฐานอะไร domain.com/th หรือ didi คุณเก็บไว้เป็น domain.com
snh_nl

เราเลือก domain.com/en/
Matthias Zeis

คำตอบ:


18

ง่ายมากที่จะให้บริการหลายโดเมน / เส้นทางตาม URL เป็นที่กล่าวถึงการตั้งค่าที่ง่ายที่สุด (การกำหนดค่าเดียว) เป็นไปได้เมื่อไม่ซ้ำกันcore/storeรหัสสามารถนำมาใช้ในเส้นทางเป็นโฟลเดอร์ย่อย สิ่งนี้ต้องการหนึ่งในสิ่งต่อไปนี้:

  1. ผู้เยี่ยมชมจะเชื่อมโยงกับเส้นทางโฟลเดอร์ย่อยที่ถูกต้องในตอนแรก
  2. ผู้เข้าชมจะได้รับหน้าที่เชื่อมโยงไปถึงซึ่งพวกเขาเลือกร้านค้าของพวกเขาและรับคุกกี้
  3. กลไกบางอย่างใช้ในการตั้งค่าประเภทการทำงานและรหัสการเรียกใช้ก่อนที่จะจัดการการตอบสนอง PHP

เกี่ยวกับ # 3: ตั้งแต่ 1.4 Magento ทำให้เป็นไปได้ที่เว็บเซิร์ฟเวอร์จะสามารถกำหนดบริบทการทำงาน ( เว็บไซต์หรือร้านค้า) ) รวมถึงรหัสเฉพาะที่ควรใช้ จากindex.php :

/* Store or website code */
$mageRunCode = isset($_SERVER['MAGE_RUN_CODE']) ? $_SERVER['MAGE_RUN_CODE'] : '';

/* Run store or run website */
$mageRunType = isset($_SERVER['MAGE_RUN_TYPE']) ? $_SERVER['MAGE_RUN_TYPE'] : 'store';

Mage::run($mageRunCode, $mageRunType);

ในขณะที่ตัวแปรสภาพแวดล้อมถูกนำมาใช้เพื่อเริ่มต้นแอปพลิเคชันก็เป็นไปได้ที่จะมีอิทธิพลต่อระบบก่อนที่จะ PHP แม้หมุนขึ้น ด้วย Apache และmod_rewriteสิ่งนี้สามารถทำได้สำหรับโฟลเดอร์ย่อยที่มีเล่ห์เหลี่ยมเล็กน้อย:

RewriteCond %{REQUEST_URI} ^/de/$
RewriteRule .* - [E=MAGE_RUN_CODE:deutsch]
RewriteCond %{ENV:REDIRECT_MAGE_RUN_CODE} (.+)
RewriteRule .* - [E=MAGE_RUN_CODE:%1]

Apache นั้นกระตุกด้วยตัวแปรสภาพแวดล้อมและโฟลเดอร์ย่อยตามที่แสดงโดยคำตอบ SO ที่ยอดเยี่ยมนี้ เริ่มต้นสองเส้นส่งผลให้ในขณะที่หลังสองเส้นให้ที่จำเป็น$_SERVER["REDIRECT_MAGE_RUN_CODE"] = 'deutsch'; $_SERVER["MAGE_RUN_CODE"] = 'deutsch';มีเทคนิคอื่น ๆ อีกมากมาย แต่ข้างต้นกัดฉันก่อนหน้านี้

เป้าหมายสุดท้ายควรเป็นการตรวจจับเริ่มต้นมากที่สุดเท่าที่จะเป็นไปได้ (geoip + ข้อกังวลเกี่ยวกับหลายภาษา) ในขณะที่ให้ผู้ใช้ตั้งคุกกี้ร้านค้าซึ่งสามารถใช้เพื่อเลี่ยงผ่าน / ก้าวผ่านตรรกะในคำขอถัดไป


1
ขอบคุณเบ็น ด้วยวิธีนี้ฉันสามารถเริ่มต้นมุมมองร้านค้าได้ แต่ฉันจะได้รับหน้า Magento 404 เสมอ ("อ๊ะโอ้พวกเราแย่มาก") ฉันตั้งค่า URL พื้นฐานเป็นdomain1.org/en , domain.org/deและอื่น ๆ URL ของผิวหนัง, URL สื่อ ฯลฯ ถูกตั้งค่าเป็นdomain.org/ (skin | media | ... )โปรดทราบว่าหน้าเว็บที่ถูกต้องจะถูกส่งกลับหากฉันใช้วิธีการ "คัดลอก index.php และ. htaccess" ปกติ
Matthias Zeis

ฉันยอมรับคำตอบนี้เนื่องจากใกล้เคียงกับสิ่งที่เราพยายามจะทำให้สำเร็จมากที่สุด (แม้ว่าเราจะแก้ไขข้อแตกต่างเล็กน้อยสำหรับความต้องการพิเศษของเรา)
Matthias Zeis

แปลกใจจริงๆที่การตั้งค่า "เพิ่มรหัสร้านค้าใน URL" ไม่ทำงาน
benmarks

รหัสร้านค้าจะต้องไม่ซ้ำกัน มันจะทำงานกับหลายมุมมองร้านค้าที่ลงท้ายด้วย de /, fr / หรือ en / อย่างไร
Matthias Zeis

ฉันคิดว่าฉันพลาดรหัสร้านค้าที่ทำซ้ำถึงแม้ว่าฉันคิดว่าฉันสมมติว่ามีการเขียนใหม่โดยใช้เว็บเซิร์ฟเวอร์ (เช่นmode_rewrite) ตามHTTP_HOST+ โฟลเดอร์ย่อยระดับ 1
เครื่องหมาย

9

หาก URL ที่เยื้อง (โฟลเดอร์ย่อย) สามารถมีชื่อเหมือนกันกับรหัสร้านค้า (เพราะเหตุใด) คุณสามารถเปิดใช้งานConfiguration > Web > Url options > Add Store Code to Urlsได้อย่างง่ายดาย


ถูกต้องแล้วคุณจะไม่จำเป็นต้องมีโฟลเดอร์ย่อย ตราบใดที่เปิดใช้งานการเขียน url ใหม่วีโอไอพีจะรู้ว่า "en" เป็นรหัสร้านค้าและไม่มองหาโฟลเดอร์ย่อย
พอล Grigoruta

8
ปัญหาของการแก้ไขปัญหานี้คือ Magento อนุญาตให้ใช้รหัสร้านค้า "de" เพียงรหัสเดียวในการติดตั้ง Magento ดังนั้นหากคุณมีเว็บไซต์หลายภาษาที่มีภาษาเดียวกันคุณต้องใช้ storecodes ที่แตกต่างกันเช่น de_de, de_en, ...
therouv

2
Rouven ได้รับมัน ปัญหาคือคุณไม่สามารถมีร้านค้าหลายร้านที่มีรหัสร้านค้าเดียวกัน
Anna Völkl

ใช่ปัญหาคือ - ตามที่ระลึกบอก - คุณไม่สามารถมีร้านค้าสองมุมมองโดยใช้รหัสร้านค้าเดียวกัน
Matthias Zeis

ฉันยืนยันว่า Rouven ถูกต้องแล้ว ข้อผิดพลาดถูกรายงานไปยัง Magento เพราะในสภาพแวดล้อมที่ทันสมัยเหล่านี้มีหลายหน่วยงานมากกว่านี้ควรทำงาน อย่างไรก็ตามคุณคิดว่าเป็นไปได้หรือไม่ที่จะทำให้การตั้งค่าAdd store codes to urlเป็นมุมมองของร้านค้า? magento.stackexchange.com/questions/60686/… = สมมติว่ามี 1 multistore ที่มีโดเมน sep การใช้งานอื่น / en และ / fr
snh_nl

3

เราลงเอยด้วยการทำอย่างนั้น

เราตรวจสอบด้วยการสนับสนุนระดับองค์กรว่าวิธีที่ดีที่สุดในการทำเช่นนี้คือการสร้างโฟลเดอร์ย่อย

เราลงเอยด้วยการทำเช่นนี้:

  • สร้างไดเรกทอรี "languagefolders"
  • สร้างสำเนาของ index.php ภายในไดเรกทอรีพร้อมด้วย. htaccess และ symlink ที่ปรับปรุงแล้วไปยังโฟลเดอร์ Magento (แอพ /, errors /, ... )
  • สร้าง symlink "de", "en" ฯลฯ ภายในไดเรกทอรีรากของ Magento ที่ชี้ไปยังไดเรกทอรี "languagefolders"

วิธีนี้เราสามารถเพิ่มภาษาใหม่โดยสร้าง symlink ใหม่ (เช่น "fr")

ในแบ็กเอนด์เราตั้งค่าร้านค้าbase urlเป็นdomain.com/en

หากคุณใช้ nginx การอัปเดตจำเป็นสำหรับการประมวลผลตำแหน่งของคุณเพื่อประมวลผล index.php ในโฟลเดอร์ย่อยใหม่ ต้องดำเนินการนี้กับโฟลเดอร์การแปลใหม่ทุกโฟลเดอร์


snh_nl มีโอกาสที่คุณจะอธิบายความหมายของ 2 บรรทัดสุดท้ายหรือไม่? ฉันมีปัญหาเดียวกันกับที่คุณพูดก่อนหน้านี้ แต่ฉันไม่เข้าใจ: ถ้าคุณใช้ nginx การปรับปรุงที่จำเป็นสำหรับการประมวลผลตำแหน่งของคุณเพื่อประมวลผล index.php ในโฟลเดอร์ย่อยใหม่ ต้องดำเนินการนี้กับโฟลเดอร์การแปลใหม่ทุกโฟลเดอร์ ฉันกำลังใช้ nginx และฉันพยายามทำเช่นเดียวกัน ขอบคุณ
vbak

location @rewrite { rewrite /(../)? /$1index.php; }
snh_nl

2

มีรายการในฐานความรู้อย่างเป็นทางการของวีโอไอพีที่อธิบายอย่างแน่นอน

ในกรณีที่คุณทำงานกับ Apache ตรวจสอบให้แน่ใจว่ารายการโฮสต์เสมือนทั้งหมด (สำหรับแต่ละโดเมน) ชี้ไปที่รูทเอกสารเดียวกันกับที่การติดตั้ง Magento ของคุณอยู่ ใช้สำหรับหลายโดเมน

สิ่งถัดไป (และสุดท้าย) คือ. htaccessในโฟลเดอร์การติดตั้ง Magento เดียวกัน .htaccess เป็นไฟล์การกำหนดค่าระดับไดเรกทอรีที่มีประสิทธิภาพซึ่งคุณสามารถตั้งกฎการกระทำสำหรับแต่ละคำขอของเซิร์ฟเวอร์ ดังนั้นคุณจะต้องจัดการกับการกระทำของโดเมน / โฟลเดอร์ (ย่อย) ที่แตกต่างกันทั้งหมดที่นั่นและตั้งค่าตัวแปรเซิร์ฟเวอร์ที่ถูกต้องซึ่ง Magento ใช้ในขั้นตอนการเริ่มต้น

หลังจากเสร็จสิ้นการกำหนดค่าเซิร์ฟเวอร์คุณจะต้องตั้งค่าเส้นทางพื้นฐานที่แตกต่างกันสำหรับแต่ละร้านใน Magento admin (ระบบ - การกำหนดค่า - ทั่วไป - เว็บ)

ดังนั้นให้แน่ใจว่าคุณทำตามคำแนะนำอย่างเป็นทางการ (ซึ่งเป็นวิธีที่ต้องการ) และสิ่งต่าง ๆ ควรทำงานอย่างราบรื่น


1
คำถามไม่ได้เกี่ยวกับหลายโดเมน
เฟเบียน Schmengler

คำถามเกี่ยวกับการตั้งค่ามัลติสโตร์ที่มีโดเมนหลายโดเมน (.org และ. ch เป็นโดเมนที่ต่างกัน) ไม่ใช่ว่ามันจะสำคัญเพราะคำตอบที่ให้ไว้จะอธิบายวิธีการตั้งค่ามัลติสโตร์ไม่ว่าคุณจะมีหลายโดเมนโดเมนย่อยหรือโฟลเดอร์ย่อยที่แตกต่างกันสำหรับร้านค้าแต่ละแห่งของคุณ
Jernej Golja

1
แต่การมุ่งเน้นไปที่เส้นทางสำหรับมุมมองร้านค้ามันไม่ได้ดูเหมือนโดเมนมีปัญหา อย่างไรก็ตามหลังจากที่คุณแก้ไขฉันเปลี่ยนการโหวตของฉัน
เฟเบียน Schmengler

1
ปัญหาไม่ได้ว่าต้องมีหลายโดเมน แต่ร้านค้าหลายแห่งต้องแชร์พา ธ / "โฟลเดอร์ย่อย" เดียวกันซึ่งไม่สามารถทำได้โดยการเพิ่มรหัสร้านค้าลงใน URL
Matthias Zeis

-2

ก่อนอื่นคุณต้องทำการกำหนดค่าบางอย่างในพาเนลผู้ดูแลระบบ Magento จากนั้นสร้างไดเรกทอรีย่อยและย้าย index.php และ. htaccess ไปยังไดเรกทอรีย่อยและทำการเปลี่ยนแปลงเล็กน้อยใน index.php

นี่คือตัวอย่างที่สมบูรณ์ของวิธีการทำสิ่งนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.