Zum Inhalt springen

LOAD_REGISTER oder OptionSplit?

Erstellt am 10. Juli 2013 · 5 Antworten · letzte Antwort am 11. Juli 2013

Tags: Frage

lisa_deng ·

Liebes Forum,

ich bin erst seit drei Wochen dabei und versuche den Carousel-Slider vom Bootstrap Framework für Typo3 4.5.2 mit Typoscript nachzubauen.
Ich weiß, es gibt Extension für ähnliche Lösungen, aber das ist nicht mein Ziel.

Ich habe im Forum ein Typo3 6.0 TypoScript für folgenden HTML-Aufbau gesehen, aber das funktioniert nicht für Typo3 4.x und ich weiß zuwenig, um rauszufinden, an welchen Stellen es genau liegen kann.
Hier der Link zum Beitrag: #114751

So sieht das Plain-HTML aus:

<div id="myCarousel" class="carousel slide">
                <ol class="carousel-indicators">
                  <li data-target="#myCarousel" data-slide-to="0" class="active"></li>
                  <li data-target="#myCarousel" data-slide-to="1"></li>
                  <li data-target="#myCarousel" data-slide-to="2"></li>
                </ol>
                <div class="carousel-inner">
                  <div class="item active">
                    <img src="img/slide1.jpg" alt="">
                    <div class="carousel-caption">
                      <h4>First Thumbnail label</h4>
                      <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p>
                    </div>
                  </div>
                  <div class="item">
                    <img src="img/slide2.jpg" alt="">
                    <div class="carousel-caption">
                      <h4>Second Thumbnail label</h4>
                      <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p>
                    </div>
                  </div>
                  <div class="item">
                    <img src="img/slide3.jpg" alt="">
                    <div class="carousel-caption">
                      <h4>Third Thumbnail label</h4>
                      <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p>
                    </div>
                  </div>
                </div>
                <a class="left carousel-control" href="#myCarousel" data-slide="prev">‹</a>
                <a class="right carousel-control" href="#myCarousel" data-slide="next">›</a>
              </div>
 <!-- ende carousel -->

Ich habe es bisher hinbekommen, dass bei der richtigen Stelle aus dem richtigen tt_content colPos die Bilder im FE ausgespuckt werden.
Nur scheitere ich jetzt daran, nur dem ersten Bild ein <div> mit einer extra class zu geben ("active").
Ich dachte anfangs, ich kann das mit OptionSplit lösen, aber das scheint nicht für meinen Aufbau zu funktioneren (1.std.wrap wäre dann meines Erachtens zu "splitten", aber das geht nicht vielleicht weil es CONTENT Element ist?).
Also halte ich mich an das oben erwähnte Typoscript für Typo3 6.0 und versuche mit LOAD_REGISTER nur dem ersten div die extra class zu geben.
Grundsätzlich geht das, nur haben jetzt alle <div>s die "active" class und mein RESTORE_REGISTER greift nicht, oder steht an der falschen Stelle, oder darf da eh nicht stehen... ich weiß es nicht.

Hier mein Typoscript (wo noch viel fehlt, ich bin jetzt erstmal nur beim inneren Content nämlich die Bilder und die Caption)

lib.carousel = CONTENT
lib.carousel {
  table = tt_content
  select.languageField = sys_language_uid
  select.where = colPos = 5
  select.selectFields = image_link,imagecaption,image,header
  stdWrap.wrap = |

  renderObj = COA
  renderObj{
      wrap =  <div id="myCarousel{field:uid}" class="carousel slide">| </div>
      wrap.insertData = 1
     
   ## hier müssen noch die carousel-indicators ebenfalls mit extra class ="active" hin


    ## Innere Elemente Bilder und Caption
    5 = COA
    5 {
     
      6 = LOAD_REGISTER
      6.firstItemSliderClass = active
     
      20 = TEXT
      20.field = image
      20.wrap = <div class="carousel-inner"> | </div>
     
      20.split {
        token = ,
        cObjNum = 1
        1 {
          10 = IMAGE
          10.file {
            import.current = 1
            import = uploads/pics/
            width = 100c
            height = 100c
          }
 
       30 = TEXT
       30 {
          field = imagecaption
          # split saves the index in REGISTER:SPLIT_COUNT
          listNum.stdWrap.data = REGISTER:SPLIT_COUNT
          listNum.splitChar = 10
         wrap = <div class="carousel-caption"><p> | <p></div>
       }
    
     }
        1.stdWrap.wrap = <div class="item {register:firstItemSliderClass}">|</div>
        1.stdWrap.wrap.insertData = 1
    
        40 = RESTORE_REGISTER
      }
}
   
    10 = TEXT
    10 {
      value (
      <!-- Carousel nav -->
      <a class="carousel-control left" href="#myCarousel{field:uid}" data-slide="prev">‹</a>
      <a class="carousel-control right" href="#myCarousel{field:uid}" data-slide="next">›</a>
      )
      insertData = 1
    }
     
       }
}

Und im Frontend sieht es dann so aus:

<div id="myCarousel24" class="carousel slide">
<div class="carousel-inner">
<div class="item active">
<img src="typo3temp/pics/afcde82dbc.jpg" width="1024" height="400" alt="" />
<div class="carousel-caption">
<p>Wüste<p>
</div>
</div>
<div class="item active">
<img src="typo3temp/pics/1abb6a1945.jpg" width="1024" height="400" alt="" />
<div class="carousel-caption">
<p>Lighthouse<p>
</div>
</div>
</div>      
<!-- Carousel nav -->
<a class="carousel-control left" href="#myCarousel24" data-slide="prev">‹</a>
<a class="carousel-control right" href="#myCarousel24" data-slide="next">›</a>
</div>

Ich freue mich sehr, wenn mir jemand helfen kann!

Vielen Dank im Voraus,
Lisa

karlchen ·

Hi,

Du bist erst seit 3 Wochen bei TYPO3 und haust dann schon mit solchen TypoScript Kloppern um dich... Respekt 🙂

Falls du das Video vielleicht noch mal zu dem Original Script sehen willst, das findest du hier:
http://www.galileo-videotrainings.de/standard-render-definitionen-anpassen/einen-titelbild-slider-erstellen/typo3-cms-6/3327/probe-lektion/
Da wird auch noch mal ein bisschen was erklärt.

Momentan hängt dein " 40 = RESTORE_REGISTER" ein Klammer zu weit oben, es hängt noch in 20.split und kann wird daher nicht

     20.split {
       ...
        40 = RESTORE_REGISTER
      }

Jedoch wird dir das hier glaube ich nichts bringen. 20.split läuft komplett durch bevor RESTORE_REGISTER überhaupt aufgerufen wurde, daher haben alle Elemente die class "active".

Du kannst den wrap aber ändern in dem du mit Hilfe von REGISTER:SPLIT_COUNT abfragst ob es das erste Element ist, wenn ja soll "active" geschrieben werden ansonsten ein anderer nicht.

Ich habe danach nach der Kombi mal gegoogelt und bin auf diese Seite gestossen:
http://labor.99grad.de/2012/06/15/records-mit-eigenem-wrap-fur-jeden-record-eigene-klasse-fur-jedes-inhaltselement-record-count/

Das Problem dort ist zwar ein anderes, aber der TypoScript Schnipsel von dort sollte passen.

Du musst dann dein "1.stdWrap.wrap" folgendermaßen anpassen, auf das {register:firstItemSliderClass} kannst du dann an der Stelle verzichten.

    1.stdWrap.wrap = <div class="item">|</div>
    1.stdWrap.wrap.insertData = 1
    1.stdWrap.wrap.override = <div class="item active">|</div>
    1.stdWrap.wrap.override.if {
      value = 0
      equals.data = register:SPLIT_COUNT
    }
lisa_deng ·

Wow!
Vielen Dank!

Das hat mich sehr viel weitergebracht!

Das Video kannte ich auch schon und geholfen hat es mir auch.

Um auch die outerwraps und carousel-indicators um die Bilder zu legen habe ich mein lib.carousel zu einem COA umgebaut und will an zwei Stellen die selben tt_content Inhalte auslesen (inspiriert vom TS vom Video-Tuturial, bei dem zweimal auf die selben FILES verwiesen wird).

Nur da scheine ich einen wichtigen Denkfehler zu machen:

Soweit erscheint alles im FE und der Slider funktionert (JIIHEEAA!), nur werden die <li> aus der <ol class="carousel-indicators"> nicht nach den Images gezählt und es erscheint nur ein <li> anstatt drei.
Ich gehe mal davon aus, dass innerhalb meines 10.renderObj = COA die Bilder gar nicht rausgelesen werden und einfach nur das HTML nach meinen Angaben ausgespuckt wird.

Leider weiß ich somit auch nicht, ob das Weiterzählen durch LOAD_REGISTER = counteritemSlider und das Ausbleiben der class ="active" bei weiteren <li>-Objekten überhaupt funktioniert.

lib.carousel = COA
lib.carousel {
  
  1 = LOAD_REGISTER
  1.counterItemSlider = 0
  
  
  ## Indicators
  10 = CONTENT
  10 {
  
  table = tt_content
  select.languageField = sys_language_uid
  select.where = colPos = 5
  select.selectFields = image
  stdWrap.wrap = |
    
  renderObj = COA
  renderObj {
    
    5 = TEXT
    5.value = <div id="myCarousel{field:uid}" class="carousel slide"><ol class="carousel-indicators">
    5.insertData = 1  
      
    10 = TEXT
      10 {
        value =  <li data-target="#myCarousel{field:uid}" data-slide-to="{register:counterItemSlider}"
        insertData = 1
        wrap = |
        wrap.insertData = 1
        noTrimWrap.override = || class="active" |
        wrap.override.if {
          value = 0
          equals.data = register:SPLIT_COUNT
        }
      }
      
      15 = TEXT
      15.value = ></li>
 
      # Zähler um 1 erhöhen
      25  = LOAD_REGISTER
      25 {
        tempN {
          data = register:counterItemSlider
          wrap = |+1
        }
        counterItemSlider.data = register:tempN
        counterItemSlider.prioriCalc = 1
      }
 
 
      # Register um einen Eintrag erhöhen, der in der Schleife wieder gelöscht wird (Object 20)
      30  = LOAD_REGISTER
      30 {
        temp = 1
      }
    40 = TEXT
    40.value = </ol>
    
    }
  }
  
  
  
  ## innere Elemente
  20 = CONTENT
  20 {
  
  table = tt_content
  select.languageField = sys_language_uid
  select.where = colPos = 5
  select.selectFields = image_link,imagecaption,image,header
  stdWrap.wrap = |

  
  renderObj = COA
  renderObj{
     
    
    5 = COA
    5 {
           
      20 = TEXT
      20.field = image
      20.wrap = <div class="carousel-inner"> | </div> <!-- ende carousel inner -->
      
      20.split {
        token = ,
        cObjNum = 1
        1 {
          10 = IMAGE
          10.file {
            import.current = 1
            import = uploads/pics/
            minW = 1024c
            maxH = 500c
          }
 
       30 = TEXT
       30 {
          field = imagecaption
          # split saves the index in REGISTER:SPLIT_COUNT
          listNum.stdWrap.data = REGISTER:SPLIT_COUNT
          listNum.splitChar = 10
         wrap = <div class="carousel-caption"><p> | <p></div>
       }
     
     }
        1.stdWrap.wrap = <div class="item">|</div>
        1.stdWrap.wrap.insertData = 1
        1.stdWrap.wrap.override = <div class="item active">|</div>
        1.stdWrap.wrap.override.if {
          value = 0
          equals.data = register:SPLIT_COUNT
        }
      }
      

      
}
    
    50 = TEXT
    50 {
      value (
      <!-- Carousel nav -->
      <a class="carousel-control left" href="#myCarousel{field:uid}" data-slide="prev">‹</a>
      <a class="carousel-control right" href="#myCarousel{field:uid}" data-slide="next">›</a>
      </div>
      )
      insertData = 1
    }
      
       }
}  

}

Hier das FE-HTML

<div id="myCarousel24" class="carousel slide">
	  
	  <ol class="carousel-indicators">
	  <li data-target="#myCarousel24" data-slide-to="0" class="active" ></li>
          <!-- hier fehlen die weiteren beiden li-Elemente mit Zähler und ohne class ="active" -->
	  </ol>
	  
   <div class="carousel-inner">
	  <div class="item active">
	  <img src="typo3temp/pics/158122f2f7.jpg" width="1443" height="500" alt="" />
	  <div class="carousel-caption"><p>Slider nur mit TypoScript!<p></div>
	  </div>
	  <div class="item">
	  <img src="typo3temp/pics/c4635e1f1d.jpg" width="1443" height="500" alt="" />
	  <div class="carousel-caption"><p>Ohne Extension!<p></div>
	  </div>
	  <div class="item">
	  <img src="typo3temp/pics/e34705d988.jpg" width="1279" height="500" alt="" />
	  <div class="carousel-caption"><p>Und es funktioniert !<p></div>
	  </div>
	  
   </div> <!-- ende carousel inner -->      

<!-- Carousel nav -->
<a class="carousel-control left" href="#myCarousel24" data-slide="prev">‹</a>
<a class="carousel-control right" href="#myCarousel24" data-slide="next">›</a>

</div>

Ich habe mich schon durch diverse Beiträge gewühlt und denke mal, dass mir beim korrekten Verschachteln von CONTENT Elementen noch das Verständnis fehlt.

Ich freue mich sehr über weitere Hilfe und Input!

Merci!

karlchen ·

hi,

Dein erstes renderObj läuft doch auch nur einmal durch.

  ## Indicators
  10 = CONTENT
  10 {
 
  table = tt_content
  select.languageField = sys_language_uid
  select.where = colPos = 5
  select.selectFields = image
  stdWrap.wrap = |
 
  renderObj = COA
  renderObj {
   ...
 }

Dieses TypoScript fragt jetzt die Datenbank ab und holt alles aus der colPos = 5 und da ist im Moment nur ein ContentElement drin oder ?
Du müsstest also genau wie in deinem zweiten renderObj das Feld Image split(en) und nur wenn du split benutzt kannst du auch register:SPLIT_COUNT nutzen.

lisa_deng ·

GENAU!

Und ich habe somit auch verstanden, was da eigentlich passiert.

TAUSEND DANK!

Ich bin richtig froh!
So macht das Spaß.

Hier das fertige TypoScript für das Bootstrap Carousel für Typo3 4.x
(als mögliche Alternative für das Bootstrap Carousel TS für Typo3 6.0 von Oliver Thiele)

Ich habe es so eingesetzt:
MARKER im Template setzen, MARKER < lib.carousel zuweisen, im BE-Layout colPos = 5 für die Sliderbilder festlegen (wenn andere colPos dann unten im TS anpassen), Bilder in diesem Seiteninhaltselement hochladen, fertig

lib.carousel = COA
lib.carousel {
  
  1 = LOAD_REGISTER
  1.counterItemSlider = 0
  
  
  ## Indicators
  10 = CONTENT
  10 {
  
  table = tt_content
  select.languageField = sys_language_uid
  select.where = colPos = 5
  select.selectFields = image
  stdWrap.wrap = |
    
  renderObj = COA
  renderObj{
      
    
    5 = COA
    5 {
            
      20 = TEXT
      20.field = image
      20.wrap = <div id="myCarousel{field:uid}" class="carousel slide"><ol class="carousel-indicators">
      20.wrap.insertData = 1
      
      20.split {
        token = ,
        cObjNum = 1
        1 {
          10 = TEXT
          10 {
            value = data-slide-to="{register:counterItemSlider}"
            insertData = 1
            
          }
          noTrimWrap = |<li data-target="#myCarousel{field:uid}" ||
          noTrimWrap.insertData = 1
          noTrimWrap.override = |<li class="active" data-target="#myCarousel{field:uid}" ||
          noTrimWrap.override.if {
            value = 0
            equals.data = register:SPLIT_COUNT
          }
          
          22 = TEXT
          22.value = ></li>
          
      # Zähler um 1 erhöhen
      25  = LOAD_REGISTER
      25 {
        tempN {
          data = register:counterItemSlider
          wrap = |+1
        }
        counterItemSlider.data = register:tempN
        counterItemSlider.prioriCalc = 1
      }
 
 
      # Register um einen Eintrag erhöhen, der in der Schleife wieder gelöscht wird (Object 20)
      30  = LOAD_REGISTER
      30 {
        temp = 1
      }
      }    
      
        
     
    }
    40 = TEXT
    40.value = </ol>
  }
  
}

}
  
  ## innere Elemente
  20 = CONTENT
  20 {
  
  table = tt_content
  select.languageField = sys_language_uid
  select.where = colPos = 5
  select.selectFields = image_link,imagecaption,image,header
  stdWrap.wrap = |

  
  renderObj = COA
  renderObj{
      
    
    5 = COA
    5 {
            
      20 = TEXT
      20.field = image
      20.wrap = <div class="carousel-inner"> | </div> <!-- ende carousel inner -->
      
      20.split {
        token = ,
        cObjNum = 1
        1 {
          10 = IMAGE
          10.file {
            import.current = 1
            import = uploads/pics/
            minW = 1024c
            minH = 500c
          }
 
       30 = TEXT
       30 {
          field = imagecaption
          # split saves the index in REGISTER:SPLIT_COUNT
          listNum.stdWrap.data = REGISTER:SPLIT_COUNT
          listNum.splitChar = 10
         wrap = <div class="carousel-caption"><p> | <p></div>
       }
     
     }
        1.stdWrap.wrap = <div class="item">|</div>
        1.stdWrap.wrap.insertData = 1
        1.stdWrap.wrap.override = <div class="item active">|</div>
        1.stdWrap.wrap.override.if {
          value = 0
          equals.data = register:SPLIT_COUNT
        }
      }
      

      
}
    
    50 = TEXT
    50 {
      value (
      <!-- Carousel nav -->
      <a class="carousel-control left" href="#myCarousel{field:uid}" data-slide="prev">‹</a>
      <a class="carousel-control right" href="#myCarousel{field:uid}" data-slide="next">›</a>
      </div>
      )
      insertData = 1
    }
      
       }
}  

}
karlchen ·

super freut mich das alles geklappt hat 🙂
werde mir das TypoScript auch mal bunkern, kann man bestimmt beim nächsten Projekt mal einsetzen, also auch ein danke von mir 🙂