[Frage] Zufälliges Hintergrundbild aus Resourcen einer fixen Seite [Gelöst] TYPO3-Version: 6.1.7

  • Chrissli Chrissli
    Jedi-General
    0 x
    1015 Beiträge
    28 Hilfreiche Beiträge
    29. 01. 2014, 17:27

    Hallo Zusammen,

    steh' grade ein wenig auf dem Schlauch.
    Ich würde gerne beim Laden der Seite aus den Resourcen der Hauptseite ( ID:1 )
    jeweils zufällig ein Bild laden um dieses als Hintergrund für die Seite
    im Body zu verwenden.

    1. temp.backImg = CONTENT
    2. temp.backImg {
    3. table = pages
    4. pidInList = 1
    5. where = uid = 1
    6. orderBy = rand()
    7. max = 1
    8. }
    9.  
    10. renderObj = FILES
    11. renderObj {
    12. references {
    13. table = pages
    14. uid.field = uid
    15. fieldName = media
    16. }
    17. renderObj = IMG_RESOURCE
    18. renderObj.file {
    19. import.data = file:current:publicUrl
    20. #import.listNum = 0
    21. #treatIdAsReference = 1
    22. }
    23. }
    24.  
    25. wrap = style="background-image: url('|');"
    26. }

    Hab' schon diverse Ansätze probiert, aber vielleicht sieht ja jemand auf Anhieb was ich falsch mache...

    God's in his heaven, all's right with the world

  • Julian.Hofmann Julian.Ho...
    Flash Gordon
    1 x
    2845 Beiträge
    105 Hilfreiche Beiträge
    30. 01. 2014, 10:45 - Lösung

    ...und manchmal kommt man auf die einfachere Lösung dann doch selbst, wenn man nochmal nachdenkt ;-)

    1. temp.backImg = IMAGE
    2. temp.backImg.file {
    3. import.data = levelmedia: 0
    4. import.listNum = rand
    5. treatIdAsReference = 1
    6. }

    Zu beachten ist hierbei aber, dass das Objekt gecacht wird, d.h. der "Zufall" auch gecacht wird. Wenn dies unerwünscht ist, dann müsste ein *_INT-Objekt außenherum.
    Alternative wäre, mehrere Bilder in HTML einzubetten udn via JS (und damit am Cache vorbei) den Zufall zu handhaben.

  • Hilfreichster Beitrag

  • Julian.Hofmann Julian.Ho...
    Flash Gordon
    1 x
    2845 Beiträge
    105 Hilfreiche Beiträge
    30. 01. 2014, 13:13 - Hilfreichster Beitrag

    Hm, also der erste Ansatz hatte bei mir (TYPO3 CMS 6.2.0beta4) funktioniert. Der hat v.a. den Vorteil, dass er tabellenunabhänig ist, d.h. die Bilddaten auch aus einem tt_content-Element, der dem neusten News-Beitrag odgl. genommen werden könnten.

    Zu Deinen weiteren Fragen:

    1.)
    stdWrap hat drei debug*-Eigenschaften, wobei das wohl nicht unbedingt in solch einem Fall hilfreich ist, weil stets auf [u]das Ergebnis[/u] (d.h. Rückgabewert des cObjects) angewandt.
    [url]http://docs.typo3.org/typo3cms/TyposcriptReference/Functions/Stdwrap/Index.html#stdwrap-debug[/url]
    Bei Selects ist IMHO der einfacher Weg, sich die Abfrage mal händisch zusammenzubauen und direkt ind er Datenbank zu testen. Wenn dann im Prinzip das richtige Resultat rauskommt, dann lässt die die Query ja auch in TS umschreiben/zerlegen und mit variablen Werten befüllen.

    2.)
    Soweit ich weiß nein.


  • 1
  • Julian.Hofmann Julian.Ho...
    Flash Gordon
    0 x
    2845 Beiträge
    105 Hilfreiche Beiträge
    30. 01. 2014, 09:57

    Hallo Chrissli.

    Jepp, die Verzweiflung erkennt man etwas... ;)

    Auf alle Fälle ist die Select-Abfrage schon mal merkwürdig. Du möchtest aus der Tabelle pages alle Datensätze mit [i]uid=1[/i] (Where-Clause) (was exakt einer sein kann), schränkst diese ein-elementige Menge via [i]max=1[/i] auf ein Element ein (was eher immer der Fall ist wegen der uid-Einschränkung), und möchtest die ein-elementige Menge aber per [i]rand()[/i] zufällig sortiert haben (also zufällig einen der Datensätze mit uid=1)???

    Funktionieren sollte folgendes:

    1. temp.backImg = FILES
    2. temp.backImg {
    3. files.cObject = CONTENT
    4. files.cObject {
    5. table = sys_file_reference
    6. // Page-ID der Seite, aus der Bilder entnommen werden sollen
    7. pidInList = 3
    8. where = tablenames='pages' AND fieldname='media'
    9. selectFields = uid_local
    10. orderBy = rand()
    11. max = 1
    12. }
    13. renderObj = TEXT
    14. renderObj.field = uid_local
    15. }
    16. renderObj = IMAGE
    17. renderObj {
    18. file.import.data = file:current:publicUrl
    19. }
    20. }

    (Für Optimierungen/einfachachere Weg bin ich gern zu haben :) )

    Viele Grüße
    Julian

  • Julian.Hofmann Julian.Ho...
    Flash Gordon
    1 x
    2845 Beiträge
    105 Hilfreiche Beiträge
    30. 01. 2014, 10:45

    ...und manchmal kommt man auf die einfachere Lösung dann doch selbst, wenn man nochmal nachdenkt ;-)

    1. temp.backImg = IMAGE
    2. temp.backImg.file {
    3. import.data = levelmedia: 0
    4. import.listNum = rand
    5. treatIdAsReference = 1
    6. }

    Zu beachten ist hierbei aber, dass das Objekt gecacht wird, d.h. der "Zufall" auch gecacht wird. Wenn dies unerwünscht ist, dann müsste ein *_INT-Objekt außenherum.
    Alternative wäre, mehrere Bilder in HTML einzubetten udn via JS (und damit am Cache vorbei) den Zufall zu handhaben.

  • Chrissli Chrissli
    Jedi-General
    0 x
    1015 Beiträge
    28 Hilfreiche Beiträge
    30. 01. 2014, 12:54

    Hallo Julian,

    vielen Dank erstmal.
    Ja manchmal sieht man den Wald vor Bäumen nicht, und am schlimmsten ist's, wenn man sich dann auch noch im Wald verläuft #giggle#

    Nach dem x-ten mal ändern und probieren war der Code einfach versaut, wen wunderts wenn da der select keinen Sinn mehr ergibt.

    Leider hat deine erste Lösung nicht funktioniert, im Nachhinein hab' ich mich an die Beschränkungen
    von CONTENT und table erinnert, sys_* Tabellen gehören leider nicht zu den erlaubten Tabellen.
    Es müsste also vermutlich einen Weg über references geben, werde das mal probieren wenn etwas mehr Zeit ist.

    However, der 2. Ansatz hat völlig problemlos funktioniert, Danke dafür!

    Hier meine Lösung mit INT:

    1. temp.backImg = COA_INT
    2. temp.backImg {
    3. 1 {
    4. file {
    5. import.data = levelmedia: 0
    6. import.listNum = rand
    7. treatIdAsReference = 1
    8. }
    9. stdWrap.noTrimWrap = | style="background-image: url('|');"|
    10. }
    11. }

    Die Option mit JS ging mir auch durch den Kopf, allerdings sind die Hintergrundbilder vollflächig in FullHD Auflösung d.h. sehr groß, daher habe ich auf diese Option bewusst verzichtet.

    Zwei Dinge hätte ich da noch, auch wenn die ein klein wenig am Thema vorbei gehen:

    1. Gibt es einen einfachen Weg ( per TS ) einzelne Content-Objekte oder Teile zu Debuggen, z.B. das Ergebnis des Select-Statement ( ähnlich SQL-Debug = 2 aus dem Install-Tool, nur für einzelne Queries ) oder auch einem TS-Äquivalent von

    1. \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump();

    für ein einzelnes Objekt um rauszufinden wo ein Ansatz krankt?

    2. Ich baue meine Body-Tag per

    1. page.bodyTagCObject = COA

    wobei ein COA-Teil eben das hier generierte Hintergrundbild war.
    Aktuell muss ich jeden teil per noTrimWrap mit einem Leerzeichen versehen, damit die einzelen HTML-Attribute nicht aufeinander kleben.
    Gibt es für COAs eigentlich einen Parameter mit dem man die einzelnen Elemente trennen kann?
    So wie das in PHP mit
    1. implode($trenner,$array)

    funktioniert?

    Ich setze den Thread mal auf gelöst, da das eigentliche Problem ja behoben ist.

    God's in his heaven, all's right with the world

  • Julian.Hofmann Julian.Ho...
    Flash Gordon
    1 x
    2845 Beiträge
    105 Hilfreiche Beiträge
    30. 01. 2014, 13:13

    Hm, also der erste Ansatz hatte bei mir (TYPO3 CMS 6.2.0beta4) funktioniert. Der hat v.a. den Vorteil, dass er tabellenunabhänig ist, d.h. die Bilddaten auch aus einem tt_content-Element, der dem neusten News-Beitrag odgl. genommen werden könnten.

    Zu Deinen weiteren Fragen:

    1.)
    stdWrap hat drei debug*-Eigenschaften, wobei das wohl nicht unbedingt in solch einem Fall hilfreich ist, weil stets auf [u]das Ergebnis[/u] (d.h. Rückgabewert des cObjects) angewandt.
    [url]http://docs.typo3.org/typo3cms/TyposcriptReference/Functions/Stdwrap/Index.html#stdwrap-debug[/url]
    Bei Selects ist IMHO der einfacher Weg, sich die Abfrage mal händisch zusammenzubauen und direkt ind er Datenbank zu testen. Wenn dann im Prinzip das richtige Resultat rauskommt, dann lässt die die Query ja auch in TS umschreiben/zerlegen und mit variablen Werten befüllen.

    2.)
    Soweit ich weiß nein.

  • Chrissli Chrissli
    Jedi-General
    0 x
    1015 Beiträge
    28 Hilfreiche Beiträge
    30. 01. 2014, 15:57

    Das hat mir schon seeehr weiter geholfen.
    Vielleicht hab ja auch ich irgendwo noch einen Fehler eingebaut.
    Wenn ich drüberstolper geb' ich's bekannt.
    Danke für deine Zeit.

    God's in his heaven, all's right with the world

  • 1