CONTENT: Datenbankabfrage nur, wenn Feld gesetzt [Gelöst]

  • Tosta Tosta
    R2-D2
    0 x
    114 Beiträge
    0 Hilfreiche Beiträge
    12. 04. 2012, 13:23

    Hallo zusammen.

    Ist es möglich, die [b]Ausführung[/b] einer Datenbankabfrage zu verhindern, wenn eine bestimmte Bedingung gegeben ist?

    Ich habe die Tabelle [i]pages[/i] um ein Feld ([i]tx_xyz_ansprechpartner[/i]) erweitert, das die UID eines [i]tt_address[/i]-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.

    [b]Die Datenbankabfrage darf nur ausgeführt werden, wenn das Ansprechpartner-Feld gesetzt ist.[/b]

    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:

    1. ansprechpartner = CONTENT
    2. ansprechpartner {
    3. # Dieses if wirkt auf die Ausgabe, aber nicht auf die SQL-Ausführung:
    4. stdWrap.if.isTrue.data = page:tx_xyz_ansprechpartner
    5. wrap = <div id="ansprechpartner"> | </div>
    6. table = tt_address
    7. # Alle Adressen sind in Ordner 285 oder in dessen Unterordnern:
    8. pidInList = 285
    9. # Auch Unterordner durchsuchen:
    10. recursive = 99
    11. # Wenn tx_xyz_ansprechpartner nicht gesetzt ist, gibt es
    12. # WHERE uid in ()
    13. # und damit einen Fehler:
    14. andWhere {
    15. data = page:tx_xyz_ansprechpartner
    16. wrap = uid in (|)
    17. }
    18. }
    19. renderObj = COA
    20. renderObj {
    21. # Ausgabe des Adressdatensatzes…
    22. }
    23. }

    [i]ansprechpartner.stdWrap.if…[/i] wird zu spät ausgeführt und wirkt darum nur auf die Ausgabe. Welche anderen Möglichkeiten gibt es? Ist [i]CONTENT[/i] überhaupt das Richtige? [i]RECORDS[/i] scheint mir allerdings nicht geeignet.

    Danke für eure Hilfe!

    Tosta


  • 1
  • Julian.Hofmann Julian.Ho...
    Flash Gordon
    0 x
    3024 Beiträge
    127 Hilfreiche Beiträge
    12. 04. 2012, 15:17

    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 Tosta
    R2-D2
    0 x
    114 Beiträge
    0 Hilfreiche Beiträge
    12. 04. 2012, 16:22

    Dass das [i]stdWrap[/i] 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 Julian.Ho...
    Flash Gordon
    0 x
    3024 Beiträge
    127 Hilfreiche Beiträge
    12. 04. 2012, 18:53

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

    [i]COA[/i] hat einerseits die Eigenschaft [i]stdWrap[/i] (und darin ein [i]if[/i]) - das wird aber (konsequent) am Ende der Objekt-Renderings ausgeführt wir bei [i]CONTENT[/i].
    Es hat aber auch direkt die [i]if[/i]-Eigenschaft. 'if "if" returns false the COA is NOT rendered'.

    1. $content = '';
    2. if ($this->cObj->checkIf($conf['if.'])) {
    3. $this->cObj->includeLibs($conf);
    4. $content = $this->cObj->cObjGet($conf);
    5. $wrap = isset($conf['wrap.']) ? $this->cObj->stdWrap($conf['wrap'], $conf['wrap.']) : $conf['wrap'];
    6. if ($wrap) {
    7. $content = $this->cObj->wrap($content, $wrap);
    8. }
    9. if (isset($conf['stdWrap.'])) {
    10. $content = $this->cObj->stdWrap($content, $conf['stdWrap.']);
    11. }
    12. }
    13. return $content;

    Daher sollte es klappen mit
    1. ansprechpartner = COA
    2. ansprechpartner.if.isTrue.data = page:tx_xyz_ansprechpartner
    3. ansprechpartner.10 = CONTENT
    4. //...

  • Tosta Tosta
    R2-D2
    0 x
    114 Beiträge
    0 Hilfreiche Beiträge
    13. 04. 2012, 11:04

    Wow – es funktioniert! Danke Julian!

  • 1