FAL - nur X Bilder aus tt_content auslesen

  • toifel toifel
    Jedi-Ratsmitglied
    0 x
    831 Beiträge
    96 Hilfreiche Beiträge
    14. 01. 2013, 11:51

    Hallo zusammen,

    seit Typo3 6.0 und dem FAL gibt es ja einige Änderungen was den Einsatz vom cObject CONTENT in Kombination mit IMAGE betrifft, da man sich Relationen über FILES auslesen muss. Das funktioniert auch einwandfrei, solange man alle Relationen eines tt_content Datensatzes haben möchte.

    Was ich noch nicht gefunden habe ist eine einfache Lösung, um z.B. nur die ersten 2 Bilder eines Datensatzes auszulesen. Hier hätte ich mit ähnlichen Parametern gerechnet wie beim select, so dass man unter FILES.references noch BEGIN und MAX angeben kann.

    Gibt es hierfür eine effiziente Möglichkeit, um sowas in Typoscript umzusetzen?!

    Aktuell habe ich eine funktionierende Lösung, allerdings kann ich mir kaum vorstellen, dass es so im Sinne des Erfinders war: Über FILES lese ich jetzt nur das komplette "image" Tabellenfeld aus und speichere den String als TEXT im Register.
    Anschließend wird dann über TEXT.split dieser String gesplittet - die split-Function hat wieder einen MAX Parameter, so dass ich dort angeben kann wie viele Bilder ich haben will.

    Das ging vorher deutlich einfacher :( Habe schon so ziemlich alles probiert, aber wahrscheinlich nur mal wieder was einfaches übersehen.


  • 1
  • cephei cephei
    Padawan
    0 x
    40 Beiträge
    1 Hilfreiche Beiträge
    01. 02. 2013, 08:35

    Eventuell bringt dich das weiter: http://www.typo3forum.net/forum/typo3-3-x-fragen-probleme/20616-anzahl-datensaetze-typoscript-abfragen.html

    1. stdWrap.if.value.numRows ...
    2. stdWrap.if.isLessThan = ...

    Diese Signatur ist in Ihrem Land leider nicht verfügbar.

  • toifel toifel
    Jedi-Ratsmitglied
    0 x
    831 Beiträge
    96 Hilfreiche Beiträge
    01. 02. 2013, 10:58

    Gute Idee, werde ich mal testen. Allerdings ist es auch damit immer noch viel komplizierter, als in 4.7 ohne FAL.
    Es fehlen einfach noch Parameter wie references.begin oder references.max, wie man sie auch im normalen CONTENT.select nutzen kann.

  • Benjamecho Benjamech...
    Sternenflotten-Admiral
    0 x
    202 Beiträge
    0 Hilfreiche Beiträge
    08. 03. 2013, 10:48

    Hallo Toifel,

    da bist Du schon einen Schritt weiter als ich :-)
    Vor 6.0 habe ich mir die Bildpfade aus dem Feld "image" geholt, das Ergebnis nach Komma gesplitet und mir dann mit import.current = 1 die Bildpfade ausgeben lassen. Hast Du ein TypoScript Snippet, wie man das nun beim FAL realisiert bekommt?
    Mekrwürdigerweise klappt die alte Technik sogar noch mit den meisten Bildern, aber z.T. werden auch falsche angezeigt ...

    Danke!
    Ben

  • toifel toifel
    Jedi-Ratsmitglied
    0 x
    831 Beiträge
    96 Hilfreiche Beiträge
    08. 03. 2013, 11:57

    Hi Ben,

    wenn Du noch Bilder aus dem "image"-Feld bekommst, dann wurde die Seite wahrscheinlich von 4.x geupdated? Seit dem FAL werden nämlich nur noch IDs in tt_content.image abgelegt, so dass man zwangsläufig einen Extra-Schritt über das FILES Objekt gehen muss. Hier mein Typoscript:

    1. page.10.marks.content = COA
    2. page.10.marks.content {
    3. 10 = CONTENT
    4. 10 {
    5. table = tt_content
    6. pidInList = 2
    7. where = colPos = 0
    8. }
    9.  
    10. renderObj = COA
    11. renderObj {
    12. 10 = FILES
    13. 10 {
    14. references {
    15. table = tt_content
    16. uid.data = field:uid
    17. fieldName = image
    18. }
    19.  
    20. renderObj = COA
    21. renderObj {
    22. # HIER WICHTIG!
    23. # Result aus FILES wird in Register abgelegt, dieses Result ist wie der alte image-String aus tt_content
    24. 10 {
    25. savedString.cObject = TEXT
    26. savedString.cObject.data = field:image
    27. }
    28. }
    29. }
    30. }
    31. }
    32.  
    33. 20 = TEXT
    34. 20 {
    35. # Hier den image-String aus dem Register normal weiterverarbeiten
    36. data = register:savedString
    37. token = ,
    38. max = 2
    39. cObjNum = 1
    40.  
    41. 1 {
    42. 20 {
    43. imageLink.cObject = TEXT
    44. imageLink.cObject.current = 1
    45. imageLink.cObject.substring = 6,1000
    46. }
    47.  
    48. 30 = IMAGE
    49. 30 {
    50. file.import.data = register:imageLink
    51. file.maxW = 210
    52. enable = 1
    53. typolink.parameter.data = register:imageLink
    54. typolink.ATagParams = class="fancybox"
    55. }
    56. wrap = <div class="imageWithCaption">|</div>
    57. }
    58. }
    59. }
    60.  
    61. wrap = <div class="miniGal">|</div>
    62. }
    63.  
    64. }

    Also zusammengefasst: Im renderObj von FILES wird der gewohnte String ins Register gespeichert. Dieser kann wie sonst auch immer gesplittet werden ;) Ich hoffe ja immer noch auf eine einfachere Lösung... hoffe ich konnte etwas helfen, habe da auch etwas länger dran gebastelt.

    Gruß, Martin/toi

  • Benjamecho Benjamech...
    Sternenflotten-Admiral
    0 x
    202 Beiträge
    0 Hilfreiche Beiträge
    09. 03. 2013, 11:44

    Hallo Martin,

    ja, das Problem ist tatsächlich nach dem Update von 4.x aufgetreten :-)
    Vielen Dank, dein Script hilft mir auf jeden Fall weiter. Der Umweg über das FILES-Objekt scheint notwendig.

    [quote="toifel"]
    Seit dem FAL werden nämlich nur noch IDs in tt_content.image abgelegt [...]
    [/quote]

    Das stimmt nicht ganz. Im image-Feld von tt_content werden nicht die IDs der Bilder abgelegt, sondern lediglich die Anzahl der eingebunden Bilder. Ich werde das mal etwas weiter analysieren und versuchen das Script zu verkürzen ...

    Gruß
    Ben

  • Benjamecho Benjamech...
    Sternenflotten-Admiral
    0 x
    202 Beiträge
    0 Hilfreiche Beiträge
    09. 03. 2013, 12:39

    Ich hab's :)

    Kurze Vorabinfo:
    Du holst Dir das Contentelement ja von einer fest definierten Seite (pidInList = 2). Ich habe mittels einer Extension ein neues Bildwechsel-Contentelement für Redakteure eingerichtet. Die Extension macht eigentlich nichts anderes, als im Backend ein neues Inhaltselement mit abgespeckten Feldern des normalen Bildelementes ...

    1. $TCA['tt_content']['types'][$_EXTKEY . '_pi1']['showitem'] = 'CType;;4;button;1-1-1, layout;;;;4-4-4, image;;;;4-4-4';

    ... anzubieten, welches dann per TypoScript gerendert wird. Das kannst Du für Deinen Anwendungsfall aber sicher leicht abwandeln.

    So funktioniert es (etwas ausführlicher):

    1. tt_content.meineextension_pi1 = COA
    2. tt_content.meineextension_pi1{
    3. 10 = FILES
    4. 10{
    5. references {
    6. table = tt_content
    7. #uid = 182
    8. #alternativ uid des aktuellen Datensatzes verwenden:
    9. uid.data = uid
    10. fieldName = image
    11. }
    12. renderObj = COA
    13. renderObj {
    14. 10 = TEXT
    15. 10.data = file:current:identifier
    16. 30 = IMAGE
    17. 30 {
    18. file.import.data = file:current: originalUid // file:current:uid
    19. }
    20. }
    21. }
    22. }

    [b]Achtung:[/b] bei "file:current: originalUid" das Leerzeichen entfernen. War notwendig, da das Forum trotz typoscript-Auszeicnung versucht einen Smiley daraus zu machen.

    Bzw. ganz abgespeckt:

    1. tt_content.meineextension_pi1 = FILES
    2. tt_content.meineextension_pi1{
    3. references {
    4. table = tt_content
    5. uid.data = uid
    6. fieldName = image
    7. }
    8. renderObj = IMAGE
    9. renderObj.file.import.data = file:current: originalUid // file:current:uid
    10. }

    Freue mich über eventuelle Verbesserungsvorschläge.
    Habe bislang auch nirgendwo Infos dazu gefunden, wofür file:current: originalUid genau steht, ob das überhaupt notwendig und sinnvoll ist. Kann das jemand erläutern?

    P.S. Zu Deinem o.g. Max-Problem: Bau beim renderObj doch einfach noch einen [url=http://www.typo3.net/forum/beitraege/sonstiges-2/107618/]Counter[/url] mit ein und gib dann ab dem 3. Element einfach nichts mehr aus.

  • danton danton
    Jedi-Meister
    0 x
    298 Beiträge
    4 Hilfreiche Beiträge
    12. 03. 2014, 09:53

    Hi

    Gibts hier eine neue Lösung um z.b. nur 1 oder nur das 1. oder 2. Bild auszugeben?
    So wie beim select mit max und begin.
    Das einzige was ich gefunden habe ich folgender Beitrag aber das kanns doch nicht sein oder?
    [url]http://lists.typo3.org/pipermail/typo3-german/2013-June/093100.html[/url]

    Komplizierter gehts nimmer.
    Dieses FAL ist ja ein tolles Feature aber etwas viel overhead oder nicht?

    Gruß Niels

    "Das Universum ist vollkommen. Es kann nicht verbessert werden. Wer es verändern will, verdirbt es. Wer es besitzen will, verliert es." - Laozi

  • danton danton
    Jedi-Meister
    0 x
    298 Beiträge
    4 Hilfreiche Beiträge
    12. 03. 2014, 11:35

    Ab TYPO3 6.2 scheint das zu tun.
    Siehe [url]http://stackoverflow.com/questions/21039594/typo3-file-abstraction-layer-files-listnum/22348392#22348392[/url].

    Leider bringt mir das grad nix weil wir 6.1.x einsetzen.

    "Das Universum ist vollkommen. Es kann nicht verbessert werden. Wer es verändern will, verdirbt es. Wer es besitzen will, verliert es." - Laozi

  • danton danton
    Jedi-Meister
    0 x
    298 Beiträge
    4 Hilfreiche Beiträge
    12. 03. 2014, 12:36

    Endlich habe ich die Antwort.
    Man muss wie so oft um die Ecke denken.
    Bitte beachten das das bei mir in einem Menü statt findet.

    1. 10 = HMENU
    2. 10{
    3. wrap = <div class="row row-1">|</div>
    4. special = directory
    5. special.data = page.uid
    6. begin = 1
    7. 1 = TMENU
    8. 1 {
    9. NO{
    10. allWrap = <div class="col span_8">|</div>
    11. ATagParams = class="bg bg-4 size-a6"
    12. ATagBeforeWrap = 1
    13. linkWrap = <div class="wrapper">|</div>
    14. stdWrap.wrap = <div class="text adjusttypo">|</div>
    15. 10 {
    16. medialist.cObject = FILES
    17. medialist.cObject{
    18. references {
    19. table = pages
    20. uid.field = uid
    21. fieldName = media
    22. }
    23. renderObj = TEXT
    24. renderObj {
    25. wrap = |,
    26. data = file:current:publicUrl
    27. }
    28. }
    29. }
    30. 15 = TEXT
    31. 15 {
    32. data = register:medialist
    33. token = ,
    34. cObjNum = 1 || 2
    35. max = 1
    36. 1{
    37. 10 = IMAGE
    38. 10{
    39. stdWrap.wrap = <div class="picto">|</div>
    40. file{
    41. width=84
    42. import.current = 1
    43. }
    44. }
    45. }
    46. }
    47. }
    48. 20 = IMAGE
    49. 20 {
    50. stdWrap.wrap = <div class="dummy">|</div>
    51. file = {$t3d_pfade.tmpls}image/clearpixel_trans.gif
    52. file.width = 319
    53. file.height = 154
    54. }
    55. }
    56. }
    57. }
    58. }

    Die wichtigen Teile sind:

    1. 10 {
    2. medialist.cObject = FILES
    3. medialist.cObject{
    4. references {
    5. table = pages
    6. uid.field = uid
    7. fieldName = media
    8. }
    9. renderObj = TEXT
    10. renderObj {
    11. wrap = |,
    12. data = file:current:publicUrl
    13. }
    14. }
    15. }

    Hier befülle ich zuerst ein register mit ALLEN Bildern des jeweiligen Menü-Punktes und zwar Komma getrennt.

    Dann gehe ich wieder auf alte Art vor und splitte mir diese Liste und gebe mir nur das 1. aus.

    1. 15 = TEXT
    2. 15 {
    3. data = register:medialist
    4. token = ,
    5. cObjNum = 1 || 2
    6. max = 1
    7. 1{
    8. 10 = IMAGE
    9. 10{
    10. stdWrap.wrap = <div class="picto">|</div>
    11. file{
    12. width=84
    13. import.current = 1
    14. }
    15. }
    16. }
    17. }
    18. }

    Bitte beachtet:
    - cObjNum = 1 || 2
    - max=1

    Auf der Folgeseite brauche ich das jetzt aber ohne HMENU und dann bitte nur das 2. Bild

    1. 20 {
    2. medialist2.cObject = FILES
    3. medialist2.cObject{
    4. references {
    5. table = pages
    6. uid.field = pid
    7. fieldName = media
    8. }
    9. renderObj = TEXT
    10. renderObj {
    11. wrap = |,
    12. data = file:current:publicUrl
    13. }
    14. }
    15. }
    16. 25 = TEXT
    17. 25 {
    18. data = register:medialist2
    19. token = ,
    20. cObjNum = 1 || 2
    21. max = 2
    22. 2{
    23. 10 = IMAGE
    24. 10{
    25. stdWrap.wrap = <div class="picto">|</div>
    26. file{
    27. width=1000
    28. import.current = 1
    29. }
    30. }
    31. }
    32. }
    33. }

    Bitte beachtet
    - uid.field = pid (nicht mehr uid beim menu).
    - max = 2
    - cObjNum = 1 || 2
    -> Solltet ihr mehr Bilder haben weiter ergänzen
    - wir sprechen jetzt das 2. Bild aus dem optionsplit an 2{}

    Ich hoffe das hilft einigen.

    Viele Grüße
    Niels

    "Das Universum ist vollkommen. Es kann nicht verbessert werden. Wer es verändern will, verdirbt es. Wer es besitzen will, verliert es." - Laozi

  • 1