Zum Inhalt springen

CONTENT DB-Abfrage erweitern

Erstellt am 4. März 2009 · 10 Antworten · letzte Antwort am 4. März 2009

Tags: Datenbank, Frage

Manthano ·

Hallo Gemeinde,

ich habe folgende Datenbankabfrage:

temp.listContent = CONTENT
    temp.listContent{
      table = tt_content
      select{
        pidInList.cObject < temp.subPagesIDs
        where = (tx_templavoila_ds = 10 or cType = "image")
        orderBy = sorting DESC
      }

in temp.subPagesIDs befinden sich die jeweiligen UID´s der Seiten aus dem ich den Inhalt geliefert bekommen möchte.
Als Ergebnis erhalte ich einen bestimmten Textabschnitt und ein Bild der oben genannten Seiten, welches ich mir als Liste auf einer anderen Seite ausgeben lassen.

Mein Problem ist die Sortierung. Ich müsste eigentlich nach der Spalte sorting, der Tabelle pages sortieren. Ist es möglich folgende vereinfachte SQL-Abfrage als Typoscript darzustellen? Entweder in das oben bestehende Typoscript hinein oder irgend wie Verschachtelt?

 SELECT * FROM tt_content content, pages page
 WHERE content.pid = 20, 30, 50
 AND   pages.uid = 20, 30, 50     
 AND  (content.tx_templavoila_ds = 10 
       OR content.cType = "image")
 ORDER BY pages.sorting;

Die ID´s in content.pid sind identisch mit temp.subPagesIDs aus dem Typoscript

Wäre für jeden Tip dankbar.

Manthano ·

aber wie mache ich das denn in typoscript?
ich schreibe ins anfängerforum weil ich auch tasächlich anfänger bin ^^

Julian.​Hofmann ·

Ist ja immer die Frage, in was mal Anfänger ist, ob "nur" in TYPO3, auch in SQL,... und wie sehr mal sich selber reindenken will bzw. ob man nur einen Denkanstoß braucht. 😉

# ...
table = tt_content
select {
  pidInList.cObject < temp.subPagesIDs
  leftjoin = pages ON(pages.uid=tt_content.pid)
  where = (tt_content.tx_templavoila_ds = 10 or tt_content.cType = "image")
  orderBy = pages.sorting DESC
}

Kann sein, dass da jetzt noch was nicht 100% stimmt, aber denke, es geht ja doch v.a. um den Ansatz.

Viele Grüße
Julian

Manthano ·

Ah cool, wusste nicht, dass das so in der Art geht, ich finde es irgend wie schwierig sämtliche Möglichkeiten zu finden.
Bin übrigens Typo3-Anfänger und da ich eine recht hohe Auffassungsgabe habe reichen meistens Denkanstöße 🙂

vielen Dank Julian.Hofmann ich werde gleich mal testen und dann die Lösung posten 🙂

Manthano ·

Ach verdammt,

leider verhält sich die Seite nun sehr merkwürdig, sodass auch meine Auffassungsgabe nicht ausreicht 🙁

die Bilder werden korrekt angezeigt auch die jeweilige Überschrift sowie der Weiterbutton. Doch durch den Join hat Typo3 Probleme mit der Textpasage.
Bei der ersten kommt der Fehler

  TemplaVoila ERROR:

Couldn't find a Data Structure set for table/row "tt_content:25".
Please select a Data Structure and Template Object first.

Seltsamer weise bei der zweiten Textpasage kommt keine Fehlermeldung, stattdessen wird die Komplette Seite an dieser Stelle angezeigt.

Zum besseren Verständnis kann man hier schauen:
http://goltz-haustierrassen.de/homepage/index.php?id=13

Die Seiten mit den ids 25 und 30 sind die jeweiligen Detailseiten aus denen die inhalte kommen

Woran kann das liegen? nehme ich den Join raus sind die Inhalte die richtigen

Julian.​Hofmann ·

Scheint, als würde Templavoila da innerhalb der Datensätze durcheinander kommen. Ein Ausweg könnte sein, dass Du in die Abfrage noch mit

selectFields = tt_content.*

erweiterst. Damit wäre in den Abfrageergebnissen nur das, was normal in Inhaltselementen vorkommt (und nicht alle Spalten von tt_content und pages, was evtl. zu Überschneidungen führt).

Manthano ·

Hey Julian

erst einmal vielen Dank für deine schnelle Unterstützung.
Leider wird nach selectFields gar nichts mehr angezeigt.

ich habe das TS jetzt noch einmal so geändert, dass alles, bis auf die Sotierung richtig angezeigt wird, also ohne join, damit Du sehen kannst wie es ungefähr aussehen soll.

außerdem hier jetzt noch einmal das komplette TS mit join.
ist ziemlich lang, sorry dafür aber wenn Du Zeit und Lust hast, kannst ja mal darüber schauen. ich neige oft dazu mich zu verrennen und vielleicht siehst Du ja auch andere Ansatzmöglichkeiten oder aber einen Fehler.

  temp.listContent = CONTENT
    temp.listContent{
      table = tt_content
      select{
        pidInList.cObject < temp.subPagesIDs
        selectFields = tt_content.bodytext tt_content.image
        leftjoin = pages ON(pages.uid = tt_content.pid)
        where = (tt_content.tx_templavoila_ds = 10 or tt_content.cType = "image")
        orderBy = pages.sorting ASC
      }
      renderObj = COA
      renderObj{
        10 = IMAGE
        10.if.value = image
        10.if.equals.field = CType
        10.file = GIFBUILDER
        10.file{
          XY = 142, 88
          format = png
          quality = 100
          10 = IMAGE
          10.file.import{
            field = image
            listNum = 0
            wrap = uploads/pics/|
          }
          10.file.width = 142c   
          10.file.height = 88c-0
        }
        10.wrap = <div class="left">|</div>
        20 = TEXT
        20.value = <div class="clear"></div>
        30 = COA
        30{
          10 = USER
          10.userFunc = user_functions->load_listHeader
          20 =< tt_content
          20.if.value = templavoila_pi1
          20.if.equals.field = CType
          40 = IMAGE
          40.if.value = templavoila_pi1
          40.if.equals.field = CType
          40{
            file = fileadmin/img/button/btn_mehr.png
            stdWrap.typolink.parameter.field = pid
            wrap = <div class="right">|</div>
          }
          50 = TEXT
          50.value = <div class="clear"></div>          
       }
        30.wrap = <div class="listentext">|</div>
      }
    }

Viele Grüße
Mathias

Julian.​Hofmann ·

Du verwendest beim Rendern eine Abfrage auf das Feld CType, das Du aber beim select nicht mit abfragst...
Die Zeile 6 war von mir wirklich mit Stern (tt_content.*) gemeint, damit alles aus der Tabellenzelle erst einmal verfügbar ist.

Das TS ist doch noch kurz. Wenn ich mir da manch anderes anschauen.... 😉

Unbekannter Benutzer ·

Wenn ich solche Queries über TS löse, dann meist um solchen selectFields Problemen aus dem Weg zu gehen in zwei Schritten verschachtelt. Das dürfte dir auch hier helfen:

temp.listContent = CONTENT
    temp.listContent{
      table = tt_content
      select{
        pidInList >
		andWhere < temp.subPagesIDs
		andWhere.wrap = uid IN (|)
        orderBy = sorting ASC
      }
	  
	  renderObj = CONTENT
	  renderObj{
		table = tt_content
	  select{
		pidInList.field = uid
		where = (tt_content.tx_templavoila_ds = 10 or tt_content.cType = "image")
	  }
	  
		      renderObj = COA
		      renderObj{
		        10 = IMAGE
		        10.if.value = image
		        10.if.equals.field = CType
		        10.file = GIFBUILDER
		        10.file{
		          XY = 142, 88
		          format = png
		          quality = 100
		          10 = IMAGE
		          10.file.import{
		            field = image
		            listNum = 0
		            wrap = uploads/pics/|
		          }
		          10.file.width = 142c   
		          10.file.height = 88c-0
		        }
		        10.wrap = <div class="left">|</div>
		        20 = TEXT
		        20.value = <div class="clear"></div>
		        30 = COA
		        30{
		          10 = USER
		          10.userFunc = user_functions->load_listHeader
		          20 =< tt_content
		          20.if.value = templavoila_pi1
		          20.if.equals.field = CType
		          40 = IMAGE
		          40.if.value = templavoila_pi1
		          40.if.equals.field = CType
		          40{
		            file = fileadmin/img/button/btn_mehr.png
		            stdWrap.typolink.parameter.field = pid
		            wrap = <div class="right">|</div>
		          }
		          50 = TEXT
		          50.value = <div class="clear"></div>         
		       }
		        30.wrap = <div class="listentext">|</div>
		      }
	  
	  
	  }
	  

    }

ungetestet!

Wobei ich mich gerade frage was in temp.subPagesIDs definiert ist... Kannst du nicht irgendwie dort schon die Reihenfolge bestimmen?

Manthano ·

yar Julian, mein Retter, es lag an der unvollständigen select 🙂
Jetzt passt die Reihenfolge im HTML-Quellcode, muss nur noch css angepasst werden.
*freu*

Vielen Dank

Kitsunet, deinen code habe ich mal einfach copy pastet, geht natürlich nicht auf anhieb, aber sieht interessant aus und werde mir das mal genauer anschauen

und für alle anderen, hier nocheinmal zusammengefasst die Lösung

    temp.listContent = CONTENT
    temp.listContent{
      table = tt_content
      select{
        pidInList = 10,11,12
        selectFields = tt_content.*
        leftjoin = pages ON(pages.uid = tt_content.pid)
        where = (tt_content.tx_templavoila_ds = 10 or tt_content.cType = "image")
        orderBy = pages.sorting ASC
      }