Zum Inhalt springen

CONTENT andWhere l10n_parent

Erstellt am 8. Mai 2009 · 3 Antworten · letzte Antwort am 16. Juni 2009

Tags: Datenbank, Frage

froemken ·

Hallo TYPO3-Liebhaber,

dieses Script funktioniert zwar, aber es listet mir den einen Datensatz für alle drei Sprachen auf und das obwohl ich languageFields angegeben habe.

10 = CONTENT
10 {
	table = tx_ebsprod_category
	select.pidInList = 72
	select {
		andWhere.cObject = COA
		andWhere.10 = TEXT
		andWhere.10.data = GPvar:tx_ebsprod_pi1|category
		andWhere.10.intval = 1
		andWhere.10.wrap = (uid=| AND l10n_parent=0)
		andWhere.20 < .10
		andWhere.20.wrap = OR (uid <> l10n_parent AND l10n_parent=|)
		selectFields = name
		languageField = sys_language_uid
	}
	renderObj = COA
	renderObj {
		10 = TEXT 
		10 {
			required = 1
			wrap = |
			field = name
		}
	}
}

Dazu mal eine Frage:
Ich habe das localization-Feature für diese Tabelle aktiviert, damit erhalte ich dieses Feld l10n_parent in dem ich angeben kann, zu welcher uid dieser Datensatz gehört.
Am liebsten würde ich einfach nur l10n_parent und sys_language_uid abfragen, aber bei der Standardsprache sind alle Felder in l10n_parent leer, weshalb ich hier in meinem Beispiel dieses krumme OR-Konstrukt einbauen musste.
Irgendjemand eine Idee, wie TYPO3 sich das mit den l10n_parent-Dingern gedacht hat?!

Stefan

froemken ·

Hmm...naja...mit dieser Lösung funktioniert es, aber wer baut sich mit TypoScript schon so komplexe Teile auf?!?!

<T3DataStructure>
	<ROOT type="array">
		<el type="array">
			<field_header type="array">
				<tx_templavoila type="array">
					<TypoScript><![CDATA[
	10 = CONTENT
	10 {
		table = tx_ebsprod_category
		select.pidInList = 72
		select {
			andWhere.cObject = COA
			andWhere.cObject.10 = TEXT
			andWhere.cObject.10.data = GPvar:L
			andWhere.cObject.10.intval = 1
			andWhere.cObject.10.wrap = (sys_language_uid=|
			andWhere.cObject.20 = TEXT
			andWhere.cObject.20.data = GPvar:tx_ebsprod_pi1|category
			andWhere.cObject.20.intval = 1
			andWhere.cObject.20.noTrimWrap = | AND uid=| |
			andWhere.cObject.30 = TEXT
			andWhere.cObject.30.value = AND l10n_parent=0)
			andWhere.cObject.40 = TEXT
			andWhere.cObject.40.data = GPvar:L
			andWhere.cObject.40.intval = 1
			andWhere.cObject.40.noTrimWrap = | OR (sys_language_uid=| |
			andWhere.cObject.50 = TEXT
			andWhere.cObject.50.value = AND uid <> l10n_parent
			andWhere.cObject.60 = TEXT
			andWhere.cObject.60.data = GPvar:tx_ebsprod_pi1|category
			andWhere.cObject.60.intval = 1
			andWhere.cObject.60.noTrimWrap = | AND l10n_parent=|)|
			selectFields = name
		}
		renderObj = COA
		renderObj {
			10 = TEXT 
			10 {
				required = 1
				wrap = |
				field = name
			}
		}
	}
					]]></TypoScript>
				</tx_templavoila>
			</field_header>
		</el>
	</ROOT>
</T3DataStructure>

PS: ARGH...jetzt in der Vorschau sehe ich auch meinen Fehler:
Es lag an dem cObject, was ich vergessen habe mit zu übernehmen.

Na toll...jetzt kann ich den Krempel nochmal umschreiben, damit er wieder kleiner wird. Mist :-)

froemken ·

Also das mit den l10n-Dingern ist echt irre. Hab jetzt erste mal ein paar Variablen in die Register geschrieben, damit mein Script nicht explodiert.

Mit "language" hole ich mit die aktuelle Sprache...allerdings musste ich da ein if reinbasteln, weil sonst wird mit einer leeren Variablen weiter gearbeitet...also ab auf 0 damit, wenn leer.

Mit "productParent" hole ich mir bei z.B. einem deutschen Datensatz den englischen Elterndatensatz. Ich brauche dieses Parent, wenn ich von Deutsch auf Polnisch wechseln will. Probleme hatte ich bei Deutsch -> Englisch, da EN ja gar keinen l10n_parent hat, also musste auch hier wieder eine Weiche rein.

Mit "productUid" hole ich mit nun an Hand des productParent die Uid des gewünschten Datensatzes. Auch hier wieder eine Abfrage, denn im Englischen gibt es keinen l10n-Eintrag, also muss, wenn leer, der productParent genommen werden.

Hier also nur das Script, um diese Variablen zu setzen:

page.10 = LOAD_REGISTER
page.10 {
	language.cObject = COA
	language.cObject {
		10 = TEXT
		10.value = 0
		10.if.isFalse.data = GPvar:L
		20 = TEXT
		20.data = GPvar:L
		20.if.isTrue.data = GPvar:L
	}
	productParent.cObject = CONTENT
	productParent.cObject {
		table = tx_ebsprod_product
		select {
			pidInList = 72
			andWhere.cObject = COA
			andWhere.cObject {
				10 = TEXT
				10.data = register:language
				10.intval = 1
				10.noTrimWrap = |(sys_language_uid=| |
				20 = TEXT
				20.data = GPvar:tx_ebsprod_pi1|uid
				20.intval = 1
				20.wrap = AND l10n_parent=|)
				30 = TEXT
				30.data = GPvar:tx_ebsprod_pi1|uid
				30.intval = 1
				30.noTrimWrap = | OR (uid=|)|
			}			
			selectFields = l10n_parent
		}
		renderObj = TEXT
		renderObj {
			wrap = |
			required = 1
			field = l10n_parent
		}
	}
	productUid.cObject = COA
	productUid.cObject {
		10 = TEXT
		10.ifEmpty.data = register:productParent
		10.cObject = CONTENT
		10.cObject {
			table = tx_ebsprod_product
			select {
				pidInList = 72
				andWhere.cObject = COA
				andWhere.cObject {
					10 = TEXT
					10.data = register:language
					10.intval = 1
					10.noTrimWrap = |(sys_language_uid=| |
					20 = TEXT
					20.data = register:productParent
					20.intval = 1
					20.wrap = AND l10n_parent=|)
				}			
				selectFields = uid
			}
			renderObj = TEXT
			renderObj {
				wrap = |
				field = uid
			}
		}
	}
}

Jetzt wo die Uid dank diesen Script-Wirrwarr da oben endlich IMMER richtig ist, brauche ich in meinen Scripten weiter unten nur noch folgenden Code:

lib.productDescription = CONTENT
lib.productDescription {
	table = tx_ebsprod_product
	select {
		pidInList = 72
		andWhere.data = register:productUid
		andWhere.intval = 1
		andWhere.wrap = uid=|
		selectFields = description
	}
	renderObj = COA
	renderObj {
		10 = TEXT
		10.field = description
		10.wrap = |
	}
}

Wie schon einmal gesagt: Sollte es jemanden geben, der l10n_parent besser kennt als ich und optimierte Varianten im Petto hat, dann immer her damit.

Danke Euch

Stefan

froemken ·

So...jetzt sind wir einen Monat weiter und ich habe endlich eine SEHR VIEL bessere Möglichkeit gefunden:

config.sys_language_overlay = hideNonTranslated

Diese Einstellung hatte ich zwar schon gesetzt, aber ich musste in meinem TS bei select ein * angeben (so zumindest ein Auszug aus Dmitrys Buch)

und schon habe ich mit nem 10-Zeiler Zugriff auf alle Sprachen. Weg mit diesem Code-Marathon, den ich zuerst hatte.

froemken