CONTENT: Datenbankabfrage nur, wenn Feld gesetzt
| Autor | Nachricht |
|---|---|
|
Verfasst am: 12. 04. 2012 [13:23]
|
|
|
Tosta
Themenersteller
Dabei seit: 14.03.2007
Beiträge: 107
|
Hallo zusammen. Ist es möglich, die Ausführung einer Datenbankabfrage zu verhindern, wenn eine bestimmte Bedingung gegeben ist? Ich habe die Tabelle pages um ein Feld (tx_xyz_ansprechpartner) erweitert, das die UID eines tt_address-Satzes enthalten kann. Damit kann ich einer Seite einen Ansprechpartner zuordnen. Bei der Ausgabe der Seite soll die Ansprechpartneradresse ermittelt und ausgegeben werden – aber nur, wenn das Feld gesetzt ist. Die Datenbankabfrage darf nur ausgeführt werden, wenn das Ansprechpartner-Feld gesetzt ist. Es gelingt mir nicht, das richtig zu konfigurieren. Die Ausgabe wird zwar unterlassen, wenn das Feld nicht gesetzt ist, aber die DB-Abfrage wird durchgeführt, allerdings mit ungültigem SQL. Hier ist mein TypoScript: TYPOSCRIPT ansprechpartner = CONTENT ansprechpartner { # Dieses if wirkt auf die Ausgabe, aber nicht auf die SQL-Ausführung: stdWrap.if.isTrue.data = page:tx_xyz_ansprechpartner wrap = <div id="ansprechpartner"> | </div> table = tt_address select { # Alle Adressen sind in Ordner 285 oder in dessen Unterordnern: pidInList = 285 # Auch Unterordner durchsuchen: recursive = 99 # Wenn tx_xyz_ansprechpartner nicht gesetzt ist, gibt es # WHERE uid in () # und damit einen Fehler: andWhere { data = page:tx_xyz_ansprechpartner wrap = uid in (|) } } renderObj = COA renderObj { # Ausgabe des Adressdatensatzes… } } ansprechpartner.stdWrap.if… wird zu spät ausgeführt und wirkt darum nur auf die Ausgabe. Welche anderen Möglichkeiten gibt es? Ist CONTENT überhaupt das Richtige? RECORDS scheint mir allerdings nicht geeignet. Danke für eure Hilfe! Tosta |
|
Verfasst am: 12. 04. 2012 [15:17]
|
|
|
Julian.Hofmann
Dabei seit: 18.05.2007
Beiträge: 2073
|
Hallo. Ansich ist der Ansatz richtig, jedoch schlägt Dir die Abarbeitungsreihenfolge ins Gesicht. Wenn Du in die zuständige Klasse schaust (/typo3/sysext/cms/tslib/content/class.tslib_content_content.php) siehst Du, dass stdWrap ganz am Ende ausgeführt wird, nachdem bereits alles andere abgearbeitet wurde (d.h. nach der SQL-Abfrage). Um das if/stdWrap vor der Abfrage ausgewertet zu bekommen, müsstest Du das ganze nochmal schachteln - z.B. in ein COA. Dann im COA die Bedingung Plazierung und in das COA Dein CONTENT-Objekt setzen. Viele Grüße Julian |
|
Verfasst am: 12. 04. 2012 [16:22]
|
|
|
Tosta
Themenersteller
Dabei seit: 14.03.2007
Beiträge: 107
|
Dass das stdWrap nach der DB-Abfrage ausgeführt wird, hatte ich ja erkannt. Auf die Idee der COA-Schachtelung bin ich darum auch gekommen. Leider macht das nichts besser: Das SELECT wird ausgeführt, auch wenn das Feld leer ist. |
|
Verfasst am: 12. 04. 2012 [18:53]
|
|
|
Julian.Hofmann
Dabei seit: 18.05.2007
Beiträge: 2073
|
Ups, zu gut gedacht, aber nicht nochmal selbst vergewissert. COA hat einerseits die Eigenschaft stdWrap (und darin ein if) - das wird aber (konsequent) am Ende der Objekt-Renderings ausgeführt wir bei CONTENT. Es hat aber auch direkt die if-Eigenschaft. 'if "if" returns false the COA is NOT rendered'. PHP $content = '';
if ($this->cObj->checkIf($conf['if.'])) {
$this->cObj->includeLibs($conf);
$content = $this->cObj->cObjGet($conf);
$wrap = isset($conf['wrap.']) ? $this->cObj->stdWrap($conf['wrap'], $conf['wrap.']) : $conf['wrap'];
if ($wrap) {
$content = $this->cObj->wrap($content, $wrap);
}
if (isset($conf['stdWrap.'])) {
$content = $this->cObj->stdWrap($content, $conf['stdWrap.']);
}
}
return $content;Daher sollte es klappen mit TYPOSCRIPT
|
|
Verfasst am: 13. 04. 2012 [11:04]
|
|
|
Tosta
Themenersteller
Dabei seit: 14.03.2007
Beiträge: 107
|
Wow – es funktioniert! Danke Julian! |



