Zum Inhalt springen

Bug oder Feature – Unterschiedliche Verarbeitung von COA und COA_INT

Erstellt am 17. Juni 2011 · 1 Antwort · letzte Antwort am 21. Juni 2011

Tags: Frage

Tosta ·

Hi,

der einzige Unterschied zwischen den Inhaltsobjekten COA und COA_INT sollte sein, dass COA_INT nicht cached wird; in verschiedenen Dokumentationen, allen voran TSRef, finde ich jedenfalls keine gegenteilige Aussage. Ich bin allerdings auf einen Fall gestoßen, in dem der Einsatz eines COA bzw. eines COA_INT zu unterschiedlichen Ergebnissen führt.

Die TYPO3-Version ist 4.5.2.

Das folgende Beispiel ist sehr abstrakt, aber dafür kompakt. Ich habe meinen tatsächlich eingesetzten Code weitgehend eingedampft.

Kurze Beschreibung der Anforderung: Eine Reihe von Textstücken wird ausgegeben. Dabei steht zwischen den Textstücken immer ein Separator, im Beispiel »#«. Hinter dem letzten Textstück steht kein Separator. Leere Textstücke müssen ignoriert werden, d.h. hinter einem leeren Textstück folgt kein Separator, und somit erscheinen auch keine zwei Separatoren unmittelbar hintereinander.

Ich realisiere das mit der stdWrap-Funktion split. Der Trenner dafür ist »---«; er wird mittels wrap hinter jedes Textstück gesetzt. split trennt dann die Textstücke und setzt hinter jedes – außer dem letzten! – den Separator.

Die einzelnen Textstücke sind

1. ein einfacher TEXT, »one«
2. ein COA ohne Inhalt, indirekt referenziert als TS-Element coa
3. ein einfacher TEXT, »two«
4. ein COA_INT ohne Inhalt, indirekt referenziert als TS-Element coa_int
5. ein einfacher TEXT, »three«
6. ein COA_INT ohne Inhalt, direkt benutzt
7. ein einfacher TEXT, »four«

Das Ganze ist noch ein bisschen strukturiert: Alle 5 Textstücke sind in ein COA eingepackt, für das required gesetzt ist. Damit wird die Anforderung »Leere Textstücke müssen ignoriert werden« erreicht.

lib.my {
  coa = COA
  coa {
    10 = TEXT
  }
  
  coa_int = COA_INT
  coa_int {
    10 = TEXT
  }
  
  element = COA
  element.stdWrap {
    wrap = | ---
    required = 1
  }
  
  foo = COA
  foo {
    stdWrap.split {
      token = ---
      cObjNum = |*|1|*|2||3|
      1 {
        current = 1
        wrap = | #
      }
      2 {
        current = 1
      }
    }
   
    10 < lib.my.element
    10.10 = TEXT
    10.10.value = one
    
    20 < lib.my.element
    20.10 < lib.my.coa
    
    30 < lib.my.element
    30.10 = TEXT
    30.10.value = two
   
    40 < lib.my.element
    40.10 < lib.my.coa_int
   
    50 < lib.my.element
    50.10 = TEXT
    50.10.value = three
   
    60 < lib.my.element
    60.10 < COA_INT
    60.10.10 = TEXT
    
    70 < lib.my.element
    70.10 = TEXT
    70.10.value = four
  }
}

Die Überraschung: Bei der Ausgabe wird das indirekt referenzierte COA_INT (40) nicht als leer erkannt, wie an den zwei hintereinander stehenden Separatoren zu erkennen ist:

one#two##three#four

Das indirekte COA und das direkte COA_INT werden aber richtig als leer erkannt und ignoriert.

In meinen Augen ist das ein Bug, der unter sehr speziellen Umständen zum Tragen kommt – aber ich will nichts überstürzen. Vielleicht hab ich selbst etwas falsch konfiguriert. Was meint ihr? Danke für eure Beiträge.

Tosta