Sprache beim Laden abhängig von der Sub-Domain ändern

Fragen zur Installation von CONTENIDO 4.9? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
matt.loker
Beiträge: 203
Registriert: Mo 7. Mai 2007, 09:05
Kontaktdaten:

Sprache beim Laden abhängig von der Sub-Domain ändern

Beitrag von matt.loker » Mo 5. Dez 2016, 11:33

Hallo liebe Community,
ich hab wieder mal eine Frage bei der ich nicht weiterkomme. Ich erkläre vielleicht erstmal kurz das Problem.

Ausgangslage:
1) Eine Website hat mehrere Sprachen - sagen wir einmal DE und einmal EN
2) Die Website ist unter DOMAIN.TLD erreichbar und zeigt standardmäßig die deutsche Sprache an
3) Ich hab eine zusätzliche DB-Tabelle erstelle in der verschiedenste Benutzer mit einer eigenen Subdomain und einer Sprach-ID angelegt sind. Jeder Benutzer hat dabei eine Standardsprache (Die Sprach-ID) mit der die Seite geladen wird.

Nehmen wir an:
Ich gehe über BEN.DOMAIN.TLD auf die Website, dann soll die englische Sprache geladen werden.
Wenn ich über ANA.DOMAIN.TLD auf die Website gehe, soll die deutsche Sprache geladen werden.

Meine Überlegung war nun folgende:
In der config.php des Mandanten findet man ja folgende Zeilen

Code: Alles auswählen

// If language isn't specified, set this client and language (ID)
$load_lang = '1';
$load_client = '1';

Ich habe gedachte, ich könnte dahinter eine Abfrage schalten mit der ich die aktuelle Subdomain auslesen, in der Datenbank abfrage ob es die Domain gibt und wenn ja welche Start-Sprache angezogen werden soll und dann entsprechend den Wert $load_lang manipuliere.

Dazu habe ich eine Funktion in einer Datei geschrieben die ich im Frontend unter include abgelegt habt. Diese Funktion macht nicht anderes als die aktuelle Domain auszulesen, dann schaut Sie in der DB ob es sich um eine registrierte Subdomain handelt und bei ja, holt sich die Funktion die Sprach ID und gibt diese aus. So die Theorie.

Das Problem ist, dass ich die Datei an diesem Punkt nicht über das Contenido eigene cInclude ins System bekomme. Ich bekomme den Fehler

Code: Alles auswählen

Fatal error: Call to undefined function cInclude() in /xxx/cms/data/config/production/config.php on line 26
Über das PHP-Eigene include() klappt das jedoch bekomme ich an dieser Stelle dann den Fehler

Code: Alles auswählen

Fatal error: Class 'cRegistry' not found in /xxx/cms/includes/checksubdomain.php on line 44
Anscheinend setze ich hier doch zu früh an, um wie ich es bei den Modulen zu arbeiten gewohnt bin, da die ganzen Funktionen an dieser Stelle noch nichtverfügbar sind.

Meine Frage:
Gibt es eine andere Stelle wo ich das genauso gut umsetzen könnte? Oder kann ich das doch in der config.php machen nur muss ich anders vorgehen? Was ich an dieser auch nicht abschätzen kann, ist wie sich mein Ansatz auswirkt, wenn ein Besucher die Sprache mal ändert (ob ihn dann das System immer wieder durch meinen Ansatz zurück zwingt in die Standardsprache)

Vielen Dank für eure Hilfe

Grüße
Matt

rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Re: Sprache beim Laden abhängig von der Sub-Domain ändern

Beitrag von rethus » Mo 5. Dez 2016, 15:24

Alles was du brauchst, ist den parameter changelang=<sprachid> zu übergeben.
Alles andere sind Weiterleitungs-Geschichten deiner Subdomains.

Wenn du also von ben.domain.de auf die englische Sprachversion von bimbom.de weiterleiten möchtest, musst du lediglich ein Redirect zu bimbom.de?changelang=<eng.Sprach.ID> machen.
Was du also im Grunde nur brauchst ist eine .htaccess in deiner Subdomain (d.h. wenn ich deine geschilderte Zielsetzung richtig verstanden habe).

PS: Wenn es aus der DB kommen muss, legst du halt eine php-Datei in die Subdomain, die dein User-Profil abfragt, und dann nen redirect via php zu bimbom.dee?changelang=xy macht.
Could I help you... you can help me... buy me a coffee . (vielen ❤ Dank an: Seelauer, Peanut, fauxxami )

xstable.com: - HighSpeed Hosting, Domains, DomainReselling, Linux-Administration
suther.de: - App-Programierung, High-Performance-Webpages, MicroServices, API-Anbindungen & Erstellung

Software... ein Blick wert: GoogleCalender Eventlist, xst_dynamic_contentType

matt.loker
Beiträge: 203
Registriert: Mo 7. Mai 2007, 09:05
Kontaktdaten:

Re: Sprache beim Laden abhängig von der Sub-Domain ändern

Beitrag von matt.loker » Mo 5. Dez 2016, 15:47

Hallo rethus,
vielen Dank für deine Rückmeldung.

Dein Lösungsvorschlag klingt auf den ersten Blick logisch, jedoch ist es bei mir so, dass es keine Subdomain-Ordner gibt - es sind alles Whitelabel-Subdomain. Zudem kann es im System mehrere 100 Subdomains geben, wenn es mal läuft. Ich brauche deshalb eine Lösung die dynamisch funktioniert. Wie gesagt, ich könnten eine separate Datenbankabfrage.

Vielleicht noch eine Kleinigkeit zur besseren Verständnis. Hauptdomain und Subdomain zeigen die gleichen Inhalte an. Bei der Subdomain werden noch weitere personifizierte Inhalte dargestellt - wie eine kleine personalisierte Website. Bisher landen alle Anfragen über die Subdomains auf der deutschen Seite und der User muss erstmal die Sprache wechseln. Ich musste das wechseln der Sprache überflüssig machen in dem ich schau welche Standard-Sprache wurde dem User (z.B. BEN) zugeteilt und setze $load_lang entsprechend - also zumindest war das mein Ansatz in der config.php.

Grüße
Matt

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Sprache beim Laden abhängig von der Sub-Domain ändern

Beitrag von Faar » Mo 5. Dez 2016, 16:13

matt.loker hat geschrieben: Nehmen wir an:
Ich gehe über BEN.DOMAIN.TLD auf die Website, dann soll die englische Sprache geladen werden.
Dann diese Subdomain auf domain.tld/english weiter leiten.
Die Sprache muss dann auch "english" heißen und im AMR als Text und nicht als Nummer eingestellt sein.
Wenn ich über ANA.DOMAIN.TLD auf die Website gehe, soll die deutsche Sprache geladen werden.
Dann diese Subdomain auf domain.tld/deutsch weiter leiten.
Meine Überlegung war nun folgende:
In der config.php des Mandanten findet man ja folgende Zeilen
Das ist ganz was anderes, das ist die Backendsprache nach dem einloggen.
Die gibt es momentan nur auf Deutsch und Englisch.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

matt.loker
Beiträge: 203
Registriert: Mo 7. Mai 2007, 09:05
Kontaktdaten:

Re: Sprache beim Laden abhängig von der Sub-Domain ändern

Beitrag von matt.loker » Mo 5. Dez 2016, 16:26

Hallo Faar,
bist du die sicher dass die config.php in cms/data/config/production/ fürs Backend ist? Ich habe gerade mal die $load_lang von 1 auf 2 geändert. Wenn ich nun die Website aufrufe, dann lädt die Seite standardmäßig mit der englischen Seite.

Grüße
Matt

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Sprache beim Laden abhängig von der Sub-Domain ändern

Beitrag von Faar » Mo 5. Dez 2016, 17:13

matt.loker hat geschrieben:bist du die sicher dass die config.php in cms/data/config/production/ fürs Backend ist? Ich habe gerade mal die $load_lang von 1 auf 2 geändert. Wenn ich nun die Website aufrufe, dann lädt die Seite standardmäßig mit der englischen Seite.
Ich war mir mal ziemlich sicher, aber jetzt nicht mehr.
Hab das hier gefunden:

Code: Alles auswählen

if (!isset($lang)) {
    // If there is an entry load_lang in __FRONTEND_PATH__/data/config/config.php use it, else use the first language of this client
    if (isset($load_lang)) {
        // load_client is set in __FRONTEND_PATH__/data/config/config.php
        $lang = $load_lang;
...
Das ist ziemlich eindeutig, wenn $lang nicht gesetzt ist, wird nach $load_lang gesucht.

Dein Problem wird dann sein, quasi bei der index.php oder front_content.php abzufragen, mit welcher Subdomain jemand an kommt und dann entsprechen die Variable $lang zu setzen (nicht $load_lang).
Ich weiß nicht, ob so früh schon eine Chain eingreifen könnte, um noch rechtzeitig die Sprache einzuschalten.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

matt.loker
Beiträge: 203
Registriert: Mo 7. Mai 2007, 09:05
Kontaktdaten:

Re: Sprache beim Laden abhängig von der Sub-Domain ändern

Beitrag von matt.loker » Mo 5. Dez 2016, 17:22

Aus welcher Datei hast du den Code Faar?

Ich habe jetzt folgendes gemacht. Vielleicht interessiert den ein oder anderen meine Lösung.
Die config.php wird in der contenido/includes/startup.php inkludiert. In dieser Datei ist eine Datenbank-Abfrage möglich. Am Ende der Datei habe ich dann meine Abfrage eingebaut und setze $load_lang falls erforderlich. Dann klappt die Weiterleitung auf die korrekte Sprache. Das ist zwar keine wirklich schöne Umsetzung, da ich diese Datei bei jedem Update erneuern muss aber zumindest tut es was es soll. Es erschien mir besser als eine eigene Datenabfrage außerhalb von Contenido zu erstellen.

Grüße und vielen Dank für die Hilfe :)
Matt

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Sprache beim Laden abhängig von der Sub-Domain ändern

Beitrag von Faar » Mo 5. Dez 2016, 17:44

matt.loker hat geschrieben:Aus welcher Datei hast du den Code Faar?
Aus einer älteren front_content.php
Aber die neue in 4.9.12 sieht ganz anders aus, da hat sich viel verändert und wurde das meiste ausgelagert in eine include.
Und es gibt einen Hook für eine Chain, vor der Sprache :-)

Code: Alles auswählen

// Call hook after plugins are loaded
cApiCecHook::execute('Contenido.Frontend.AfterLoadPlugins');
Zeile 89 in include.front_content.php
Das kann man sicher nützen, um $lang entsprechend Subdomain zu setzen.
Die config.php wird in der contenido/includes/startup.php inkludiert.
In 4.9.12 wird die Frontend-Config in front_content.php includiert.
Du bringst da die Frontend-Config mit der Backend-Config durcheinander.
In dieser Datei ist eine Datenbank-Abfrage möglich.
Eben, in welcher nun?
Am Ende der Datei habe ich dann meine Abfrage eingebaut und setze $load_lang falls erforderlich.
$load_lang wird in der frontend-config gesetzt, weil es auch das frontend betrifft.
Das ist zwar keine wirklich schöne Umsetzung, da ich diese Datei bei jedem Update erneuern muss aber zumindest tut es was es soll.
Eben.
Schreib eine Chain, die Du in den Hook oben einklinkst. Das ist dann relativ Update sicher.

P.S. Nach deem Hook kommt auch folgendes:

Code: Alles auswählen

if (isset($changelang)) {
    $lang = $changelang;
}
Da kann man statt $lang auch $changelang in deiner Chain setzen und schon klappt das.
Weil danach erst wird gefragt:

Code: Alles auswählen

if (!isset($lang)) { ...
Und $lang hättest du damit dann ja bereits gesetzt.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

matt.loker
Beiträge: 203
Registriert: Mo 7. Mai 2007, 09:05
Kontaktdaten:

Re: Sprache beim Laden abhängig von der Sub-Domain ändern

Beitrag von matt.loker » Mo 5. Dez 2016, 18:15

Hab ich den Zwischenzeit auch gemerkt dass das murks war was ich da gemacht habe. Es etwas war im Frontend geklappt aber dadurch hab ich das Backend außer Kraft gesetzt. :)

ich werde morgen versuchen den Ansatz mit der Chain umzusetzen :). Vielen vielen Dank für deine Hilfe!!

Grüße
Matt

homtata
Beiträge: 1142
Registriert: Mi 14. Jan 2004, 14:41
Kontaktdaten:

Re: Sprache beim Laden abhängig von der Sub-Domain ändern

Beitrag von homtata » Di 6. Dez 2016, 00:09

Willst du das nicht vielleicht lieber über eine htaccess umsetzen?

matt.loker
Beiträge: 203
Registriert: Mo 7. Mai 2007, 09:05
Kontaktdaten:

Re: Sprache beim Laden abhängig von der Sub-Domain ändern

Beitrag von matt.loker » Mi 7. Dez 2016, 12:35

Hallo homtata,
Mit rewrites kenn ich mich nicht wirklich aus deshalb hab ich die mir vertrautere Variante gewählt. Ich hab es mittlerweile tatsächlich über die von Farr beschrieben Chain geschafft mich vorher einzuklinken und die Sprache anzupassen. Das ganze hab ich über ein Modul gelöst, da ich das wirklich nur im Frontend brauche. Hier mal das Modul. Innerhalb der Funktion LoadTpLang greife ich noch auf andere Funktionen zu.

Code: Alles auswählen

function LoadTpLang()
{
 	global $lang;
	//Checkt die aktuelle Domain ob Sie zu einem Teampartner gehört
	$checkSubDomain = getTpInfos();
	$load_tp_lang = $checkSubDomain["load_lang"];
	if(strlen($load_tp_lang) !=0){
		$lang = $load_tp_lang;
		return $lang;
	}
	return false;
}
cApiCecHook::execute('Contenido.Frontend.AfterLoadPlugin', LoadTpLang());
Mein Problem ist jetzt nur, dass ich die Sprache nicht mehr wechseln kann. ich hab schon

Code: Alles auswählen

if (!isset($changelang)) {
    cApiCecHook::execute('Contenido.Frontend.AfterLoadPlugin', LoadTpLang());
}
probiert aber das greift leider nicht. Habt Ihr vielleicht eine Idee?

Viele Grüße
Matt

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Sprache beim Laden abhängig von der Sub-Domain ändern

Beitrag von Faar » Mi 7. Dez 2016, 14:53

Vielleicht hilft diese Info hier weiter: https://docs.contenido.org/display/CONDEVE/Chain

Und statt $lang würde ich $changelang nehmen.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

Oldperl
Beiträge: 4250
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Kontaktdaten:

Re: Sprache beim Laden abhängig von der Sub-Domain ändern

Beitrag von Oldperl » Mi 7. Dez 2016, 19:57

Servus,

hatten wir dieses Thema nicht schon mal hier? :arrow: http://forum.contenido.org/viewtopic.php?f=98&t=36934

Gruß aus Franken

Ortwin
ConLite 2.1, alternatives und stabiles Update von Contenido 4.8.x unter PHP 7.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog

homtata
Beiträge: 1142
Registriert: Mi 14. Jan 2004, 14:41
Kontaktdaten:

Re: Sprache beim Laden abhängig von der Sub-Domain ändern

Beitrag von homtata » Mi 7. Dez 2016, 22:07

Nur für den Fall der Fälle: hier noch etwas htaccess-Input.

Ich löse das in einer Installation für Mehrsprachigkeit über die htaccess, indem unterschiedliche Domains auf die Sprachversionen geroutet werden. Nehme ich das als Vorbild, dann müsste folgendes in der htaccess ergänzt werden unter AMR und sollte funktionieren:

Code: Alles auswählen

# Enable rewrite engine
# ---------------------
RewriteEngine on

# These lines deal with URl that have nothing attached, pure domain name, rerouting to english
RewriteCond %{HTTP_HOST} ^subdomain1.domain.com$ [NC]
RewriteRule ^$ http://www.domain.com/english [R=301,L]
RewriteCond %{HTTP_HOST} ^subdomain1.domain.com$ [NC]
RewriteRule ^(.+)$ http://www.domain.com/$1 [R=301,L]
Mit diesen 4 Zeilen pro Subdomain kann ich sowohl die Subdomain isoliert aufrufen und umrouten, und zudem werden alle an die Subdomain angehängten Parameter ggf. auch an den umgerouteten URl angehängt. Ich bin zwar auch kein großer htaccess-Versteher, aber immerhin funzt es so bei mir und ich muss nicht im Core rumwurschteln.
LG

matt.loker
Beiträge: 203
Registriert: Mo 7. Mai 2007, 09:05
Kontaktdaten:

Re: Sprache beim Laden abhängig von der Sub-Domain ändern

Beitrag von matt.loker » Do 8. Dez 2016, 19:01

Hallo zusammen,
da ich mit dem setzen der Sprache über Chains nicht wirklich zurecht gekommen bin (hab es einfach nicht geschafft, dass man die Sprache wechseln kann - auch nicht mit $changelang) hab ich die Abfrage jetzt doch in die front_content.php eingebaut. Sind nur 2 Zeilen Code und die Datei ist ja recht überschaubar. Vielen Dank für eure Hilfe. Hat mich zumindest dazu gebracht mich noch einmal mit den Chains auseinander zu setzen. Zumindest verstehe ich jetzt wie man Sie einsetzt :D. Vielen Dank für eure Hilfe und Geduld :)

@Oldperl - mein Post zu den Chains war zu einen anderen Thema. Ich hatte mich darauf hin mit den Chains beschäftigt aber trotzdem nicht verstanden. Mit dem Post hier kam das Thema nochmal auf. Daraufhin hab ich mich nochmal dran gesetzt und es soweit verstanden, dass ich bestehende Chains einsetzen konnte.

@homtata - das komplexe in meinem Fall ist, dass es unzählige Subdomains gibt. Ich kann diese nicht vorher in einer .htaccess eintragen, da diese vom User selbst bestimmt werden können. Deshalb muss es eine Lösung über die Datenbankabfrage sein. Trotzdem vielen Dank für deine Hilfe :)

Viele Grüße und nochmals vielen Dank
Matt

Antworten