Visualizzazioni di negozi o siti Web diversi nelle sottocartelle


29

Un cliente vuole che il suo negozio multi-store sia configurato in questo modo:

Questo è un esempio, ma potrebbero esserci molte più sottocartelle diverse. Qual è l'approccio migliore per gestire diverse sottocartelle per diverse visualizzazioni / siti Web di negozi?

So che una soluzione è creare sottocartelle chiamate de, enecc. E copiare index.php e .htaccess nelle corrispondenti sottocartelle.

Potrebbero esserci anche alcune soluzioni alternative (collegamenti simbolici per index.php, configurazione vHost invece di utilizzare .htaccess) per ridurre al minimo la duplicazione dei file, ma mi piacerebbe trovare una soluzione in cui non devo apportare modifiche al file system ma solo gestire tutto dalla configurazione.


AGGIORNARE

Abbiamo verificato con il supporto Enterprise che il modo migliore per farlo è creare sottocartelle.

Abbiamo finito per farlo in questo modo:

  • Creare una directory "cartelle di lingue"
  • Creata una copia di index.php all'interno della directory insieme a .htaccess adattato e collegamenti simbolici alle cartelle Magento (app /, errori /, ...)
  • Link simbolici creati "de", "en" ecc. All'interno della directory principale di Magento che punta alla directory "languagefolders"

In questo modo possiamo aggiungere una nuova lingua creando un nuovo link simbolico (ad es. "Fr").


Abbiamo fatto solo questo per scoprire che il sito Web non è in grado di trovare alcun prodotto o categoria (Magento 404 / nessun percorso verso la pagina). Hai riscontrato anche questo?
snh_nl

Mi dispiace, non per quanto mi ricordi. Hai ricreato tutti gli indici?
Matthias Zeis,

Usiamo nginx ed è necessario un aggiornamento alla conf per farlo funzionare. Aggiornerò il mio commento
snh_nl

Altre 2 cose strane. 1) / checkout restituisce un 404 e 2) il selettore di lingua: se faccio clic su inglese, quindi faccio di nuovo clic su inglese, vediamo che l'uri continua ad aggiungere / en / en / en / etc .... cosa hai scelto come url di base? domain.com/en o didi lo conservi come domain.com
snh_nl

Abbiamo scelto domain.com/en/.
Matthias Zeis,

Risposte:


18

È molto semplice fornire più domini / percorsi basati su URL. Come accennato, l'impostazione più semplice (solo configurazione) è possibile quando i core/storecodici univoci possono essere utilizzati nel percorso come sottocartelle . Ciò richiede una delle seguenti:

  1. I visitatori sono inizialmente collegati al percorso corretto della sottocartella
  2. Ai visitatori viene fornita una pagina di destinazione dalla quale selezionano il loro negozio e ricevono un cookie
  3. Alcuni meccanismi sono usati per impostare il tipo di esecuzione ed eseguire il codice prima che PHP gestisca la risposta

Per quanto riguarda # 3: dall'1.4 Magento, ha permesso al server Web di determinare il contesto in esecuzione ( sito Web o negozio ) e il codice particolare che dovrebbe essere utilizzato. Da 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);

Considerando che le variabili di ambiente vengono utilizzate per inizializzare l'applicazione, è possibile influenzare il sistema anche prima che PHP si giri. Con Apache e mod_rewritequesto può essere fatto per le sottocartelle con un po 'di trucco:

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

Apache è nervoso con variabili d'ambiente e sottocartelle, come dimostrato da questa eccellente risposta SO . Le prime due righe risultano $_SERVER["REDIRECT_MAGE_RUN_CODE"] = 'deutsch';mentre le ultime due forniscono il necessario $_SERVER["MAGE_RUN_CODE"] = 'deutsch';. Ci sono molti altri trucchi, ma quanto sopra mi ha morso prima.

L'obiettivo finale dovrebbe essere il rilevamento iniziale per quanto ragionevole (geoip + preoccupazioni multi-lingua) mentre si induce l'utente a impostare il cookie del negozio che può essere utilizzato per bypassare / scorrere la logica nelle richieste successive.


1
Grazie Ben. In questo modo, posso inizializzare le visualizzazioni del negozio ma ottengo sempre la pagina Magento 404 ("Whoops, our bad"). Ho impostato l'URL di base su domain1.org/en , domain.org/de e così via. Skin Skin, Media URL ecc. Sono impostati su domain.org/ (skin | media | ...) Si prega di notare che le pagine corrette vengono restituite se uso il normale approccio "copia index.php e .htaccess".
Matthias Zeis,

Ho accettato questa risposta poiché si avvicina di più a ciò che abbiamo cercato di realizzare (anche quando l'abbiamo risolto in modo leggermente diverso per i nostri requisiti speciali).
Matthias Zeis,

Sono davvero sorpreso che l'impostazione "Aggiungi codice negozio all'URL" non abbia funzionato.
benmarks

I codici negozio devono essere univoci. Come dovrebbe funzionare con diverse viste dello store che terminano tutte con de /, fr / o en /?
Matthias Zeis,

Penso di aver perso i codici negozio replicati, anche se penso che stavo assumendo una riscrittura basata su server Web (ad esempio mode_rewrite) basata sul HTTP_HOSTlivello + sottocartella 1.
benmarks

9

Se gli URL rientrati (sottocartelle) possono avere lo stesso nome dei codici negozio (perché no?), Puoi semplicemente abilitarli Configuration > Web > Url options > Add Store Code to Urls.


Corretto, non avrai nemmeno bisogno di sottocartelle. fintanto che la riscrittura dell'URL è abilitata, Magento saprà che "en" è un codice storeview e non cercherà una sottocartella.
Paul Grigoruta,

8
Il problema con questa soluzione è che Magento consente solo un codice negozio "de" in un'installazione Magento. Quindi, se hai diversi siti Web con le stesse lingue, devi utilizzare codici di archiviazione diversi, ad esempio de_de, de_en, ...
therouv

2
Rouven l'ha capito. Il problema è che non è possibile avere più negozi con lo stesso codice negozio.
Anna Völkl,

Sì, il problema è che, come ha affermato Rouven, non è possibile avere due viste negozio utilizzando lo stesso codice negozio.
Matthias Zeis,

Confermo che Rouven ha capito bene. Un bug è stato segnalato a Magento. Perché in questi ambienti moderni con più multistor dovrebbe funzionare. Tuttavia, pensi che sarebbe possibile impostare Add store codes to urlun'impostazione di visualizzazione negozio? magento.stackexchange.com/questions/60686/… = supponiamo che ci sia 1 multistore con domini sep, l'altro usi / en e / fr
snh_nl

3

abbiamo finito per fare esattamente questo

Abbiamo verificato con il supporto Enterprise che il modo migliore per farlo è creare sottocartelle.

Abbiamo finito per farlo in questo modo:

  • Creare una directory "cartelle di lingue"
  • Creata una copia di index.php all'interno della directory insieme a .htaccess adattato e collegamenti simbolici alle cartelle Magento (app /, errori /, ...)
  • Link simbolici creati "de", "en" ecc. All'interno della directory principale di Magento che punta alla directory "languagefolders"

In questo modo possiamo aggiungere una nuova lingua creando un nuovo link simbolico (ad es. "Fr").

Nel backend abbiamo impostato il negozio base urlsudomain.com/en

Se usi nginx è necessario un aggiornamento per l'elaborazione della tua posizione per elaborare index.php anche nella nuova sottocartella. Questo deve essere fatto per ogni nuova cartella di traduzione


snh_nl C'è una possibilità che spieghi cosa significano le tue ultime 2 righe? Sto riscontrando lo stesso problema che hai detto prima ma non riesco a capire: se usi nginx è necessario un aggiornamento per l'elaborazione della tua posizione per elaborare index.php anche nella nuova sottocartella. Questo deve essere fatto per ogni nuova cartella di traduzione. Sto usando nginx e sto cercando di fare lo stesso. Grazie
vbak,

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

2

C'è una voce nella knowledge base ufficiale di Magento che descrive esattamente questo.

Nel caso in cui lavori con Apache, assicurati che tutte le voci di Virtual Host (per ciascun dominio) puntino alla stessa radice del documento in cui si trova l'installazione di Magento. Questo è per più domini.

La prossima (e ultima) cosa è il .htaccess nella stessa cartella di installazione di Magento. .htaccess è un potente file di configurazione a livello di directory in cui è possibile impostare azioni-regole per ogni richiesta del server. Quindi dovrai gestire tutte le diverse azioni (sotto) domini / cartelle lì e impostare le variabili server corrette che Magento utilizza nella fase di inizializzazione.

Dopo aver terminato la configurazione del server, dovrai impostare percorsi di base diversi per ciascuno degli store nell'amministratore Magento (sistema - configurazione - generale - web).

Quindi assicurati di seguire la guida ufficiale (che è anche il modo preferito) e le cose dovrebbero funzionare senza problemi.


1
La domanda non riguardava più domini.
Fabian Schmengler,

La domanda riguardava l'installazione a più stadi CON MOLTI DOMINI (.org e .ch sono domini diversi). Tuttavia, non importa, perché la risposta fornita descrive una soluzione per l'installazione di più negozi, indipendentemente dal fatto che tu abbia più domini, sottodomini o solo sottocartelle diverse per ciascuno dei tuoi negozi.
Jernej Golja,

1
Ma l'attenzione era rivolta ai percorsi per le visualizzazioni del negozio, non sembrava che i domini fossero un problema. Comunque, dopo la tua modifica ho cambiato il mio voto.
Fabian Schmengler,

1
Esatto, il problema non è che devono essere utilizzati più domini, ma che diversi negozi devono condividere lo stesso percorso / "sottocartella" che non è possibile aggiungendo i codici negozio all'URL.
Matthias Zeis,

-2

Per prima cosa devi fare una configurazione nel pannello di amministrazione di Magento, quindi creare una sottodirectory e spostare index.php e .htaccess nella sottodirectory e apportare alcune modifiche minori a index.php.

Ecco un esempio completo di come eseguire questa operazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.