Zum Inhalt springen

CONTENT: Datenbankabfrage nur, wenn Feld gesetzt

Erstellt am 12. April 2012 · 4 Antworten · letzte Antwort am 13. April 2012

Tags: Datenbank, Frage

Tosta ·

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:

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

Julian.​Hofmann ·

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

Tosta ·

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.

Julian.​Hofmann ·

Ups, zu gut gedacht, aber nicht nochmal selbst vergewissert. :o

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'.

$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

ansprechpartner = COA
ansprechpartner.if.isTrue.data = page:tx_xyz_ansprechpartner
ansprechpartner.10 = CONTENT
//...