[Magento] Multistore na wielu domenach

Data dodania wpisu: 27-05-2010

Mając uruchomiony sklep na platformie Magento, nierzadko zdarza się, że chcemy uruchomić jeden sklep na wielu wersjach językowych. Problemu nie ma jeśli bazujemy na jednej domenie i za przełącznik służy parametr __from __to. Problem zaś rodzi się w momencie, w którym chcemy, aby wiele widoków działało na wielu domenach, np. moj-sklep.pl i my-shop.com. Standardowa instalacja Magento nie umożliwia uruchomienia wersji językowych jednego sklepu postawionego na jednej witrynie na osobnych domenach. Należy po pierwsze wprowadzić zmiany w ustawieniach w panelu administracyjnym (Konfiguracja->Sieć, gdzie trzeba dla każdego widoku sklepu wpisać odpowiedni url i secure url sklepu), po drugie należy zmodyfikować plik index.php w katalogu głównym Magento (oczywiście uprzednio robimy kopię pliku;)) Przyjrzyjmy się bliżej zawartości pliku index.php:

<?php
$mageFilename = 'app/Mage.php';

if (!file_exists($mageFilename)) {
    if (is_dir('downloader')) {
        header(&quot;Location: downloader&quot;);
    } else {
        echo $mageFilename.&quot; was not found&quot;;
    }
    exit;
}

require_once $mageFilename;

#Varien_Profiler::enable();

#Mage::setIsDeveloperMode(true);

#ini_set('display_errors', 1);

umask(0);
Mage::run('default');
?>

W zasadzie najważniejsza jest ostatnia linijka. Poprzez wywołanie Mage::run('default'); uruchamia się domyślny sklep z domyślnym widokiem. Nawet po zmianie ustawień w panelu administracyjnym, przełączanie się pomiędzy domenami nie zaskoczy uruchomieniem poprawnego widoku sklepu. Zmiany jakie należy wprowadzić w pliku index.php są przedstawione poniżej. Dlaczego dodany jest warunek eregi dla /admin w adresie? Wytłumaczę to nieco później.

<?php
if(!eregi('/admin',$_SERVER['REQUEST_URI'])){
if(eregi('moj-sklep.pl',$_SERVER['HTTP_HOST']))
 $storeview = 'widok_sklepu_pl';
elseif(eregi('my-shop.com',$_SERVER['HTTP_HOST']))
 $storeview = 'widok_sklepu_en';
else
 $storeview = 'widok_skepu_pl';

if(isset($_GET['SID'])){
 header("HTTP/1.1 301 Moved Permanently");
 header("Location: http://".$_SERVER['HTTP_HOST']);
 exit();
}
}
?>

Powyższy kawałek kodu dodajemy pomiędzy

#ini_set('display_errors', 1);

a

umask(0);

Zależnie od domeny, do zmiennej $storeview wpisujemy kod widoku sklepu, zdefiniowny przy ich tworzeniu w panelu admina. Jeśli w adresie mamy ID sesji, to najbezpieczniej jest przekierować 301 na stronę główną danej wersji językowej - w końcu kto robi zakupy na wielu wersjach językowych?;) Za to na końcu kodu w pliku index.php zamieniamy Mage::run('default); na:

if(!eregi('/admin',$_SERVER['REQUEST_URI'])){
 Mage::run($storeview,'store');
}
else
Mage::run();

Jeżeli w adresie nie ma parametru panelu administracyjnego, to odpalamy widok sklepu zależny od wprowadzonej wersji językowej. W przeciwnym wypadku (jeśli jest odpalony 'admin') uruchamiamy podstawową wersję (widok) sklepu. Dlaczego? Podczas dodawania zdjęć do produktów w panelu admina, wykłada się AJAX wysyłający zdjęcia na serwer. Nie rozgryzłem dlaczego, ale ten warunek (eregi dla admina) jest wystarczający i wszystko funkcjonuje jak należy;) O czym można pobocznie wspomnieć, to zamiana przełącznika językowego na wyłącznie strony główne poszczególnych widoków sklepu. W tym celu, należy wprowadzić następującą modyfikację w pliku templatki:

/template/page/switch/languages.phtml

Należy zamienić:

<option value="<?php echo $_lang->getCurrentUrl() ?>" 
<?php echo $_selected ?>><?php echo $this->htmlEscape($_lang->getName()) ?></option>

na:

<?php $link = ''; ?>
<?php $link = str_replace('http://','',$_lang->getCurrentUrl()); ?>

<?php $link = explode('/',$link); ?>
<option value="<?php echo $link[0] ?>" <?php echo $_selected ?>>
<?php echo $this->htmlEscape($_lang->getName()) ?></option>

Powyższa modyfikacja powoduje wyświetlanie wyłącznie domen wersji językowych, bez nierzadko nieistniejących translacji kategorii, podstron itp. kierujących do strony 404. A Google i userzy tego nie lubią;)

Komentarze

Ten wpis nie posiada jeszcze komentarzy

Comments closed...