Ueberschriften Nummerieren

Nummerierung der Überschriften in der Sitemap

Hier oben seht Ihr eine mit TYPO3 erzeugte Sitemap mit der Einstellung “Abschnittsübersicht (mit Seiteninhalt)”. Diese Sitemap erzeugt pro Inhaltselement auf dieser Seite einen Link zu dem jeweiligen Inhaltselement. Um diese Sitemap zu nummerieren reicht bei Verwendung von css_styled_content eine Zeile TypoScript:

tt_content.menu.20.3.wrap = <ol class="csc-menu csc-menu-3">|</ol>

Unter Verwendung von fluid_styled_content wird es etwas aufwändiger. Dadurch, dass das HTML-Element für die Auflisten fest in den HTML-Templates verankert ist, müsst Ihr das Partial, das für diese Art Menü zuständig ist austauschen. Kopiert Euch dazu die Type-3.html aus dem Verzeichnis fluid_styled_content/Resources/Private/Partials/Menu/ in eine Eurer Extensions und ändert dort das

    in ein
      . Teilt Fluid nun mit, dass Euer Partial geladen werden soll:

      lib.fluidContent.partialRootPaths.10 = EXT:my_ext/Resources/Private/Fsc/Partials/

      Die Überschrift der Sitemap nicht mit ins Menü

      Da es ein bissl blöde ausschaut, wenn auch die Überschrift der Sitemap im Sitemapmenü auftaucht, sollten wir diese aus dem Menü entfernen. Dafür hat TYPO3 in den Inhaltselementen eine Option auf dem Tab “Zugriff” mit dem Namen “In Menüs zeigen”. Hier den Haken raus und unser Menü ist fertig.

      Das Problem mit den Überschriften

      Bis jetzt schaut alles schon ganz gut aus. Das Einzige was noch nervt sind die Überschriften der Inhaltselemente, denn bei diesen fehlt die Nummerierung, wie wir sie in der Sitemap haben.

      Dieser Text hier steht in einem Inhaltselement OHNE Überschrift. Wenn alles funktioniert, darf dieser nicht in der Sitemap erscheinen und auch nicht die Nummerierung beeinflussen.

      Eine TypoScript-Lösung für css_styled_content

      Im folgenden TypoScript wird die Variable sectionIndex Dank LOAD_REGISTER mit jedem Aufruf um den Wert 1 erhöht, aber nur wenn eine Überschrift gesetzt wurde. Mit prioriCalc wird dann der neue sectionIndex berechnet.

      Im unteren Abschnitt wird eigentlich nur noch überprüft, ob es sich bei dem aktuellen Inhaltselement NICHT um das Erste handelt, denn wir wollen vor der Überschrift der Sitemap keine Nummerierung haben. Es soll erst mit dem zweiten Inhaltselement angefangen werden zu zählen.

      # this must be 1, because of the both RESTORE_REGISTER
      lib.stdheader.1 = LOAD_REGISTER
      lib.stdheader.1 {
        sectionIndex.cObject = TEXT
        sectionIndex.cObject {
          data = register:sectionIndex
          # calculate only when not the first contentelement
          if.isGreaterThan.data = COBJ:parentRecordNumber
          if.value = 1
          # appent 1 if a header is set
          append = TEXT
          append.if.isTrue.field = header
          append.value = +1
        }
        sectionIndex.prioriCalc = intval
      }
      lib.stdheader.10.setCurrent.prepend = TEXT
      lib.stdheader.10.setCurrent.prepend {
        if.isGreaterThan.data = COBJ:parentRecordNumber
        if.value = 1
        data = register:sectionIndex
        noTrimWrap = ||. |
      }

      DataProcessor für fluid_styled_content

      Unter Verwendung von fluid_styled_content könnte man zwar auch die TypoScript-Lösung anwenden, müsste aber dann die TypoScript-Struktur mit einem COA-Element erweitern. Kann man machen, aber die Idee von fluid_styled_content ist die Reduzierung von TypoScript. Als Alternative zeige ich Euch hier eine Lösung mit Hilfe eines DataProcessors, den ich in meine Extension eingebaut habe:

      typo3lexikon/Classes/Frontend/DataProcessing/HeaderProcessor.php

      <?php
      namespace StefanFroemken\Typo3lexikon\Frontend\DataProcessing;
      use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
      use TYPO3\CMS\Frontend\ContentObject\DataProcessorInterface;
      use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController;
      
      class HeaderProcessor implements DataProcessorInterface
      {
          /**
           * Process content object data
           * 
           * @param ContentObjectRenderer $cObj The data of the content element or page
           * @param array $contentObjectConfiguration The configuration of Content Object
           * @param array $processorConfiguration The configuration of this processor
           * @param array $processedData Key/value store of processed data (e.g. to be passed to a Fluid View)
           * @return array the processed data as key/value store
           */
          public function process(
              ContentObjectRenderer $cObj,
              array $contentObjectConfiguration, 
              array $processorConfiguration,
              array $processedData
          ) {
              if (empty($this->getTypoScriptFrontendController()->register['currentIndexForHeader'])) {
                  $this->getTypoScriptFrontendController()->register['currentIndexForHeader'] = 1;        
              }
             
              // don't create header numbers for first element
              if ($cObj->parentRecordNumber !== 1) { 
                  if (!empty($processedData['data']['header'])) {
                      $currentIndex = $this->getTypoScriptFrontendController()->register['currentIndexForHeader'];
                      $processedData['data']['header'] = $currentIndex . '. ' . $processedData['data']['header'];
                      $this->getTypoScriptFrontendController()->register['currentIndexForHeader'] += 1;   
                  }
              }
              
              return $processedData;
          }   
      
          /**
           * get TypoScriptFrontendController
           *
           * @return TypoScriptFrontendController
           */
          protected function getTypoScriptFrontendController()
          {
              return $GLOBALS['TSFE'];
          } 
      }

      Mithilfe der dataProcessing-Eigenschaft des FLUIDTEMPLATEs könnt Ihr nun Euren DataProcessor einbinden. In diesem Fall wird der DataProcessor nur für das TextMedia-Element eingebunden. Für das TextMedia-Element sind bereits 2 DataProcessoren (10 und 20) registriert, deshalb habe ich mich hier für einen deutlich höheren Key (100) entschieden:

      tt_content.textmedia.dataProcessing {
        100 = StefanFroemken\Typo3lexikon\Frontend\DataProcessing\HeaderProcessor
      }