This post is also available in English.
Redelijk vaak krijgen wij van klanten de vraag of zij ook meerdere webshops in een enkele Magento installatie kunnen draaien. Uiteraard is dat geen probleem in Magento, maar de exacte implementatie verschilt nogal van klant tot klant, van webshop tot webshop. Ook is het voor veel mensen niet exact duidelijk wat ze moeten doen om de extra domeinen werkend te krijgen in Magento. Daarom hier een kleine uitleg over hoe je meerdere Magento shops in een installatie krijgt bij Byte.
Extra domeinnamen
Uiteraard heeft u voor uw extra winkels een eigen domeinnaam nodig. Als voorbeeld hebben wij een winkel in exotische pakdieren. Deze willen we online gaan verkopen en dus hebben wij het domein www.kamelen-online.nl geregistreerd met een Magento 1000 pakket. Dit pakket biedt wat extra ruimte op de schijf, wat we bij een setup met meerdere winkels, en dus extra producten, goed kunnen gebruiken. Omdat we internationaal willen gaan met onze webwinkel, hebben we een tweede domein geregistreerd, genaamd www.camels-online.com. Voor dit pakket nemen we een Presence. Ook gaan we dromedarissen aanbieden, en dus registeren we ook www.dromedaris-online.nl, met een Presence pakket.
Als deze domeinen allemaal geregistreerd zijn, kan je daarna de Presence pakketten in stellen. De beste oplossing is om deze op het service paneel, met de optie "Server Alias" allemaal te koppelen aan de domeinnaam met het hosting pakket (In dit geval is dat kamelen-online.nl).
Websites, stores, views...
Even snel wat termen tussendoor. In Magento spreekt men over Websites, Stores, en Store Views.
- Het verschil tussen een Website en een Store, is dat een Website eigenlijk alleen klant data bevat, maar geen producten en categorieën.
- Stores zijn de echte winkels. Deze bevatten de verschillende producten die in de shop beschikbaar zijn. Stores hebben een of meerdere Store views.
- Store views zijn de verschillende manieren waarop de Stores zichtbaar worden gemaakt. Vaak zijn er b.v. per taal een Store view aangemaakt.
Elke Magento site heeft dus altijd minstens een Website, een Store, en een Store View.
Deze zijn allemaal aan te maken via de Admin interface van Magento, onder System, Manage Stores. In ons voorbeeld hebben we dit als volgt opgelost: Een website "Kamelen Site", met een enkele shop genaamd "Kamelen Shop". Deze shop hebben we vervolgens twee views gegeven, een in het Nederlands, en een in het Engels. Daarnaast hebben we een website "Dromedaris Site" aangemaakt, met een enkele shop en een enkele view. Bij het aanmaken van de Store Views wordt ook gevraagd om een code waar de view intern mee werkt. Deze hebben we ingesteld op "kamelen_nl", "kamelen_en" en "dromedaris". Deze zijn belangrijk omdat we deze codes later aan de domeinnamen moeten koppelen.
Domeinnamen en Store Views koppelen
Een van de eerste dingen die Magento doet zodra het opstart, is namelijk de shop starten. Standaard start dan de default shop, maar dit is uiteraard in te stellen, b.v. aan de hand van de website die bezocht wordt. Het enige wat we hoeven te doen, is kijken welke shop er bezocht wordt en Magento opstarten met de code van de benodigde store front.
Het koppelen van domeinnamen en store views kan helaas nog niet via de Magento backend.
Gelukkig is het erg makkelijk. Er hoeft slechts 1 bestand aangepast te worden. Welke dat is, is afhankelijk van welke Magento versie er draait.
Koppelen in Magento 1.3
In Magento 1.3 is de koppeling te realiseren via het index.php bestand. Hierin worden alle Magento bestanden geladen, en vervolgens wordt de website gestart. We moeten daarvoor index.php aanpassen. Zoek onderstaande regel in PHP:
Mage::run();
Vervang deze regel met onderstaande stuk code:
switch ($_SERVER['HTTP_HOST']) {
//Klant komt voor Nederlandse Kamelen.
case 'www.kamelen-online.nl':
case 'kamelen-online.nl':
Mage::run('kamelen_nl', 'store');
break;
//Klant komt voor Internationale Kamelen.
case 'www.camels-online.com':
case 'camels-online.com':
Mage::run('kamelen_en', 'store');
break;
//Klant komt voor de Dromedaris.
case 'www.dromedaris-online.nl':
case 'dromedaris-online.nl':
Mage::run('dromedaris', 'store');
break;
default:
Mage::run();
break;
}
Koppelen in Magento 1.4
Sinds Magento 1.4 is besloten om het detecteren van de juiste store front uit de standaard bestanden van Magento te halen. Dit voorkomt problemen bij het upgraden van webshops, waarbij ineens alle store views op dezelfde website uitkomen, of dat Magento helemaal niet meer werkt na een upgrade.
Extra aanpassing voor Byte Hosting
Hoewel de manier die Magento gebruikt om de store view te kiezen mooi in elkaar zit, werkt het helaas niet 100% samen met de extra beveiligde omgeving waarin uw website draait bij Byte. Byte maakt gebruik van het "suExec" principe voor website hosting. Dit zorgt ervoor dat niemand bij uw bestanden/website kan op de server. Zo ruimt het onder andere het omgeving-geheugen op voordat uw website geladen wordt. Helaas maakt Magento van dit geheugen gebruik om daarin op te slaan welke store er in beeld moet komen.
Om toch gebruik te maken van de gegevens die in het omgeving geheugen worden geladen, is een kleine aanpassing aan het bestand index.php nodig. Rond regel 75 staat de volgende regel:
$mageRunCode = isset($_SERVER['MAGE_RUN_CODE']) ? $_SERVER['MAGE_RUN_CODE'] : '';
Vervang dit door het volgende:
$mageRunCode = isset($_SERVER['MAGE_RUN_CODE']) ? $_SERVER['MAGE_RUN_CODE'] : (isset($_SERVER['REDIRECT_MAGE_RUN_CODE']) ? $_SERVER['REDIRECT_MAGE_RUN_CODE'] : '');
Na het aanpassen van deze code zal Magento voortaan ook in de opgeruimde waardes kijken welke store er gestart moet worden.
In Magento 1.4 staat alle logica om de juiste shop te kiezen in het .htaccess bestand. Hierin wordt in het omgeving geheugen opgeslagen welke store er gestart moet worden. Het index.php bestand kijkt vervolgens in dit geheugen en start de juiste winkel.
In het .htaccess voegen we hiervoor het volgende toe:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)kamelen-online.nl
RewriteRule ^ - [E=MAGE_RUN_CODE:kamelen_nl]
RewriteCond %{HTTP_HOST} ^(.*)camels-online.com
RewriteRule ^ - [E=MAGE_RUN_CODE:camels_en]
RewriteCond %{HTTP_HOST} ^(.*)dromedaris-online.nl
RewriteRule ^ - [E=MAGE_RUN_CODE:dromedaris]
Ook hier zijn weer drie verschillende stores opgegeven. Alle domeinen die eindigen op 'kamelen-online.nl' komen op de "kamelen_nl" store uit, camels-online.com komt uit op de engelse, en ook de dromedaris store staat nog geconfigureerd.
Verschillende shops configureren
Het enige wat nu nog gedaan moet worden is alles goed instellen voor de verschillende stores in Magento. Standaard zijn bij stores de instellingen namelijk automatisch hetzelfde als bij de website en de instellingen van de websites zijn weer gelinked aan de globale instellingen. Uiteraard zijn de instellingen op elk niveau aan te passen. Wisselen tussen de verschillende niveau's kan simpelweg door de juiste view, shop, of de standaard instelling te kiezen via het pull down menu links boven het menu in Magento's configuratie editor.
Het belangrijkste om aan te passen is natuurlijk de base URL, welke te vinden is in de backend van Magento terug onder System\Configuration\Web\Unsecure en \Secure. Hier vullen we op de verschillende niveaus in welke URL's Magento als standaard URL moet gebruiken. Zo vullen we in dit voorbeeld als hoofddomein onder "Default Config" in dat de shop "http://www.kamelen-online.nl/" heet. De English versie onder "Kamelen Store" krijgt als base URL "http://www.camels-online.com/", en de Dromedarissen versie komt natuurlijk op "http://www.dromedaris-online.nl/".
Mochten deze shops nou ook een HTTPS/Secure versie hebben, dan moet deze uiteraard onder "Secure" ook nog even worden ingevuld, maar dan met https linkjes.
Uiteraard is het aanmaken van de verschillende stores slechts het begin. Er zijn nu nog heel veel opties in het Magento Admin Panel om per shop in te stellen, maar laten we het, for now, hier maar even bij laten. Graag horen we nog van klanten die nog mooie of handige tips en trucks hebben met Magento Multi Shops. Wie weet, als er echt een mooie tussen zit, kan er nog wel eens een taart uitgaan




