Kategorien
- [-]Developer (104)
- API (15)
- Backend (17)
- Extensions (29)
- HTML & CSS (4)
- Typoscript (33)
- [-]Redaktionelles (21)
- Anleitungen (9)
- Tipps (8)
- [-]Sonstiges (50)
- SEO (8)
Schlagwortwolke
« | 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
Letzte Kommentare
- Das liegt daran, dass die captcha.php versucht, das halbe...
- 05.12.2017 00:41
- Hallo, danke für den tollen Beitrag. Kann man die...
- 22.10.2015 10:05
- Vielen Dank für den Austausch guter Artikel. Es ist eine...
- 17.08.2015 10:58
- Hallo Peter, danke für die Extension. Ich habe sie auf...
- 27.08.2014 12:51
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 ...
- << Erste
- < Vorherige
-
- 1
- 2
- Nächste >
- Letzte >>
Zur Zeit wird gefiltert nach: api
Filter zurücksetzen
CSS und JavaScript im Kopfbereich ausgeben
Bei der Extension-Programmierung steht man immer wieder vor dem Problem, dynamisch erstelltes JavaScript oder CSS ausgeben zu müssen. Man kann das natürlich direkt auf der Seite bzw. über die $content-Ausgabe, aber das ist nicht schön und funktioniert auch manchmal gar nicht. Es gibt deshalb die Möglichkeit, beides aus der Extension heraus in den HEAD-Bereich zu schreiben:
- $GLOBALS['TSFE']->setJS($this->extKey, 'alert("Mach was. ")');
- $GLOBALS['TSFE']->setCSS($this->extKey, 'p {padding:2em}');
Die Deklaration kann weggelassen werden, das übernimmt Typo3. Die Einträge verwenden das globale Array $GLOBALS[‘TSFE’]->additionalJavaScript bzw. $GLOBALS[‘TSFE’]->additionalCSS. Da diese Einträge nach denen des TypoScript-Templates erscheinen, können so auch vorher definierte Werte überschrieben werden.
Weiterführende Links
siehe auch den Artikel zu GLOBALS TSFE
Sprachen in Extensions
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:
- $this->sys_language_mode=$this->conf['sys_language_mode']?$this->conf['sys_language_mode']:$GLOBALS['TSFE']->sys_language_mode;
- #####
- # Mögliche Werte:
- #
- # [leer]: Das System fällt in die Standardsprache zurück,
- # wenn keine Übersetzung vorliegt.
- #
- # "content_fallback": Es wird immer mit der Übersetzung gearbeitet,
- # auch wenn eine Seite nicht übersetzt
- # wurde. Dadurch fallen die Menüs nicht immer
- # auf die Standardsprache zurück.
- #
- # "strict": Bei fehlenden Übersetzungen wird nichts gezeigt,
- # auch nicht die Standardsprache.
- #
- #########
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”.
- $where='pid = '.$pid.' AND sys_language_uid IN (-1,0) '.$this->cObj->enableFields('tt_content');
- $res=$GLOBALS['TYPO3_DB']->exec_SELECTquery(
- '*',
- 'tt_content',
- $where,
- '',
- '',
- ''
- );
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:
- while (($row=$GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))){
- // wenn eine andere als die Defaultsprache gewählt wurde
- if ($GLOBALS['TSFE']->sys_language_content){
- // Daten mit Language-Overlay überschreiben
- $row=$GLOBALS['TSFE']->sys_page->getRecordOverlay('tt_content',$row,$GLOBALS['TSFE']->sys_language_content,$this->sys_language_mode=='strict'?'hideNonTranslated':'');
- }
- }
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:
- while ($row=$GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)){
- if ($GLOBALS['TSFE']->sys_language_content){
- $row=$GLOBALS['TSFE']->sys_page->getPageOverlay($row);
- }
- }
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
Links in Extensions
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:
- tslib_pibase.pi_getPageLink (
- $id,
- $target = '',
- );
- $test = $this->pi_getPageLink (11,'',($this->prefixId=>array('name'=>'wert')) );
- // index.php?id=11&tx;_extension_pi1[name]=wert
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:
- tslib_pibase.pi_linkToPage (
- $str,
- $id,
- $target = '',
- );
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
- tslib_pibase.pi_linkTP (
- $str,
- $cache = 0,
- $altPageId = 0
- );
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
- tslib_pibase.pi_linkTP_keepPIvars (
- $str,
- $cache = 0,
- $clearAnyway = 0,
- $altPageId = 0
- );
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:
- tslib_pibase.pi_linkTP_keepPIvars_url (
- $cache = 0,
- $clearAnyway = 0,
- $altPageId = 0
- );
Grundlage: der Typolink
Letzlich rufen die obigen Funktionen nach einigen Manipulationen die folgenden Funktionen auf:
- tslib_cObj.typoLink ( $linktxt, $conf ) ;
- // oder
- 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:
- $url=$this->cObj->typoLink_URL(
- 'parameter'=>29,
- 'useCacheHash'=>true,
- 'additionalParams'=>'&tx;_ttnews[cat]='.$linkUid
- )
- );
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.
- # GET abfragen
- t3lib_div._GET ( $var = NULL )
- # POST
- t3lib_div._POST ( $var = NULL )
- # Beides
- t3lib_div._GP( $var = NULL)
- # Beispiel
- t3lib_div._GET ( 'tx_ttnews' )
Weiterleitungen
Sollten ebenfalls für Typolinks erfolgen; hier z. B. zusätzlich über eine PID aus dem Config-Array:
Weiterführende Links
Typo3 Dokumentation: Darin suchen nach »tslib_pibase«.
tslib_pibase Class Reference: (Achtung: geht ausserhalb seines Framesets auf).
GLOBALS TSFE
Über GLOBAL[‘TSFE’] kann man bei der Extension-Programmierung mehr oder weniger auf das gesamte TypoScript-Setup von Typo3 zugreifen. Man kann aktuelle Konfigurationen abfragen oder auch ändern, so dass sich die Ausgabe ins Frontend abhängig vom installierten Plugin auf jeder Seite ändern kann.
Zum Beispiel können damit zusätzliche JavaScript- oder CSS-Definitionen im Kopfbereich ausgegeben werden (siehe CSS und JavaScript im Kopfbereich ausgeben) oder der Bodytag erweitert werden. Folgende Zeile fügt z. B. auf jeder Seite, auf der das Plugin installiert wirde, dem Body-Tag einen onload-Befehl hinzu, wie er für Google-Maps benötigt wird:
- $GLOBALS['TSFE']->pSetup['bodyTagAdd']='onload="load()" onunload="GUnload()';
Mit
- $GLOBALS['TYPO3_DB']->debugOutput=true;
- echot3lib_div::debug($GLOBALS['TSFE']->pSetup);
kann man sich die erste Ebene des $GLOBAL-Arrays ausgeben lassen:
- 0 id
- 1 type
- 2 idParts
- 3 cHash
- 4 no_cache
- 5 rootLine
- 6 page
- 7 contentPid
- 8 sys_page
- 9 jumpurl
- 10 pageNotFound
- 11 domainStartPage
- 12 pageAccessFailureHistory
- 13 MP
- 14 RDCT
- 15 page_cache_reg1
- 16 siteScript
- 17 fe_user
- 18 loginUser
- 19 gr_list
- 20 beUserLogin
- 21 workspacePreview
- 22 loginAllowedInBranch
- 23 ADMCMD_preview_BEUSER_uid
- 24 fePreview
- 25 showHiddenPage
- 26 showHiddenRecords
- 27 simUserGroup
- 28 TYPO3_CONF_VARS
- 29 TCAcachedExtras
- 30 tmpl
- 31 cacheTimeOutDefault
- 32 cacheContentFlag
- 33 cacheExpires
- 34 isClientCachable
- 35 all
- 36 sPre
- 37 pSetup
- 38 newHash
- 39 getMethodUrlIdToken
- 40 no_CacheBeforePageGen
- 41 tempContent
- 42 forceTemplateParsing
- 43 cHash_array
- 44 hash_base
- 45 pagesTSconfig
- 46 additionalHeaderData
- 47 additionalJavaScript
- 48 additionalCSS
- 49 JSeventFuncCalls
- 50 JSCode
- 51 JSImgCode
- 52 divSection
- 53 defaultBodyTag
- 54 debug
- 55 intTarget
- 56 extTarget
- 57 MP_defaults
- 58 spamProtectEmailAddresses
- 59 absRefPrefix
- 60 absRefPrefix_force
- 61 compensateFieldWidth
- 62 lockFilePath
- 63 ATagParams
- 64 sWordRegEx
- 65 sWordList
- 66 linkVars
- 67 excludeCHashVars
- 68 displayEditIcons
- 69 displayFieldEditIcons
- 70 sys_language_uid
- 71 sys_language_mode
- 72 sys_language_content
- 73 sys_language_contentOL
- 74 sys_language_isocode
- 75 applicationData
- 76 register
- 77 registerStack
- 78 cObjectDepthCounter
- 79 recordRegister
- 80 currentRecord
- 81 accessKey
- 82 imagesOnPage
- 83 lastImageInfo
- 84 uniqueCounter
- 85 uniqueString
- 86 indexedDocTitle
- 87 altPageTitle
- 88 pEncAllowedParamNames
- 89 baseUrl
- 90 anchorPrefix
- 91 cObj
- 92 content
- 93 clientInfo
- 94 scriptParseTime
- 95 TCAloaded
- 96 csConvObj
- 97 defaultCharSet
- 98 renderCharset
- 99 metaCharset
- 100 localeCharset
- 101 lang
- 102 langSplitIndex
- 103 labelsCharset
- 104 convCharsetToFrom
- 105 LL_labels_cache
- 106 LL_files_cache
- 107 config
- 108 no_cacheBeforePageGen
- 109 xhtmlDoctype
- 110 xhtmlVersion
Viele der Einträge kommen bekannt vor und man kann sich denken, worum es dabei geht. Wenn man sich für eine Rubrik interessiert, kann man sie sich einzeln ausgeben lassen, z. B. das gesamte config-Setup:
- $GLOBALS['TYPO3_DB']->debugOutput=true;
- echot3lib_div::debug($GLOBALS['TSFE']->config);
TSFE mit Typoscript auslesen
Man kann über Typoscript alle Werte des TSFE auslesen, hier ein Beispiel mit lastImageInfo:
- temp.bildinfo=COA
- temp.bildinfo {
- 10=IMAGE
- # Das Bild muss existieren!
- # Bildbreite
- 20=TEXT
- 20.data=TSFE:lastImageInfo|0
- # Höhe
- 30=TEXT
- 30.data=TSFE:lastImageInfo|1
- # Typ
- 40=TEXT
- 40.data=TSFE:lastImageInfo|2
- # Pfad
- 50=TEXT
- 50.data=TSFE:lastImageInfo|3
- # Pfad zum Originalbild
- 60=TEXT
- 60.data=TSFE:lastImageInfo|origFile
- # Datum und Zeit des Uplaods
- 70=TEXT
- 70.data=TSFE:lastImageInfo|origFile_mtime
- }
Weiterführende Links:
- Auslesen von Informationen des IMAGE
- Auslesen von Informationen aus dem typolink Objekt
- Auslesen von client Informationen
- Andere nützliche Informationen
Ein Anwendungsbeispiel wäre die Bildergalerie mit reinem TypoScript von Georg Ringer bei typo3blogger.de