Différentes vues de magasin ou sites Web dans des sous-dossiers


29

Un client souhaite que sa boutique à plusieurs magasins soit configurée comme suit:

Ceci est un exemple mais il peut y avoir beaucoup plus de sous-dossiers différents. Quelle est la meilleure approche pour gérer différents sous-dossiers pour différentes vues de magasin / sites Web?

Je sais qu'une solution consiste à créer des sous-dossiers appelés de, enetc. et à copier les index.php et .htaccess dans les sous-dossiers correspondants.

Il peut également y avoir des solutions de contournement (liens symboliques pour index.php, configuration de vHost au lieu d'utiliser .htaccess) pour minimiser la duplication de fichiers mais j'aimerais trouver une solution où je n'ai pas à faire de changements dans le système de fichiers mais juste gérer tout par configuration.


MISE À JOUR

Nous avons vérifié auprès de l'assistance Enterprise que la meilleure façon de le faire est de créer des sous-dossiers.

Nous avons fini par le faire comme ceci:

  • Créer un répertoire "dossiers linguistiques"
  • Création d'une copie de index.php dans le répertoire avec un .htaccess ajusté et des liens symboliques vers les dossiers Magento (app /, erreurs /, ...)
  • Création de liens symboliques "de", "en" etc. dans le répertoire racine de Magento pointant vers le répertoire "dossiers linguistiques"

De cette façon, nous pouvons ajouter une nouvelle langue en créant un nouveau lien symbolique (par exemple "fr").


Nous l'avons fait uniquement pour constater que le site Web ne trouve aucun produit ou catégorie (Magento 404 / aucun itinéraire vers la page). L'avez-vous rencontré également?
snh_nl

Pas pour autant que je m'en souvienne, désolé. Avez-vous recréé tous les index?
Matthias Zeis

Nous utilisons nginx et une mise à jour est nécessaire à la conf pour le faire fonctionner. Je
mettrai à

2 choses plus étranges. 1) / checkout renvoie un 404 et 2) le sélecteur de langue: si je clique sur anglais, puis de nouveau sur anglais, nous voyons que l'uri continue d'ajouter / en / en / en / en / etc .... qu'avez-vous choisi comme URL de base? domain.com/en ou didi vous le conservez en tant que domain.com
snh_nl

Nous avons choisi domain.com/en/.
Matthias Zeis

Réponses:


18

Il est très facile de servir plusieurs domaines / chemins en fonction des URL. Comme mentionné, la configuration la plus simple (configuration uniquement) est possible lorsque les core/storecodes uniques peuvent être utilisés dans le chemin en tant que sous-dossiers . Cela nécessite l'un des éléments suivants:

  1. Les visiteurs sont initialement liés au chemin de sous-dossier correct
  2. Les visiteurs reçoivent une page de destination à partir de laquelle ils sélectionnent leur boutique et reçoivent un cookie
  3. Un mécanisme est utilisé pour définir le type d'exécution et le code d'exécution avant que PHP ne gère la réponse

Concernant # 3: depuis 1.4 Magento, a permis de permettre au serveur Web de déterminer le contexte de fonctionnement ( site web ou magasin ) ainsi que le code particulier à utiliser. Depuis 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);

Alors que les variables d'environnement sont utilisées pour initialiser l'application, il est possible d'influencer le système avant même que PHP ne tourne. Avec Apache et mod_rewritecela peut être fait pour les sous-dossiers avec un peu de ruse:

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

Apache est nerveux avec les variables d'environnement et les sous-dossiers, comme le démontre cette excellente réponse SO . Les deux premières lignes résultent $_SERVER["REDIRECT_MAGE_RUN_CODE"] = 'deutsch';alors que les deux dernières lignes fournissent le nécessaire $_SERVER["MAGE_RUN_CODE"] = 'deutsch';. Il existe de nombreuses autres astuces, mais ce qui précède m'a déjà mordu.

L'objectif final doit être la détection initiale autant que raisonnable (géoip + problèmes multilingues) tout en amenant l'utilisateur à définir le cookie de stockage qui peut être utilisé pour contourner / parcourir la logique dans les requêtes suivantes.


1
Merci, Ben. En procédant de cette façon, je peux initialiser les vues du magasin, mais j'obtiens toujours la page Magento 404 ("Whoops, our bad"). J'ai défini l'URL de base sur domain1.org/en , domain.org/de et ainsi de suite. L'URL du skin, l'URL du média, etc. sont définies sur domain.org/ (skin | media | ...) Veuillez noter que les pages correctes sont renvoyées si j'utilise l'approche "copy index.php et .htaccess" normale.
Matthias Zeis

J'ai accepté cette réponse car elle se rapproche le plus de ce que nous avons essayé d'accomplir (même lorsque nous l'avons résolu un peu différemment pour nos besoins particuliers).
Matthias Zeis

Vraiment surpris que le paramètre "Ajouter le code du magasin à l'URL" ne fonctionne pas.
benmarks

Les codes de magasin doivent être uniques. Comment cela devrait-il fonctionner avec plusieurs vues de magasin se terminant toutes par de /, fr / ou en /?
Matthias Zeis

Je pense que j'ai raté les codes de magasin répliqués, bien que je pense que je supposais une réécriture basée sur le serveur Web (par exemple mode_rewrite) basée sur le HTTP_HOSTniveau de sous-dossier + 1.
benmarks

9

Si les URL (sous-dossiers) en retrait peuvent avoir le même nom que les codes de magasin (pourquoi pas?), Vous pouvez simplement les activer Configuration > Web > Url options > Add Store Code to Urls.


Correct, vous n'aurez même pas besoin de sous-dossiers. tant que la réécriture d'URL est activée, Magento saura que "en" est un code de magasin et ne cherchera pas de sous-dossier.
Paul Grigoruta

8
Le problème avec cette solution est que Magento n'autorise qu'un seul code de magasin "de" dans une installation Magento. Donc, si vous avez plusieurs sites Web avec les mêmes langues, vous devez utiliser des storecodes différents, par exemple de_de, de_en, ...
therouv

2
Rouven l'a compris. Le problème est que vous ne pouvez pas avoir plusieurs magasins avec le même code de magasin.
Anna Völkl

Oui, le problème est que - comme l'a dit Rouven - vous ne pouvez pas avoir deux vues de magasin en utilisant le même code de magasin.
Matthias Zeis

Je confirme que Rouven a bien compris. Un bug a été signalé à Magento. Parce que dans ces environnements modernes avec plusieurs magasins, cela devrait fonctionner. Cependant, pensez-vous qu'il serait possible de faire du paramètre Add store codes to urlun paramètre de vue de magasin? magento.stackexchange.com/questions/60686/… = supposons qu'il y ait 1 magasin multiple avec des domaines sep, les autres utilisent / en et / fr
snh_nl

3

nous avons fini par faire exactement cela

Nous avons vérifié auprès de l'assistance Enterprise que la meilleure façon de le faire est de créer des sous-dossiers.

Nous avons fini par le faire comme ceci:

  • Créer un répertoire "dossiers linguistiques"
  • Création d'une copie de index.php dans le répertoire avec un .htaccess ajusté et des liens symboliques vers les dossiers Magento (app /, erreurs /, ...)
  • Création de liens symboliques "de", "en" etc. dans le répertoire racine de Magento pointant vers le répertoire "dossiers linguistiques"

De cette façon, nous pouvons ajouter une nouvelle langue en créant un nouveau lien symbolique (par exemple "fr").

Dans le backend, nous avons réglé le magasin base urlsurdomain.com/en

Si vous utilisez nginx, une mise à jour de votre traitement d'emplacement est nécessaire pour traiter index.php également dans le nouveau sous-dossier. Cela doit être fait pour chaque nouveau dossier de traduction


snh_nl Y a-t-il une chance que vous expliquiez ce que signifient vos 2 dernières lignes? J'ai le même problème que vous avez dit auparavant, mais je ne comprends pas: si vous utilisez nginx, une mise à jour est nécessaire pour le traitement de votre emplacement pour traiter index.php également dans le nouveau sous-dossier. Cela doit être fait pour chaque nouveau dossier de traduction. J'utilise nginx et j'essaie de faire de même. Merci
vbak

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

2

Il existe une entrée dans la base de connaissances officielle de Magento qui décrit exactement cela.

Dans le cas où vous travaillez avec Apache, assurez-vous que toutes les entrées d'hôte virtuel (pour chaque domaine) pointent vers la même racine de document où se trouve votre installation Magento. C'est pour plusieurs domaines.

La prochaine (et dernière) chose est le .htaccess dans le même dossier d'installation de Magento. .htaccess est un puissant fichier de configuration au niveau du répertoire où vous pouvez définir des règles-actions pour chaque demande de serveur. Vous devrez donc gérer toutes les actions de (sous-) domaines / dossiers différents et définir les variables de serveur correctes que Magento utilise lors de l'initialisation.

Une fois la configuration du serveur terminée, vous devrez définir différents chemins de base pour chacun des magasins dans l'administration Magento (système - configuration - général - web).

Assurez-vous donc de suivre le guide officiel (qui est également le moyen préféré) et les choses devraient fonctionner sans heurts.


1
La question ne concernait pas plusieurs domaines.
Fabian Schmengler

La question concernait la configuration multi-magasins AVEC PLUSIEURS DOMAINES (.org et .ch sont des domaines différents). Cependant, cela n'a pas d'importance, car la réponse fournie décrit une solution pour la configuration multi-magasins, que vous ayez plusieurs domaines, sous-domaines ou simplement des sous-dossiers différents pour chacun de vos magasins.
Jernej Golja

1
Mais l'accent était mis sur les chemins d'accès aux vues du magasin, il ne semblait pas que les domaines étaient un problème. Quoi qu'il en soit, après votre modification, j'ai changé de vote.
Fabian Schmengler

1
Exactement, le problème n'est pas que plusieurs domaines doivent être utilisés mais que plusieurs magasins doivent partager le même chemin / "sous-dossier", ce qui n'est pas possible en ajoutant des codes de magasin à l'URL.
Matthias Zeis

-2

Vous devez d'abord effectuer une configuration dans le panneau d'administration de Magento, puis créer un sous-répertoire, déplacer le index.php et le .htaccess dans le sous-répertoire et apporter des modifications mineures au index.php.

Voici un exemple complet de la façon de procéder.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.