Schnellnavigation:

Kategorien

« September 2015»
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

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 ... 

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:

  1. t3lib_extMgm::addPItoST43(
  2.   $_EXTKEY, 'piX/class.tx_myExtension_pi1.php',
  3.   '_pi1', 'list_type',1
  4. );

Zusätzlich muss innerhalb der Extension der cHash aktiviert werden, indem eine Klassenvariable definiert wird:

  1. 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:

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

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:

  1. t3lib_extMgm::addPItoST43(
  2.   $_EXTKEY,'piX/class.tx_myExtension_pi1.php',
  3.   '_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 

  1. plugin.tx_myExt_pi1=USER_INT

kann ein Plugin nachträglich von USER auf USER_INT umgestellt werden. Das erlaubt Konstruktionen dieser Art:

  1. [globalVar=TSFE:id=100] 
  2.      plugin.tx_tx_myExt_pi1=USER_INT

Tipp: Diese Einstellung in der main-Function:

  1. functionmain($content,$conf){ 
  2.    $this->pi_USER_INT_obj=1;
  3. }

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:

  1. switch ($this->conf['code']){
  2.   case'FORM':
  3.       $this->cObj->convertToUserIntObject();
  4.       $content.='Bin jetzt ein USER_INT-Objekt und cache nicht.';
  5.     break;
  6.     default:
  7.       $content.='Bin ein USER-Objekt und cache. ';
  8.     break;
  9. }

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”:

  1. if ($this->cObj->getUserObjectType() ==tslib_cObj::OBJECTTYPE_USER){
  2.   $content.='Ich bin ein USER Objekt.<br>';
  3.   if (!$this->conf['allowCaching']){
  4.       $this->cObj->convertToUserIntObject(); return'';
  5.     }
  6. }else{   
  7.     $content.='Nun bin ich ein USER_INT Objekt<br>';
  8. }

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:

  1. $content.='Normale, gechachte Ausgabe. <br>';
  2.  
  3. $cObj=t3lib_div::makeInstance('tslib_cObj');
  4. $cObj->start(array());
  5. $conf2=$GLOBALS['TSFE']->tmpl->setup['plugin.']['tx_myExt_pi2.'];
  6. $conf2['includeLibs']='EXT:myExt/pi2/class.tx_test_pi2.php';
  7. // ungecachte Ausgabe aus einem anderen Plugin:
  8. $content.=$cObj->cObjGetSingle('USER_INT',$conf2);
  9.  
  10. $content.='<br> und wieder die gecachte Ausgabe ... ';

Quelle: das Buch “Extension entwickeln” von Dimitry Dupolev, S. 129.

Weiterführende Links

Kategorien: API/Extensions  
Links:
Trackback-Link  (Bitte kopieren)
 
| Mehr
  •  
  • Kommentare
  •