Schnellnavigation:

Kategorien

« März 2024»
S M T W T F S
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            

Letzte Nachrichten

DSGVO
26.05.2018 18:39
Trackingtools und Datenschutzerklärung
14.03.2014 23:07
1:n und n:1 Relationen in Extbase
06.12.2013 12:04
Erste Abmahnungen wegen Google Analytics
04.10.2013 12:11

Kopieren Sie diesen Link in Ihren RSS-Reader

RSS 0.91Nachrichten
RSS 2.0Nachrichten

In eigener Sache

Peter Linzenkirchner, Lisardo EDV Beratung in Augsburg. Freelance und Partner für Design- und Webagenturen in Augsburg und München. Pixelgenaue Templates, valides HTML, barrierearm. TYPO3-Projekte, Extension-Programmierung und mehr ... 

In der Version 4.3 kann man den Wizard für die neuen Inhaltselemente ziemlich gut konfigurieren. Das bentuze ich um z. B. das ebenfalls komplett überarbeitete Inhaltselement Media in die erste Rubrik Typischer Seiteninhalt einzubinden.

Dazu muss in TSconfig der Seite folgender Abschnitt:

  1. mod {
  2.     wizards{
  3.         newContentElement {
  4.             # Darstellung in Tabs
  5.             renderMode=tabs
  6.             # Content-Element media in den ersten
  7.             # Tab aufnehmen
  8.             # Definition
  9.             wizardItems.common.elements.media {
  10.                 icon=gfx/c_wiz/multimedia.gif
  11.                 title=Media
  12.                 description=Video/Flash einbinden
  13.                 tt_content_defValues {
  14.                         CType=media
  15.                 }

  1.             }
  2.             # Hinzufügen
  3.             wizardItems.common.show:=addToList(media)
  4.         }
  5.     }
  6. }

Tipp: Wenn man mit TemplaVoila arbeitet, geht der Code nicht, in dem Fall muss mod durch templavoila ersetzt werden:

  1. templavoila {
  2.     wizards{
  3.                 # und so  weiter.
  4.     }
  5. }

Weiterführende Links

Kategorien: Backend  Kommentare 0
Tags: wizard, backend

Die Verarbeitung von Sprachen in Extensions geht in mehreren Schritten vor sich: 

Spracheinstellungen aus config

Zuerst muss die Spracheinstellung (Modus) aus config im Setup ausgelesen werden, am besten in der main()-Funktion oder in einer speziellen init()-Funktion, die aus main() ausgerufen wird:

  1. $this->sys_language_mode=$this->conf['sys_language_mode']?$this->conf['sys_language_mode']:$GLOBALS['TSFE']->sys_language_mode;
  2.  
  3. #####
  4. # Mögliche Werte:
  5. #
  6. # [leer]: Das System fällt in die Standardsprache zurück,
  7. #      wenn keine Übersetzung vorliegt.
  8. #
  9. # "content_fallback": Es wird immer mit der Übersetzung gearbeitet,
  10. #              auch wenn eine Seite nicht übersetzt
  11. #              wurde. Dadurch fallen die Menüs nicht immer
  12. #              auf die Standardsprache zurück.
  13. #
  14. # "strict": Bei fehlenden Übersetzungen wird nichts gezeigt,
  15. #      auch nicht die Standardsprache.
  16. #
  17. #########
  18.  

Der Wert für $this->sys_language_mode wird entweder aus der lokalen Konfiguration der Extension entnommen oder aus den config-Einstellungen im Setup.

Datenbankabfrage

Bereits bei der Datenbankabfrage muss die Sprache berücksichtigt werden, da sich die Übersetzungen in der gleichen Datentabelle befinden wie die Defaultsprache, nur mit einer anderen uid und der uid der Sprachversion im Feld “sys_language_uid”.

  1. $where='pid = '.$pid.' AND sys_language_uid IN (-1,0) '.$this->cObj->enableFields('tt_content');
  2. $res=$GLOBALS['TYPO3_DB']->exec_SELECTquery(
  3.     '*',
  4.     'tt_content',
  5.     $where,
  6.     '',
  7.     '',
  8.     ''
  9. );

Dadurch wird sichergestellt, dass immer nur die Datensätze der Default-Sprache ausgelesen werden, nicht die Übersetzungen. Diese werden im nächsen Schritt geholt.

Language Overlay

Über eine spezielle Abfrage wird die Default-Sprache überschrieben:

  1. while (($row=$GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))){
  2.     // wenn eine andere als die Defaultsprache gewählt wurde
  3.     if ($GLOBALS['TSFE']->sys_language_content){
  4.         // Daten mit Language-Overlay überschreiben
  5.         $row=$GLOBALS['TSFE']->sys_page->getRecordOverlay('tt_content',$row,$GLOBALS['TSFE']->sys_language_content,$this->sys_language_mode=='strict'?'hideNonTranslated':'');
  6.     }
  7. }

Dieser Aufruf bringt die neue Sprache zurück, falls eine vorhanden ist und solange der Modus nicht ‘strict’ lautet. Wenn keine Übersetzung vorhanden ist, wird die Defaultsprache zurückgeliefert, wenn jedoch zusätzlich sys_language_mode = ‘strict’ ist, dann wird ein leeres Array zurückgeliefert.

Bei pages geht es etwas anders:

Der obige Weg muss immer eingeschlagen werden, wenn sich die Sprachversionen in der gleichen Datentabelle befinden, wie üblich in tt_content oder in Extensions. Bei den Seiten ist es allerdings etwas anders, da es hier eine eigene pages_language_overlay-Tabelle gibt. Folglich muss bei der Datenbankabfrage nicht die language_uid berücksichtigt werden, da immer nur die Seite in der Defaultsprache gefunden wird.

Es muss nur im Anschluss an die Abfrage erneut der Language-Overlay aufgerufen werden:

  1. while ($row=$GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)){
  2.     if ($GLOBALS['TSFE']->sys_language_content){
  3.         $row=$GLOBALS['TSFE']->sys_page->getPageOverlay($row);
  4.     }
  5. }

Wie man sieht, funktioniert es etwas anders als bei normalen Content-Elementen. Man erhält mit dieser Funktion den Sprachoverlay der Seite – das heißt, wenn es keine Übersetzung gibt, dann erhält man die Werte der Default-Sprache. Wenn tatsächlich eine Übersetzung in der aktuellen Sprache vorliegt, so enthält die Variable $row nach dem Obverlay noch zwei zusätzliche Arraywerte: _PAGES_OVERLAY=1 sowie _PAGES_OVERLAY_UID mit der uid der übersetzten Seite. Damit kann im Anschluss z. B. entschieden werden, ob die Seite auch »gezählt« werden soll. Will man nur übersetzte Seite ausgeben, so kann man auf die Existenz dieser Felder prüfen. 

Weiterführende Links

 

 

Kategorien: API/Extensions  Kommentare 0
Tags: api, language

Es gibt mehrere Möglichkeiten, ein Menü für verschiedene Benutzer oder Benutzergruppen unterschiedlich zu gestalten.

Unterscheidung mit if

  1. temp.nav_main=HMENU
  2. temp.nav_main {
  3.   special=directory
  4.   special.value=3
  5.   entryLevel=1
  6.   1=TMENU
  7.   1 {
  8.     noBlur=1
  9.     wrap= <divclass="navi"><ul>|</ul></div>
  10.     NO=1
  11.     NO.ATagTitle.field=abstract// description // title
  12.     NO.linkWrap= <li>|</li>
  13.     NO.stdWrap.htmlSpecialChars=1
  14.     NO.ATagParams= class="intern"
  15.  
  16.     #################################################
  17.     # andere Anzeige für die internen Seiten.
  18.  
  19.     NO.ATagParams.if{
  20.         value=0
  21.         isGreaterThan.field=fe_group
  22.     }
  23.    
  24.     ACT< .NO
  25.     ACT.linkWrap= <liclass="aktiv">|
  26.    
  27.   }
  28. }

Hier interessiert vor allem die zusätzliche Zuweisung einer besonderen Klasse in einige Menpunkte, die Seiten betreffen, die nur für Frontend User zugänglich sind:

  1. #################################################
  2. # andere Anzeige für die internen Seiten.
  3.  
  4. NO.ATagParams.if{
  5.     value=0
  6.     isGreaterThan.field=fe_group
  7. }

Menu Item State: 

Eine weitere Möglichkeit sind die Common item states für Menüs; dort gibt es einen Item State speziell für zugangsbeschränkte Seiten: USR und URSRO

Weiterführende Links

Rubrik »if« in der TypoScript-Referenz
Hier vor allem die verschiedenen Vergleichsoperatoren und die Besipiele.

Common Item States in der TSref.

Kategorien: Typoscript  Kommentare 0
Tags: typoscript, menü

Auch ohne TemplaVoila oder einem Template-Switcher können den Redakteuren verschiedene Layouts einfach über eine TypoScript-Konfiguration im Main-Template zur Verfügung gestellt werden

  1. page=PAGE
  2. page {
  3.     10= CASE
  4.     10.key.field=layout
  5.     # Standardtemplate
  6.     10.0  =TEMPLATE
  7.     10.0.template=FILE
  8.     10.0.template.file=fileadmin/tmpl/standard.html
  9.     10.0.workOnSubpart=DOCUMENT_BODY
  10.     10.0.marks {
  11.           # etc.
  12.     }
  13.     # Variante 1:
  14.     10.1  =TEMPLATE
  15.     10.1.template=FILE
  16.     10.1.template.file=fileadmin/tmpl/variante1.html
  17.     10.1.workOnSubpart=DOCUMENT_BODY
  18.     10.1.marks {
  19.           # etc.
  20.     }
  21.     # und so weiter.
  22. }

Standardmäßig sind vier Varianten vorgesehen. Diese können über PageTSconfig anders benannt werden:

  1. #In die Rootseite ins Feld Tsconfig:
  2. TCEFORM.pages {
  3.     layout.altLabels.0=Standard Vorlage
  4.     layout.altLabels.1=Zwei Spalter
  5.     layout.altLabels.2=Drei Spalter
  6.     layout.altLabels.3=Und so weiter.
  7. }

Falls vier Varianten nicht reichen, können noch weitere ergänzt werden:

  1. TCEFORM.pages{
  2.     layout.addItems {
  3.           4=eine weitere Variante
  4.           # usw
  5.     }
  6. }

Mit dieser Technik kann sogar das klassische 4-Spalten-Layout im Backend mit TemplaVoila kombiniert werden, von Seite zu Seite individuell und einfach vom Redakteur auszuwählen:

  1. page=PAGE
  2. page {
  3.     10= CASE
  4.     10.key.field=layout
  5.     # Standardtemplate
  6.     10.0=USER
  7.     10.0.userFunc=tx_templavoila_pi1->main_page
  8.     # Variante 1:
  9.     10.1  =TEMPLATE
  10.     10.1.template=FILE
  11.     10.1.template.file=fileadmin/tmpl/variante1.html
  12.     10.1.workOnSubpart=DOCUMENT_BODY
  13.     10.1.marks {
  14.           # etc.
  15.     }
  16.     # und so weiter.
  17. }

Allerdings muss dann TemplaVoila so konfiguriert werden, dass in der Rubrik »Web« im Backend beide Seiten-Module gezeigt werden: für TemplaVoila und das klassische. (Je nach Seitenlayout muss das passende Modul für die Eingabe der Inhalte verwendet werden). Dazu öffnet man im Extension Manager TemplaVolia und aktiviert die Option »Enable the classic page module«. Aber Achtung: da beide Seitenmodule leicht verwechselt werden können, erstellen ungeübte Redakteure schnell Inhalte in den falschen Modulen, was dazu führen kann, dass Inhalte zwar in TemplaVoila erscheinen sollen, aber dort nicht referenziert und damit letztlich auch nicht gezeigt werden. Diese Technik setzt also Redakteure voraus, die wissen was sie tun.

Falls doch einmal Inhalte nicht in TemplaVoila referenziert werden und damit nicht im Frontend erscheinen, so gibt es unter »Funktionen« den Assistenten »Referenziere unbenutzte Inhaltselement (TemplaVolia)«. Damit werden alle Inhaltselement in TemplaVoila-Spalten eingefügt – leider oft in die falschen. Aber immerhin sind sie jetzt da und und in der aktuellen Version von TemplaVoila können Inhaltselemente leicht per Drag und Drop verschoben werden, so dass sich der Aufwand in Grenzen hält.

 

In Extensions sollten Links generell nicht hart codiert sondern immer mit den Typo3-Funktionen erstellt werden. Der Grund ist einfach: Werden die Links in PHP direkt kofiert, so greifen die Typolink-Funktionen nicht, ausserdem können zusätzliche Parameter nicht durchgeschleift werden. Es gibt eine große Auswahl an Typo3-Funktionen für die Erstellung von Links:

Einfacher Link auf eine interne Seite:

  1. tslib_pibase.pi_getPageLink (
  2.     $id,
  3.     $target = '',
  4.     $urlParameters = array()
  5. );
  6.  
  7. $test = $this->pi_getPageLink (11,'',($this->prefixId=>array('name'=>'wert')) );
  8. // index.php?id=11&tx;_extension_pi1[name]=wert 
  9.  

Parameter

  • integer: PID der Seite auf die der Link verweisen soll
  • string: HTML-Targetarray: weitere Parameter, als Array:
  • array(‘page’=>5,‘irgendwas’=>‘7’)

Man bekommt eine URL zurück. Um den gesamten Link-Text incl. HTML zu erhalten, kann folgende Funktion verwendet werden:

  1. tslib_pibase.pi_linkToPage  (
  2.     $str,
  3.     $id,
  4.     $target = '',
  5.     $urlParameters = array()
  6. );

Die Parameter sind wie oben, allerdings kommt noch ein String hinzu für den Inhalt, der mit dem Link umgeben werden soll. Rückgabewert ist das komplette HTML für den Link.

Link auf die aktuelle Seite mit Cache-Einstellungen und zus. Parametern

  1. tslib_pibase.pi_linkTP  (
  2.     $str,
  3.     $urlParameters = array(),
  4.     $cache = 0,
  5.     $altPageId = 0
  6. );

Parameter

  • string: Der Linktext
  • array: Array mit zusätzlichen URL-Parametern. Diese Parameter werden in Liste der Parameter in der TypoScript-Property “parent.addParams” und $this->pi_moreParams aufgenommen. Bedeutet, dass sie den $this->prefixId String benötigen.
  • boolean: Mit 1 wird die aufgerufene Seite gecacht (durch Anhängen eines &cHash;-Wertes, vorausgesetzt es handelt sich um ein USER_INT). Mit 0 wird ein no_cache-Parameter an den Link angehängt.
  • integer: PID der Zielseite; wenn das nicht angegeben wird, in das Ziel die aktuelle Seite.

Diese Schreibweise kann also auch für Links auf andere Seiten verwendet werden. Da per Voreinstellung auf die aktuelle Seite verlinkt wird, fehlt auch das target. Rückgabewert ist der komplette Link incl. HTML.

Link zur aktuellen Seite, der aktuell
gesetzte piVars erhält bzw. überschreibt

  1. tslib_pibase.pi_linkTP_keepPIvars (
  2.     $str,
  3.     $overrulePIvars = array(),
  4.     $cache = 0,
  5.     $clearAnyway = 0,
  6.     $altPageId = 0
  7. );

Parameter

  • string: der Linktext
  • array: Array zum Überschreiben (und Ergänzen) der aktuellen piVars. Die Variablen werden automatisch dem piVars-Array hinzugefügt; im Gegensatz zu pi_linkTP sollten die Schlüssel also nicht um $this->prefixId erweitert werden, das parriert automatisch. Werte, die sich in diesem Array befinden, überschreiben vorhandene Einträge in piVars. Wenn der Wert eines Schlüssels leer ist (leerer String), dann wird dieser Wert aus dem piVArs-Array entfernt.
  • boolean: Mit 1 wird die aufgerufene Seite gecacht (durch Anhängen eines &cHash;-Wertes, vorausgesetzt es handelt sich um ein USER_INT). Mit 0 wird ein no_cache-Parameter an den Link angehängt.
  • boolean: Wenn dieser Wert gesetzt wird, so bleibt der Inhalt der piVars nicht erhalten. Praktisch, um piVars zu definieren, ohne auf den prefix zu achten. Insbesondere beim Action-Link von Formularen sinnvoll, sonst bleiben bei wiederholten Formularaufrufen einmal gesetzte Werte von Checkboxen oder Radioboxen erhalten.
  • integer: PID der Zielseite; wenn das nicht angegeben wird, in das Ziel die aktuelle Seite.

Rückgabewert ist der gesamte Link mit den Tags. Um nur die URL zu erhalten, folgende Funktion verwenden:

  1. tslib_pibase.pi_linkTP_keepPIvars_url (
  2.     $overrulePIvars = array(),
  3.     $cache = 0,
  4.     $clearAnyway = 0,
  5.     $altPageId = 0
  6. );

Grundlage: der Typolink

Letzlich rufen die obigen Funktionen nach einigen Manipulationen die folgenden Funktionen auf:

  1. tslib_cObj.typoLink ( $linktxt, $conf ) ;
  2. // oder
  3. tslib_cObj.typoLink_URL ( $conf );

Diese Funktion ermöglicht die Konfiguration und Erweiterung der Links über die Typolink-Optionen von TypoScript. Sie sollte nie übergangen werden.

Links auf Seiten mit Inhalten aus anderen Extensions

Die obigen Techniken finden Anwendung, wenn in einer Extension Links verwendet werden, die wiederum Inhalte der eigenen Extension aufrufen. Oft müssen aber Links eingebaut werden, die Inhalt von fremden Extensions aufrufen und dazu die Parameter der fremden Extension übergeben müssen. Auch diese Links müssen richtig aufgebaut werden und vor allem für das Caching den cHashe-Parameter enthalten.

Hier ist ein Beispiel, wie das aussehen kann:

  1. $url=$this->cObj->typoLink_URL(
  2.     array(
  3.           'parameter'=>29,
  4.           'useCacheHash'=>true,
  5.           'additionalParams'=>'&tx;_ttnews[cat]='.$linkUid
  6.       )
  7. );

Man erkennt ohne Probleme die Syntax des Typolinks darin.

Übergabe-Variablen korrekt abfragen und verarbeiten

Die Globalen GET und POST sollten nie direkt abgefragt werden, sondern immer über die folgenden API-Funktionen. Die Übergabe-Variable “var” kann benutzt werden, um Teile des Arrays abzufragen. Das Beispiel liefert ein Array aller GET-Parameter von tt_news.

  1. # GET abfragen
  2. t3lib_div._GET ( $var = NULL )
  3. # POST
  4. t3lib_div._POST ( $var = NULL )   
  5. # Beides
  6. t3lib_div._GP( $var = NULL) 
  7. # Beispiel
  8. t3lib_div._GET ( 'tx_ttnews' )

Weiterleitungen

Sollten ebenfalls für Typolinks erfolgen; hier z. B. zusätzlich über eine PID aus dem Config-Array:

  1. header('Location:'.t3lib_div::locationHeaderUrl($this->pi_getPageLink($this->conf['pid'])));

Weiterführende Links

Typo3 Dokumentation: Darin suchen nach »tslib_pibase«.
tslib_pibase Class Reference: (Achtung: geht ausserhalb seines Framesets auf).

Kategorien: API/Extensions  Kommentare 0
Tags: links, extension, api