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
« | April 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 |
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: extension
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
Cache in Extensions
Grundsätzlich kann eine Extension als gecachtes USER-Objekt oder als ungecachtes USER_INT-Objekt eingebunden werden. Prinzipiell kann das für jede Extensions sowohl im PHP-Code wie auch über Typoscript bestimmt werden.
Extensions, die gecachet werden sollen
Zunächst erhalten Sie folgenden Eintrag in der ext_localconf.php. Die “1” am Ende steht für aktivierten Cache:
- t3lib_extMgm::addPItoST43(
- $_EXTKEY, 'piX/class.tx_myExtension_pi1.php',
- '_pi1', 'list_type',1
- );
Zusätzlich muss innerhalb der Extension der cHash aktiviert werden, indem eine Klassenvariable definiert wird:
- var$pi_checkCHash=true;
Die Ausgabe des cHash ist nötig, damit für jede Paramter-Kombination ein eigener Cache-Eintrag angelegt wird. Ohne cHash wird jeweils der erste Seitenaufruf für die gesamte Seite gechachet und die weiteren Parameter-Kombinationen ignoriert. Der cHash ist ein Hash-Wert, der aus den Parametern und dem Encryption key des Install-Tools errechnet wird. Er soll verhindern, dass über zufällig aufgerufene Parameter der Cache überflutet wird – was einer DOS-Attacke gleich käme. Nur gültige Parameter erzeugen einen Cache-Eintrag.
Natürlich müssen die Links entsprechend erstellt werden, sinnvollerweise über die TypoLink-Funktionen von TYPO3:
- tslib_pibase.pi_linkTP (
- $str,
- $cache=1,
- $altPageId=0
- );
Weitere Beispiel im Artikel Links in Extensions.
Dynamische Extensions ohne Cache
Extensions, die z. B. mit Formularen umgehen oder aktuelle Daten liefern sollen, dürfen nicht gecached werden. Allerdings sollte natürlich trotzdem der Rest der Seite gecachet werden, nur eben rein der Code der Extension nicht. Das kann so erreicht werden:
- t3lib_extMgm::addPItoST43(
- $_EXTKEY,'piX/class.tx_myExtension_pi1.php',
- '_pi1','list_type',0);
Damit wird die Extension als USER_INT – also als nicht cachende Extension – eingebunden.
Steuerung über TypoScript
Es ist ohne weiteres möglich, Plugins über Typoscript umzustellen von USER auf USER_INT. Mit
- plugin.tx_myExt_pi1=USER_INT
kann ein Plugin nachträglich von USER auf USER_INT umgestellt werden. Das erlaubt Konstruktionen dieser Art:
- [globalVar=TSFE:id=100]
- plugin.tx_tx_myExt_pi1=USER_INT
Tipp: Diese Einstellung in der main-Function:
- functionmain($content,$conf){
- $this->pi_USER_INT_obj=1;
- }
Wird oft zusätzlich empfohlen, um ein USER_INT-Plugin anzulegen. Meines Wissens schreibt sie auch der Extensions-Manager entsprechend rein. Ich würde das nicht empfehlen, da dadurch der TypoScript-Umschalter natürlich deaktiviert wird und die oben erwähnten Methoden nicht mehr funktionieren.
Steuerung über Flexforms
Das ist nicht so einfach und setzt einen entsprechenden PHP-Code im Plugin selbst voraus. Ausserdem ist es erst ab TYPO3 4.3 möglich. Dieser Code in der main-Function des (USER-)Plugins:
- switch ($this->conf['code']){
- case'FORM':
- $this->cObj->convertToUserIntObject();
- $content.='Bin jetzt ein USER_INT-Objekt und cache nicht.';
- break;
- default:
- $content.='Bin ein USER-Objekt und cache. ';
- break;
- }
schaltet automatisch bei der Auswahl von FORM in den Flexforms um auf ein USER_INT. Hier ist noch eine andere Variante, welche die USER/USER_INT-Eigenschaften abhängig macht von der TypoScript-Variablen “allowCaching”:
- if ($this->cObj->getUserObjectType() ==tslib_cObj::OBJECTTYPE_USER){
- $content.='Ich bin ein USER Objekt.<br>';
- if (!$this->conf['allowCaching']){
- $this->cObj->convertToUserIntObject(); return'';
- }
- }else{
- $content.='Nun bin ich ein USER_INT Objekt<br>';
- }
Quelle: USER to USER_INT conversion. Aber Achtung: dort stimmt die Syntax nicht! Meine hier ist richtig.
Ausgabe eines USER_INT-Plugins innerhalb eines USER-Plugins
Machmal besteht die Notwendigkeit, innerhalb einer gecachten Extension eine einzelne Ausgabe ungecached machen zu lassen – z. B. die Ausgabe einer Zeit. Das kann man über ein kleines zusätzliches Plugin lösen, das im eigentlichen Plugin aufgerufen wird:
- $content.='Normale, gechachte Ausgabe. <br>';
- $cObj=t3lib_div::makeInstance('tslib_cObj');
- $conf2=$GLOBALS['TSFE']->tmpl->setup['plugin.']['tx_myExt_pi2.'];
- $conf2['includeLibs']='EXT:myExt/pi2/class.tx_test_pi2.php';
- // ungecachte Ausgabe aus einem anderen Plugin:
- $content.=$cObj->cObjGetSingle('USER_INT',$conf2);
- $content.='<br> und wieder die gecachte Ausgabe ... ';
Quelle: das Buch “Extension entwickeln” von Dimitry Dupolev, S. 129.
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
Extension debuggen
Einige Möglichkeiten, während der Entwicklung einer Extension den Quellcode zu debuggen.
Ein Array ordentlich ausgeben:
- t3lib_div::debug($data);
Wenn es mehrere Debugs sind, kann man sie benennen:
- t3lib_div::debug($data,'Array vorher');
- $data['Name']='Dampf';
- $data['Alter']=32;
- t3lib_div::debug($data,'Array nachher');
Datenbankabfragen:
- $GLOBALS['TYPO3_DB']->debugOutput=true;