Discussion:
[TYPO3-german] typolink erstellen nur wenn es eine Übersetzung gibt
Paul Kamma
2015-04-10 08:20:51 UTC
Permalink
Hallo,

ich hab efolgenden codesnippet:

page {
headerData {
1423 = TEXT
1423 {
stdWrap.typolink.parameter.data = TSFE:id
stdWrap.typolink.forceAbsoluteUrl = 1
stdWrap.typolink.returnLast = url
stdWrap.typolink.additionalParams = &L=1
wrap = <link rel="alternate" hreflang="en" href="|" />
}
}
}

Soweit funktioniert es, aber ich möchte das er dieses Element nicht ersellt (oder überschreibt) wenn es keine Englische Übersetung gibt.
Ich habe es schon hiermit probiert:

[globalVar = TSFE:page|l18n_cfg = 2]
page.headerData.1423.wrap = <link rel="TEST TEST TEST" hreflang="en" href="|" />
[global]


aber das scheint nicht mehr zu funktionieren, zumindest geht er da nicht rein.
bernd wilke
2015-04-10 10:31:59 UTC
Permalink
Post by Paul Kamma
Hallo,
page {
headerData {
1423 = TEXT
1423 {
stdWrap.typolink.parameter.data = TSFE:id
stdWrap.typolink.forceAbsoluteUrl = 1
stdWrap.typolink.returnLast = url
stdWrap.typolink.additionalParams = &L=1
wrap = <link rel="alternate" hreflang="en" href="|" />
}
}
}
Soweit funktioniert es, aber ich möchte das er dieses Element nicht
ersellt (oder überschreibt) wenn es keine Englische Übersetung gibt.
[globalVar = TSFE:page|l18n_cfg = 2]
page.headerData.1423.wrap = <link rel="TEST TEST TEST" hreflang="en" href="|" />
[global]
aber das scheint nicht mehr zu funktionieren, zumindest geht er da nicht rein.
für die aktuelle Seite geht das eigentlich recht gut wenn du ein
Sprach-Menü erstellst:
http://docs.typo3.org/typo3cms/TyposcriptReference/ContentObjects/Hmenu/Index.html#hmenu-special-language
beachte die States USERDEF1 und USERDEF2

bernd
--
http://www.pi-phi.de/cheatsheet.html
Paul Kamma
2015-04-10 10:43:32 UTC
Permalink
naja, ich möchte aber kein Menü sondern einen simples TEXT element :/
Stephan Schuler
2015-04-10 16:33:04 UTC
Permalink
Hallo Paul.

Leider geht das nicht ohne ein Bisschen Helfer-PHP. Ich kann nicht sagen warum, mich nervt das alle zwei Wochen.

Fakt ist aber, dass dieses Feature an genau drei Stellen implementiert ist:

1: TCA, damit die Checkbox im BE existiert

2: Frontend-Aktuelle-Seite-Finden-Mechanismus. Genauer: Der TypoScriptFrontEndController in der methode settingLanguage(), hier fliegt dann gleich die PageNotFoundException.

3: Im Menü, im AbstractMenuContentObject in den Methoden makeMenu(), filterMenuPages(), und isSubMenu().

Weder gibt es eine schöne Helferfunktion die dir sagt ob eine Seite in einer bestimmten Sprache angezeigt werden soll oder nicht, noch ist das automatischer Teil des TypoLinks oder kann in den einfach eingefädelt werden.

Ich hab mal schnell aus dem Kopf was zusammengeschrieben. Etwa das hier brauchst du:
https://gist.github.com/anonymous/2a7a691d79cde079ed49

Natürlich kann man das jetzt um die Frage erweitern, ob eine bestimmte Seite nicht nur in der aktuellen Sprache sondern einer bestimmten existiert. Immerhin ist das *nicht* Teil meines kleinen Beispiels.
Dann muss man mehr oder weniger den Inhalt von PageRepository::getPage() nachtippen, damit man in PageRepository::getPageOverlay() als zweites Argument die Sprache fallen lassen kann.

Es geht, aber der Weg dorthin führt durch ein paar Untiefen des Cores die man in Zeiten von Extbase nur selten zu Gesicht bekommt.

Gruß,


Stephan Schuler
Web-Entwickler | netlogix Media

Telefon: +49 (911) 539909 - 0
E-Mail: ***@netlogix.de
Web: media.netlogix.de




netlogix GmbH & Co. KG
IT-Services | IT-Training | Media
Neuwieder Straße 10 | 90411 Nürnberg
Telefon: +49 (911) 539909 - 0 | Fax: +49 (911) 539909 - 99
E-Mail: ***@netlogix.de | Web: http://www.netlogix.de

netlogix GmbH & Co. KG ist eingetragen am Amtsgericht Nürnberg (HRA 13338)
Persönlich haftende Gesellschafterin: netlogix Verwaltungs GmbH (HRB 20634)
Umsatzsteuer-Identifikationsnummer: DE 233472254
Geschäftsführer: Stefan Buchta, Matthias Schmidt



- -----Ursprüngliche Nachricht-----
Von: typo3-german-***@lists.typo3.org [mailto:typo3-german-***@lists.typo3.org] Im Auftrag von Paul Kamma
Gesendet: Freitag, 10. April 2015 12:44
An: typo3-***@lists.typo3.org
Betreff: Re: [TYPO3-german] typolink erstellen nur wenn es eine Übersetzung gibt

naja, ich möchte aber kein Menü sondern einen simples TEXT element :/ _______________________________________________
TYPO3-german mailing list
TYPO3-***@lists.typo3.org
http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german
Paul Kamma
2015-04-13 06:18:28 UTC
Permalink
Das ist natürlich ein krasser aufwand für eine solch, meiner Meinung nach, einfache Funktion.
Abr gut zu wissen das ich da nichtallein mit dastehe, vielleicht finde ich noch einen anderen Weg.
Schonmal vielen dank.
Marc Willmann
2015-04-10 18:30:42 UTC
Permalink
Post by Paul Kamma
naja, ich möchte aber kein Menü sondern einen simples TEXT element :/
und was spricht dagegen, den Link über ein HMENU aufzubauen, dass sich
wie ein TEXT-Element verhält oder als Bestandteil eines COAs mit einem
Textelement?

Ansonsten könntest Du auch mit overrride, if und einem SELECT auf der
pages-Tabelle experimentieren.

Marc
--
Marc Willmann. TYPO3-Freelancer.
http://www.marc-willmann.de

Seelandstr. 14-16
D-23569 Lübeck

TYPO3 Certified Integrator
Paul Kamma
2015-04-13 06:19:57 UTC
Permalink
Das mit einem Select zu erledigen habe ich auch dran gedacht, aber da ich noch nicht so viel mit gearbeitet habe wollte ich erst hier nachfragen bevor ich mich damit beschäftige. Wird mir wohl jetzt keine andere Wahl bleiben :)

Wie ich es das mit einem HMENU machen soll ist mir persönlich leider schleierhaft.
Paul Kamma
2015-04-13 12:14:34 UTC
Permalink
OK War unterm strich ganz einfach:

page.headerData.1423 = TEXT
page.headerData.1423 {
stdWrap.typolink.parameter.data = TSFE:id
stdWrap.typolink.forceAbsoluteUrl = 1
stdWrap.typolink.returnLast = url
stdWrap.typolink.additionalParams = &L=1
wrap = <link rel="alternate" hreflang="en" href="|" />
}
page.headerData.1423 {
if.isTrue.cObject = CONTENT
if.isTrue.cObject{
table = tt_content
select.where = sys_language_uid = 1 AND colpos=0
select.pidInList = this
}
}

[globalVar = GP:L=1]
page.headerData.1423.wrap = <link rel="alternate" hreflang="de" href="|" />
page.headerData.1423.stdWrap.typolink.additionalParams = &L=0
page.headerData.1423.if.isTrue.cObject.select.where = sys_language_uid = 0 AND colpos=0
[global]

mach das was es soll
Paul Kamma
2015-04-13 12:23:04 UTC
Permalink
Achso hässlig ist es ja nicht geworden. Bin dir da wohl etwas zuvor gekommen :)
Stephan Schuler
2015-04-13 12:41:45 UTC
Permalink
Naja. Kann man schon so machen, aber ...


Du fragst nicht pages und nicht pages_language_overlay sondern tt_content.
Damit prüfst du (das ist dir vermutlich bewusst), ob auf der Seite in der colpos 0 ein Element mit der Sprache 0 ist um den Link zur Standardsprache anzuzeigen oder ein Element in Sprache 1 um den Link in der Übersetzung 1 anzuzeigen.

Stell dir vor der Redakteur legt jetzt nur Inhaltselemente mit der Sprache "alle" an. Das ist sys_language_uid -1.
Dann werden deine Links bisher überhaupt nicht gerendert.

Stell dir vor der Redakteur legt eine Seitenübersetzung in Sprache 1 an, stellt die aber auf "versteckt".
Dann wird der Link gerendert und führt zu einem 404er. Weil das tt_content ja *nicht* versteckt ist.

Stell dir vor der Redakteur setzt in den Seiteneigenschaften die Checkbox "Hide default translation of page".
Trotzdem wird, wenn im Backend ein Inhaltselement in Standardsprache existiert, ein Link auf die Standardsprache erzeugt weil dein query das nicht berücksichtigt, der führt dann aber zu einem 404er weil das Seitenrendering das sehr wohl tut.

Stell dir vor der Redakteur setzt im Backend die Checkbox "Show page even if no translation exists" (sofern du im Install-Tool die Option "hidePagesIfNotTranslatedByDefault" aktiv hast, was streng genommen die Voraussetzung für deaktiviertes Language-Fallback ist).
Dann wird der Link für die Übersetzung nicht gerendert obwohl er eigentlich da sein müsste.


Dass du nicht auf das Zusammenspiel von pages und pages_language_overlay eingehst sondern auf tt_content mag zwar für deinen Anwendungsfall und solange du ggf. der einzige Redakteur bist funktionieren, und vielleicht auch, solang die Seite neben der Standardsprache nur eine Übersetzung hat. Aber formal produziert deine Lösung nur zufällig das Ergebnis das du erwartest.



Stephan Schuler
Web-Entwickler | netlogix Media

Telefon: +49 (911) 539909 - 0
E-Mail: ***@netlogix.de
Web: media.netlogix.de




netlogix GmbH & Co. KG
IT-Services | IT-Training | Media
Neuwieder Straße 10 | 90411 Nürnberg
Telefon: +49 (911) 539909 - 0 | Fax: +49 (911) 539909 - 99
E-Mail: ***@netlogix.de | Web: http://www.netlogix.de

netlogix GmbH & Co. KG ist eingetragen am Amtsgericht Nürnberg (HRA 13338)
Persönlich haftende Gesellschafterin: netlogix Verwaltungs GmbH (HRB 20634)
Umsatzsteuer-Identifikationsnummer: DE 233472254
Geschäftsführer: Stefan Buchta, Matthias Schmidt



- -----Ursprüngliche Nachricht-----
Von: typo3-german-***@lists.typo3.org [mailto:typo3-german-***@lists.typo3.org] Im Auftrag von Paul Kamma
Gesendet: Montag, 13. April 2015 14:23
An: typo3-***@lists.typo3.org
Betreff: Re: [TYPO3-german] typolink erstellen nur wenn es eine Übersetzung gibt

Achso hässlig ist es ja nicht geworden. Bin dir da wohl etwas zuvor gekommen :) _______________________________________________
TYPO3-german mailing list
TYPO3-***@lists.typo3.org
http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german
Paul Kamma
2015-04-13 13:27:39 UTC
Permalink
Ich kann mit ruhigem gewissen sagen das diese Fälle nie eintreten werden. Und falls es doch passiert werde ich nach einer anderen Lösung suchen, im moment ist das "good Enough" wie man gerne mal sagt.

Trotzdem danke für deine detailierte Problemlösung, ich werde es auf jeden fall Bookmarken falls einer derFälle eintritt oder ich mal wieder etwas Zeit habe um mich mit dem Problem noch weiter zu beschäftigen.
Stephan Schuler
2015-04-13 12:18:25 UTC
Permalink
Hallo Marc, hallo Paul.


Das mit dem SELECT würde ich nicht umsetzen. Das wird viel hässlicher als eine UserFunc.
Zunächst muss nicht "pages" angefragt werden sondern "page_language_overlay".

Dann allerdings ist trotzdem in der zugehörigen "pages"-Tabelle relevant, was in "18n_cfg" steht.
Der Wert "0" bedeutet: Seite immer anzeigen
Der Wert "1" bedeutet: "Standardsprache verbergen".
Der Wert "2" bedeutet: "Seite in Zielsprache verbergen wenn keine Übersetzung existiert".
Der Wert "3" bedeutet: "Sowohl Standardsprache verbergen als auch die Seite in Zielsprache wenn keine Übersetzung existiert", also "1+2".

Es könnte aber auch im InstallTool der Wert "hidePagesIfNotTranslatedByDefault" aktiv sein, dann ist hier "irgendwas" vertauscht (ich glaube 0 mit 2 und 1 mit 3, bin mir da aber gerade nicht ganz sicher).

=> Das will man bitte *unter keinen Umständen* im SQL-Query innerhalb des Headers im Typoscript nachpuzzeln.


Zur UserFunc:

Der Aufwand hält sich *eigentlich* in Grenzen. Den Großteil hab ich dir ja in einem Snippet bereitgestellt. Als TypoLink-IF-Irgendwas hab ich das allerdings noch nie verwendet und hab deshalb auch keinen 100% vollständigen Code hier den ich dir schicken könnte.

Das HMENU ist da relativ einfach und hat *eigentlich* dafür auch eine passende Option: "special=language".

http://docs.typo3.org/typo3cms/TyposcriptReference/ContentObjects/Hmenu/Index.html#hmenu-special-language
http://docs.typo3.org/typo3cms/FrontendLocalizationGuide/BasicSetupOfALocalizedWebsite/LanguageSelectorMenu/Index.html

Das sowohl in der TSREF als auch im "FrontendLocalizationGuide" gezeigte Beispiel eines GMENU ist natürlich für deinen Anwendungsfall falsch, aber da findest du ja auch die HEMNU/TMENU-Kombination aus der du denen Usecase ableiten kannst.

Relevant ist eigentlich, im Vergleich zum herkömmlichen HEMNU "ohne special", dass du "special=language" und "special.value=1,3,5,7,11" schreibst (sofern du die Sprachen 1, 3, 5, 7 und 11 auflisten möchtest).

Im HMENU/TMENU-Beispiel siehst du auch, wie du zwischen den drei Varianten "aktuelle Sprache", "Seite existiert in dieser Sprache nicht" und "Übersetzung" unterscheidest -- nämlich über die THMENU-Items ACT, USERDEF und NO.


Gruß,


Stephan Schuler
Web-Entwickler | netlogix Media

Telefon: +49 (911) 539909 - 0
E-Mail: ***@netlogix.de
Web: media.netlogix.de




netlogix GmbH & Co. KG
IT-Services | IT-Training | Media
Neuwieder Straße 10 | 90411 Nürnberg
Telefon: +49 (911) 539909 - 0 | Fax: +49 (911) 539909 - 99
E-Mail: ***@netlogix.de | Web: http://www.netlogix.de

netlogix GmbH & Co. KG ist eingetragen am Amtsgericht Nürnberg (HRA 13338)
Persönlich haftende Gesellschafterin: netlogix Verwaltungs GmbH (HRB 20634)
Umsatzsteuer-Identifikationsnummer: DE 233472254
Geschäftsführer: Stefan Buchta, Matthias Schmidt



- -----Ursprüngliche Nachricht-----
Von: typo3-german-***@lists.typo3.org [mailto:typo3-german-***@lists.typo3.org] Im Auftrag von Paul Kamma
Gesendet: Montag, 13. April 2015 08:20
An: typo3-***@lists.typo3.org
Betreff: Re: [TYPO3-german] typolink erstellen nur wenn es eine Übersetzung gibt

Das mit einem Select zu erledigen habe ich auch dran gedacht, aber da ich noch nicht so viel mit gearbeitet habe wollte ich erst hier nachfragen bevor ich mich damit beschäftige. Wird mir wohl jetzt keine andere Wahl bleiben :)

Wie ich es das mit einem HMENU machen soll ist mir persönlich leider schleierhaft.
_______________________________________________
TYPO3-german mailing list
TYPO3-***@lists.typo3.org
http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german
Loading...