Zum Inhalt springen

Tabellenabfrage tt_content

Erstellt am 25. Februar 2009 · 7 Antworten · letzte Antwort am 26. Februar 2009

Tags: Frage

Cordt ·

Schönen guten Morgen,

folgendes Problem:
Ich verwende die tt_news Extension zur Verwaltung von Projekten. In der Single-Anzeige soll neben dem Projekt der entsprechende Ansprechpartner angezeigt werden. Der Ansprechpartner ist ein FCE und die Zuordnung erfolgt über "author" (aus tt_news) und "header" (aus tt_content).
Im Prinzip funktioniert es schon, bloß bei dem andWhere hakt es. Übergebe ich den Namen manuel funktioniert es, wenn ich den Namen per TypoScript zuweise nicht.
Folgendes Code dazu:

tmp.contact_name = CONTENT
tmp.contact_name {
	table = tt_news	

        # In diesem Ordner befinden sich die Projekte (also tt_news Datensätze)
	select.pidInList = 103
	
        # Die uid der News wird dem $_GET Array entnommen
        select.andWhere {
		data = GPvar:tx_ttnews | tt_news
		# avoid SQL injection:
		intval = 1
		wrap = uid=|
	}
 
        # Das Feld "author" wird ausgelesen und entsprechend gewrapt
	renderObj = COA
	renderObj {
	10 = TEXT
	10.field = author
	10.wrap = header="|"	
	} 
}

lib.project_contact = COA
lib.project_contact.10 = CONTENT
lib.project_contact.10 {
	table = tt_content	
	select.where = tx_templavoila_to=7

        # Bei manueller Angabe funktioniert es:
	select.andWhere = header="Vorname Nachname"

        # Hier liegt das Problem, die Zuweisung funktioniert nicht
	# select.andWhere < tmp.contact_name

        # Dieser Ordner enthält die Kontakte
	select.pidInList = 109
	renderObj.stdWrap.outerWrap = |
}

# Hier habe ich getestet ob "tmp.contact_name" den richtigen Wert enthält, also header="Vorname Nachname" --> funktioniert
lib.project_contact.11 < tmp.contact_name

Also langer Rede Kurzer Sinn,

select.andWhere < tmp.contact_name

funktioniert nicht. Würde mich über jede Hilfe freuen.

Vielen Dank,

Cordt

relph ·

Das würde mich auch interessieren. Kann es sein, dass diese andWhere-Bedingung in Typoscript nicht geht?

relph ·

hm, blöd gefragt eigentlich. ich weiß ja das es geht, aber scheinbar eben nur hier und dort. Hier ist eine andWhere Abfrage möglich. aber Dann müßte das ganze Plugin extra gerendert werden.

page.40 = CONTENT
page.40 {
table = tt_news
select {
selectFields = author, title
#PID des sysfolders
pidInList = 12
orderBy = datetime
andWhere.dataWrap = crfeuser_id = {GPvar:uid}
}
renderObj = COA
renderObj {
10 = TEXT
10.field = title
10.wrap = <h2>|</h2>

20 = TEXT
...
}

und mit dem folgenden Typoscript ist die Abfrage bei mir wieder nicht möglich, und da versteh ich nicht ganz, worauf es nun ankommt, das so eine Abfrage greift oder eben nicht.

NEWS < plugin.tt_news
    NEWS {
          code >
          code = LATEST
          pid_list >
          pid_list = 12 
          limit = 5
          listOrderBy = datetime
          andWhere = crfeuser_id = {GPvar:uid}
          select {
               
                andWhere = crfeuser_id = {GPvar:uid}
                max = 10
        }
}

geht leider auch nicht:

plugin.tt_news.displayList.andWhere.dataWrap = crfeuser_id = {GPvar:uid}
Cordt ·

Also ich hab es so verstanden, dass andWhere, was ja logisch ist, zum select gehört. Es ist ja eine ergänzung zum SELECT Statement.

Also bei dir steht ja quasi (in dem 2. Code)

plugin.tt_news.andWhere

Ich frage mich, ob man dem andWhere auch eine select-Abfrage zuordnen kann. Werde das mal testen.

Cordt ·

Hab die Lösung gefunden:

Das temporäre Objekt ist vom Typ cObject. Das muss dem andWhere offensichtlich mitgeteilt werden 🙂

select.andWhere.cObject < temp.contact_name

statt

select.andWhere < temp.contact_name

Hier nochmal das vollständige TS falls es jemanden interessiert. Es ließt also aus den übergeben "News" den Autor aus und ermittelt so anhand des Headers, der dementsprechend den gleichen Namen haben muss, den Ansprechpartner aus tt_content:

temp.contact_name = CONTENT
temp.contact_name {
	table = tt_news	
	select.pidInList = 103
	select.andWhere {
		data = GPvar:tx_ttnews | tt_news
		# avoid SQL injection:
		intval = 1
		wrap = uid=|
	}
	renderObj = TEXT
	renderObj.field = author
	renderObj.wrap = header="|"	 
}

lib.project_contact = CONTENT
lib.project_contact {
	table = tt_content	
	select.where = tx_templavoila_to=7
	select.pidInList = 109
	select.andWhere.cObject < temp.contact_name  # Hier lag der Hund begraben ;)
	renderObj.stdWrap.outerWrap = |
}

Viele Grüße

kraftb ·

Hallo !

Also generell mal: "andWhere" ist eine stdWrap property. Das heisst wenn du Ihr ein cObject zuweist (tmp.contact_name = CONTENT) wird das nicht klappen.

So sollte es auf jeden Fall klappen:

select.andWhere.cObject < tmp.contact_name

(Siehe TSRef -> stdWrap -> cObject)

Und nur mal folgende Frage: Wird das cObject "lib.project_contact" direkt in die tt_news single anzeige (template) eingefügt? Weil wenn dem so ist - dann brauchst du gar nicht mit einer extra query den author der "aktuell angezeigten" news abfragen.

Denn dann könnte man das ja sowieso schon andersweitig verwendete "author" feld auch gleich zum darstellen der author info verwenden:

plugin.tt_news.author_stdWrap.cObject = CONTENT
plugin.tt_news.author_stdWrap.cObject {
	table = tt_content     
        select.andWhere = tx_templavoila_to=7 AND header="{field:author}"
        select.pidInList = 109
        renderObj <= tt_content
}

Wenn du nun den Marker für das feld "author" in das tt_news HTML template einfügst, müsste dir an dieser Stelle das FCE gerendert werden ...

BTW: Eventuell wäre es sinnvoller die "related" box im tt_news record, so anzupassen (übers TCA), dass du nicht nur related tt_news records wählen kannst, sondern auch tt_content einträge als "related" einstellen kannst. Dann kannst du in der related box das CE für den author auswählen, und ersparst dir die werte für "author/title-beim-FCE" immer konsistend usw. halten zu müssen und hast echte relations.

Natürlich könntest du auch das TCA vom "author" feld anpassen, also in ext/tt_news/tca.php - für das feld 'author' eintragen (also den bisherigen wert ersetzen):

'author' => Array (
	'exclude' => 1,
	'l10n_mode' => 'exclude',
	'label' => '!!!bla unverändert!!!',
	'config' => Array (
		'type' => 'select',
		'foreign_table' => 'tt_content',
		# Page 109 enthält die kontakte
		'foreign_table_where' => ' AND tt_content.pid=109'
		'size' => 1,
		'minitems' => 0,
		'maxitems' => 1,
	),
),

Somit hast du dann anstelle des text-eingabefeldes im tt_news-record ein drop down aus dem du eines deiner "kontakt" fce's auswählen kannst (Nicht vergessen ALLE caches zu clearen!)

Dann brauchst du im obigen TypoScript nur noch das "select.andWhere" anpassen - und die Lösung ist optimal (meines erachtens nach 🙂

select.andWhere.field = author
select.andWhere.intval = 1
select.andWhere = tx_templavoila_to=7 AND uid=|

wobei man das "tx_templavoila_to" dann ja auch weglassen kann - weil es durch die "uid" sowieso schon eindeutig spezifiziert ist.

grüsse,
Bernhard

kraftb ·

Hallo nochmal,

BTW:
Wenn du irgendwo ein stdWrap feld hast. Kann man sich immer mit ".debugData = 1" anzeigen lassen welche werte gerade für ".field =" verfügbar sind.

In diesem fall also z.B. bei:

select.andWhere = tx_templavoila_to=7 AND header="{field:author}"

könnte man mit:

select.andWhere.debugData = 1

ein liste (debug ausgabe) aller derzeit über "dataWrap = {field:feldname}" oder über ".field = feldname" verfügbaren felder anzeigen lassen ... wo dann auch das feld "author" aufscheinen sollte, wenn dieses TypoScript vom tt_news plugin ausgeführt wird - wenn also im tt_news plugin $this->cObj->data mit dem aktuell gerendertem news-record befüllt ist.

grüsse,
Bernhard

Cordt ·

Vielen Dank für die Hilfe,

select.andWhere.cObject < tmp.contact_name

ist ja das was ich auch nach längerer Suche gefunden habe.

Ich bin erstmal froh, dass ich es überhaupt zum laufen bekommen habe, aber bei Gelegeneheit werde ich mal deine Lösung ausprobieren, das scheint mir tatsächlich eleganter zu sein.

Und danke für den Hinweis mit debugData.

Gruß

Cordt