Schnellnavigation:

Kategorien

« 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

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

Zur Zeit wird gefiltert nach: Extensions
Filter zurücksetzen

Eine Extension kann Konfigurationsvariablen enthalten, die im Extensions-Manager eingestellt werden können/müssen. Dazu muss zunächste eine Datei mit dem Namen ext_conf_template.txt in der Root der Extension erstellt werden. Darin werden die Auswahl- bzw. Einstellungsmöglichkeiten definiert (hier ein Beispiel aus der captcha-Extension):

  1. # cat=basic; type=boolean; label=Use TTF: When set the captcha will get generated using TTF font rendering functions which will result in much more readable captchas
  2. useTTF=0
  3.  
  4. # cat=basic; type=integer; label=Image width: The width of the captcha image
  5. imgWidth=95

Diese Variablen werden im Extensions-Manager bei der Installation der Extension abgefragt und können dort eingestellt werden. Sie werden automatisch serialisiert in der localconf.php der TYPO3-Installation abgelegt.

Innerhalb einer Frontend-Extension kann nur auf diese Variablen so zugegriffen werden:

  1. $_EXTCONF=unserialize($_EXTCONF);
  2.  
  3. $useTTF=$_EXTCONF['useTTF'];
  4.  
  5. // usw.
  6.  

Von ausserhalb der Extension – wie das z. B. in der captcha.php der captcha-Extension nötig ist, kann so zugeriffen werden:

  1. // Pfade einstellung und localcon.php laden
  2. define('TYPO3_MODE','FE');
  3. define(PATH_this,dirname(__FILE__).'/');
  4. define(PATH_site,dirname(dirname(dirname(dirname(dirname(__FILE__))))).'/');
  5. define(PATH_typo3conf,PATH_site.'typo3conf/');
  6. require_once(PATH_typo3conf.'localconf.php');
  7. //
  8. $config=unserialize($TYPO3_CONF_VARS['EXT']['extConf']['captcha']);

Die captcha-Extension wirft in manchen Installationen folgenden Fehler:

TYPO3 Fatal Error: Extension key “lang” was NOT loaded! (t3lib_extMgm::extPath)

Das liegt daran, dass die captcha.php versucht, das halbe Backend nachzuladen, was aber überhaupt nicht erforderlich ist. Der einfachste Fix geht so, dass die ersten Zeilen der Extension, in denen verschiedene Klassen des Backends nachgeladen werden, durch andere ersetzt werden.

Diese Zeilen:

  1. define(PATH_t3lib,PATH_site.'t3lib/');
  2. define(PATH_tslib,PATH_site.'typo3/sysext/cms/tslib/');
  3. require_once(PATH_t3lib.'class.t3lib_div.php');
  4. require_once(PATH_t3lib.'class.t3lib_extmgm.php');
  5. require_once(PATH_t3lib.'config_default.php');

ersetzen durch diese:

  1. define(PATH_typo3conf,PATH_site.'typo3conf/');
  2. require_once(PATH_typo3conf.'localconf.php');
  3. $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['captcha']=
  4.       unserialize($TYPO3_CONF_VARS['EXT']['extConf']['captcha']);

Damit wird das Nachladen vieler Klassen umgangen und die Konfiguration direkt aus der localconf.php übernommen.

 

 

30August2010

Formulare in Typo3

Mit dem normalen Inhaltselement FORM kann man bereits einiges machen, allerdings hat es einige Einschränkungen:

  • man kann die Formularelemente nur sehr mühsam mehrspaltig anordnen
  • Zwischentexte zwischen den Elementen sind zwar möglich, können aber nur mit einer einheitlichen Formatierung versehen werden.
  • die Validierung erfolgt nur mittels JavaScript
  • der Absender bekommt die gesendeten Inhalte nicht mehr gezeigt.
  • die eingebenen Daten werden nicht in einer Datenbank gespeichert

Es gibt einige Erweiterungen, die das Inhaltselement FORM erweitern, ausserdem kann man Erweiterungen einsetzen, die es komplett ersetzen.

Tipps zu FORM

Einzelne Elemente mit Klassen versehen:

  1. tt_content.mailform.20.params.input = class="mein_input"
  2. tt_content.mailform.20.params.textarea = class="mein-text"

In den Beispielen auf Typo3.org findet sich eine Syntax, wie Kopien an mehrere Empfänger versendet werden können

  1. |recipient_copy=hidden | copy@email.com

und wie man eine Bestätigungs-E-Mail an den Absender schicken kann: 

  1. |auto_respond_msg=hidden|Hello / This is an autoresponse. //We have received your mail.
  2.  

Diese Nachricht wird nur gesendet, wenn die E-Mailadresse bekannt ist, also das Feld “email” ausgefüllt wurde. Unklar ist dabei, inwieweit das gegen Spam geschützt werden kann. Ich vermute, dass es ein neues Feature von Typo3 Vs. 4 ist.

Weiterführende Links:

FORM in css_styled_content

In css_styled_content findet sich ein ziemlich ausführliches TypoScript zum FORM-Objekt, das als Ausgangspunkt genommen werden kann. Es ist dann relativ einfach, dieses zu ergänzen. Nachfolgend zuerst der Code, wie das FORM-Objekt standardmäßig überschrieben wird:

  1. tt_content.mailform = COA
  2. tt_content.mailform.10 = < lib.stdheader
  3. tt_content.mailform.20 = FORM
  4. tt_content.mailform.20 {
  5.   layout = <tr><td class="csc-form-labelcell">###LABEL###</td><td class="csc-form-fieldcell">###FIELD###</td></tr>
  6.   labelWrap.wrap = <p class="csc-form-label">|</p>
  7.   commentWrap.wrap = <p class="csc-form-comment">|</p>
  8.   radioWrap.wrap = <span class="csc-form-radio">|</span><br />
  9.   REQ = 1
  10.   REQ.labelWrap.wrap = <p class="csc-form-label-req">|</p>
  11.   COMMENT.layout = <tr><td colspan="2" class="csc-form-commentcell">###LABEL###</td></tr>
  12.   target = {$styles.content.mailform.target}
  13.   goodMess = {$styles.content.mailform.goodMess}
  14.   badMess = {$styles.content.mailform.badMess}
  15.   redirect.field = pages
  16.   redirect.listNum = 0
  17.   recipient.field = subheader
  18.   data.field = bodytext
  19.   locationData = 1
  20.  
  21.   stdWrap.wrap = <table border="0" cellspacing="1" cellpadding="1" class="csc-mailform">| </table>
  22.   stdWrap {
  23.       editIcons = tt_content: bodytext, pages, subheader
  24.       editIcons.iconTitle.data = LLL:EXT:css_styled_content/pi1/locallang.php:eIcon.form
  25.  
  26.       prefixComment = 2 | Mail form inserted:
  27.   }
  28. }

Danach folgt die neue Version ([compatVersion = 3.9.0]):

  1. tt_content.table.20.innerStdWrap.wrap = |
  2.  
  3. tt_content.mailform.20 {
  4.   accessibility = 1
  5.   noWrapAttr=1
  6.   formName = mailform
  7.   dontMd5FieldNames = 1
  8.   REQ = 1
  9.   layout = <div class="csc-mailform-field">###LABEL### ###FIELD###</div>
  10.   COMMENT.layout = <div class="csc-mailform-label">###LABEL###</div>
  11.   RADIO.layout = <div class="csc-mailform-field">###LABEL### <span class="csc-mailform-radio">###FIELD###</span></div>
  12.   LABEL.layout = <div class="csc-mailform-field">###LABEL### <span class="csc-mailform-label">###FIELD###</span></div>
  13.   labelWrap.wrap = |
  14.   commentWrap.wrap = |
  15.   radioWrap.wrap = |<br />
  16.   REQ.labelWrap.wrap = |
  17.   stdWrap.wrap = <fieldset class="csc-mailform"> | </fieldset>
  18.   params.radio = class="csc-mailform-radio"
  19.   params.check = class="csc-mailform-check"
  20.   params.submit = class="csc-mailform-submit"
  21. }

Das ergibt zum Beispiel folgenden Output:

  1. <form action="Divers.64.0.html" id="mailform" name="mailform" enctype="multipart/form-data" method="post" target="_self" onsubmit="return validateForm('mailform','the_name,Name:,email,Email:','','Leere Pflichtfelder:','')">
  2.   <div style="display:none;">
  3.       <input type="hidden" name="html_enabled" id="mailformhtml_enabled" value="1" />
  4.       <input type="hidden" name="subject" id="mailformsubject" value="This is the subject" />
  5.       <input type="hidden" name="auto_respond_msg" id="mailformauto_respond_msg" value="Hello / This is an autoresponse. //We have received your mail." />
  6.       <input type="hidden" name="tv" id="mailformtv" value="0" />
  7.       <input type="hidden" name="locationData" value="64:tt_content:165" />
  8.   </div>
  9.   <fieldset class="csc-mailform">
  10.       <div class="csc-mailform-field">
  11.           <label for="mailformthe_name">Name:</label>
  12.           <input type="text" name="the_name" id="mailformthe_name" size="20" value="Enter your name here" />
  13.       </div>
  14.       <div class="csc-mailform-label">
  15.           Eine kleine Zwischenzeile
  16.       </div>
  17.       <div class="csc-mailform-field">
  18.           <label for="mailformemail">Email:</label>
  19.           <input type="text" name="email" id="mailformemail" size="20" value="" />
  20.       </div>
  21.       <div class="csc-mailform-field">
  22.           Label <span class="csc-mailform-label">Label value</span>
  23.       </div>
  24.       <div class="csc-mailform-field">
  25.           <label for="mailformtv">Like TV:</label>
  26.           <input type="checkbox" value="1" name="tv" id="mailformtv" class="csc-mailform-check" />
  27.       </div>
  28.       <div class="csc-mailform-field">
  29.           <input type="submit" name="formtype_mail" id="mailformformtype_mail" value="Send this!" class="csc-mailform-submit" />
  30.       </div>
  31.   </fieldset>
  32. </form>

Funktionserweiterungen für FORM

Drei Extensions von Christian Jul Jensen erweitern FORM um einige dieser aufgezählten Funktionen:

  • julle_formpreview: zeigt nach dem Ausfüllen und vor dem Absenden des Formulars nochmals alle Daten.RepositoryManual
  • julle_formreceipt: Damit kann eine Bestätigungsmail an den Ausfüller versendet werden. RepositoryManual
  • julle_form2csv: speichert die Daten im CSV-Format. RepositoryManual
  • formevalwizard: Damit können Validierungsvorgaben gespeichert werden; das macht es für die Redakteure einfacher, komplexe Validierungen einzusetzen, da sie keine regulären Ausdrücke mehr benötigen. Repository,Manual
  • qforms: ein einfach zu nutzender Formulareditor, der den Redakteuren das Anlegen von Formularen erleichtern soll. Repository]=search&no_cache=1&tx;_terfe_pi1[sword]=qforms, Manual

MailformPlus

Diese Extension wird wohl am häufigsten eingesetzt, um FORM zu ersetzen. Die Handhabung ist recht einfache, das eigentliche Formular wird einfach als HTML-Template angelegt, mit den üblichen Platzhaltern. Es ermöglicht somit ein völlig freies Layout. Seine Features:

  • flexibles Layout mit Templates
  • serverseitige Validierung
  • E-Mail an den Absender
  • Speichern in Datenbank und als Export als CSV-Datei
  • Erweiterbar um JavaScript-Validierung, bis hin zu Ajax.
  • ermöglicht mehrseitige Formulare

Nachteil:

  • man kann keine Felder dynamisch vorbelegen
  • komplexere Validierungen (die über »Feld leer« hinausgehen, sind offensichtlich nicht möglich.

RepositoryManual. Eine schöne Beispielseite mit etwas AJAX ist bei Steffen Kamper zu finden.

Mehrsprachigkeit kann mit mailformplus so realisiert werden:

  1. plugin.tx_thmailformplus_pi1.default.email_htmltemplate = /fileadmin/tmpl/deutsch.html
  2. [globalVar = GP:L=1]
  3.   plugin.tx_thmailformplus_pi1.default.email_htmltemplate = /fileadmin/tmpl/andereSprache.html

Mir ist noch dre_formmaker aufgefallen: offensichtlich extrem mächtig, aber neu und noch im Experimentalstadium. Das Manual ist verwirrend, ausserdem erfordert es mindestens PEAR und noch weitere Bibliotheken. Sollte man aber im Auge behalten … RepositoryManual

Kategorien: Extensions  Kommentare 1
Tags: formular, form

Eine kleine Übersicht über die wichtigsten Download-Extensions für TYPO3, mit einer kurzen Beschreibung ihrer wichtigsten Features. Mir geht es hierbei schwerpunktmäßig um sicheren Download, der keine Deeplinks auf zugangsbeschränkte Dateien zulässt.  

Secure Downloads (naw_securedl)

Absicherung von Downloadbereichen, so dass kein direkter Link mehr möglich ist. Für verschiedene Dateitypen und unterschiedliche Ordner. Erzwungener Download möglich.

Beschreibung im TER

Download Stats (wwe_documentstats)

Statistik für das oben beschriebene Secure Downloads (Backend-Modul)

Beschreibung im TER

Modern Downloads (ab_downloads)

Downloadbereich mit Kategorien und Listen; ausserdem Community-Funktionen wie Bewertungsmöglichkeiten, am häufigsten Heruntergeladen, sponsored Downloads und statistische Auswertung. Ermöglicht vor allem Front-End-Usern einen Upload bzw. Upload-Vorschläge.

Beschreibung im TER

File List (dr_blob)

Dateiliste für Download, wobei die Dateien wahlweise in der DB oder als Datei zur Verfügung stehen. Front-End-User können eigene Kriterien für Downloadlisten erstellen (Subscribe-Funktion). Extension kann ich andere Extensions intergriert werden. indexed_search kann den Inhalt durchsuchen.

Berechtungen für versch. Frontend-Usergruppen möglich, allerdings wird bei fehlender Berechtigung der Datensatz gar nicht gezeigt. Anzeige + Verweis auf Login ist nicht möglich.

Integration mit der Extension link_handler; also Verlinkung aus dem RTE möglich.

Beschreibung im TER

PDF Shop (pdf_order)

Man kann Downlaoddateien per E-Mail bestellen. Darstellung der Dateien wie in einem Shop. Enthält keinerlei Bezahlmodul und keinen Warenkorb.

Beschreibung im TER

Download system (sb_downloader)

Downloadlisten mit (ausführlichen) Beschreibungen, Click-counter, Dateigrößen und Vorschau.

Demo

Beschreibung im TER

Download link with hit counter (jpk_downloadcounter)

Erstellen von Downloadlinks mit jeweils eigenem Click-Counter.

Bescrheibung im TER

Documents download (rtg_files)

Erstellen von Downloadlisten für unterschiedliche Dateiarten. Kann Quelltext als Text darstellen. Ausführliche Statistik. Suche. Listen können echte Downloads enthalten oder externe Links.

Beschreibung im TER

Passwortgeschützte Downloads (fhm_downloads)

Passwortschutz für Downloads als eigenes Inhaltselement. Der Besucher muss ein Passwort eingeben, dann kann er downloaden. Keine Lokalisierung!

Beschreibung im TER

Secure Download (rs_securedownload)

Erlaubt einen passwortgeschützten Download. Mit Statistikfunktionen im Backend.

Beschreibung im TER

Password Secured Downloads (fr_pwsdownload)

Passwortgeschützte Downloads als neues Inhaltselement. Kann ergänzt werden um eine Liste von Usern, die downloaden dürfen. Leider als kommaseparierte Liste und nicht als Gruppe … kann aber wahrscheinlich leicht angepasst werden.

Beschreibung im TER

Kategorien: Extensions  Kommentare 0
Tags: download, secure

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:

  1. $GLOBALS['TSFE']->setJS($this->extKey, 'alert("Mach was. ")');
  2. $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

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

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  Kommentare 0
Tags: cache, extension