<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.stephanschlegel.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=109.193.152.215</id>
	<title>Wikizone - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.stephanschlegel.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=109.193.152.215"/>
	<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Spezial:Beitr%C3%A4ge/109.193.152.215"/>
	<updated>2026-05-06T19:50:45Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.35.14</generator>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Xampp&amp;diff=20565</id>
		<title>Xampp</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Xampp&amp;diff=20565"/>
		<updated>2014-12-10T08:33:10Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.215: /* Mailkonfiguration für XAMPP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mailkonfiguration für XAMPP ==&lt;br /&gt;
Standardmäßig speichert XAMPP Mails die z.B. über PHP generiert werden im &amp;#039;&amp;#039;&amp;#039;Verzeichnis: mailoutput&amp;#039;&amp;#039;&amp;#039;. Dort kann man sie als txt Dateien lesen.&lt;br /&gt;
&lt;br /&gt;
Man kann XAMPP aber auch so konfigurieren, dass er über einen Mail Account Mails versenden kann. Damit kann man z.B. php Mailskripte testen, und bekommt auch die entsprechende Rückmeldung bzw. Spamassasin etc.&lt;br /&gt;
In Mac kann man das eingebaute Postfix nutzen (siehe Postfix auf Mac OS) in Windows nutzt man die XAMPP Konfiguration.&lt;br /&gt;
&lt;br /&gt;
Beispiel Konfiguration für Gmail&lt;br /&gt;
Dateien:&lt;br /&gt;
 C:\xampp\php\php.ini&lt;br /&gt;
 C:\xampp\sendmail\sendmail.ini&lt;br /&gt;
php.ini [mail function]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMTP=smtp.gmail.com&lt;br /&gt;
smtp_port=587&lt;br /&gt;
sendmail_from = my-gmail-id@gmail.com&lt;br /&gt;
sendmail_path = &amp;quot;\&amp;quot;C:\xampp\sendmail\sendmail.exe\&amp;quot; -t&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
sendmail.ini. Replace all the existing code in sendmail.ini with following code&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[sendmail]&lt;br /&gt;
&lt;br /&gt;
smtp_server=smtp.gmail.com&lt;br /&gt;
smtp_port=587&lt;br /&gt;
error_logfile=error.log&lt;br /&gt;
debug_logfile=debug.log&lt;br /&gt;
auth_username=my-gmail-id@gmail.com&lt;br /&gt;
auth_password=my-gmail-password&lt;br /&gt;
force_sender=my-gmail-id@gmail.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
replace my-gmail-id and my-gmail-password restart the server using the XAMMP control panel so the changes take effect.&lt;br /&gt;
&lt;br /&gt;
== XAMPP Probleme lösen ==&lt;br /&gt;
Zuweilen hat xampp veraltete libs an Bord. Auch wenn auf dem Rechner die neueren Libs sind benutzt xampp die eigenen alten. &lt;br /&gt;
=== ImageMagick und GraphicsMagick funktionieren nicht ===&lt;br /&gt;
Fehlermeldung im error_log&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dyld: Library not loaded: /usr/local/lib/libfreetype.6.dylib&lt;br /&gt;
  Referenced from: /usr/local/bin/gm&lt;br /&gt;
  Reason: Incompatible library version: gm requires version 18.0.0 or later, but libfreetype.6.dylib provides version 15.0.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
GraphicsMagick wurde über Homebrew installiert.&lt;br /&gt;
&lt;br /&gt;
Die Pfadangabe für libfreetype.6.dylib stimmt nicht. Eigentlich nutzt XAMPP die in seinem eigenen lib Verzeichnis. Man kann diese jedoch einfach mit der aus der /usr/local/lib/ ersetzen, dann funktioniert es wieder. &lt;br /&gt;
&lt;br /&gt;
== xampp update ==&lt;br /&gt;
Quelle: http://www.jurkos.com/?p=854 11/2014&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1. Stop services or process under XAMPP control panel and EXIT&lt;br /&gt;
2. Rename installation folder C:\XAMPP\… with C:\XAMPP_old\&lt;br /&gt;
3. Create new folder with the same name C:\XAMPP\…&lt;br /&gt;
4. Install there new version of XAMPP (in security options you have to write the same passwords and usernames you had before)&lt;br /&gt;
5. Ctrl+c or ctrl+x just website folders under C:\XAMPP\htdocs\*… (don’t copy xampp folder and others who came with installation)&lt;br /&gt;
6. Create databases (with same name as before), this will create just new folder under C:\XAMPP\mysql\data\* with file inside db.opt + copy ibdata1 file under folder C:\XAMPP\mysql\&lt;br /&gt;
7. Copy content of older C:\XAMPP_old\mysql\data\*\ to C:\XAMPP\mysql\data\*\ and skip the file db.opt&lt;br /&gt;
8. If you did changes in previous xampp of file httpd-vhosts.conf under C:\XAMPP\apache\conf\extra\ don’t forget to copy it right and create folder C:\XAMPP\log&lt;br /&gt;
9. Start XAMPP control panel, start apache and mysql&lt;br /&gt;
10. DONE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Bessere installation auf Mac ===&lt;br /&gt;
in XAMPP &amp;gt; xamppfiles &amp;gt; htdocs Symlink auf allgemeinen www Ordner setzen (z.B. unterste Ebene Festplatte oder in Benutzerordner.&lt;/div&gt;</summary>
		<author><name>109.193.152.215</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Xampp&amp;diff=20564</id>
		<title>Xampp</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Xampp&amp;diff=20564"/>
		<updated>2014-12-10T08:17:32Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.215: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mailkonfiguration für XAMPP ==&lt;br /&gt;
Man kann XAMPP so konfigurieren, dass er über einen Mail Account Mails versenden kann. Damit kann man z.B. php Mailskripte testen.&lt;br /&gt;
In Mac kann man das eingebaute Postfix nutzen (siehe Postfix auf Mac OS) in Windows nutzt man die XAMPP Konfiguration.&lt;br /&gt;
&lt;br /&gt;
Beispiel Konfiguration für Gmail&lt;br /&gt;
Dateien:&lt;br /&gt;
 C:\xampp\php\php.ini&lt;br /&gt;
 C:\xampp\sendmail\sendmail.ini&lt;br /&gt;
php.ini [mail function]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMTP=smtp.gmail.com&lt;br /&gt;
smtp_port=587&lt;br /&gt;
sendmail_from = my-gmail-id@gmail.com&lt;br /&gt;
sendmail_path = &amp;quot;\&amp;quot;C:\xampp\sendmail\sendmail.exe\&amp;quot; -t&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
sendmail.ini. Replace all the existing code in sendmail.ini with following code&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[sendmail]&lt;br /&gt;
&lt;br /&gt;
smtp_server=smtp.gmail.com&lt;br /&gt;
smtp_port=587&lt;br /&gt;
error_logfile=error.log&lt;br /&gt;
debug_logfile=debug.log&lt;br /&gt;
auth_username=my-gmail-id@gmail.com&lt;br /&gt;
auth_password=my-gmail-password&lt;br /&gt;
force_sender=my-gmail-id@gmail.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
replace my-gmail-id and my-gmail-password restart the server using the XAMMP control panel so the changes take effect.&lt;br /&gt;
== XAMPP Probleme lösen ==&lt;br /&gt;
Zuweilen hat xampp veraltete libs an Bord. Auch wenn auf dem Rechner die neueren Libs sind benutzt xampp die eigenen alten. &lt;br /&gt;
=== ImageMagick und GraphicsMagick funktionieren nicht ===&lt;br /&gt;
Fehlermeldung im error_log&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dyld: Library not loaded: /usr/local/lib/libfreetype.6.dylib&lt;br /&gt;
  Referenced from: /usr/local/bin/gm&lt;br /&gt;
  Reason: Incompatible library version: gm requires version 18.0.0 or later, but libfreetype.6.dylib provides version 15.0.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
GraphicsMagick wurde über Homebrew installiert.&lt;br /&gt;
&lt;br /&gt;
Die Pfadangabe für libfreetype.6.dylib stimmt nicht. Eigentlich nutzt XAMPP die in seinem eigenen lib Verzeichnis. Man kann diese jedoch einfach mit der aus der /usr/local/lib/ ersetzen, dann funktioniert es wieder. &lt;br /&gt;
&lt;br /&gt;
== xampp update ==&lt;br /&gt;
Quelle: http://www.jurkos.com/?p=854 11/2014&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1. Stop services or process under XAMPP control panel and EXIT&lt;br /&gt;
2. Rename installation folder C:\XAMPP\… with C:\XAMPP_old\&lt;br /&gt;
3. Create new folder with the same name C:\XAMPP\…&lt;br /&gt;
4. Install there new version of XAMPP (in security options you have to write the same passwords and usernames you had before)&lt;br /&gt;
5. Ctrl+c or ctrl+x just website folders under C:\XAMPP\htdocs\*… (don’t copy xampp folder and others who came with installation)&lt;br /&gt;
6. Create databases (with same name as before), this will create just new folder under C:\XAMPP\mysql\data\* with file inside db.opt + copy ibdata1 file under folder C:\XAMPP\mysql\&lt;br /&gt;
7. Copy content of older C:\XAMPP_old\mysql\data\*\ to C:\XAMPP\mysql\data\*\ and skip the file db.opt&lt;br /&gt;
8. If you did changes in previous xampp of file httpd-vhosts.conf under C:\XAMPP\apache\conf\extra\ don’t forget to copy it right and create folder C:\XAMPP\log&lt;br /&gt;
9. Start XAMPP control panel, start apache and mysql&lt;br /&gt;
10. DONE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Bessere installation auf Mac ===&lt;br /&gt;
in XAMPP &amp;gt; xamppfiles &amp;gt; htdocs Symlink auf allgemeinen www Ordner setzen (z.B. unterste Ebene Festplatte oder in Benutzerordner.&lt;/div&gt;</summary>
		<author><name>109.193.152.215</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=PHP_-_E-Mail_versenden&amp;diff=20421</id>
		<title>PHP - E-Mail versenden</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=PHP_-_E-Mail_versenden&amp;diff=20421"/>
		<updated>2014-10-23T14:24:14Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.215: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
 http://www.a2hosting.com/kb/developer-corner/php/using-php-to-send-e-mail-messages#Method-1.3A-Using-the-mail-function&lt;br /&gt;
 http://www.phpbuddy.eu/emails-mit-php-versenden.html?start=4&lt;br /&gt;
 http://de.wikipedia.org/wiki/Header_(E-Mail)#Beispielmail&lt;br /&gt;
 http://www.schlayer.org/Spamassasin-Hits-deutsche-Uebersetzung.html&lt;br /&gt;
 &lt;br /&gt;
=== Probleme mit Spamfiltern vermeiden ===&lt;br /&gt;
Oft ist es notwendig den -f Parameter zu verwenden um Spamfiltern zu vermitteln, daß es sich nicht um einen Spamversand handelt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$addParams = &amp;#039;-fnoreply@&amp;#039;.$_SERVER[&amp;#039;SERVER_NAME&amp;#039;];&lt;br /&gt;
$success = mail($to, $subject, $body, $headers,$addParams);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Richtige Header ====&lt;br /&gt;
Bei Problemen mit der Spamerkennung. Hinweise bieten die Codes von Spamassasin&lt;br /&gt;
&lt;br /&gt;
 Link: http://www.schlayer.org/Spamassasin-Hits-deutsche-Uebersetzung.html&lt;br /&gt;
&lt;br /&gt;
 MESSAGE              BEDEUTUNG&lt;br /&gt;
 FH_FROMEML_NOTLD     From Adresse hat keine gültige Top Level Domain (oder fehlt)&lt;br /&gt;
 INVALID_MSGID        Aufbau: &amp;lt;random characters@fqdn-of-sending-host&amp;gt; z.B. &lt;br /&gt;
 RP_MATCHES_RCVD&lt;br /&gt;
 URI_HEX&lt;br /&gt;
&lt;br /&gt;
==== Funktionierendes Beispiel====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
				$fqdn_hostname = $_SERVER[&amp;#039;SERVER_NAME&amp;#039;];&lt;br /&gt;
				$mid = &amp;quot;&amp;lt;&amp;quot; . sha1(microtime()) . &amp;quot;@&amp;quot; . $fqdn_hostname . &amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
				$from = &amp;#039;&amp;quot;Narda Safety Test Solutions&amp;quot; &amp;lt;noreply@&amp;#039;.$_SERVER[&amp;#039;SERVER_NAME&amp;#039;].&amp;#039;&amp;gt;&amp;#039;;&lt;br /&gt;
				$admin_mail = &amp;#039;&amp;lt;schlegel@geo-bit.de&amp;gt;&amp;#039;;&lt;br /&gt;
				$replyto_mail = &amp;#039;service.narda-de@l-3com.com&amp;#039;;&lt;br /&gt;
				$to = $_POST[e_brief];&lt;br /&gt;
				$subject=&amp;quot;NARDA-STS / Request for RMA-Number&amp;quot;;&lt;br /&gt;
				$headers .= &amp;#039;Reply-To: &amp;#039;.$replyto_mail.&amp;quot;\r\n&amp;quot;;&lt;br /&gt;
			    //$headers .= &amp;quot;Return-Path: noreply@&amp;quot; .$_SERVER[&amp;#039;SERVER_NAME&amp;#039;]. &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
			    //$headers .= &amp;quot;Return-Path: &amp;quot; .$replyto_mail. &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
				$headers .= &amp;#039;X-Mailer: PHP/&amp;#039;.phpversion().&amp;quot;\r\n&amp;quot;;&lt;br /&gt;
				$headers .= &amp;#039;From: &amp;#039;.$from.&amp;#039;\r\n&amp;#039;;&lt;br /&gt;
				//$headers .= &amp;#039;Cc:&amp;#039;.$narda_mail.&amp;quot;\n&amp;quot;;&lt;br /&gt;
				$headers .= &amp;#039;Bcc:&amp;#039;.$admin_mail.&amp;quot;\n&amp;quot;;&lt;br /&gt;
			    $headers .= &amp;quot;MIME-Version: 1.0\r\n&amp;quot;;&lt;br /&gt;
			    $headers .= &amp;quot;Content-type: text/plain; charset=iso-8859-1\r\n&amp;quot;;&lt;br /&gt;
			    $headers .= &amp;quot;Content-Transfer-Encoding: 7bit\r\n&amp;quot;;&lt;br /&gt;
				$headers .= &amp;quot;Message-ID: &amp;quot; .$mid. &amp;quot;\r\n\r\n&amp;quot;;&lt;br /&gt;
				$addParams = &amp;#039;-fnoreply@&amp;#039;.$_SERVER[&amp;#039;SERVER_NAME&amp;#039;];&lt;br /&gt;
				$body = &amp;quot;Dear Mrs./Mr. $_POST[first_name] $_POST[last_name],\r\n&amp;quot;;&lt;br /&gt;
				$body .= &amp;quot;your email-adress has been successfully confirmed. \r\n&amp;quot;;&lt;br /&gt;
				$body .= &amp;quot;You will find the form for filling in the data of your device here:\r\n\r\n&amp;quot;;&lt;br /&gt;
				$body .= $secure_root_url.&amp;quot;/$ziel_ordner/RMA/rma_reCall.php?req_num=$req_number&amp;quot;;&lt;br /&gt;
				$state=mail($to, $subject, $body, $headers, $addParams);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gmx Header ===&lt;br /&gt;
Bei GMX können Kleinigkeiten dazu führen daß die Mail als Spam eingestuft wird. Wichtig beim Absender z.B. das folgende Format:&lt;br /&gt;
 From: &amp;quot;Geocaching&amp;quot; &amp;lt;noreply@geocaching.com&amp;gt;&lt;br /&gt;
 PHP-Beispiel:&lt;br /&gt;
 $headers .=&amp;#039;From: &amp;quot;Narda&amp;quot; &amp;lt;&amp;#039;.$from.&amp;quot;&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Testmail ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   $template = &amp;quot;Dies ist ein Test&amp;quot;;&lt;br /&gt;
   $empfaenger = &amp;quot;schlegel@geo-bit.de&amp;quot;;&lt;br /&gt;
   // Trenner für den Anhang&lt;br /&gt;
   $trenner = md5( time() );&lt;br /&gt;
&lt;br /&gt;
   // Mail Header erstellen&lt;br /&gt;
   $mailheader = &amp;#039;&amp;#039;;&lt;br /&gt;
   $mailheader .= &amp;quot;Reply-To: Schlegel&amp;lt;schlegel@geo-bit.de&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
   $mailheader .= &amp;quot;Return-Path: noreply@&amp;quot; .$_SERVER[&amp;#039;SERVER_NAME&amp;#039;]. &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
   $mailheader .= &amp;quot;Message-ID: &amp;lt;&amp;quot; .time(). &amp;quot; noreply@&amp;quot; .$_SERVER[&amp;#039;SERVER_NAME&amp;#039;]. &amp;quot;&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
   $mailheader .= &amp;quot;X-Mailer: PHP v&amp;quot; .phpversion(). &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
   $mailheader .= &amp;quot;From: Keine Antwort&amp;lt;noreply@&amp;quot; .$_SERVER[&amp;#039;SERVER_NAME&amp;#039;]. &amp;quot;&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
   $mailheader .= &amp;quot;MIME-Version: 1.0\r\n&amp;quot;;&lt;br /&gt;
   $mailheader .= &amp;quot;Content-Type: multipart/mixed;\r\n&amp;quot;;&lt;br /&gt;
   $mailheader .= &amp;quot; boundary = &amp;quot; .$trenner;&lt;br /&gt;
   $mailheader .= &amp;quot;\r\n\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
   // Mailbody vorbereiten&lt;br /&gt;
   $mailbody  = &amp;quot;This is a multi-part message in MIME format\r\n&amp;quot;;&lt;br /&gt;
   $mailbody .= &amp;quot;--&amp;quot; .$trenner. &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
   $mailbody .= &amp;quot;Content-Type: text/html; charset=UTF-8\r\n&amp;quot;;&lt;br /&gt;
   $mailbody .= &amp;quot;Content-Transfer-Encoding: 8bit\r\n\r\n&amp;quot;;&lt;br /&gt;
   $mailbody .= $template. &amp;quot;\r\n\r\n&amp;quot;;&lt;br /&gt;
   echo($mailheader);&lt;br /&gt;
   echo($mailbody);&lt;br /&gt;
   // Email versenden&lt;br /&gt;
   if (mail( $empfaenger, htmlspecialchars( $betreff ), $mailbody, $mailheader ))&lt;br /&gt;
   {&lt;br /&gt;
       // Bei erfolgreichem Versand Danke-Seite anzeigen&lt;br /&gt;
       echo &amp;#039;Danke, die Email wurde verschickt!&amp;#039;;&lt;br /&gt;
   }else{&lt;br /&gt;
	echo &amp;#039;Fehler beim Versand&amp;#039;;&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Einfache Text E-Mail mit Template ===&lt;br /&gt;
Einfache Text Email&lt;br /&gt;
&lt;br /&gt;
Zuerst das Listing unserer Template Datei mailbody.txt&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Soeben ist eine Nachricht von ###NAME### eingetroffen.&lt;br /&gt;
Als Antwortadresse wurde ###EMAIL### angegeben.&lt;br /&gt;
Die Nachricht die gesendet wurde:&lt;br /&gt;
###NACHRICHT###&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie man unschwer erkennt, ist das ganz normaler und schlichter Text. Lediglich die Platzhalter darin fallen auf. Diese Platzhalter korrespondieren in unserem Script mit den Benutzereingaben und werden in unserem Script durch diese ersetzt.&lt;br /&gt;
Dadurch das wir den Text, der später per Email an uns geschickt wird, in einer eigenen Datei ablegen, können wir den Text schnell und flexibel beliebig verändern und erweitern. Da es sich hierbei um einen Mailer handelt der nur reinen Text verschickt, müssen wir auf jegliche Art von Formatierungen verzichten.&lt;br /&gt;
&lt;br /&gt;
Bisher haben wir das HTML-Formular, die Funktionen und das Mail Template kennengelernt, fehlt nur noch das Hauptscript, dass wir uns gleich mal vorknöpfen.&lt;br /&gt;
&lt;br /&gt;
Listing der Datei mail.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
 &lt;br /&gt;
header( &amp;#039;Content-Type: text/html; charset=utf-8&amp;#039; );&lt;br /&gt;
 &lt;br /&gt;
// Empfänger Email&lt;br /&gt;
$empfaenger = &amp;#039;max.mustermann@domain.tld&amp;#039;;&lt;br /&gt;
 &lt;br /&gt;
// Prüfen ob das Formular abgeschickt wurde&lt;br /&gt;
if (isset($_POST[&amp;#039;senden&amp;#039;]))&lt;br /&gt;
{&lt;br /&gt;
    // Funktionen einbinden&lt;br /&gt;
    include( &amp;#039;funktionen.inc.php&amp;#039; );&lt;br /&gt;
 &lt;br /&gt;
    // Benutzereingaben bereinigen und auf Injection prüfen&lt;br /&gt;
    cleanInput();&lt;br /&gt;
 &lt;br /&gt;
    // Name prüfen&lt;br /&gt;
    $name = checkName( $_POST[&amp;#039;name&amp;#039;] );&lt;br /&gt;
    // Email prüfen&lt;br /&gt;
    $email = checkEmail( $_POST[&amp;#039;email&amp;#039;] );&lt;br /&gt;
    // Betreff und Nachricht prüfen&lt;br /&gt;
    if ((strlen( $_POST[&amp;#039;betreff&amp;#039;] ) &amp;lt; 5) || (strlen( $_POST[&amp;#039;nachricht&amp;#039;] ) &amp;lt; 5))&lt;br /&gt;
    {&lt;br /&gt;
        die( &amp;#039;Bitte füllen Sie alle Felder aus!&amp;#039; );&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        $betreff   = $_POST[&amp;#039;betreff&amp;#039;];&lt;br /&gt;
        $nachricht = $_POST[&amp;#039;nachricht&amp;#039;];&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // --------------------------------------------------------------------------------&lt;br /&gt;
    // Wurde das Script bisher nicht abgebrochen, wurde das Formular korrekt ausgefüllt&lt;br /&gt;
    // --------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
    // Template mit dem Mailbody laden und für den Versand vorbereiten&lt;br /&gt;
    $mailbody = file_get_contents( &amp;#039;mailbody.txt&amp;#039; );&lt;br /&gt;
    // Platzhalter mit den Benutzereingaben ersetzen&lt;br /&gt;
    $mailbody = str_replace( &amp;#039;###NAME###&amp;#039;, htmlspecialchars( $name ), $mailbody );&lt;br /&gt;
    $mailbody = str_replace( &amp;#039;###EMAIL###&amp;#039;, $email, $mailbody );&lt;br /&gt;
    $mailbody = str_replace( &amp;#039;###NACHRICHT###&amp;#039;, htmlspecialchars( $nachricht ), $mailbody );&lt;br /&gt;
 &lt;br /&gt;
    // Mail Header erstellen&lt;br /&gt;
    $mailheader  = &amp;quot;From: PHP Email Tutorial&amp;lt;noreply@&amp;quot; .$_SERVER[&amp;#039;SERVER_NAME&amp;#039;]. &amp;quot;&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
    $mailheader .= &amp;quot;Reply-To: &amp;quot; .$name. &amp;quot;&amp;lt;&amp;quot; .$email. &amp;quot;&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
    $mailheader .= &amp;quot;Return-Path: noreply@&amp;quot; .$_SERVER[&amp;#039;SERVER_NAME&amp;#039;]. &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
    $mailheader .= &amp;quot;MIME-Version: 1.0\r\n&amp;quot;;&lt;br /&gt;
    $mailheader .= &amp;quot;Content-Type: text/plain; charset=UTF-8\r\n&amp;quot;;&lt;br /&gt;
    $mailheader .= &amp;quot;Content-Transfer-Encoding: 7bit\r\n&amp;quot;;&lt;br /&gt;
    $mailheader .= &amp;quot;Message-ID: &amp;lt;&amp;quot; .time(). &amp;quot; noreply@&amp;quot; .$_SERVER[&amp;#039;SERVER_NAME&amp;#039;]. &amp;quot;&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
    $mailheader .= &amp;quot;X-Mailer: PHP v&amp;quot; .phpversion(). &amp;quot;\r\n\r\n&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    // Email versenden&lt;br /&gt;
    if (@mail( $empfaenger, htmlspecialchars( $betreff ), $mailbody, $mailheader ))&lt;br /&gt;
    {&lt;br /&gt;
        // Bei erfolgreichem Versand Danke-Seite anzeigen&lt;br /&gt;
        echo &amp;#039;Danke, die Email wurde verschickt!&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das sieht im ersten Moment mehr und wilde&lt;br /&gt;
r aus, als es das eigentlich ist. Der obere Teil ist schnell erklärt. Zunächst setzen wir die Email des Empfängers, der idR wir selbst sind. Dann wird geprüft ob das Formular überhaupt abgeschickt wurde und wenn dem so ist, binden wir die benötigten Funktionen ein und überprüfen die Benutzereingaben.&lt;br /&gt;
&lt;br /&gt;
Mit den Zeilen ...&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    // Template mit dem Mailbody laden und für den Versand vorbereiten&lt;br /&gt;
    $mailbody = file_get_contents( &amp;#039;mailbody.txt&amp;#039; );&lt;br /&gt;
    // Platzhalter mit den Benutzereingaben ersetzen&lt;br /&gt;
    $mailbody = str_replace( &amp;#039;###NAME###&amp;#039;, htmlspecialchars( $name ), $mailbody );&lt;br /&gt;
    $mailbody = str_replace( &amp;#039;###EMAIL###&amp;#039;, $email, $mailbody );&lt;br /&gt;
    $mailbody = str_replace( &amp;#039;###NACHRICHT###&amp;#039;, htmlspecialchars( $nachricht ), $mailbody );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
... laden wir das Mail Template (file_get_contents) und ersetzen mit einfachen str_replace Funktionen die Platzhalter. Auch wenn wir bereits auf mögliche Injections geprüft haben, entschärfen wir dennoch die Eingaben mit htmlspecialchars, damit uns niemand etwas unterschiebt. Bei der Email ist das nicht nötig, da diese sonst nicht durch den Filter gekommen wäre.&lt;br /&gt;
&lt;br /&gt;
Jetzt kommen wir zu dem wichtigsten Teil, der ein erfolgreiches Versenden überhaupt erst möglich macht: dem Mail Header.&lt;br /&gt;
&lt;br /&gt;
Der Mail Header ist der Kopf der Email, der alle relevanten und wichtigen Informationen über unsere Email enthält. Sehr sehr häufig sieht man in Scripts und Tutorials, dass hier lediglich das &amp;quot;From:&amp;quot; angegeben ist. Wenn nur diese Information angegeben ist, bleibt die Mail sehr häufig in einem Spamfilter hängen. Kein Mensch würde auf die Idee kommen einen echten Brief zu verschicken und als Beschreibung auf dem Brief nur einen Name angeben, ohne komplette Anschrift und Absenderadresse. Wieso dann bei einer Email?!&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns also an wie ein Header aussieht, der die wichtigsten Angaben enthält:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    $mailheader  = &amp;quot;From: PHP Email Tutorial&amp;lt;noreply@&amp;quot; .$_SERVER[&amp;#039;SERVER_NAME&amp;#039;]. &amp;quot;&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
    $mailheader .= &amp;quot;Reply-To: &amp;quot; .$name. &amp;quot;&amp;lt;&amp;quot; .$email. &amp;quot;&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
    $mailheader .= &amp;quot;Return-Path: noreply@&amp;quot; .$_SERVER[&amp;#039;SERVER_NAME&amp;#039;]. &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
    $mailheader .= &amp;quot;MIME-Version: 1.0\r\n&amp;quot;;&lt;br /&gt;
    $mailheader .= &amp;quot;Content-Type: text/plain; charset=UTF-8\r\n&amp;quot;;&lt;br /&gt;
    $mailheader .= &amp;quot;Content-Transfer-Encoding: 7bit\r\n&amp;quot;;&lt;br /&gt;
    $mailheader .= &amp;quot;Message-ID: &amp;lt;&amp;quot; .time(). &amp;quot; noreply@&amp;quot; .$_SERVER[&amp;#039;SERVER_NAME&amp;#039;]. &amp;quot;&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
    $mailheader .= &amp;quot;X-Mailer: PHP v&amp;quot; .phpversion(). &amp;quot;\r\n\r\n&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Steuerungzeichen &amp;quot;\r\n&amp;quot; entsprechen einen Wagenrücklauf und Zeilenvorschub oder anders ausgedrückt, ein Zeilenumbruch. Diese Steuerungzeichen sind betriebssystemabhängig und müssen ggfs. angepasst werden. Auf Linux würde man z.B. nur &amp;quot;\n&amp;quot; verwenden. Schauen wir uns nun die anderen angaben an:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;From&amp;#039;&amp;#039;&amp;#039; - Das ist die Absendeadresse und der dazugehörige Name. Es ist üblich diesen in der Form Name anzugeben. Das ist die absolute Minimumangabe für inen Mailheader. Fehlt das From, wird der Versand der Mail fehlschlagen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Reply-To&amp;#039;&amp;#039;&amp;#039; - Das Format kann entweder nur eine Email Adresse sein, oder man wählt das Format wir bei From. Dieses Feld ist die Antwortadresse an die die Mail geschickt wird, wenn wir im Mail Client auf antworten klicken.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Return-Path&amp;#039;&amp;#039;&amp;#039; - Konnte die Mail nicht zugestellt werden, wird dies an diese Adresse gemeldet.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;MIME-Version&amp;#039;&amp;#039;&amp;#039; - Entspricht dem MIME Typ der Mail.&lt;br /&gt;
    &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Content-Type&amp;#039;&amp;#039;&amp;#039; - Das ist die Information die dem Mail Client mitteilt, um welche Art Mail es sich handelt und welcher Zeichensatz zur Darstellung benutzt werden soll.&lt;br /&gt;
    &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Content-Transfer-Encoding&amp;#039;&amp;#039;&amp;#039; - Dies beschreibt die Art der Übertragung und wie sowohl Mailserver, als auch Email Clients diese Mail interpretieren. 7bit ist die kleinste Form, die maximal mögliche Kompatibilität ermöglicht. Beim 7bit ASCII Zeichensatz können die ersten 128 zeichen der ASCII Tabelle dargestellt werden. Zeichen wie deutsche Umlaute sind darin nicht vorgesehen. Bei der 8bit Übertragung können bis zu 256 zeichen dargestellt werden. Ältere Mailerver, so liest man, verstehen nur 7bit und verwerfen Anfragen die mit 8bit übertragen werden sollen. Anders ausgedrückt, es kann passieren das die Mail nicht ankommt. Ich persönlich hatte damit allerdings noch nie Probleme und die 7bit &amp;quot;Zwangsangabe&amp;quot; scheint veraltet zu sein.&lt;br /&gt;
    &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Message-ID&amp;#039;&amp;#039;&amp;#039; - Die Message ID ist einmalig, bzw. sollte es sein, wodurch die Mail eindeutig zugeordnet werden kann.&lt;br /&gt;
    &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;X-Mailer&amp;#039;&amp;#039;&amp;#039; - Beschreibt den Client der die Mail versendet hat. In unserem Fall geben wir die PHP Version an, damit Mailserver auf der Route wissen, dass diese Mail mit PHP verschickt wurde.&lt;br /&gt;
&lt;br /&gt;
Es gibt noch weitere Felder und Varianten, die uns aber im moment nicht kümmern. Im Abschnitt Mail mit Anhang werden wir noch einen etwas anderen Header kennen lernen.&lt;br /&gt;
Speziell die letzten beiden Angaben (Message ID und X_Mailer) im Header oben sind sehr wichtige Informationen. Fehlen diese Angaben, ist die Wahrscheinlichkeit sehr hoch, dass die Mail niemals beim Empfänger ankommen wird, weil die Mail irgendwo unterwegs in einem Spamfilter hängen bleibt und nicht weitergeleitet wird!&lt;br /&gt;
&lt;br /&gt;
Falls also eine Mail nicht ankommt, liegt das in den aller meisten Fällen entweder am Transfer-Encoding (7bit oder 8bit) oder an fehlenden Absendeangaben!&lt;br /&gt;
&lt;br /&gt;
Der Rest des Scripts ist sehr einfach, weil hier einfach nur noch die Mail verschickt wird.&lt;br /&gt;
&lt;br /&gt;
    if (@mail( $empfaenger, htmlspecialchars( $betreff ), $mailbody, $mailheader ))&lt;br /&gt;
    {&lt;br /&gt;
        // Bei erfolgreichem Versand Danke-Seite anzeigen&lt;br /&gt;
        echo &amp;#039;Danke, die Email wurde verschickt!&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Die mail-Funktion kennt noch einen 5. Parameter auf den ich jetzt nicht eingehen werde, weil dieser nur in den seltensten Fällen unterstützt wird. Wer mehr darüber erfahren möchte kann sich darüber in der Online-Doku informieren. Die mail-Funktion selbst liefert entweder TRUE oder FALSE zurück. Bei einem FALSE konnte die Mail nicht für den Versand übergeben werden und wir können entsprechend darauf reagieren. Im Falle von TRUE heisst das zwar das die Mail für den Versand angenommen wurde, aber es ist nicht prüfbar ob die Mail auch tatsächlich beim Empfänger ankam! Einige Gründe dafür stehen weiter oben. Wurde die Mail für den Versand akzeptiert, können wir darauf angemessen reagieren, indem wir den Besucher zu einer Danke-Seite weiterleiten oder, was weiter unter gezeigt wird, dem Benutzer eine Empfangsbestätigung, respektive Kopie der Mail an seine Adresse schicken.&lt;br /&gt;
&lt;br /&gt;
Soweit so gut. Dieser Abschnitt fiel etwas länger aus, weil ich die prinzipielle Funktionsweise und den Header beschrieben habe. Die nachfolgenden Beispiele sind über große Strecken identisch, deswegen spare ich mir dort die Erklärungen und gehe nur auf die abweichenden Passagen ein.&lt;br /&gt;
&lt;br /&gt;
=== E-Mail mit CSS Formatierung ===&lt;br /&gt;
&lt;br /&gt;
Eine Email im HTML Format zu senden ist im Grunde genommen nichts anderes, als eine einzelne Webseite per Email zu verschicken. Wir haben also mehr oder weniger freie Hand was die Gestaltung angeht, solange wir uns an die HTML und CSS Richtlinien halten. Das wird sofort ersichtlicht, wenn man das Template für die Email sieht.&lt;br /&gt;
&lt;br /&gt;
Listing der Datei mailbody.txt&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; xml:lang=&amp;quot;de&amp;quot; lang=&amp;quot;de&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=utf-8&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;Email als HTML&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br /&gt;
body { font: normal 12px Verdana, Arial, Helvetica, sans-serif; }&lt;br /&gt;
a { color: blue; text-decoration: none; }&lt;br /&gt;
h2 { font-size: 16px; font-weight: bold; }&lt;br /&gt;
.gruen { color: green; }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;Soeben ist eine Nachricht von &amp;lt;span class=&amp;quot;gruen&amp;quot;&amp;gt;###NAME###&amp;lt;/span&amp;gt; eingetroffen.&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Als Antwortadresse wurde &amp;lt;a href=&amp;quot;mailto:###EMAIL###&amp;quot;&amp;gt;###EMAIL###&amp;lt;/a&amp;gt; angegeben.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Die Nachricht die gesendet wurde lautet:&amp;lt;br /&amp;gt;&lt;br /&gt;
###NACHRICHT###&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Template besteht aus einer normalen HTML Datei mit etwas CSS. Auch hier treffen wir wieder unsere Platzhalter, die durch die Benutzereingaben ersetzt werden.&lt;br /&gt;
&lt;br /&gt;
Die Datei funktionen.inc.php ist identisch mit wie beim vorherigen Beispiel. Auch die mail.php weicht nur minimal vom letzten Beispiel ab - das aber mit großer Wirkung!&lt;br /&gt;
Die erste Abweichung findet in der Zeile zum ersetzen des Platzhalters für die Nachricht statt.&lt;br /&gt;
&lt;br /&gt;
 $mailbody = str_replace( &amp;#039;###NACHRICHT###&amp;#039;, nl2br( htmlspecialchars( $nachricht ) ), $mailbody );&lt;br /&gt;
&lt;br /&gt;
Ergänzt wurde hier die Funktion nl2br. Diese Funktion bewirkt, dass das Steuerungzeichen für einen Zeilenumbruch (\n) in ein HTML-konformes Break (&amp;lt;br /&amp;gt;) umgewandelt wird. Ohne diese Funktion hätten wir bei der Ausgabe nur eine laaaange Zeile Text ohne neue Absätze und Umbrüche.&lt;br /&gt;
&lt;br /&gt;
Die nächsten beiden Veränderungen finden im Mail Header statt. Da wird nun ja keinen reinen Text, sondern HTML verschicken, muß natürlich der Content-Type angepasst werden. Ebenso ändern wir das Transfer-Encoding auf 8bit. Hier die beiden geänderten Zeilen:&lt;br /&gt;
&lt;br /&gt;
    $mailheader .= &amp;quot;Content-Type: text/html; charset=UTF-8\r\n&amp;quot;;&lt;br /&gt;
    $mailheader .= &amp;quot;Content-Transfer-Encoding: 8bit\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
That&amp;#039;s it!&lt;br /&gt;
Diese kleinen Veränderungen haben eine solch große Auswirkung auf die Art der Darstellung!&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis im Mail Client:&lt;br /&gt;
&lt;br /&gt;
(Deutlich zu sehen das die H2-Überschrift sich absetzt und auch der Name durch das CSS farblich hervorgehoben wird)&lt;br /&gt;
&lt;br /&gt;
Vermutlich stand jeder angehende Programmierer schon mal an dieser Stelle. Voller Stolz blickt man in sein Postfach, wo die erste Mail vom eigenen Formmailer eingetroffen ist. Dann denkt man sich: &amp;quot;Das war ja einfach, mit nur so wenigen Zeilen Code so ein Ergebnis zu erzielen. Wie schwer kann es da schon sein auch eine Datei mitzuschicken?!&amp;quot;.&lt;br /&gt;
Angesichts der oben gezeigten Beispiele, und wie minimal der Unterschied zwischen Text Mail und HTML Mail ist, neigt man dazu zu denken, dass dies mit einem Dateianhang ebenso einfach ist.&lt;br /&gt;
&lt;br /&gt;
Tja, leider ist dem nicht so. Das senden von Dateianhänge ist erheblich aufwändiger als das senden einer Text/HTML Mail. Das Formular ist abweichend, der Mail Header ist abweichend, der Mail Body muß in einzelne Teilbereiche getrennt werden, Dateianhänge müssen Richtlinien beachten, was die Zeilenlänge und die Art der Zeichen innerhalb der Mail angeht.&lt;br /&gt;
Glücklicherweise hilft uns PHP bei den meisten Sachen und deshalb werden wir auch dieses Problem meistern. :)&lt;br /&gt;
&lt;br /&gt;
=== E-Mail mit CSS und Anhang ===&lt;br /&gt;
Todo Quelle siehe oben (2012-03)&lt;br /&gt;
&lt;br /&gt;
HTML Email mit CSS Formatierung und Dateianhang&lt;br /&gt;
&lt;br /&gt;
Da wir eine Datei mit der Mail verschicken möchten, muß das Formular natürlich dahingehend erweitert werden, dass ein Upload auch möglich ist. In unserem Beispiel möchten wir eine JPG datei anhängen und erlauben auch nur das hochladen dieses Bildtyps.&lt;br /&gt;
Die Template Datei ist identisch zum vorherigen HTML Beispiel. In der Datei funktionen.inc.php fügen wir aber eine weitere Funktion hinzu, die für uns prüft, ob eine Datei hochgeladen wurde und ob es sich dabei um eine JPG Datei handelt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function checkFile()&lt;br /&gt;
{&lt;br /&gt;
    if ($_FILES[&amp;#039;datei&amp;#039;][&amp;#039;error&amp;#039;] == 0 &amp;amp;&amp;amp;&lt;br /&gt;
        $_FILES[&amp;#039;datei&amp;#039;][&amp;#039;type&amp;#039;] == &amp;#039;image/jpeg&amp;#039;)&lt;br /&gt;
    {&lt;br /&gt;
        return $_FILES[&amp;#039;datei&amp;#039;][&amp;#039;name&amp;#039;];&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        die( &amp;#039;Bitte eine gültige JPG Datei anhängen!&amp;#039; );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Datei mail.php wird sich nun einiges ändern. Zunächst erweitern wir die einleitende Abfrage dahingehend, dass wir feststellen ob auch eine Datei angehängt wurde ...&lt;br /&gt;
&lt;br /&gt;
 if (isset($_POST[&amp;#039;senden&amp;#039;]) &amp;amp;&amp;amp; $_FILES[&amp;#039;datei&amp;#039;][&amp;#039;size&amp;#039;] &amp;gt; 0)&lt;br /&gt;
&lt;br /&gt;
... und fügen ebenso den Aufruf für die neue Funktion hinzu, die prüft ob ein JPG hochgeladen wurde:&lt;br /&gt;
&lt;br /&gt;
 $uploadname = checkFile();&lt;br /&gt;
&lt;br /&gt;
Das weitere Listing der Datei mail.php sieht wie folgt aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    // Template mit dem Mailbody laden&lt;br /&gt;
    $template = file_get_contents( &amp;#039;mailbody.txt&amp;#039; );&lt;br /&gt;
    // Trenner für den Anhang&lt;br /&gt;
    $trenner = md5( time() );&lt;br /&gt;
 &lt;br /&gt;
    // Platzhalter mit den Benutzereingaben ersetzen&lt;br /&gt;
    $template = str_replace( &amp;#039;###NAME###&amp;#039;, htmlspecialchars( $name ), $template );&lt;br /&gt;
    $template = str_replace( &amp;#039;###EMAIL###&amp;#039;, $email, $template );&lt;br /&gt;
    $template = str_replace( &amp;#039;###NACHRICHT###&amp;#039;, nl2br( htmlspecialchars( $nachricht ) ), $template );&lt;br /&gt;
 &lt;br /&gt;
    // Mail Header erstellen&lt;br /&gt;
    $mailheader .= &amp;quot;Reply-To: &amp;quot; .$name. &amp;quot;&amp;lt;&amp;quot; .$email. &amp;quot;&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
    $mailheader .= &amp;quot;Return-Path: noreply@&amp;quot; .$_SERVER[&amp;#039;SERVER_NAME&amp;#039;]. &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
    $mailheader .= &amp;quot;Message-ID: &amp;lt;&amp;quot; .time(). &amp;quot; noreply@&amp;quot; .$_SERVER[&amp;#039;SERVER_NAME&amp;#039;]. &amp;quot;&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
    $mailheader .= &amp;quot;X-Mailer: PHP v&amp;quot; .phpversion(). &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
    $mailheader .= &amp;quot;From: PHP Email Tutorial&amp;lt;noreply@&amp;quot; .$_SERVER[&amp;#039;SERVER_NAME&amp;#039;]. &amp;quot;&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
    $mailheader .= &amp;quot;MIME-Version: 1.0\r\n&amp;quot;;&lt;br /&gt;
    $mailheader .= &amp;quot;Content-Type: multipart/mixed;\r\n&amp;quot;;&lt;br /&gt;
    $mailheader .= &amp;quot; boundary = &amp;quot; .$trenner;&lt;br /&gt;
    $mailheader .= &amp;quot;\r\n\r\n&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    // Mailbody vorbereiten&lt;br /&gt;
    $mailbody  = &amp;quot;This is a multi-part message in MIME format\r\n&amp;quot;;&lt;br /&gt;
    $mailbody .= &amp;quot;--&amp;quot; .$trenner. &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
    $mailbody .= &amp;quot;Content-Type: text/html; charset=UTF-8\r\n&amp;quot;;&lt;br /&gt;
    $mailbody .= &amp;quot;Content-Transfer-Encoding: 8bit\r\n\r\n&amp;quot;;&lt;br /&gt;
    $mailbody .= $template. &amp;quot;\r\n\r\n&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    // Anhang anfügen&lt;br /&gt;
    $mailbody .= &amp;quot;--&amp;quot; .$trenner. &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
    $mailbody .= &amp;quot;Content-Type: image/jpeg; name=\&amp;quot;&amp;quot; .$uploadname. &amp;quot;\&amp;quot;\r\n&amp;quot;;&lt;br /&gt;
    $mailbody .= &amp;quot;Content-Transfer-Encoding: base64\r\n&amp;quot;;&lt;br /&gt;
    $mailbody .= &amp;quot;Content-Disposition: attachment; filename=\&amp;quot;&amp;quot; .$uploadname. &amp;quot;\&amp;quot;\r\n\r\n&amp;quot;;&lt;br /&gt;
    $mailbody .= chunk_split( base64_encode( file_get_contents( $_FILES[&amp;#039;datei&amp;#039;][&amp;#039;tmp_name&amp;#039;] ) ) );&lt;br /&gt;
    $mailbody .= &amp;quot;\n&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    // Email versenden&lt;br /&gt;
    if (@mail( $empfaenger, htmlspecialchars( $betreff ), $mailbody, $mailheader ))&lt;br /&gt;
    {&lt;br /&gt;
        // Bei erfolgreichem Versand Danke-Seite anzeigen&lt;br /&gt;
        echo &amp;#039;Danke, die Email wurde verschickt!&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir sehen auf den ersten Blick, dass dieser Code ganz anders aussieht als das vorherige Beispiel. Gehen wir den Code mal der Reihe nach durch, um etwas Licht in&amp;#039;s Dunkel zu bringen.&lt;br /&gt;
&lt;br /&gt;
Im oberen Bereich erzeugen wir einen eindeutigen String, den wir zum trennen der verschiedenen Teilbereiche der Mail verwenden werden:&lt;br /&gt;
&lt;br /&gt;
 $trenner = md5( time() );&lt;br /&gt;
&lt;br /&gt;
Der erste Teil des Mail Header ist uns bereits bekannt, aber beim Content-Type benötigen wir nun eine andere Angabe.&lt;br /&gt;
&lt;br /&gt;
 $mailheader .= &amp;quot;Content-Type: multipart/mixed;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
Dieser Content-Type ähnelt der Angabe &amp;quot;multipart/form-data&amp;quot; in einem HTML Formular, wenn wir dort ebenfalls gemischte Inhalte haben, nämlich Text und Dateien. Damit der Mail Client nun weiß an welchen Stellen im gesendeten Quellcode er Inhalte trennen muß, teilen wir im Header den boundary-String mit.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle möchte ich noch auf 2 wichtige Dinge hinweisen. Das Leerzeichen vor dem &amp;quot;boundary&amp;quot; im Header ist kein Versehen! Es kann tatsächlich dazu führen das eine Mail nicht korrekt dargestellt wird, wenn dieses Leerzeichen fehlt. Ebenso ist es wichtig, dass die &amp;quot;From&amp;quot;-Angabe unmittelbar vor der &amp;quot;MIME-Version&amp;quot; und dem &amp;quot;Content-Type&amp;quot; steht. Vertauscht man die Reihenfolge der Header Angabe, führt das z.B. bei mir dazu, dass ich im Thunderbird nur eine leere Seite als Mail angezeigt bekomme, obwohl der komplette Mail Inhalt im Quelltext einsehbar ist.&lt;br /&gt;
&lt;br /&gt;
Die nächste Zeile ...&lt;br /&gt;
&lt;br /&gt;
 $mailbody  = &amp;quot;This is a multi-part message in MIME format\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
... steht vor der Nachricht im Head Bereich in der Email. Sie scheint nicht zwingend erforderlich zu sein, aber Mail Clients fügen diese ebenfalls hinzu, wenn man mit z.B. Thunderbird eine Email verschickt. Ich vermute, dass dies aus Gründen der Kompatibilität zu einigen Mail Server geschieht.&lt;br /&gt;
&lt;br /&gt;
Nun folgt der erste Teil unserer Email, der Text.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    $mailbody .= &amp;quot;--&amp;quot; .$trenner. &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
    $mailbody .= &amp;quot;Content-Type: text/html; charset=UTF-8\r\n&amp;quot;;&lt;br /&gt;
    $mailbody .= &amp;quot;Content-Transfer-Encoding: 8bit\r\n\r\n&amp;quot;;&lt;br /&gt;
    $mailbody .= $template. &amp;quot;\r\n\r\n&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Durch den Trenner teilen wir dem Mail Client mit, dass zwischen diesem Trenner und dem nächsten Trenner, bzw. dem Ende der Mail, ein Teilabschnitt dieser Email steht. Damit der Client weiß um was es sich bei diesem Abschnitt handelt, teilen wir ihm das mithilfe des &amp;quot;Content-Type&amp;quot; und dem &amp;quot;Transfer-Encoding&amp;quot; mit. Durch die Angabe &amp;quot;text/html&amp;quot; weiß nun der Client, dass alles bis zum nächsten Trennen als HTML dargestellt werden soll.&lt;br /&gt;
&lt;br /&gt;
Der nächste Teilabschnitt der Mail ist unser Bild:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    // Anhang anfügen&lt;br /&gt;
    $mailbody .= &amp;quot;--&amp;quot; .$trenner. &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
    $mailbody .= &amp;quot;Content-Type: image/jpeg; name=\&amp;quot;&amp;quot; .$uploadname. &amp;quot;\&amp;quot;\r\n&amp;quot;;&lt;br /&gt;
    $mailbody .= &amp;quot;Content-Transfer-Encoding: base64\r\n&amp;quot;;&lt;br /&gt;
    $mailbody .= &amp;quot;Content-Disposition: attachment; filename=\&amp;quot;&amp;quot; .$uploadname. &amp;quot;\&amp;quot;\r\n\r\n&amp;quot;;&lt;br /&gt;
    $mailbody .= chunk_split( base64_encode( file_get_contents( $_FILES[&amp;#039;datei&amp;#039;][&amp;#039;tmp_name&amp;#039;] ) ) );&lt;br /&gt;
    $mailbody .= &amp;quot;\n&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Wieder folgt zunächst der Trenner. Der Client stoppt seine HTML Ausgabe an dieser Position und wird ab diesem Punkt ausgeben, was ihm durch den &amp;quot;Content-Type&amp;quot; und das &amp;quot;Transfer-Encoding&amp;quot; aufgetragen wird. Wir sehen nun, dass wir als Content-Type eine JPG Datei ausgeben möchten. Der Name ergibt sich aus dem Rückgabewert der Funktion, die den Upload zuvor überprüft hat. Als Transfer-Encoding wird &amp;quot;base64&amp;quot; angegeben. Diese Angabe ist überaus wichtig um eine korrekte Übertragung der Daten zu gewährleisten. Mit der Angabe &amp;quot;Content-Disposition: attachment;&amp;quot; legen wir fest, dass der Anhang wirklich an die Mail angehängt wird. Eine andere Möglichkeit wäre hier das Einbetten in den Mailtext, indem man als Content-Disposition ein &amp;quot;inline&amp;quot; angibt. Die nächste Zeile ist ziemlich tricky:&lt;br /&gt;
&lt;br /&gt;
 $mailbody .= chunk_split( base64_encode( file_get_contents( $_FILES[&amp;#039;datei&amp;#039;][&amp;#039;tmp_name&amp;#039;] ) ) );&lt;br /&gt;
&lt;br /&gt;
Arbeiten wir uns mal von Innen nach Außen durch, weil hier mehrere Funktionen verschachtelt sind. Mit file_get_contents wird eine Datei als String eingelesen. Dies ist hier möglich, weil diese Funktion seit PHP 4.3 binary safe ist. Als einzulesender Dateiname nehmen wir hier den Name der temporären datei, die durch den Upload auf dem Server gelandet ist. Diese Datei steht nur zu genau diesem Zeitpunkt zur Verfügung. Sobald das Script beendet wird oder eine andere Seite geladen wird, existiert diese Datei nicht mehr. Möchte man diese Datei erst zu einem späteren Zeitpunkt verarbeiten, muß man diese zunächst mit move_uploaded_file an eine andere Position kopieren.&lt;br /&gt;
Da wir nun die Bilddatei als String eingelesen haben, wird er mit base64_encode umgewandelt, damit die Datei beschädigt wird, falls es nicht möglich ist die Mail als 8bit zu übertragen. Es wird also aus Gründen der Kompatibilität gemacht. Anschließend wird der String mit chunk_split so aufbereitet, dass die Zeilenlänge 76 Zeichen nicht übersteigt.&lt;br /&gt;
&lt;br /&gt;
Das war&amp;#039;s! Die Daten können nun wieder mit der mail-Funktion versendet werden. Sollte man mehr als eine Datei anhängen wollen, kann man den letzten Schritt beliebig oft wiederholen. Erst Trenner setzen, dann Art der Daten und Übertragungsmodus angeben, die Datei anhängen, fertig.&lt;br /&gt;
&lt;br /&gt;
==== Beispiel Funktion (SPAM Proofed)====&lt;br /&gt;
(Aus Narda Accredited Calibration)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function send_acc_mail($rma_num,$arrForm,$arrPartner){&lt;br /&gt;
	global $user_db;&lt;br /&gt;
	global $dbase;&lt;br /&gt;
	global $pass_db;&lt;br /&gt;
	global $database;&lt;br /&gt;
	global $pdf_template;&lt;br /&gt;
	global $mail_template;// not used&lt;br /&gt;
	global $mail_template_txt;// only use this for plaintext message (more secure)&lt;br /&gt;
	global $pdf_css;&lt;br /&gt;
	global $narda_mail;&lt;br /&gt;
	global $admin_mail;&lt;br /&gt;
	global $replyto_mail;&lt;br /&gt;
	$partner_mail = $arrPartner[email];&lt;br /&gt;
&lt;br /&gt;
	$arrMarkers = array_merge($arrForm,$arrPartner,array(&amp;quot;rma_num&amp;quot;=&amp;gt;$rma_num));&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	// PDF-TEMPLATE&lt;br /&gt;
	$pdf_template = file_get_contents( $pdf_template );&lt;br /&gt;
	$pdf_template = replace_markers($pdf_template,$arrMarkers);&lt;br /&gt;
	// Mail Template&lt;br /&gt;
	$mail_template_txt = file_get_contents( $mail_template_txt );&lt;br /&gt;
	$mail_template_txt = replace_markers($mail_template_txt,$arrMarkers);&lt;br /&gt;
&lt;br /&gt;
	//MAIL&lt;br /&gt;
	// Trenner für multipart mail&lt;br /&gt;
    $mid = md5( time() );&lt;br /&gt;
	$filename = &amp;quot;acc-&amp;quot;.$rma_num;&lt;br /&gt;
	&lt;br /&gt;
    // Anhang generieren&lt;br /&gt;
	include(&amp;quot;lib/mpdf56/mpdf.php&amp;quot;);&lt;br /&gt;
	$mpdf=new mPDF(&amp;#039;c&amp;#039;);&lt;br /&gt;
	$mpdf-&amp;gt;SetDisplayMode(&amp;#039;fullpage&amp;#039;);&lt;br /&gt;
	$stylesheet = file_get_contents($pdf_css);&lt;br /&gt;
	$mpdf-&amp;gt;WriteHTML($stylesheet,1); // 1 -&amp;gt; css/style only and no body/html/text&lt;br /&gt;
	$mpdf-&amp;gt;WriteHTML($pdf_template);&lt;br /&gt;
	$pdf_attachment = chunk_split(base64_encode($mpdf-&amp;gt;Output(&amp;#039;&amp;#039;,&amp;#039;S&amp;#039;)));&lt;br /&gt;
   &lt;br /&gt;
	// Mailheader&lt;br /&gt;
	//$to=$partner_mail;&lt;br /&gt;
	$to=&amp;quot;schlegel@geo-bit.de&amp;quot;;&lt;br /&gt;
	$subject = &amp;quot;Accredited Calibration Request&amp;quot;;&lt;br /&gt;
	$headers .= &amp;#039;Reply-To: &amp;#039;.$replyto_mail.&amp;quot;\r\n&amp;quot;;&lt;br /&gt;
    $headers .= &amp;quot;Return-Path: noreply@&amp;quot; .$_SERVER[&amp;#039;SERVER_NAME&amp;#039;]. &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
	$headers .= &amp;#039;X-Mailer: PHP/&amp;#039;.phpversion().&amp;quot;\r\n&amp;quot;;&lt;br /&gt;
	$headers .=&amp;#039;From: NARDA-STS GmbH &amp;lt;&amp;#039;.$narda_mail.&amp;#039;&amp;gt;&amp;#039;.&amp;quot;\r\n&amp;quot;;&lt;br /&gt;
	$headers .= &amp;#039;Cc:&amp;#039;.$narda_mail.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	$headers .= &amp;#039;Bcc:&amp;#039;.$admin_mail.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$headers .= &amp;quot;MIME-Version: 1.0\r\n&amp;quot;;&lt;br /&gt;
	$headers .= &amp;quot;Content-Type: multipart/mixed; boundary=\&amp;quot;&amp;quot;.$mid.&amp;quot;\&amp;quot;\r\n\r\n&amp;quot;;&lt;br /&gt;
	$headers .= &amp;quot;This is a multi-part message in MIME format.\r\n&amp;quot;;&lt;br /&gt;
	$headers .= &amp;quot;--&amp;quot;.$mid.&amp;quot;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// Textpart&lt;br /&gt;
	$headers .= &amp;quot;Content-type:text/plain; charset=iso-8859-1\r\n&amp;quot;;&lt;br /&gt;
	$headers .= &amp;quot;Content-Transfer-Encoding: 7bit\r\n\r\n&amp;quot;;&lt;br /&gt;
    //$headers .= &amp;quot;Content-Type: text/html; charset=UTF-8\r\n&amp;quot;;&lt;br /&gt;
    //$headers .= &amp;quot;Content-Transfer-Encoding: 8bit\r\n\r\n&amp;quot;;&lt;br /&gt;
    $headers .= $mail_template_txt.&amp;quot;\r\n\r\n&amp;quot;;&lt;br /&gt;
	$headers .= &amp;quot;--&amp;quot;.$mid.&amp;quot;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	//pdf-att&lt;br /&gt;
	$headers .= &amp;quot;Content-Type: application/pdf; name=\&amp;quot;&amp;quot;.$filename.&amp;quot;\&amp;quot;\r\n&amp;quot;;&lt;br /&gt;
	$headers .= &amp;quot;Content-Transfer-Encoding: base64\r\n&amp;quot;;&lt;br /&gt;
	$headers .= &amp;quot;Content-Disposition: attachment; filename=\&amp;quot;&amp;quot;.$filename.&amp;quot;\&amp;quot;\r\n\r\n&amp;quot;;&lt;br /&gt;
	$headers .= $pdf_attachment.&amp;quot;\r\n\r\n&amp;quot;;&lt;br /&gt;
	$headers .= &amp;quot;--&amp;quot;.$mid.&amp;quot;--&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$addParams = &amp;#039;-fnoreply@&amp;#039;.$_SERVER[&amp;#039;SERVER_NAME&amp;#039;];&lt;br /&gt;
	$success = mail($to, $subject, $body, $headers,$addParams);&lt;br /&gt;
	return $success;&lt;br /&gt;
	//echo($headers);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== E-Mail mit Empfangsbestätigung ===&lt;br /&gt;
&lt;br /&gt;
Eine Empfangsbestätigung verschicken&lt;br /&gt;
&lt;br /&gt;
Das ist genauso einfach wie das verschicken einer ganz einfachen Textmail. Wie wir ja bereits gehört haben, gibt die mail-Funktion bei Erfolg ein TRUE zurück. Damit können wir also feststellen, ob die Nachricht des Benutzers an uns übermittelt wurde und falls ja, schicken wir ihm eine Mail als Bestätigung. Das sieht in etwa so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    if (@mail( $empfaenger, htmlspecialchars( $betreff ), $mailbody, $mailheader ))&lt;br /&gt;
    {&lt;br /&gt;
        // Bei erfolgreichem Versand Danke-Seite anzeigen&lt;br /&gt;
        $mailheader  = &amp;quot;From: Firma Max Mustermann&amp;lt;mustermann@domain.tld&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
        $mailheader .= &amp;quot;Reply-To: Firma Max Mustermann&amp;lt;mustermann@domain.tld&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
        $mailheader .= &amp;quot;Return-Path: noreply@&amp;quot; .$_SERVER[&amp;#039;SERVER_NAME&amp;#039;]. &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
        $mailheader .= &amp;quot;MIME-Version: 1.0\r\n&amp;quot;;&lt;br /&gt;
        $mailheader .= &amp;quot;Content-Type: text/plain; charset=UTF-8\r\n&amp;quot;;&lt;br /&gt;
        $mailheader .= &amp;quot;Content-Transfer-Encoding: 7bit\r\n&amp;quot;;&lt;br /&gt;
        $mailheader .= &amp;quot;Message-ID: &amp;lt;&amp;quot; .time(). &amp;quot; noreply@&amp;quot; .$_SERVER[&amp;#039;SERVER_NAME&amp;#039;]. &amp;quot;&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
        $mailheader .= &amp;quot;X-Mailer: PHP v&amp;quot; .phpversion(). &amp;quot;\r\n\r\n&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
        // Inhalt der Bestätigung&lt;br /&gt;
        $mailbody = &amp;#039;Vielen Dank für Ihre Email. Wir werden uns in Kürze bei Ihnen melden.&amp;#039;;&lt;br /&gt;
 &lt;br /&gt;
        // Bestätigung verschicken&lt;br /&gt;
        if (@mail( $email, &amp;quot;Die Firma Max Mustermann bedankt sich&amp;quot;, $mailbody, $mailheader ))&lt;br /&gt;
        {&lt;br /&gt;
            // Bestätigung wurde verschickt&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das ist im Prinzip der selbe Code wie zuvor in der Text Mail. Es werden lediglich einige Kleinigkeiten im Mail Header angepasst, damit der Benutzer auch weiß, wer ihm schreibt und wohin er antworten kann.&lt;br /&gt;
&lt;br /&gt;
Damit sollten die meisten Fragen zum Thema &amp;quot;Wie versendet man eine Email mit PHP&amp;quot; geklärt sein. Wer Fragen oder Anregungen hat, kann sie gerne in diesem Thread stellen.&lt;/div&gt;</summary>
		<author><name>109.193.152.215</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=TYPO3_-_Extensions_mit_Extbase_programmieren&amp;diff=20367</id>
		<title>TYPO3 - Extensions mit Extbase programmieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=TYPO3_-_Extensions_mit_Extbase_programmieren&amp;diff=20367"/>
		<updated>2014-09-30T11:31:44Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.215: /* Quickstart */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
http://docs.typo3.org/typo3cms/extensions/extension_builder/&lt;br /&gt;
&lt;br /&gt;
http://docs.typo3.org/typo3cms/ExtbaseGuide/Extbase/FirstExtbaseExtension.html&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
=== Extension Builder Installieren ===&lt;br /&gt;
=== Domain Modelling ===&lt;br /&gt;
* New Model auf Arbeitsfläche ziehen (z.B. Product)&lt;br /&gt;
** Object Setting Aggregate Root für das Hauptobjekt&lt;br /&gt;
** Default Actions z.B. list und show&lt;br /&gt;
** Properties z.b. title, price...&lt;br /&gt;
** Relations z.b. categories 1:n ...&lt;br /&gt;
&lt;br /&gt;
* New Model (z.b. Category)&lt;br /&gt;
** Diesmal KEIN Aggregate Root&lt;br /&gt;
&lt;br /&gt;
* Verbindungen von den Relations der Haupt Domain auf die Unterdomains ziehen.&lt;br /&gt;
* Speichern&lt;br /&gt;
&lt;br /&gt;
=== Extension aktivieren ===&lt;br /&gt;
Extension Manager&lt;br /&gt;
&lt;br /&gt;
=== Datensätze anlegen ===&lt;br /&gt;
Wie üblich.&lt;/div&gt;</summary>
		<author><name>109.193.152.215</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=TYPO3_-_Extensions_mit_Extbase_programmieren&amp;diff=20366</id>
		<title>TYPO3 - Extensions mit Extbase programmieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=TYPO3_-_Extensions_mit_Extbase_programmieren&amp;diff=20366"/>
		<updated>2014-09-30T11:24:23Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.215: /* Domain Modelling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
http://docs.typo3.org/typo3cms/extensions/extension_builder/&lt;br /&gt;
&lt;br /&gt;
http://docs.typo3.org/typo3cms/ExtbaseGuide/Extbase/FirstExtbaseExtension.html&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
=== Extension Builder Installieren ===&lt;br /&gt;
=== Domain Modelling ===&lt;br /&gt;
* New Model auf Arbeitsfläche ziehen (z.B. Product)&lt;br /&gt;
** Object Setting Aggregate Root für das Hauptobjekt&lt;br /&gt;
** Default Actions z.B. list und show&lt;br /&gt;
** Properties z.b. title, price...&lt;br /&gt;
** Relations z.b. categories 1:n ...&lt;br /&gt;
&lt;br /&gt;
* New Model (z.b. Category)&lt;br /&gt;
** Diesmal KEIN Aggregate Root&lt;/div&gt;</summary>
		<author><name>109.193.152.215</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=TYPO3_-_Extensions_mit_Extbase_programmieren&amp;diff=20365</id>
		<title>TYPO3 - Extensions mit Extbase programmieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=TYPO3_-_Extensions_mit_Extbase_programmieren&amp;diff=20365"/>
		<updated>2014-09-30T10:26:44Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.215: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
http://docs.typo3.org/typo3cms/extensions/extension_builder/&lt;br /&gt;
&lt;br /&gt;
http://docs.typo3.org/typo3cms/ExtbaseGuide/Extbase/FirstExtbaseExtension.html&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
=== Extension Builder Installieren ===&lt;br /&gt;
=== Domain Modelling ===&lt;/div&gt;</summary>
		<author><name>109.193.152.215</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=TYPO3_-_Extensions_mit_Extbase_programmieren&amp;diff=20364</id>
		<title>TYPO3 - Extensions mit Extbase programmieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=TYPO3_-_Extensions_mit_Extbase_programmieren&amp;diff=20364"/>
		<updated>2014-09-30T10:25:55Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.215: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
http://docs.typo3.org/typo3cms/extensions/extension_builder/&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
=== Extension Builder Installieren ===&lt;br /&gt;
=== Domain Modelling ===&lt;/div&gt;</summary>
		<author><name>109.193.152.215</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=TYPO3_-_Extensions_mit_Extbase_programmieren&amp;diff=20363</id>
		<title>TYPO3 - Extensions mit Extbase programmieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=TYPO3_-_Extensions_mit_Extbase_programmieren&amp;diff=20363"/>
		<updated>2014-09-30T09:54:22Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.215: Die Seite wurde neu angelegt: „ == Quickstart == === Extension Builder Installieren === === Domain Modelling ===“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
=== Extension Builder Installieren ===&lt;br /&gt;
=== Domain Modelling ===&lt;/div&gt;</summary>
		<author><name>109.193.152.215</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Typo3_-_Extensions_programmieren&amp;diff=20362</id>
		<title>Typo3 - Extensions programmieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Typo3_-_Extensions_programmieren&amp;diff=20362"/>
		<updated>2014-09-30T09:53:01Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.215: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ab V6 sollte man für Extensions Extbase und das MVC Schema nutzen. Deshalb gibts eine neue Seite:&lt;br /&gt;
&lt;br /&gt;
[[TYPO3 - Extensions mit Extbase programmieren]]&lt;br /&gt;
&lt;br /&gt;
Weiterführende Links:&lt;br /&gt;
&lt;br /&gt;
http://wiki.typo3.org/Extension_Developers_Guide&lt;br /&gt;
&lt;br /&gt;
[[Typo3 - Backend Module programmieren (Extensions)]]&lt;br /&gt;
&lt;br /&gt;
http://typo3.org/documentation/api/&lt;br /&gt;
&lt;br /&gt;
http://wiki.typo3.org/De:Create_your_own_extension&lt;br /&gt;
&lt;br /&gt;
http://typo3.org/documentation/document-library/core-documentation/doc_core_api/4.2.0/view/3/2/#id4144512&lt;br /&gt;
&lt;br /&gt;
(High Priority Functions)&lt;br /&gt;
&lt;br /&gt;
== Templates ==&lt;br /&gt;
[[Typo3 Extension Developer Templates]]&lt;br /&gt;
== Wie fange ich an ? ==&lt;br /&gt;
Was möchtest du tun?&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ein vorhandenes Inhaltselement verändern, z.B. Felder hinzufügen oder ein neues Erstellen.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Typo3 Extensions - Inhaltstypen anlegen und bearbeiten]]&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel dafür ist die Extension metatags die den Inhaltselementen Text mit Bild und Bild zusätzliche Felder für Alt und Title Tag hinzufügt.&lt;br /&gt;
&lt;br /&gt;
== Extensions Programmieren in der Praxis ==&lt;br /&gt;
=== TYPO3 Extensions - Links richtig anlegen ===&lt;br /&gt;
[[TYPO3 Extensions programmieren - Links]]&lt;br /&gt;
=== Typo3 Extensions - Sicherheit ===&lt;br /&gt;
[[Typo3 Extensions programmieren - Security Tipps]]&lt;br /&gt;
=== JavaScript in Typo3 Extensions ===&lt;br /&gt;
[[Typo3 - JavaScript einbinden]]&lt;br /&gt;
&lt;br /&gt;
=== Typo3 und AJAX ===&lt;br /&gt;
[[AJAX in TYPO3 Extensions]]&lt;br /&gt;
&lt;br /&gt;
=== TypoScript in Extensions ===&lt;br /&gt;
[[TypoScript Einstellungen in Extensions auslagern]]&lt;br /&gt;
&lt;br /&gt;
=== Frontend Plugin ===&lt;br /&gt;
[[Typo3 Extensions - ein Frontend Plugin Programmieren]]&lt;br /&gt;
=== IRRE ===&lt;br /&gt;
[[Typo3 Extensions mit IRRE]]&lt;br /&gt;
&lt;br /&gt;
Das IRRE Konzept hilft beim erstellen von Extensions mit &amp;quot;echten&amp;quot; relationalen Datenbankabfragen&lt;br /&gt;
=== FlexForms ===&lt;br /&gt;
[[Typo3 Extensions mit FlexForms]]&lt;br /&gt;
&lt;br /&gt;
=== Backendformulare ===&lt;br /&gt;
[[Typo3 Extensions - Backend Formulare und TCA Konfiguration]]&lt;br /&gt;
&lt;br /&gt;
siehe auch&lt;br /&gt;
&lt;br /&gt;
http://wiki.zone30.info/wikizone/index.php/Typo3_-_Extensions_programmieren#Formulare_im_Backend&lt;br /&gt;
&lt;br /&gt;
=== Erweitern von Funktionalitäten mit Hooks ===&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel findet sich hier unter Funktionen vor oder nach der Backendeingabe ausführen: &lt;br /&gt;
&lt;br /&gt;
[[Typo3 Extensions - Backend Formulare und TCA Konfiguration]]&lt;br /&gt;
&lt;br /&gt;
Eine schöne Einführung von Typo3 Blogger:&lt;br /&gt;
[[Typo3 - Alles über Hooks]]&lt;br /&gt;
&lt;br /&gt;
=== Arbeiten mit Templates ===&lt;br /&gt;
[[Typo3 Extensions - Arbeiten mit Templates]]&lt;br /&gt;
&lt;br /&gt;
=== Typo3 Extensions programmieren - Snippets ===&lt;br /&gt;
[[Typo3 Extensions programmieren - Snippets]]&lt;br /&gt;
&lt;br /&gt;
=== Typo3 Extensions programmieren - Rich Text Editor (RTE) ===&lt;br /&gt;
[[Typo3 Extensions programmieren - RTE]]&lt;br /&gt;
&lt;br /&gt;
=== Typo3 Extensions programmieren - Session Verwaltung ===&lt;br /&gt;
Siehe auch Sessions in Typo3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Standardmäßig gibt es Sessions für eingeloggte Frontend User Session und Browser Sessions&lt;br /&gt;
&lt;br /&gt;
Browser Session Variable setzen&lt;br /&gt;
 $GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;fe_user-&amp;gt;setKey(&amp;quot;ses&amp;quot;,&amp;quot;zaehler&amp;quot;, $wert);&lt;br /&gt;
und auslesen:&lt;br /&gt;
 $GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;fe_user-&amp;gt;getKey(&amp;quot;ses&amp;quot;,&amp;quot;zaehler&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Bei der User Session wird statt &amp;#039;ses&amp;#039; &amp;#039;user&amp;#039; als 1. Parameter verwendet&lt;br /&gt;
Beispiele User Session: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $this-&amp;gt;lastSelection[&amp;#039;filters&amp;#039;][&amp;#039;sem&amp;#039;] = 0;&lt;br /&gt;
 //User SEssion Data lesen&lt;br /&gt;
 $this-&amp;gt;lastSelection = $GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;fe_user-&amp;gt;getKey(&amp;quot;user&amp;quot;,&amp;quot;lastSelection&amp;quot;);&lt;br /&gt;
 // User Session Data schreiben&lt;br /&gt;
 $GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;fe_user-&amp;gt;setKey(&amp;quot;user&amp;quot;,&amp;quot;lastSelection&amp;quot;,$this-&amp;gt;lastSelection);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ein weiterer netter Artikel von Tim Lochmüller aus typo3weblog.de&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Diesmal geht es um die Benutzung der Session in TYPO3. In der Regel genügt nur eine Zeile Code um einen Wert in die Session zu schreiben oder wieder heraus zu holen. Schauen wir uns erstmal an, wie man etwas in die Session schreibt:&lt;br /&gt;
&lt;br /&gt;
 $GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;fe_user-&amp;gt;setKey(&amp;quot;ses&amp;quot;, &amp;quot;tx_myext&amp;quot;, $data);&lt;br /&gt;
&lt;br /&gt;
Die Funktion setKey() erwartet drei Parameter:&lt;br /&gt;
&lt;br /&gt;
# Type: Dieser kann &amp;quot;ses&amp;quot; oder &amp;quot;user&amp;quot; sein.&lt;br /&gt;
# Key: Eindeutiger Ident für eine Session Variable&lt;br /&gt;
# Data: Die Daten die gespeichert werden sollen.&lt;br /&gt;
&lt;br /&gt;
Die beiden Typen &amp;quot;ses&amp;quot; und &amp;quot;user&amp;quot; unterscheiden sich wesentlich. Während der Typ &amp;quot;ses&amp;quot; nur temporär die Daten speichert, also genau so lange, wie die Session besteht (Session-Cookie), ist es mit dem Key &amp;quot;user&amp;quot; möglich, die Daten auch über mehrere Sessions hinweg zu speichern, wobei diese an den FE-User gekoppelt werden.&lt;br /&gt;
&lt;br /&gt;
Der Key sollte so gewählt werden, dass man nicht in Konflikt mit anderen Extensions kommt. Am besten benutzt man seinen Extension-Key dafür.&lt;br /&gt;
&lt;br /&gt;
Die Daten die man speichern will kann jede beliebige PHP Variable sein, sogar komplette Objekte kann man ablegen.&lt;br /&gt;
&lt;br /&gt;
So, nun wollen wir uns den Wert mal wieder raus holen, auch dies geht sehr schnell und einfach:&lt;br /&gt;
&lt;br /&gt;
 $data = $GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;fe_user-&amp;gt;getKey(&amp;quot;ses&amp;quot;, &amp;quot;tx_myext&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Die Methode getKey erwartet nur zwei Parameter, die Bedeutung ist die gleiche wie bei setKey().&lt;br /&gt;
&lt;br /&gt;
Das Leben kann so einfach sein, wenn es nicht ab und an diese kleinen fiesen Sonderfälle gibt ;)&lt;br /&gt;
&lt;br /&gt;
Nehmen wir mal an, man erzeugt ein PDF oder eine AJAX-Antwort, dann gibt man das PDF aus und steigt mit einem exit() oder die() aus. In diesen Fällen, reicht ein einfacher Aufruf von setKey() nicht aus. Denn TYPO3 kann dann die Daten nicht automatisch speichern. Aber hier schafft der folgende Code Abhilfe:&lt;br /&gt;
&lt;br /&gt;
 $GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;fe_user-&amp;gt;setKey(&amp;quot;ses&amp;quot;, &amp;quot;tx_myext&amp;quot;, $data);&lt;br /&gt;
 $GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;fe_user-&amp;gt;storeSessionData();&lt;br /&gt;
&lt;br /&gt;
Mit storeSessionData() sorgen wir dafür, dass TYPO3 umgehend die Werte speichert. Sehr häufig wird gerade auf die letzte Zeile verzichtet, was in der Regel auch funktioniert, jedoch nur so lange, wie kein Fehler auftritt oder das Script vorzeitig beendet wird.&lt;br /&gt;
&lt;br /&gt;
Fröhliches Session-Handling Euch allen :)&lt;br /&gt;
&lt;br /&gt;
=== Caching in Typo3 Extensions - Cache Mechanismen ===&lt;br /&gt;
[[Typo3 - Caching in Extensions]]&lt;br /&gt;
&lt;br /&gt;
=== Typo3 Extensions programmieren - Nützliche Funktionen ===&lt;br /&gt;
Aus Adventskalender 2008 typo3blog &lt;br /&gt;
&lt;br /&gt;
Interessante Funktionen aus der Klasse t3lib_div vor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. t3lib_div::array2json($data)&lt;br /&gt;
Mit dieser Funktion kann man sehr einfach seine Daten in ein JSON Objekt konvertieren. Die Funktion erwartet ein Array mit den Daten, dieses kann beliebig verschachtelt sein. Natürlich gibt es auch noch die PHP native Funktion json_encode, jedoch muss dies von der installierten PHP Installation unterstüzt werden.&lt;br /&gt;
&lt;br /&gt;
2. t3lib_div::convUmlauts($str)&lt;br /&gt;
Eine sehr nützliche Funktion ist convUmlauts, welche die deutschen Umlaute konvertiert, dabei wird aus einem Ä eine Ae oder aus einem ü ein ue. Groß und Klein-Schreibung wird also berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
3. t3lib_div::rmFromList($element, $list)&lt;br /&gt;
Auch diese Funktion ist sehr nützlich. Möchte man aus einer kommaseparierten Liste ein Element entfernen, ist dies mit einem Funktionsaufruf getan. Gerade bei TYPO3 ist diese Funktion sehr hilfreich, wenn man z.B. eine Benutzergruppe eines FE-Users entfernen möchte.&lt;br /&gt;
&lt;br /&gt;
=== Typo3 Extensions programmieren - Sprachlabels ===&lt;br /&gt;
==== Probleme mit Umlauten ====&lt;br /&gt;
Bei den Sprachdateien locallang.xml etc. kann es Probleme mit Umlauten geben, wenn die Codierung der Datei nicht mit der der Typo3 Installation zusammen passt. Es funktioniert aber automatisch, wenn man die Codierung der xml Datei im Header angibt angibt. Also oben z.B. reinschreiben:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; standalone=&amp;quot;yes&amp;quot; ?&amp;gt;&lt;br /&gt;
=== Typo3 Extension - Sicherheit ===&lt;br /&gt;
[[Typo3 Extensions programmieren - Sicherheit]]&lt;br /&gt;
&lt;br /&gt;
=== Typo3 Extensions - JavaScript Frameworks nutzen ===&lt;br /&gt;
Nutzen von jquery, extJS und Konsorten in Typo3&lt;br /&gt;
[[Typo3 Extensions - JavaScript Frameworks nutzen]]&lt;br /&gt;
&lt;br /&gt;
== Wichtige Variablen ==&lt;br /&gt;
 $_EXTKEY &lt;br /&gt;
bzw. im Array...&lt;br /&gt;
Enthält den Extension Key.  Immer die Variable benutzen, dann kann man den Code leichte wieder verwenden.&lt;br /&gt;
 $TYPO3_CONF_VARS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wie arbeitet eine Extension ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Laden:&amp;#039;&amp;#039;&amp;#039; Extension Manager (EM) ruft &amp;#039;&amp;#039;ext_emconf.php&amp;#039;&amp;#039; (enthält nur das Array: $EM_CONF[$_EXTKEY]) bei allen Extensions auf die in der localconf.php aufgeführt sind.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Aufruf von Backend oder Frontend:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;ext_localconf.php&amp;#039;&amp;#039; wird ausgeführt (oder eine gecachete Kopie) In dieser wird die /typo3conf/localconf.php erweitert.&lt;br /&gt;
Funktion: weitere Klassen includieren (require_once())&lt;br /&gt;
&lt;br /&gt;
=== Wichtige Dateien einer Extension ===&lt;br /&gt;
&lt;br /&gt;
====ext_emconf.php====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Metadaten&amp;#039;&amp;#039;&amp;#039; wie Name, Kategorie, Status einer Extension - muß vorhanden sein sonst wird die Extension nicht geladen. Die Informationen landen in $EM_CONF[$_EXTKEY] = ARRAY&lt;br /&gt;
&lt;br /&gt;
==== ext_localconf.php ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;TCA Konfiguration für das Backend&amp;#039;&amp;#039;&amp;#039;. (Werte für das Array $TYPO3_CONF_VARS). Z.B. Namen der zu ladenden Klassen, statische TSFiles etc.&lt;br /&gt;
&lt;br /&gt;
Wird immer geladen wenn ein Aufruf in Frontend oder Backend erfolgt. Kann deshalb dazu benutzt werden wichtige Klassendaten zu laden oder Skripte zu inkludieren.&lt;br /&gt;
&lt;br /&gt;
Optional - wird genutzt wenn Sie gefunden wird.&lt;br /&gt;
&lt;br /&gt;
==== ext_tables.php ====&lt;br /&gt;
Erweiterungen für  $&amp;#039;&amp;#039;&amp;#039;TCA&amp;#039;&amp;#039;&amp;#039;(Table Configuration Array). Beschreibungen von Tabellen und Formularen.&lt;br /&gt;
&lt;br /&gt;
Wird außerdem genutzt um den &amp;#039;&amp;#039;&amp;#039;Code von Frontend-Plugins, Modulen oder statischem TypoScript zu laden&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Optional - wird genutzt wenn Sie gefunden wird.&lt;br /&gt;
&lt;br /&gt;
==== Weitere häufige Dateien ====&lt;br /&gt;
ext_tables.sql - SQL Statements für die &amp;#039;&amp;#039;&amp;#039;Datenbank-Tabellen&amp;#039;&amp;#039;&amp;#039; beim Installieren der Extension.&lt;br /&gt;
&lt;br /&gt;
ext_tables_static+adt.sql - SQL Insert Statements für &amp;#039;&amp;#039;&amp;#039;statische Werte in Tabellen&amp;#039;&amp;#039;&amp;#039; (z.B. PLZ Liste).&lt;br /&gt;
&lt;br /&gt;
ext_conf_template.txt&lt;br /&gt;
&lt;br /&gt;
tca.php - Anpassungen für &amp;#039;&amp;#039;&amp;#039;$TCA,&amp;#039;&amp;#039;&amp;#039; Informationen für die Behandlung von Datenbanktabellen&lt;br /&gt;
&lt;br /&gt;
locallang[...].xml und locallang[...].php - &amp;#039;&amp;#039;&amp;#039;Sprachdateien&amp;#039;&amp;#039;&amp;#039; (Begriffe).&lt;br /&gt;
&lt;br /&gt;
====Typische Unterordner (optional)====&lt;br /&gt;
pi1, pi2 - Enthalten Frontend Plugins&lt;br /&gt;
&lt;br /&gt;
mod1, mod2 - Backend Module&lt;br /&gt;
&lt;br /&gt;
sv1, sv2 - Services&lt;br /&gt;
&lt;br /&gt;
=== Wichtige Globale Variablen ===&lt;br /&gt;
$_EXTKEY - der Extension Key&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Formulare im Backend ===&lt;br /&gt;
Das &amp;#039;&amp;#039;&amp;#039;$TCA&amp;#039;&amp;#039;&amp;#039; (Table Configuration Array) bestimmt welche Formularfelder verwendet werden.&lt;br /&gt;
Das Array ist in ext_tables.php(Bereiche: ctrl und feinterface s.u.) und tca.php gespeichert&lt;br /&gt;
&lt;br /&gt;
* Jeder Eintrag im $TCA ist an eine Datenbanktabelle geknüpft&lt;br /&gt;
* Der erste Index ist der Tabellenname.&lt;br /&gt;
* Im zweiten Index gibt es 6 Bereiche: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 ctrl -&amp;gt; Informationen zur Tabelle&lt;br /&gt;
 interface -&amp;gt; Konfiguration für die Auflistung und Darstellung im Backend&lt;br /&gt;
 feInterface -&amp;gt; Eigenschaften für das Frontend Editing&lt;br /&gt;
 columns -&amp;gt; Informationen zu den Feldtypen der Tabelle und der Verarbeitung der Daten (zweiter Index ist hier der Spaltenname)&lt;br /&gt;
 types -&amp;gt; legt fest welche der in columns definierten Spalten dargestellt werden und in welcher Reihenfolge, &lt;br /&gt;
          außerdem Zusatzinfo wie alternative Feldbezeichnung, Palettennummer, style codes...&lt;br /&gt;
 palettes -&amp;gt; Zum Zusammenfassen von mehreren Eingabefeldern, Zusammenstellungen wiederverwenden, Hilfsfelder definieren&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Daten bearbeiten mit TCE und TCEforms ===&lt;br /&gt;
Die im $TCA definierten Daten müssen in irgend einer Form bearbeitet werden. Ein umfangreiches Modul dazu befindet sich  in der Extension CMS (typo3/sysext/cms/layout/db_layout.php. DDas Modul greift auf die &amp;#039;&amp;#039;&amp;#039;Typo3 Core Engine (TCE)&amp;#039;&amp;#039;&amp;#039; zurück, die zum Verarbeiten und Speichern von Daten dient. Die &amp;#039;&amp;#039;&amp;#039;Formulare werden mit der Klasse TCEforms&amp;#039;&amp;#039;&amp;#039; erzeugt. Bearbeitet wird hierbei im Backend.&lt;br /&gt;
&lt;br /&gt;
Immer dann, wenn man die &amp;#039;&amp;#039;&amp;#039;im $TCA eingetragenen Tabellen über Eingabemasken manipulieren&amp;#039;&amp;#039;&amp;#039; will ist des sinnvoll die TCE zu nutzen.&lt;br /&gt;
&lt;br /&gt;
 t3lib_TCEmain -&amp;gt; t3lib/class.t3lib_tce-main.php&lt;br /&gt;
 t3lib_TCEforms -&amp;gt; TCEforms&lt;br /&gt;
&lt;br /&gt;
==== Einsatz in Extensions ====&lt;br /&gt;
Instanz von t3lib_TCEmain erzeugen:&lt;br /&gt;
 require_once(PATH_t3lib.&amp;quot;class.t3lib_tcemain.php&amp;quot;);&lt;br /&gt;
 $tce=t3lib_div::makeInstance(&amp;#039;t3lib_TCEmain&amp;#039;);&lt;br /&gt;
Arrays für Daten und Kommandos erzeugen:&lt;br /&gt;
 $data[tabelle][uid][feld] = wert&lt;br /&gt;
um neue Daten zu schreiben bevor man eine uid hat belegt man uid mit NEW und einem Zufallsstring z.B. NEWo1amh&lt;br /&gt;
 $cmd[tabelle][uid][befehl] = wert&lt;br /&gt;
dabei stehen verschiedene Befehle zur Verfügung:&lt;br /&gt;
 copy, move, delete, localize, version, new&lt;br /&gt;
Die beiden Arrays werden dann mittels &lt;br /&gt;
 $tce-&amp;gt;start($data,$cmd) &lt;br /&gt;
an die TCE übergeben und von &lt;br /&gt;
$tce-&amp;gt;process_cmdmap() &lt;br /&gt;
abgearbeitet.&lt;br /&gt;
&lt;br /&gt;
== Wo finde ich welche Funktionen - Bibliotheken von TYPO3 einbinden und nutzen ==&lt;br /&gt;
Oft sucht man nach benötigten Funktionen. Z.B. wenn man im Backend oder über das alternative Rendering (eid) Core Funktionen braucht. &lt;br /&gt;
Hier mal ein paar Ansätze zum gucken. Dies ist kein zusammenhängender Code nur ein paar Schnipsel um die Hirnwindungen anzuregen &lt;br /&gt;
&lt;br /&gt;
ToDo&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
require_once(PATH_t3lib.&amp;#039;class.t3lib_page.php&amp;#039;);&lt;br /&gt;
require_once(PATH_tslib.&amp;quot;class.tslib_content.php&amp;quot;);&lt;br /&gt;
require_once(PATH_t3lib.&amp;quot;class.t3lib_stdgraphic.php&amp;quot;);&lt;br /&gt;
require_once(PATH_tslib.&amp;quot;class.tslib_gifbuilder.php&amp;quot;); &lt;br /&gt;
require_once (PATH_t3lib . &amp;#039;class.t3lib_htmlmail.php&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
$pid = intval(t3lib_div::_GET(&amp;#039;pid&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
// create object instances:&lt;br /&gt;
&lt;br /&gt;
//$temp_TSFEclassName = t3lib_div::makeInstanceClassName(&amp;#039;tslib_fe&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
$TSFE = new $temp_TSFEclassName($TYPO3_CONF_VARS, $page, 0, true);&lt;br /&gt;
$TSFE-&amp;gt;sys_page = t3lib_div::makeInstance(&amp;#039;t3lib_pageSelect&amp;#039;);&lt;br /&gt;
$TSFE-&amp;gt;tmpl = t3lib_div::makeInstance(&amp;#039;t3lib_tstemplate&amp;#039;);&lt;br /&gt;
$TSFE-&amp;gt;tmpl-&amp;gt;init();&lt;br /&gt;
&lt;br /&gt;
// fetch rootline and extract ts setup:&lt;br /&gt;
$TSFE-&amp;gt;rootLine = $TSFE-&amp;gt;sys_page-&amp;gt;getRootLine(intval($pid));&lt;br /&gt;
$TSFE-&amp;gt;getConfigArray();&lt;br /&gt;
&lt;br /&gt;
// return ts setup array:&lt;br /&gt;
$setup = $TSFE-&amp;gt;tmpl-&amp;gt;setup;&lt;br /&gt;
$conf = $setup[&amp;#039;plugin.&amp;#039;][&amp;#039;tx_rgcarousel_pi1.&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
$myCObj = new tslib_cObj();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Funktionen in Klassendateien auslagern ==&lt;br /&gt;
Oft ist es übersichtlicher Funktionen in eigene Dateien auszulagern. Im tt_news Frontend-Plugin wird das z.B. so gemacht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
require_once (t3lib_extMgm::extPath(&amp;#039;tt_news&amp;#039;) . &amp;#039;lib/class.tx_ttnews_catmenu.php&amp;#039;);&lt;br /&gt;
require_once (t3lib_extMgm::extPath(&amp;#039;tt_news&amp;#039;) . &amp;#039;lib/class.tx_ttnews_helpers.php&amp;#039;);&lt;br /&gt;
require_once (t3lib_extMgm::extPath(&amp;#039;tt_news&amp;#039;) . &amp;#039;lib/class.tx_ttnews_cache.php&amp;#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Klassendateien liegen also im Ordner lib.&lt;br /&gt;
&lt;br /&gt;
Die Dateien enthalten gleichnamige Klassen. Das Objekt dazu wird dann z.B. so erzeugt:&lt;br /&gt;
 $catTreeObj = t3lib_div::makeInstance(&amp;#039;tx_ttnews_catmenu&amp;#039;);&lt;br /&gt;
Typo3 hat also eine eigene Funktion um die Instanz zu erzeugen. Man muß also nicht mit new arbeiten. Der Vorteil ist mir noch nicht klar. Evtl. wird hier noch etwas anderes ausgeführt etwa um die Klasse zu registrieren o.ä.&lt;br /&gt;
&lt;br /&gt;
Drauf zugegriffen wird dann ganz normal z.B.:&lt;br /&gt;
 $catTreeObj-&amp;gt;init($this);&lt;br /&gt;
&lt;br /&gt;
== Wie kann ich eine eigene Extension debuggen? ==&lt;br /&gt;
=== Hilfreiche Extensions zur Entwicklung von Extensions ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;devlog&amp;#039;&amp;#039;&amp;#039; -&amp;gt; schreibt log Einträge in eine Datenbanktabelle. Dazu ruft man an in seiner Extension die Funktion TODO auf und übergibt die Werte die man loggen will.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Extension Development Evaluator  (extdeveval) &amp;#039;&amp;#039;&amp;#039; -&amp;gt; Referenzen aufrufen, Autmatisch Funktionsinfos schreiben u.v.m.&lt;br /&gt;
	&lt;br /&gt;
=== permalink ===&lt;br /&gt;
Wenn man eine eigene Extension schreibt benutzt man zum größten Teil Array, und um den Überblick zu behalten was nach den ganzen schritten in einem Array noch so drin steht hat man die möglichkeit mit einer Funktion das Array schön und sauber in einer tabelle anzeigen zu lassen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
PHP-Code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$data = array(&amp;quot;Name&amp;quot; =&amp;gt; &amp;quot;Peter KeineAhnung&amp;quot;, &amp;quot;Alter&amp;quot; =&amp;gt; 22, &amp;quot;Wohnort&amp;quot; =&amp;gt; &amp;quot;Ratingen&amp;quot;);&lt;br /&gt;
t3lib_div::debug($data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergebnis:&lt;br /&gt;
&lt;br /&gt;
je nach devIPMask Einstellungen ist auch nur&lt;br /&gt;
&lt;br /&gt;
PHP-Code:&lt;br /&gt;
&lt;br /&gt;
 debug();&lt;br /&gt;
&lt;br /&gt;
nützlich, vor allem wenn ein Kundenprojekt Online ist einfach im Installtool und devIpMask deine IP eingeben und dann mit debug(); arbeiten, so kannst nur du den debug sehen und nicht irgendwelche User die grade auf der Site sind.&lt;br /&gt;
&lt;br /&gt;
Kleiner Zusatz Tip:&lt;br /&gt;
&lt;br /&gt;
Ihr lasst euch gleichzeitig mehrere Debugs ausgeben und verliert den überblick welcher debug welcher ist... Beispiel Ihr lasst euch ein Array vor einer funktion debugen und anschliessend...&lt;br /&gt;
&lt;br /&gt;
da habt ihr dann die möglichkeit euerem Debug einen Namen zu geben..&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
PHP-Code:&lt;br /&gt;
 $data = array(&amp;quot;Name&amp;quot; =&amp;gt; &amp;quot;Peter KeineAhnung&amp;quot;, &amp;quot;Alter&amp;quot; =&amp;gt; 22);&lt;br /&gt;
 t3lib_div::debug(,&amp;#039;Array vorher&amp;#039;);&lt;br /&gt;
        &lt;br /&gt;
 $data[&amp;#039;Name&amp;#039;] = &amp;#039;T.uX&amp;#039;;&lt;br /&gt;
 $data[&amp;#039;Alter&amp;#039;] = 32;&lt;br /&gt;
&lt;br /&gt;
 t3lib_div::debug(,&amp;#039;Array nachher&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
Auch bei der Verwendung der integrierten DB-Abstraktionsschicht können eine Reihe von Fehlern auftreten, die teilweise nur sehr magere Fehlermeldungen produzieren. Um eine etwas explizitere Fehlerausgabe zu erzwingen sollte man folgende Zeile in seine Extension integrieren*:&lt;br /&gt;
&lt;br /&gt;
PHP-Code:&lt;br /&gt;
 $GLOBALS[&amp;#039;TYPO3_DB&amp;#039;]-&amp;gt;debugOutput = true;&lt;br /&gt;
So wird z.B. das SQL-Stement Ausgegeben, das zu einem Fehler geführt hat.&lt;br /&gt;
&lt;br /&gt;
== Datenbankabfrage in Extensions ==&lt;br /&gt;
[[TYPO3 - Datenbankabfragen in Extensions]]&lt;br /&gt;
&lt;br /&gt;
== Struktur einer Extension ==&lt;br /&gt;
===ext_emconf.php===&lt;br /&gt;
&lt;br /&gt;
Informationen und Metadaten zur Extension. Etwa die Infos die im Kickstarter unter General Info stehen.&lt;br /&gt;
&lt;br /&gt;
* Root-Verzeichnis&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;ext_localconf.php&amp;#039;&amp;#039;&amp;#039; Enthält &amp;#039;&amp;#039;&amp;#039;Konfigurationsdaten&amp;#039;&amp;#039;&amp;#039; ($TYPO3_CONF_VARS) für das Backend und Frontend. Hier kann über die Extension API auch &amp;#039;&amp;#039;&amp;#039;TypoScript&amp;#039;&amp;#039;&amp;#039; eingebunden werden. Hier können auch Klassendateien aufgerufen werden (require_once() ) die bei jedem Aufruf zur Verfügung stehen sollen.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;ext_tables.php&amp;#039;&amp;#039;&amp;#039; Konfiguration von &amp;#039;&amp;#039;&amp;#039;Datenbanktabellen&amp;#039;&amp;#039;&amp;#039;. Plugins und Module über die Extension API einbinden. (Alles über Kickstarter)&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;ext_tables.sql&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;SQL-Daten&amp;#039;&amp;#039;&amp;#039; für die Tabellendefinition. Die Auswertung erfolgt über den Extension Manager und das Install-Tool.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;ext_tables_static+adt.sql&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;SQL-Tabellendefinition&amp;#039;&amp;#039;&amp;#039; inkl. Daten. Z.B. für statische Daten (Länderinfos etc.)Die Tabellen müssen zusätzlich in ext_tables.sql definiert sein.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;ext_typoscript_*.txt&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;Globaler TypoScript-Code&amp;#039;&amp;#039;&amp;#039;. Steht nicht üver Template-Datensätze zur Auswahl (siehe /static)&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;ext_conf_template.txt&amp;#039;&amp;#039;&amp;#039; Hier werden &amp;#039;&amp;#039;&amp;#039;Optionen zur Konfiguration&amp;#039;&amp;#039;&amp;#039; angelegt, die der Benutzer im Extensionmanager einstellen kann.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;*icon*.gif&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;Symbol-Dateien&amp;#039;&amp;#039;&amp;#039; für Extension,DB-Tabellen,Plugins, Module...&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;locallang*.php&amp;#039;&amp;#039;&amp;#039; Texte für die &amp;#039;&amp;#039;&amp;#039;Lokalisierung&amp;#039;&amp;#039;&amp;#039; in verschiedenen Sprachen&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;class.ext_update.php&amp;#039;&amp;#039;&amp;#039; Funktionen für ein &amp;#039;&amp;#039;&amp;#039;Update der Extension&amp;#039;&amp;#039;&amp;#039; (Beispiel siehe newloginbox).&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;pi1/&amp;#039;&amp;#039;&amp;#039; Verzeichnis für &amp;#039;&amp;#039;&amp;#039;Skripte und Daten&amp;#039;&amp;#039;&amp;#039; des Plugin&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;class*.php&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;PHP-Klassen&amp;#039;&amp;#039;&amp;#039; z.B. für Plugins oder Submodule&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;cm1/&amp;#039;&amp;#039;&amp;#039; Verzeichnis für Dateien die das &amp;#039;&amp;#039;&amp;#039;Kontext-Menü&amp;#039;&amp;#039;&amp;#039; betreffen&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;mod1/&amp;#039;&amp;#039;&amp;#039; Verzeichnis für ein Modul.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;conf.php&amp;#039;&amp;#039;&amp;#039; Konfigurationsdatei für ein &amp;#039;&amp;#039;&amp;#039;Modul&amp;#039;&amp;#039;&amp;#039; zum einbinden ins Backend.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;index.php&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;Hauptscript eines Moduls&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;modfunc1/&amp;#039;&amp;#039;&amp;#039; Skripte und Daten für &amp;#039;&amp;#039;&amp;#039;Submodul-Funktionen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;static/&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;TypoScript-Template&amp;#039;&amp;#039;&amp;#039;-Dateien. Diese werden über die Extension-API eingebunden und stehen dann in Template-Datensätzen, ähnlich den Standard Templates zur Auswahl.&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;sv1/&amp;#039;&amp;#039;&amp;#039; Verzeichnis für &amp;#039;&amp;#039;&amp;#039;Services&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;res/&amp;#039;&amp;#039;&amp;#039; Verzeichnis für beliebige &amp;#039;recourcen&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;doc/&amp;#039;&amp;#039;&amp;#039; Verzeichnis der &amp;#039;&amp;#039;&amp;#039;Dokumentation&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Wo werden Extensions installiert ? ==&lt;br /&gt;
===typo3/sysext/ (System)===&lt;br /&gt;
System Extensions wie cms und lang. Hier können keine Extensions mit dem Extension Manager installiert werden.&lt;br /&gt;
===typo3/ext/ - globale Extensions (Global) ===&lt;br /&gt;
Z.B. diese die von Typo3 mitgeliefert werden. Mit der Option allowGlobalInstall kann man die Installation in dieses Verzeichnis erlauben. Das ist dann nicht sinnvoll wenn sich mehrere Typo3 WEbsites eine Installation teilen, weil es hier zu Versionskonflikten kommen kann.&lt;br /&gt;
===typo3conf/ext - lokale Extensions (Local)===&lt;br /&gt;
Hier werden normalerweise alle Extensions installiert. Die Lokale Installation hat immer Vorang vor einer globalen.&lt;br /&gt;
&lt;br /&gt;
== Typolinks richtig in Extensions einsetzen ==&lt;br /&gt;
&lt;br /&gt;
In diesem kurzem Tutorial möchte ich zeigen, wie man Typolinks in eigenen Erweiterungen erstellt, die das&lt;br /&gt;
Feature &amp;#039;Simulate Static Documents&amp;#039; unterstützen und eine Ausgabe erstellen, die von Typo3 gecached wird&lt;br /&gt;
und so auch mit der Indexed search verwendet werden können. Diese Informationen wurden aus anderen&lt;br /&gt;
Erweiterungen zusammengetragen, speziell aus der Erweiterung tt_board.&lt;br /&gt;
Typoscript&lt;br /&gt;
Zuerst erstelle in der Datei &amp;#039;ext_typoscript_setup.txt&amp;#039; eine Eigenschaft, die deiner Erweiterung mitteilt, ob&lt;br /&gt;
caching genutzt werden soll oder nicht:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plugin.tx_myextension_pi1 {&lt;br /&gt;
allowCaching = 1&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn das später auf 0 gesetzt wird, werden diese Seiten nicht mehr gecached.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Vorbereitung&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Bereite in der main() Funktion den Typolink vor und konfiguriere das caching:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class tx_myextension_pi1 extends tslib_pibase {&lt;br /&gt;
...&lt;br /&gt;
var $allowCaching = &amp;quot;&amp;quot;;&lt;br /&gt;
function main($content,$conf) {&lt;br /&gt;
$this-&amp;gt;conf=$conf;&lt;br /&gt;
...&lt;br /&gt;
// Preconfigure the typolink&lt;br /&gt;
$this-&amp;gt;local_cObj = t3lib_div::makeInstance(&amp;quot;tslib_cObj&amp;quot;);&lt;br /&gt;
$this-&amp;gt;local_cObj-&amp;gt;setCurrentVal($GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;id);&lt;br /&gt;
$this-&amp;gt;typolink_conf = $this-&amp;gt;conf[&amp;quot;typolink.&amp;quot;];&lt;br /&gt;
$this-&amp;gt;typolink_conf[&amp;quot;parameter.&amp;quot;][&amp;quot;current&amp;quot;] = 1;&lt;br /&gt;
$this-&amp;gt;typolink_conf[&amp;quot;additionalParams&amp;quot;] =&lt;br /&gt;
$this-&amp;gt;cObj-&amp;gt;stdWrap($this-&amp;gt;typolink_conf[&amp;quot;additionalParams&amp;quot;],&lt;br /&gt;
$this-&amp;gt;typolink_conf[&amp;quot;additionalParams.&amp;quot;]);&lt;br /&gt;
unset($this-&amp;gt;typolink_conf[&amp;quot;additionalParams.&amp;quot;]);&lt;br /&gt;
// Configure caching&lt;br /&gt;
$this-&amp;gt;allowCaching = $this-&amp;gt;conf[&amp;quot;allowCaching&amp;quot;]?1:0;&lt;br /&gt;
if (!$this-&amp;gt;allowCaching) {&lt;br /&gt;
$GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;set_no_cache();&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
Links erstellen&lt;br /&gt;
Um nun Links in der Erweiterung zu erstellen, benutze das folgende Code Fragment:&lt;br /&gt;
$temp_conf = $this-&amp;gt;typolink_conf;&lt;br /&gt;
$temp_conf[&amp;quot;additionalParams&amp;quot;] .= &amp;quot;&amp;amp;tx_myextension_pi1[key]=value&amp;quot;;&lt;br /&gt;
$temp_conf[&amp;quot;useCacheHash&amp;quot;] = $this-&amp;gt;allowCaching;&lt;br /&gt;
$temp_conf[&amp;quot;no_cache&amp;quot;] = !$this-&amp;gt;allowCaching;&lt;br /&gt;
$the_link = $this-&amp;gt;local_cObj-&amp;gt;typolink(&amp;quot;Linktext&amp;quot;, $temp_conf);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach kann man &amp;#039;$the_link&amp;#039; zu der Ausgabe hinzufügen. Das &amp;#039;$temp_conf&amp;#039; Array kann man mit allen&lt;br /&gt;
Eigenschaften des typolink Objektes erweitern.&lt;br /&gt;
&lt;br /&gt;
Tutorial by typo3.hachmeister.org&lt;br /&gt;
Von:fruit-lab.de&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Datei Uploads in Backend Extensions ==&lt;br /&gt;
Feld im Kickstarter anlegen. in der tca.php kannst du den uploadfolder festlegen.&lt;br /&gt;
&lt;br /&gt;
Komplizierter wirds in folgendem Fall (aus typo3.net 12-2007)&lt;br /&gt;
&lt;br /&gt;
 stimmt schon, dass man da den ordner ändern kann, aber was wenn ich nicht alle dateien in einen ordner speichern will?&lt;br /&gt;
ich brauche 2 ordner. einen für normale downloads und in den anderen würden die dateien reinkommen, die kostenpflichtig downzuloaden sind. diesen ordner muss ich also per htaccess schützen. darum wärs nötig, dass der upload-ordner für den späteren redakteur frei wählbar, oder zumindest 2 ordner auswählbar sind.&lt;br /&gt;
&lt;br /&gt;
irgendwelche ideen?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
alles kein Problem.&lt;br /&gt;
&lt;br /&gt;
Man kann in der ext_emconf.php unter createDirs die benötigten Verzeichnisse angeben.&lt;br /&gt;
Für Fileupload gibts auch einige Typofunktionen die man nutzen kann, so helfen einem folgende Klassen weiter:&lt;br /&gt;
t3lib_basicFileFunctions&lt;br /&gt;
t3lib_extFileFunctions&lt;br /&gt;
&lt;br /&gt;
== Debug Methode ==&lt;br /&gt;
Typo3 | Debug Methode :: Hilfe bei der Programmierung&lt;br /&gt;
&lt;br /&gt;
Wenn man eine eigene Extension schreibt benutzt man zum größten Teil Array, und um den Überblick zu&lt;br /&gt;
behalten was nach den ganzen schritten in einem Array noch so drin steht hat man die möglichkeit mit einer Funktion das Array schön und sauber in einer tabelle anzeigen zu lassen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$data = array(&amp;quot;Name&amp;quot; =&amp;gt; &amp;quot;Peter KeineAhnung&amp;quot;, &amp;quot;Alter&amp;quot; =&amp;gt; 22, &amp;quot;Wohnort&amp;quot; =&amp;gt; &amp;quot;Ratingen&amp;quot;);&lt;br /&gt;
echo t3lib_div::debug($data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergebnis:&lt;br /&gt;
&lt;br /&gt;
[[Bild:TS_debug01.gif]]&lt;br /&gt;
&lt;br /&gt;
je nach devIPMask Einstellungen ist auch nur&lt;br /&gt;
 debug($sonstwas);&lt;br /&gt;
nützlich, vor allem wenn ein Kundenprojekt Online isteinfach im Installtool und devIpMask deine IP eingeben und dann mit debug($sonstwas); arbeiten, so kannst nur du den debug sehen und nicht irgendwelche User die grade auf der Site sind.&lt;br /&gt;
&lt;br /&gt;
Kleiner Zusatz Tip:&lt;br /&gt;
&lt;br /&gt;
Ihr lasst euch gleichzeitig mehrere Debugs ausgeben und verliert den überblick welcher debug welcher ist...&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Ihr lasst euch ein Array vor einer funktion debugen und anschliessend...&lt;br /&gt;
da habt ihr dann die möglichkeit euerem Debug einen Namen zu geben..&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$data = array(&amp;quot;Name&amp;quot; =&amp;gt; &amp;quot;Peter KeineAhnung&amp;quot;, &amp;quot;Alter&amp;quot; =&amp;gt; 22, &amp;quot;Wohnort&amp;quot; =&amp;gt; &amp;quot;Ratingen&amp;quot;);&lt;br /&gt;
echo t3lib_div::debug($data,&amp;#039;Array vorher&amp;#039;);&lt;br /&gt;
$data[&amp;#039;Name&amp;#039;] = &amp;#039;T.uX&amp;#039;;&lt;br /&gt;
$data[&amp;#039;Alter&amp;#039;] = 32;&lt;br /&gt;
echo t3lib_div::debug($data,&amp;#039;Array nachher&amp;#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergebnis:&lt;br /&gt;
&lt;br /&gt;
[[Bild:TS_debug02.gif]]&lt;br /&gt;
&lt;br /&gt;
Hinweis:&lt;br /&gt;
läst du dir eine Variable im debug ausgeben erscheint [b]|debug|[/b]. das funzt nur mit Arrays ;-)&lt;br /&gt;
Auch bei der Verwendung der integrierten DB-Abstrktionsschicht können eine Reihe von Fehlern auftreten,&lt;br /&gt;
die teilweise nur sehr magere Fehlermeldungen produzieren. Um eine etwas explizitere Fehlerausgabe zu&lt;br /&gt;
erzwingen sollte man folgende Zeile in seine Extension integrieren*:&lt;br /&gt;
$GLOBALS[&amp;#039;TYPO3_DB&amp;#039;]-&amp;gt;debugOutput = true;&lt;br /&gt;
&lt;br /&gt;
So wird z.B. das SQL-Stement Ausgegeben, das zu einem Fehler geführt hat.&lt;br /&gt;
Tutorial by typo3.kj187.de&lt;br /&gt;
&lt;br /&gt;
== PHP-Skripte einbinden ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== mit PHP_SCRIPT ===&lt;br /&gt;
&lt;br /&gt;
Im Typo Script:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
##############################&lt;br /&gt;
### temporäres Test Script ###&lt;br /&gt;
##############################&lt;br /&gt;
&lt;br /&gt;
temp.phpScript = PHP_SCRIPT&lt;br /&gt;
temp.phpScript {&lt;br /&gt;
   file = demo/test.inc.php&lt;br /&gt;
   myVerySpecialOwnParameter = Hallo Welt&lt;br /&gt;
   myParamArray {&lt;br /&gt;
      a = 2&lt;br /&gt;
      b = 5&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Im Skript text.inc.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Use the debug-function to view the config&lt;br /&gt;
// array $conf given by TypoScript:&lt;br /&gt;
debug( $conf );&lt;br /&gt;
&lt;br /&gt;
$contentArr[] = &amp;quot;Test&amp;quot;;&lt;br /&gt;
$contentArr[] = $conf[&amp;#039;file&amp;#039;];&lt;br /&gt;
$contentArr[] = $conf[&amp;#039;myVerySpecialOwnParameter&amp;#039;];&lt;br /&gt;
$contentArr[] = implode( $conf[&amp;#039;myParamArray.&amp;#039;], &amp;#039;, &amp;#039; );&lt;br /&gt;
&lt;br /&gt;
// Put all your output to $content,&lt;br /&gt;
// that TYPO3 will display for you:&lt;br /&gt;
$content = implode( $contentArr, &amp;#039;&amp;lt; br /&amp;gt;&amp;#039; );&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== mit PHP_SCRIPT_EXT ===&lt;br /&gt;
Typo3 | Externe PHP Scripte einbinden&lt;br /&gt;
&lt;br /&gt;
Haben Sie ihr Projekt auf Typo3 umgestellt und wollen dennoch ihre eigenen PHP-Scripte verwenden? Dann machen Sie folgendes.&lt;br /&gt;
&lt;br /&gt;
Schreiben Sie in das SETUP Feld des Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tt_content.script = CASE&lt;br /&gt;
tt_content.script {&lt;br /&gt;
key.field = select_key&lt;br /&gt;
test = PHP_SCRIPT_EXT&lt;br /&gt;
test.file = fileadmin/dein_script.php&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um das Script jetzt als Contentelement in die Seite einzubinden, legen Sie einen neuen Seiteninhalt an. Wechseln Sie von Typ = Text auf Typ = Skript. In das CODE Feld müssen Sie jetzt nur noch test eintragen und sie sind fertig. &lt;br /&gt;
&lt;br /&gt;
Dies ist die einfachste Methode. Die Ausgabe des Scripts wird aber nicht in den Cache aufgenommen! Diese Funktion wird leider nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
Tutorial by typo3.kj187.de&lt;br /&gt;
&lt;br /&gt;
Anmerkung Steff: Für die Cache Funktion kann man z.B. eine Einfache Extension basteln.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
===Einträge aus Bildausrichtungen im Backend entfernen===&lt;br /&gt;
aus cron_cssstyledimgtext&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
if (!defined (&amp;#039;TYPO3_MODE&amp;#039;))     die (&amp;#039;Access denied.&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
t3lib_extMgm::addPItoST43($_EXTKEY,&amp;#039;pi1/class.tx_croncssstyledimgtext_pi1.php&amp;#039;,&amp;#039;_pi1&amp;#039;,&amp;#039;&amp;#039;,1);&lt;br /&gt;
&lt;br /&gt;
$_EXTCONF = unserialize($_EXTCONF);&lt;br /&gt;
if ($_EXTCONF[&amp;#039;addPageTS&amp;#039;])	{&lt;br /&gt;
	t3lib_extMgm::addPageTSConfig(&amp;#039;&lt;br /&gt;
TCEFORM.tt_content.imageorient.types.image.removeItems = 8,9,10,17,18,25,26&lt;br /&gt;
&amp;#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;FE&amp;#039;][&amp;#039;XCLASS&amp;#039;][&amp;#039;tslib/class.tslib_content.php&amp;#039;]=t3lib_extMgm::extPath($_EXTKEY).&amp;#039;class.ux_tslib_content.php&amp;#039;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Bilder in eigener Extension rendern ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel benutzte Variablen:&lt;br /&gt;
 $BildAdresse&lt;br /&gt;
 $ParameterFuerImgTag&lt;br /&gt;
 $Alttext&lt;br /&gt;
&lt;br /&gt;
In PHP-Datei der Extension:&lt;br /&gt;
&lt;br /&gt;
 $this-&amp;gt;conf[&amp;quot;imageBeispiel.&amp;quot;][&amp;quot;file&amp;quot;]=&amp;quot;uploads/pics/&amp;quot;.$BildAdresse;&lt;br /&gt;
 $this-&amp;gt;conf[&amp;quot;imageBeispiel.&amp;quot;][&amp;quot;params&amp;quot;]=$ParameterFuerImgTag;&lt;br /&gt;
 $this-&amp;gt;conf[&amp;quot;imageBeispiel.&amp;quot;][&amp;quot;altText&amp;quot;]=$Alttext;&lt;br /&gt;
 $Bild=$this-&amp;gt;cObj-&amp;gt;IMAGE($this-&amp;gt;conf[&amp;quot;imageBeispiel.&amp;quot;]);&lt;br /&gt;
 $Content.=$Bild;&lt;br /&gt;
&lt;br /&gt;
In Typoscript Setup&lt;br /&gt;
&lt;br /&gt;
 plugin.tx_hoTest_pi1 {     //hier Plugin-Name&lt;br /&gt;
 imageArtikel{&lt;br /&gt;
     file.maxW = {$ho_Test.BildWidthNews}  &lt;br /&gt;
     imageLinkWrap = 1&lt;br /&gt;
     imageLinkWrap {&lt;br /&gt;
       enable = 1&lt;br /&gt;
       bodyTag = &amp;lt;BODY bgColor=white&amp;gt;&lt;br /&gt;
       wrap = |&lt;br /&gt;
       width = 400m&lt;br /&gt;
       height = 400&lt;br /&gt;
       JSwindow = 1&lt;br /&gt;
       JSwindow.newWindow = 1&lt;br /&gt;
       JSwindow.expand = 17,20&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Der Wert {$ho_Test.BildWidthNews} kann aus Constants übernommen werden.&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch&lt;br /&gt;
Konstanten von Constants im Setup verwenden&lt;br /&gt;
und&lt;br /&gt;
Konstanten für Constant-Editor bereitstellen&lt;br /&gt;
&lt;br /&gt;
(aus www.easy-office4you.de/ 10.1.2006)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Spalten der Seiten umbenennen ===&lt;br /&gt;
&lt;br /&gt;
Um die Spalten der Seite im Backend beliebig umzubenennen und/oder zusätzliche eigene Spalten zu verwenden, muß die Extension zed_more_columns installiert werden und dann in der Datei ext_tables.php die Spalten-Namen eingeben werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
 $TCA[&amp;quot;tt_content&amp;quot;][&amp;quot;columns&amp;quot;][&amp;quot;colPos&amp;quot;][&amp;quot;config&amp;quot;][&amp;quot;items&amp;quot;] = array (&lt;br /&gt;
 &amp;quot;0&amp;quot; =&amp;gt; array (&amp;quot;Mitte||Mitte||||||||&amp;quot;,&amp;quot;0&amp;quot;),&lt;br /&gt;
 &amp;quot;1&amp;quot; =&amp;gt; array (&amp;quot;Links||Links||||||||&amp;quot;,&amp;quot;1&amp;quot;),&lt;br /&gt;
 &amp;quot;2&amp;quot; =&amp;gt; array (&amp;quot;Rechts||Rechts||||||||&amp;quot;,&amp;quot;2&amp;quot;),&lt;br /&gt;
 &amp;quot;3&amp;quot; =&amp;gt; array (&amp;quot;Teaser||Teaser||||||||&amp;quot;,&amp;quot;3&amp;quot;),&lt;br /&gt;
 &amp;quot;4&amp;quot; =&amp;gt; array (&amp;quot;Fusszeile||Fusszeile||||||||&amp;quot;,&amp;quot;4&amp;quot;)&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
== Bei Extension dafür sorgen, daß im Backend kein Sortierungs-Button entsteht ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In der Datei ext_tables.php der Extension folgende Zeile ändern&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;sortby&amp;quot; =&amp;gt; &amp;quot;name&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
ändern in&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;default_sortby&amp;quot; =&amp;gt; &amp;quot;ORDER BY name&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
Anstatt &amp;quot;name&amp;quot; kann natürlich auch ein anderes Suchkriterium verwendet werden.&lt;br /&gt;
&lt;br /&gt;
== Ausgaben im HTML-Header in Extensions programmieren ==&lt;br /&gt;
Manchmal möchte man bestimmte Angaben in den Header schreiben, um zum Beispiel ein JavaScript einzubinden o.ä.&lt;br /&gt;
&lt;br /&gt;
Man könnte im statischen TypoScript für das Objekt page etwas hernehmen. Das funktioniert aber nur wenn das PAGE Objekt auch wirklich page heißt.&lt;br /&gt;
&lt;br /&gt;
Also besser mit einer Typo3 Eigenen Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel - JavaScript einbinden&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function includeJavaScript() {&lt;br /&gt;
  $js .= &amp;#039;&amp;lt;script src=&amp;quot;&amp;#039;.t3lib_extMgm::siteRelPath($this-&amp;gt;extKey).dirname($this-&amp;gt;scriptRelPath).&amp;#039;/JS-Verzeichnis/js-file.js&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;!-- //--&amp;gt;&amp;lt;/script&amp;gt;&amp;#039;;&lt;br /&gt;
  $GLOBALS[&amp;#039;TSFE&amp;#039;]-&amp;gt;additionalHeaderData[$this-&amp;gt;extKey] = $js;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Aufruf der Funktion:&lt;br /&gt;
$content=$this-&amp;gt;includeJavaScript(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Variable $this-&amp;gt;extKey wird normalerweise immer in der Klassendefinition der Extensiongesetzt und enthält den Namen der Extension (z.B. meineextension)&lt;br /&gt;
&lt;br /&gt;
Für $this-&amp;gt;scriptRelPath gilt das gleiche. Hier steht der Pfad ab dem Extension Ordner (z.B. pi1/class.tx_meineExtension_pi1.php)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachige Extensions ==&lt;br /&gt;
Seit der Version 4 hat sich die Vorgehensweise bei der Lokalisierung geändert. Um zu verstehen wie die Lokalisierung von Backend, Frontend etc. funktioniert gibt es hier eine kleine Übersicht:&lt;br /&gt;
[[Sprachverwaltung und Lokalisierung in Typo3]]&lt;br /&gt;
&lt;br /&gt;
== $GLOBALS[&amp;#039;TSFE&amp;#039;] ==&lt;br /&gt;
&lt;br /&gt;
TSFE ist ein Abbild der Klasse tslib_fe, die kannst Du auch untersuchen.&lt;/div&gt;</summary>
		<author><name>109.193.152.215</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Typo3_-_Extensions_programmieren&amp;diff=20361</id>
		<title>Typo3 - Extensions programmieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Typo3_-_Extensions_programmieren&amp;diff=20361"/>
		<updated>2014-09-30T09:52:32Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.215: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ab V6 sollte man für Extensions Extbase und das MVC Schema nutzen. Deshalb gibts eine neue Seite:&lt;br /&gt;
&lt;br /&gt;
TYPO3 - Extensions mit Extbase&lt;br /&gt;
&lt;br /&gt;
Weiterführende Links:&lt;br /&gt;
&lt;br /&gt;
http://wiki.typo3.org/Extension_Developers_Guide&lt;br /&gt;
&lt;br /&gt;
[[Typo3 - Backend Module programmieren (Extensions)]]&lt;br /&gt;
&lt;br /&gt;
http://typo3.org/documentation/api/&lt;br /&gt;
&lt;br /&gt;
http://wiki.typo3.org/De:Create_your_own_extension&lt;br /&gt;
&lt;br /&gt;
http://typo3.org/documentation/document-library/core-documentation/doc_core_api/4.2.0/view/3/2/#id4144512&lt;br /&gt;
&lt;br /&gt;
(High Priority Functions)&lt;br /&gt;
&lt;br /&gt;
== Templates ==&lt;br /&gt;
[[Typo3 Extension Developer Templates]]&lt;br /&gt;
== Wie fange ich an ? ==&lt;br /&gt;
Was möchtest du tun?&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ein vorhandenes Inhaltselement verändern, z.B. Felder hinzufügen oder ein neues Erstellen.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Typo3 Extensions - Inhaltstypen anlegen und bearbeiten]]&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel dafür ist die Extension metatags die den Inhaltselementen Text mit Bild und Bild zusätzliche Felder für Alt und Title Tag hinzufügt.&lt;br /&gt;
&lt;br /&gt;
== Extensions Programmieren in der Praxis ==&lt;br /&gt;
=== TYPO3 Extensions - Links richtig anlegen ===&lt;br /&gt;
[[TYPO3 Extensions programmieren - Links]]&lt;br /&gt;
=== Typo3 Extensions - Sicherheit ===&lt;br /&gt;
[[Typo3 Extensions programmieren - Security Tipps]]&lt;br /&gt;
=== JavaScript in Typo3 Extensions ===&lt;br /&gt;
[[Typo3 - JavaScript einbinden]]&lt;br /&gt;
&lt;br /&gt;
=== Typo3 und AJAX ===&lt;br /&gt;
[[AJAX in TYPO3 Extensions]]&lt;br /&gt;
&lt;br /&gt;
=== TypoScript in Extensions ===&lt;br /&gt;
[[TypoScript Einstellungen in Extensions auslagern]]&lt;br /&gt;
&lt;br /&gt;
=== Frontend Plugin ===&lt;br /&gt;
[[Typo3 Extensions - ein Frontend Plugin Programmieren]]&lt;br /&gt;
=== IRRE ===&lt;br /&gt;
[[Typo3 Extensions mit IRRE]]&lt;br /&gt;
&lt;br /&gt;
Das IRRE Konzept hilft beim erstellen von Extensions mit &amp;quot;echten&amp;quot; relationalen Datenbankabfragen&lt;br /&gt;
=== FlexForms ===&lt;br /&gt;
[[Typo3 Extensions mit FlexForms]]&lt;br /&gt;
&lt;br /&gt;
=== Backendformulare ===&lt;br /&gt;
[[Typo3 Extensions - Backend Formulare und TCA Konfiguration]]&lt;br /&gt;
&lt;br /&gt;
siehe auch&lt;br /&gt;
&lt;br /&gt;
http://wiki.zone30.info/wikizone/index.php/Typo3_-_Extensions_programmieren#Formulare_im_Backend&lt;br /&gt;
&lt;br /&gt;
=== Erweitern von Funktionalitäten mit Hooks ===&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel findet sich hier unter Funktionen vor oder nach der Backendeingabe ausführen: &lt;br /&gt;
&lt;br /&gt;
[[Typo3 Extensions - Backend Formulare und TCA Konfiguration]]&lt;br /&gt;
&lt;br /&gt;
Eine schöne Einführung von Typo3 Blogger:&lt;br /&gt;
[[Typo3 - Alles über Hooks]]&lt;br /&gt;
&lt;br /&gt;
=== Arbeiten mit Templates ===&lt;br /&gt;
[[Typo3 Extensions - Arbeiten mit Templates]]&lt;br /&gt;
&lt;br /&gt;
=== Typo3 Extensions programmieren - Snippets ===&lt;br /&gt;
[[Typo3 Extensions programmieren - Snippets]]&lt;br /&gt;
&lt;br /&gt;
=== Typo3 Extensions programmieren - Rich Text Editor (RTE) ===&lt;br /&gt;
[[Typo3 Extensions programmieren - RTE]]&lt;br /&gt;
&lt;br /&gt;
=== Typo3 Extensions programmieren - Session Verwaltung ===&lt;br /&gt;
Siehe auch Sessions in Typo3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Standardmäßig gibt es Sessions für eingeloggte Frontend User Session und Browser Sessions&lt;br /&gt;
&lt;br /&gt;
Browser Session Variable setzen&lt;br /&gt;
 $GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;fe_user-&amp;gt;setKey(&amp;quot;ses&amp;quot;,&amp;quot;zaehler&amp;quot;, $wert);&lt;br /&gt;
und auslesen:&lt;br /&gt;
 $GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;fe_user-&amp;gt;getKey(&amp;quot;ses&amp;quot;,&amp;quot;zaehler&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Bei der User Session wird statt &amp;#039;ses&amp;#039; &amp;#039;user&amp;#039; als 1. Parameter verwendet&lt;br /&gt;
Beispiele User Session: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $this-&amp;gt;lastSelection[&amp;#039;filters&amp;#039;][&amp;#039;sem&amp;#039;] = 0;&lt;br /&gt;
 //User SEssion Data lesen&lt;br /&gt;
 $this-&amp;gt;lastSelection = $GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;fe_user-&amp;gt;getKey(&amp;quot;user&amp;quot;,&amp;quot;lastSelection&amp;quot;);&lt;br /&gt;
 // User Session Data schreiben&lt;br /&gt;
 $GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;fe_user-&amp;gt;setKey(&amp;quot;user&amp;quot;,&amp;quot;lastSelection&amp;quot;,$this-&amp;gt;lastSelection);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ein weiterer netter Artikel von Tim Lochmüller aus typo3weblog.de&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Diesmal geht es um die Benutzung der Session in TYPO3. In der Regel genügt nur eine Zeile Code um einen Wert in die Session zu schreiben oder wieder heraus zu holen. Schauen wir uns erstmal an, wie man etwas in die Session schreibt:&lt;br /&gt;
&lt;br /&gt;
 $GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;fe_user-&amp;gt;setKey(&amp;quot;ses&amp;quot;, &amp;quot;tx_myext&amp;quot;, $data);&lt;br /&gt;
&lt;br /&gt;
Die Funktion setKey() erwartet drei Parameter:&lt;br /&gt;
&lt;br /&gt;
# Type: Dieser kann &amp;quot;ses&amp;quot; oder &amp;quot;user&amp;quot; sein.&lt;br /&gt;
# Key: Eindeutiger Ident für eine Session Variable&lt;br /&gt;
# Data: Die Daten die gespeichert werden sollen.&lt;br /&gt;
&lt;br /&gt;
Die beiden Typen &amp;quot;ses&amp;quot; und &amp;quot;user&amp;quot; unterscheiden sich wesentlich. Während der Typ &amp;quot;ses&amp;quot; nur temporär die Daten speichert, also genau so lange, wie die Session besteht (Session-Cookie), ist es mit dem Key &amp;quot;user&amp;quot; möglich, die Daten auch über mehrere Sessions hinweg zu speichern, wobei diese an den FE-User gekoppelt werden.&lt;br /&gt;
&lt;br /&gt;
Der Key sollte so gewählt werden, dass man nicht in Konflikt mit anderen Extensions kommt. Am besten benutzt man seinen Extension-Key dafür.&lt;br /&gt;
&lt;br /&gt;
Die Daten die man speichern will kann jede beliebige PHP Variable sein, sogar komplette Objekte kann man ablegen.&lt;br /&gt;
&lt;br /&gt;
So, nun wollen wir uns den Wert mal wieder raus holen, auch dies geht sehr schnell und einfach:&lt;br /&gt;
&lt;br /&gt;
 $data = $GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;fe_user-&amp;gt;getKey(&amp;quot;ses&amp;quot;, &amp;quot;tx_myext&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Die Methode getKey erwartet nur zwei Parameter, die Bedeutung ist die gleiche wie bei setKey().&lt;br /&gt;
&lt;br /&gt;
Das Leben kann so einfach sein, wenn es nicht ab und an diese kleinen fiesen Sonderfälle gibt ;)&lt;br /&gt;
&lt;br /&gt;
Nehmen wir mal an, man erzeugt ein PDF oder eine AJAX-Antwort, dann gibt man das PDF aus und steigt mit einem exit() oder die() aus. In diesen Fällen, reicht ein einfacher Aufruf von setKey() nicht aus. Denn TYPO3 kann dann die Daten nicht automatisch speichern. Aber hier schafft der folgende Code Abhilfe:&lt;br /&gt;
&lt;br /&gt;
 $GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;fe_user-&amp;gt;setKey(&amp;quot;ses&amp;quot;, &amp;quot;tx_myext&amp;quot;, $data);&lt;br /&gt;
 $GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;fe_user-&amp;gt;storeSessionData();&lt;br /&gt;
&lt;br /&gt;
Mit storeSessionData() sorgen wir dafür, dass TYPO3 umgehend die Werte speichert. Sehr häufig wird gerade auf die letzte Zeile verzichtet, was in der Regel auch funktioniert, jedoch nur so lange, wie kein Fehler auftritt oder das Script vorzeitig beendet wird.&lt;br /&gt;
&lt;br /&gt;
Fröhliches Session-Handling Euch allen :)&lt;br /&gt;
&lt;br /&gt;
=== Caching in Typo3 Extensions - Cache Mechanismen ===&lt;br /&gt;
[[Typo3 - Caching in Extensions]]&lt;br /&gt;
&lt;br /&gt;
=== Typo3 Extensions programmieren - Nützliche Funktionen ===&lt;br /&gt;
Aus Adventskalender 2008 typo3blog &lt;br /&gt;
&lt;br /&gt;
Interessante Funktionen aus der Klasse t3lib_div vor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. t3lib_div::array2json($data)&lt;br /&gt;
Mit dieser Funktion kann man sehr einfach seine Daten in ein JSON Objekt konvertieren. Die Funktion erwartet ein Array mit den Daten, dieses kann beliebig verschachtelt sein. Natürlich gibt es auch noch die PHP native Funktion json_encode, jedoch muss dies von der installierten PHP Installation unterstüzt werden.&lt;br /&gt;
&lt;br /&gt;
2. t3lib_div::convUmlauts($str)&lt;br /&gt;
Eine sehr nützliche Funktion ist convUmlauts, welche die deutschen Umlaute konvertiert, dabei wird aus einem Ä eine Ae oder aus einem ü ein ue. Groß und Klein-Schreibung wird also berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
3. t3lib_div::rmFromList($element, $list)&lt;br /&gt;
Auch diese Funktion ist sehr nützlich. Möchte man aus einer kommaseparierten Liste ein Element entfernen, ist dies mit einem Funktionsaufruf getan. Gerade bei TYPO3 ist diese Funktion sehr hilfreich, wenn man z.B. eine Benutzergruppe eines FE-Users entfernen möchte.&lt;br /&gt;
&lt;br /&gt;
=== Typo3 Extensions programmieren - Sprachlabels ===&lt;br /&gt;
==== Probleme mit Umlauten ====&lt;br /&gt;
Bei den Sprachdateien locallang.xml etc. kann es Probleme mit Umlauten geben, wenn die Codierung der Datei nicht mit der der Typo3 Installation zusammen passt. Es funktioniert aber automatisch, wenn man die Codierung der xml Datei im Header angibt angibt. Also oben z.B. reinschreiben:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; standalone=&amp;quot;yes&amp;quot; ?&amp;gt;&lt;br /&gt;
=== Typo3 Extension - Sicherheit ===&lt;br /&gt;
[[Typo3 Extensions programmieren - Sicherheit]]&lt;br /&gt;
&lt;br /&gt;
=== Typo3 Extensions - JavaScript Frameworks nutzen ===&lt;br /&gt;
Nutzen von jquery, extJS und Konsorten in Typo3&lt;br /&gt;
[[Typo3 Extensions - JavaScript Frameworks nutzen]]&lt;br /&gt;
&lt;br /&gt;
== Wichtige Variablen ==&lt;br /&gt;
 $_EXTKEY &lt;br /&gt;
bzw. im Array...&lt;br /&gt;
Enthält den Extension Key.  Immer die Variable benutzen, dann kann man den Code leichte wieder verwenden.&lt;br /&gt;
 $TYPO3_CONF_VARS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wie arbeitet eine Extension ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Laden:&amp;#039;&amp;#039;&amp;#039; Extension Manager (EM) ruft &amp;#039;&amp;#039;ext_emconf.php&amp;#039;&amp;#039; (enthält nur das Array: $EM_CONF[$_EXTKEY]) bei allen Extensions auf die in der localconf.php aufgeführt sind.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Aufruf von Backend oder Frontend:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;ext_localconf.php&amp;#039;&amp;#039; wird ausgeführt (oder eine gecachete Kopie) In dieser wird die /typo3conf/localconf.php erweitert.&lt;br /&gt;
Funktion: weitere Klassen includieren (require_once())&lt;br /&gt;
&lt;br /&gt;
=== Wichtige Dateien einer Extension ===&lt;br /&gt;
&lt;br /&gt;
====ext_emconf.php====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Metadaten&amp;#039;&amp;#039;&amp;#039; wie Name, Kategorie, Status einer Extension - muß vorhanden sein sonst wird die Extension nicht geladen. Die Informationen landen in $EM_CONF[$_EXTKEY] = ARRAY&lt;br /&gt;
&lt;br /&gt;
==== ext_localconf.php ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;TCA Konfiguration für das Backend&amp;#039;&amp;#039;&amp;#039;. (Werte für das Array $TYPO3_CONF_VARS). Z.B. Namen der zu ladenden Klassen, statische TSFiles etc.&lt;br /&gt;
&lt;br /&gt;
Wird immer geladen wenn ein Aufruf in Frontend oder Backend erfolgt. Kann deshalb dazu benutzt werden wichtige Klassendaten zu laden oder Skripte zu inkludieren.&lt;br /&gt;
&lt;br /&gt;
Optional - wird genutzt wenn Sie gefunden wird.&lt;br /&gt;
&lt;br /&gt;
==== ext_tables.php ====&lt;br /&gt;
Erweiterungen für  $&amp;#039;&amp;#039;&amp;#039;TCA&amp;#039;&amp;#039;&amp;#039;(Table Configuration Array). Beschreibungen von Tabellen und Formularen.&lt;br /&gt;
&lt;br /&gt;
Wird außerdem genutzt um den &amp;#039;&amp;#039;&amp;#039;Code von Frontend-Plugins, Modulen oder statischem TypoScript zu laden&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Optional - wird genutzt wenn Sie gefunden wird.&lt;br /&gt;
&lt;br /&gt;
==== Weitere häufige Dateien ====&lt;br /&gt;
ext_tables.sql - SQL Statements für die &amp;#039;&amp;#039;&amp;#039;Datenbank-Tabellen&amp;#039;&amp;#039;&amp;#039; beim Installieren der Extension.&lt;br /&gt;
&lt;br /&gt;
ext_tables_static+adt.sql - SQL Insert Statements für &amp;#039;&amp;#039;&amp;#039;statische Werte in Tabellen&amp;#039;&amp;#039;&amp;#039; (z.B. PLZ Liste).&lt;br /&gt;
&lt;br /&gt;
ext_conf_template.txt&lt;br /&gt;
&lt;br /&gt;
tca.php - Anpassungen für &amp;#039;&amp;#039;&amp;#039;$TCA,&amp;#039;&amp;#039;&amp;#039; Informationen für die Behandlung von Datenbanktabellen&lt;br /&gt;
&lt;br /&gt;
locallang[...].xml und locallang[...].php - &amp;#039;&amp;#039;&amp;#039;Sprachdateien&amp;#039;&amp;#039;&amp;#039; (Begriffe).&lt;br /&gt;
&lt;br /&gt;
====Typische Unterordner (optional)====&lt;br /&gt;
pi1, pi2 - Enthalten Frontend Plugins&lt;br /&gt;
&lt;br /&gt;
mod1, mod2 - Backend Module&lt;br /&gt;
&lt;br /&gt;
sv1, sv2 - Services&lt;br /&gt;
&lt;br /&gt;
=== Wichtige Globale Variablen ===&lt;br /&gt;
$_EXTKEY - der Extension Key&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Formulare im Backend ===&lt;br /&gt;
Das &amp;#039;&amp;#039;&amp;#039;$TCA&amp;#039;&amp;#039;&amp;#039; (Table Configuration Array) bestimmt welche Formularfelder verwendet werden.&lt;br /&gt;
Das Array ist in ext_tables.php(Bereiche: ctrl und feinterface s.u.) und tca.php gespeichert&lt;br /&gt;
&lt;br /&gt;
* Jeder Eintrag im $TCA ist an eine Datenbanktabelle geknüpft&lt;br /&gt;
* Der erste Index ist der Tabellenname.&lt;br /&gt;
* Im zweiten Index gibt es 6 Bereiche: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 ctrl -&amp;gt; Informationen zur Tabelle&lt;br /&gt;
 interface -&amp;gt; Konfiguration für die Auflistung und Darstellung im Backend&lt;br /&gt;
 feInterface -&amp;gt; Eigenschaften für das Frontend Editing&lt;br /&gt;
 columns -&amp;gt; Informationen zu den Feldtypen der Tabelle und der Verarbeitung der Daten (zweiter Index ist hier der Spaltenname)&lt;br /&gt;
 types -&amp;gt; legt fest welche der in columns definierten Spalten dargestellt werden und in welcher Reihenfolge, &lt;br /&gt;
          außerdem Zusatzinfo wie alternative Feldbezeichnung, Palettennummer, style codes...&lt;br /&gt;
 palettes -&amp;gt; Zum Zusammenfassen von mehreren Eingabefeldern, Zusammenstellungen wiederverwenden, Hilfsfelder definieren&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Daten bearbeiten mit TCE und TCEforms ===&lt;br /&gt;
Die im $TCA definierten Daten müssen in irgend einer Form bearbeitet werden. Ein umfangreiches Modul dazu befindet sich  in der Extension CMS (typo3/sysext/cms/layout/db_layout.php. DDas Modul greift auf die &amp;#039;&amp;#039;&amp;#039;Typo3 Core Engine (TCE)&amp;#039;&amp;#039;&amp;#039; zurück, die zum Verarbeiten und Speichern von Daten dient. Die &amp;#039;&amp;#039;&amp;#039;Formulare werden mit der Klasse TCEforms&amp;#039;&amp;#039;&amp;#039; erzeugt. Bearbeitet wird hierbei im Backend.&lt;br /&gt;
&lt;br /&gt;
Immer dann, wenn man die &amp;#039;&amp;#039;&amp;#039;im $TCA eingetragenen Tabellen über Eingabemasken manipulieren&amp;#039;&amp;#039;&amp;#039; will ist des sinnvoll die TCE zu nutzen.&lt;br /&gt;
&lt;br /&gt;
 t3lib_TCEmain -&amp;gt; t3lib/class.t3lib_tce-main.php&lt;br /&gt;
 t3lib_TCEforms -&amp;gt; TCEforms&lt;br /&gt;
&lt;br /&gt;
==== Einsatz in Extensions ====&lt;br /&gt;
Instanz von t3lib_TCEmain erzeugen:&lt;br /&gt;
 require_once(PATH_t3lib.&amp;quot;class.t3lib_tcemain.php&amp;quot;);&lt;br /&gt;
 $tce=t3lib_div::makeInstance(&amp;#039;t3lib_TCEmain&amp;#039;);&lt;br /&gt;
Arrays für Daten und Kommandos erzeugen:&lt;br /&gt;
 $data[tabelle][uid][feld] = wert&lt;br /&gt;
um neue Daten zu schreiben bevor man eine uid hat belegt man uid mit NEW und einem Zufallsstring z.B. NEWo1amh&lt;br /&gt;
 $cmd[tabelle][uid][befehl] = wert&lt;br /&gt;
dabei stehen verschiedene Befehle zur Verfügung:&lt;br /&gt;
 copy, move, delete, localize, version, new&lt;br /&gt;
Die beiden Arrays werden dann mittels &lt;br /&gt;
 $tce-&amp;gt;start($data,$cmd) &lt;br /&gt;
an die TCE übergeben und von &lt;br /&gt;
$tce-&amp;gt;process_cmdmap() &lt;br /&gt;
abgearbeitet.&lt;br /&gt;
&lt;br /&gt;
== Wo finde ich welche Funktionen - Bibliotheken von TYPO3 einbinden und nutzen ==&lt;br /&gt;
Oft sucht man nach benötigten Funktionen. Z.B. wenn man im Backend oder über das alternative Rendering (eid) Core Funktionen braucht. &lt;br /&gt;
Hier mal ein paar Ansätze zum gucken. Dies ist kein zusammenhängender Code nur ein paar Schnipsel um die Hirnwindungen anzuregen &lt;br /&gt;
&lt;br /&gt;
ToDo&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
require_once(PATH_t3lib.&amp;#039;class.t3lib_page.php&amp;#039;);&lt;br /&gt;
require_once(PATH_tslib.&amp;quot;class.tslib_content.php&amp;quot;);&lt;br /&gt;
require_once(PATH_t3lib.&amp;quot;class.t3lib_stdgraphic.php&amp;quot;);&lt;br /&gt;
require_once(PATH_tslib.&amp;quot;class.tslib_gifbuilder.php&amp;quot;); &lt;br /&gt;
require_once (PATH_t3lib . &amp;#039;class.t3lib_htmlmail.php&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
$pid = intval(t3lib_div::_GET(&amp;#039;pid&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
// create object instances:&lt;br /&gt;
&lt;br /&gt;
//$temp_TSFEclassName = t3lib_div::makeInstanceClassName(&amp;#039;tslib_fe&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
$TSFE = new $temp_TSFEclassName($TYPO3_CONF_VARS, $page, 0, true);&lt;br /&gt;
$TSFE-&amp;gt;sys_page = t3lib_div::makeInstance(&amp;#039;t3lib_pageSelect&amp;#039;);&lt;br /&gt;
$TSFE-&amp;gt;tmpl = t3lib_div::makeInstance(&amp;#039;t3lib_tstemplate&amp;#039;);&lt;br /&gt;
$TSFE-&amp;gt;tmpl-&amp;gt;init();&lt;br /&gt;
&lt;br /&gt;
// fetch rootline and extract ts setup:&lt;br /&gt;
$TSFE-&amp;gt;rootLine = $TSFE-&amp;gt;sys_page-&amp;gt;getRootLine(intval($pid));&lt;br /&gt;
$TSFE-&amp;gt;getConfigArray();&lt;br /&gt;
&lt;br /&gt;
// return ts setup array:&lt;br /&gt;
$setup = $TSFE-&amp;gt;tmpl-&amp;gt;setup;&lt;br /&gt;
$conf = $setup[&amp;#039;plugin.&amp;#039;][&amp;#039;tx_rgcarousel_pi1.&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
$myCObj = new tslib_cObj();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Funktionen in Klassendateien auslagern ==&lt;br /&gt;
Oft ist es übersichtlicher Funktionen in eigene Dateien auszulagern. Im tt_news Frontend-Plugin wird das z.B. so gemacht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
require_once (t3lib_extMgm::extPath(&amp;#039;tt_news&amp;#039;) . &amp;#039;lib/class.tx_ttnews_catmenu.php&amp;#039;);&lt;br /&gt;
require_once (t3lib_extMgm::extPath(&amp;#039;tt_news&amp;#039;) . &amp;#039;lib/class.tx_ttnews_helpers.php&amp;#039;);&lt;br /&gt;
require_once (t3lib_extMgm::extPath(&amp;#039;tt_news&amp;#039;) . &amp;#039;lib/class.tx_ttnews_cache.php&amp;#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Klassendateien liegen also im Ordner lib.&lt;br /&gt;
&lt;br /&gt;
Die Dateien enthalten gleichnamige Klassen. Das Objekt dazu wird dann z.B. so erzeugt:&lt;br /&gt;
 $catTreeObj = t3lib_div::makeInstance(&amp;#039;tx_ttnews_catmenu&amp;#039;);&lt;br /&gt;
Typo3 hat also eine eigene Funktion um die Instanz zu erzeugen. Man muß also nicht mit new arbeiten. Der Vorteil ist mir noch nicht klar. Evtl. wird hier noch etwas anderes ausgeführt etwa um die Klasse zu registrieren o.ä.&lt;br /&gt;
&lt;br /&gt;
Drauf zugegriffen wird dann ganz normal z.B.:&lt;br /&gt;
 $catTreeObj-&amp;gt;init($this);&lt;br /&gt;
&lt;br /&gt;
== Wie kann ich eine eigene Extension debuggen? ==&lt;br /&gt;
=== Hilfreiche Extensions zur Entwicklung von Extensions ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;devlog&amp;#039;&amp;#039;&amp;#039; -&amp;gt; schreibt log Einträge in eine Datenbanktabelle. Dazu ruft man an in seiner Extension die Funktion TODO auf und übergibt die Werte die man loggen will.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Extension Development Evaluator  (extdeveval) &amp;#039;&amp;#039;&amp;#039; -&amp;gt; Referenzen aufrufen, Autmatisch Funktionsinfos schreiben u.v.m.&lt;br /&gt;
	&lt;br /&gt;
=== permalink ===&lt;br /&gt;
Wenn man eine eigene Extension schreibt benutzt man zum größten Teil Array, und um den Überblick zu behalten was nach den ganzen schritten in einem Array noch so drin steht hat man die möglichkeit mit einer Funktion das Array schön und sauber in einer tabelle anzeigen zu lassen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
PHP-Code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$data = array(&amp;quot;Name&amp;quot; =&amp;gt; &amp;quot;Peter KeineAhnung&amp;quot;, &amp;quot;Alter&amp;quot; =&amp;gt; 22, &amp;quot;Wohnort&amp;quot; =&amp;gt; &amp;quot;Ratingen&amp;quot;);&lt;br /&gt;
t3lib_div::debug($data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergebnis:&lt;br /&gt;
&lt;br /&gt;
je nach devIPMask Einstellungen ist auch nur&lt;br /&gt;
&lt;br /&gt;
PHP-Code:&lt;br /&gt;
&lt;br /&gt;
 debug();&lt;br /&gt;
&lt;br /&gt;
nützlich, vor allem wenn ein Kundenprojekt Online ist einfach im Installtool und devIpMask deine IP eingeben und dann mit debug(); arbeiten, so kannst nur du den debug sehen und nicht irgendwelche User die grade auf der Site sind.&lt;br /&gt;
&lt;br /&gt;
Kleiner Zusatz Tip:&lt;br /&gt;
&lt;br /&gt;
Ihr lasst euch gleichzeitig mehrere Debugs ausgeben und verliert den überblick welcher debug welcher ist... Beispiel Ihr lasst euch ein Array vor einer funktion debugen und anschliessend...&lt;br /&gt;
&lt;br /&gt;
da habt ihr dann die möglichkeit euerem Debug einen Namen zu geben..&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
PHP-Code:&lt;br /&gt;
 $data = array(&amp;quot;Name&amp;quot; =&amp;gt; &amp;quot;Peter KeineAhnung&amp;quot;, &amp;quot;Alter&amp;quot; =&amp;gt; 22);&lt;br /&gt;
 t3lib_div::debug(,&amp;#039;Array vorher&amp;#039;);&lt;br /&gt;
        &lt;br /&gt;
 $data[&amp;#039;Name&amp;#039;] = &amp;#039;T.uX&amp;#039;;&lt;br /&gt;
 $data[&amp;#039;Alter&amp;#039;] = 32;&lt;br /&gt;
&lt;br /&gt;
 t3lib_div::debug(,&amp;#039;Array nachher&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
Auch bei der Verwendung der integrierten DB-Abstraktionsschicht können eine Reihe von Fehlern auftreten, die teilweise nur sehr magere Fehlermeldungen produzieren. Um eine etwas explizitere Fehlerausgabe zu erzwingen sollte man folgende Zeile in seine Extension integrieren*:&lt;br /&gt;
&lt;br /&gt;
PHP-Code:&lt;br /&gt;
 $GLOBALS[&amp;#039;TYPO3_DB&amp;#039;]-&amp;gt;debugOutput = true;&lt;br /&gt;
So wird z.B. das SQL-Stement Ausgegeben, das zu einem Fehler geführt hat.&lt;br /&gt;
&lt;br /&gt;
== Datenbankabfrage in Extensions ==&lt;br /&gt;
[[TYPO3 - Datenbankabfragen in Extensions]]&lt;br /&gt;
&lt;br /&gt;
== Struktur einer Extension ==&lt;br /&gt;
===ext_emconf.php===&lt;br /&gt;
&lt;br /&gt;
Informationen und Metadaten zur Extension. Etwa die Infos die im Kickstarter unter General Info stehen.&lt;br /&gt;
&lt;br /&gt;
* Root-Verzeichnis&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;ext_localconf.php&amp;#039;&amp;#039;&amp;#039; Enthält &amp;#039;&amp;#039;&amp;#039;Konfigurationsdaten&amp;#039;&amp;#039;&amp;#039; ($TYPO3_CONF_VARS) für das Backend und Frontend. Hier kann über die Extension API auch &amp;#039;&amp;#039;&amp;#039;TypoScript&amp;#039;&amp;#039;&amp;#039; eingebunden werden. Hier können auch Klassendateien aufgerufen werden (require_once() ) die bei jedem Aufruf zur Verfügung stehen sollen.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;ext_tables.php&amp;#039;&amp;#039;&amp;#039; Konfiguration von &amp;#039;&amp;#039;&amp;#039;Datenbanktabellen&amp;#039;&amp;#039;&amp;#039;. Plugins und Module über die Extension API einbinden. (Alles über Kickstarter)&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;ext_tables.sql&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;SQL-Daten&amp;#039;&amp;#039;&amp;#039; für die Tabellendefinition. Die Auswertung erfolgt über den Extension Manager und das Install-Tool.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;ext_tables_static+adt.sql&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;SQL-Tabellendefinition&amp;#039;&amp;#039;&amp;#039; inkl. Daten. Z.B. für statische Daten (Länderinfos etc.)Die Tabellen müssen zusätzlich in ext_tables.sql definiert sein.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;ext_typoscript_*.txt&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;Globaler TypoScript-Code&amp;#039;&amp;#039;&amp;#039;. Steht nicht üver Template-Datensätze zur Auswahl (siehe /static)&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;ext_conf_template.txt&amp;#039;&amp;#039;&amp;#039; Hier werden &amp;#039;&amp;#039;&amp;#039;Optionen zur Konfiguration&amp;#039;&amp;#039;&amp;#039; angelegt, die der Benutzer im Extensionmanager einstellen kann.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;*icon*.gif&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;Symbol-Dateien&amp;#039;&amp;#039;&amp;#039; für Extension,DB-Tabellen,Plugins, Module...&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;locallang*.php&amp;#039;&amp;#039;&amp;#039; Texte für die &amp;#039;&amp;#039;&amp;#039;Lokalisierung&amp;#039;&amp;#039;&amp;#039; in verschiedenen Sprachen&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;class.ext_update.php&amp;#039;&amp;#039;&amp;#039; Funktionen für ein &amp;#039;&amp;#039;&amp;#039;Update der Extension&amp;#039;&amp;#039;&amp;#039; (Beispiel siehe newloginbox).&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;pi1/&amp;#039;&amp;#039;&amp;#039; Verzeichnis für &amp;#039;&amp;#039;&amp;#039;Skripte und Daten&amp;#039;&amp;#039;&amp;#039; des Plugin&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;class*.php&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;PHP-Klassen&amp;#039;&amp;#039;&amp;#039; z.B. für Plugins oder Submodule&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;cm1/&amp;#039;&amp;#039;&amp;#039; Verzeichnis für Dateien die das &amp;#039;&amp;#039;&amp;#039;Kontext-Menü&amp;#039;&amp;#039;&amp;#039; betreffen&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;mod1/&amp;#039;&amp;#039;&amp;#039; Verzeichnis für ein Modul.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;conf.php&amp;#039;&amp;#039;&amp;#039; Konfigurationsdatei für ein &amp;#039;&amp;#039;&amp;#039;Modul&amp;#039;&amp;#039;&amp;#039; zum einbinden ins Backend.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;index.php&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;Hauptscript eines Moduls&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;modfunc1/&amp;#039;&amp;#039;&amp;#039; Skripte und Daten für &amp;#039;&amp;#039;&amp;#039;Submodul-Funktionen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;static/&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;TypoScript-Template&amp;#039;&amp;#039;&amp;#039;-Dateien. Diese werden über die Extension-API eingebunden und stehen dann in Template-Datensätzen, ähnlich den Standard Templates zur Auswahl.&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;sv1/&amp;#039;&amp;#039;&amp;#039; Verzeichnis für &amp;#039;&amp;#039;&amp;#039;Services&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;res/&amp;#039;&amp;#039;&amp;#039; Verzeichnis für beliebige &amp;#039;recourcen&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;doc/&amp;#039;&amp;#039;&amp;#039; Verzeichnis der &amp;#039;&amp;#039;&amp;#039;Dokumentation&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Wo werden Extensions installiert ? ==&lt;br /&gt;
===typo3/sysext/ (System)===&lt;br /&gt;
System Extensions wie cms und lang. Hier können keine Extensions mit dem Extension Manager installiert werden.&lt;br /&gt;
===typo3/ext/ - globale Extensions (Global) ===&lt;br /&gt;
Z.B. diese die von Typo3 mitgeliefert werden. Mit der Option allowGlobalInstall kann man die Installation in dieses Verzeichnis erlauben. Das ist dann nicht sinnvoll wenn sich mehrere Typo3 WEbsites eine Installation teilen, weil es hier zu Versionskonflikten kommen kann.&lt;br /&gt;
===typo3conf/ext - lokale Extensions (Local)===&lt;br /&gt;
Hier werden normalerweise alle Extensions installiert. Die Lokale Installation hat immer Vorang vor einer globalen.&lt;br /&gt;
&lt;br /&gt;
== Typolinks richtig in Extensions einsetzen ==&lt;br /&gt;
&lt;br /&gt;
In diesem kurzem Tutorial möchte ich zeigen, wie man Typolinks in eigenen Erweiterungen erstellt, die das&lt;br /&gt;
Feature &amp;#039;Simulate Static Documents&amp;#039; unterstützen und eine Ausgabe erstellen, die von Typo3 gecached wird&lt;br /&gt;
und so auch mit der Indexed search verwendet werden können. Diese Informationen wurden aus anderen&lt;br /&gt;
Erweiterungen zusammengetragen, speziell aus der Erweiterung tt_board.&lt;br /&gt;
Typoscript&lt;br /&gt;
Zuerst erstelle in der Datei &amp;#039;ext_typoscript_setup.txt&amp;#039; eine Eigenschaft, die deiner Erweiterung mitteilt, ob&lt;br /&gt;
caching genutzt werden soll oder nicht:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plugin.tx_myextension_pi1 {&lt;br /&gt;
allowCaching = 1&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn das später auf 0 gesetzt wird, werden diese Seiten nicht mehr gecached.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Vorbereitung&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Bereite in der main() Funktion den Typolink vor und konfiguriere das caching:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class tx_myextension_pi1 extends tslib_pibase {&lt;br /&gt;
...&lt;br /&gt;
var $allowCaching = &amp;quot;&amp;quot;;&lt;br /&gt;
function main($content,$conf) {&lt;br /&gt;
$this-&amp;gt;conf=$conf;&lt;br /&gt;
...&lt;br /&gt;
// Preconfigure the typolink&lt;br /&gt;
$this-&amp;gt;local_cObj = t3lib_div::makeInstance(&amp;quot;tslib_cObj&amp;quot;);&lt;br /&gt;
$this-&amp;gt;local_cObj-&amp;gt;setCurrentVal($GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;id);&lt;br /&gt;
$this-&amp;gt;typolink_conf = $this-&amp;gt;conf[&amp;quot;typolink.&amp;quot;];&lt;br /&gt;
$this-&amp;gt;typolink_conf[&amp;quot;parameter.&amp;quot;][&amp;quot;current&amp;quot;] = 1;&lt;br /&gt;
$this-&amp;gt;typolink_conf[&amp;quot;additionalParams&amp;quot;] =&lt;br /&gt;
$this-&amp;gt;cObj-&amp;gt;stdWrap($this-&amp;gt;typolink_conf[&amp;quot;additionalParams&amp;quot;],&lt;br /&gt;
$this-&amp;gt;typolink_conf[&amp;quot;additionalParams.&amp;quot;]);&lt;br /&gt;
unset($this-&amp;gt;typolink_conf[&amp;quot;additionalParams.&amp;quot;]);&lt;br /&gt;
// Configure caching&lt;br /&gt;
$this-&amp;gt;allowCaching = $this-&amp;gt;conf[&amp;quot;allowCaching&amp;quot;]?1:0;&lt;br /&gt;
if (!$this-&amp;gt;allowCaching) {&lt;br /&gt;
$GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;set_no_cache();&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
Links erstellen&lt;br /&gt;
Um nun Links in der Erweiterung zu erstellen, benutze das folgende Code Fragment:&lt;br /&gt;
$temp_conf = $this-&amp;gt;typolink_conf;&lt;br /&gt;
$temp_conf[&amp;quot;additionalParams&amp;quot;] .= &amp;quot;&amp;amp;tx_myextension_pi1[key]=value&amp;quot;;&lt;br /&gt;
$temp_conf[&amp;quot;useCacheHash&amp;quot;] = $this-&amp;gt;allowCaching;&lt;br /&gt;
$temp_conf[&amp;quot;no_cache&amp;quot;] = !$this-&amp;gt;allowCaching;&lt;br /&gt;
$the_link = $this-&amp;gt;local_cObj-&amp;gt;typolink(&amp;quot;Linktext&amp;quot;, $temp_conf);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach kann man &amp;#039;$the_link&amp;#039; zu der Ausgabe hinzufügen. Das &amp;#039;$temp_conf&amp;#039; Array kann man mit allen&lt;br /&gt;
Eigenschaften des typolink Objektes erweitern.&lt;br /&gt;
&lt;br /&gt;
Tutorial by typo3.hachmeister.org&lt;br /&gt;
Von:fruit-lab.de&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Datei Uploads in Backend Extensions ==&lt;br /&gt;
Feld im Kickstarter anlegen. in der tca.php kannst du den uploadfolder festlegen.&lt;br /&gt;
&lt;br /&gt;
Komplizierter wirds in folgendem Fall (aus typo3.net 12-2007)&lt;br /&gt;
&lt;br /&gt;
 stimmt schon, dass man da den ordner ändern kann, aber was wenn ich nicht alle dateien in einen ordner speichern will?&lt;br /&gt;
ich brauche 2 ordner. einen für normale downloads und in den anderen würden die dateien reinkommen, die kostenpflichtig downzuloaden sind. diesen ordner muss ich also per htaccess schützen. darum wärs nötig, dass der upload-ordner für den späteren redakteur frei wählbar, oder zumindest 2 ordner auswählbar sind.&lt;br /&gt;
&lt;br /&gt;
irgendwelche ideen?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
alles kein Problem.&lt;br /&gt;
&lt;br /&gt;
Man kann in der ext_emconf.php unter createDirs die benötigten Verzeichnisse angeben.&lt;br /&gt;
Für Fileupload gibts auch einige Typofunktionen die man nutzen kann, so helfen einem folgende Klassen weiter:&lt;br /&gt;
t3lib_basicFileFunctions&lt;br /&gt;
t3lib_extFileFunctions&lt;br /&gt;
&lt;br /&gt;
== Debug Methode ==&lt;br /&gt;
Typo3 | Debug Methode :: Hilfe bei der Programmierung&lt;br /&gt;
&lt;br /&gt;
Wenn man eine eigene Extension schreibt benutzt man zum größten Teil Array, und um den Überblick zu&lt;br /&gt;
behalten was nach den ganzen schritten in einem Array noch so drin steht hat man die möglichkeit mit einer Funktion das Array schön und sauber in einer tabelle anzeigen zu lassen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$data = array(&amp;quot;Name&amp;quot; =&amp;gt; &amp;quot;Peter KeineAhnung&amp;quot;, &amp;quot;Alter&amp;quot; =&amp;gt; 22, &amp;quot;Wohnort&amp;quot; =&amp;gt; &amp;quot;Ratingen&amp;quot;);&lt;br /&gt;
echo t3lib_div::debug($data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergebnis:&lt;br /&gt;
&lt;br /&gt;
[[Bild:TS_debug01.gif]]&lt;br /&gt;
&lt;br /&gt;
je nach devIPMask Einstellungen ist auch nur&lt;br /&gt;
 debug($sonstwas);&lt;br /&gt;
nützlich, vor allem wenn ein Kundenprojekt Online isteinfach im Installtool und devIpMask deine IP eingeben und dann mit debug($sonstwas); arbeiten, so kannst nur du den debug sehen und nicht irgendwelche User die grade auf der Site sind.&lt;br /&gt;
&lt;br /&gt;
Kleiner Zusatz Tip:&lt;br /&gt;
&lt;br /&gt;
Ihr lasst euch gleichzeitig mehrere Debugs ausgeben und verliert den überblick welcher debug welcher ist...&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Ihr lasst euch ein Array vor einer funktion debugen und anschliessend...&lt;br /&gt;
da habt ihr dann die möglichkeit euerem Debug einen Namen zu geben..&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$data = array(&amp;quot;Name&amp;quot; =&amp;gt; &amp;quot;Peter KeineAhnung&amp;quot;, &amp;quot;Alter&amp;quot; =&amp;gt; 22, &amp;quot;Wohnort&amp;quot; =&amp;gt; &amp;quot;Ratingen&amp;quot;);&lt;br /&gt;
echo t3lib_div::debug($data,&amp;#039;Array vorher&amp;#039;);&lt;br /&gt;
$data[&amp;#039;Name&amp;#039;] = &amp;#039;T.uX&amp;#039;;&lt;br /&gt;
$data[&amp;#039;Alter&amp;#039;] = 32;&lt;br /&gt;
echo t3lib_div::debug($data,&amp;#039;Array nachher&amp;#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergebnis:&lt;br /&gt;
&lt;br /&gt;
[[Bild:TS_debug02.gif]]&lt;br /&gt;
&lt;br /&gt;
Hinweis:&lt;br /&gt;
läst du dir eine Variable im debug ausgeben erscheint [b]|debug|[/b]. das funzt nur mit Arrays ;-)&lt;br /&gt;
Auch bei der Verwendung der integrierten DB-Abstrktionsschicht können eine Reihe von Fehlern auftreten,&lt;br /&gt;
die teilweise nur sehr magere Fehlermeldungen produzieren. Um eine etwas explizitere Fehlerausgabe zu&lt;br /&gt;
erzwingen sollte man folgende Zeile in seine Extension integrieren*:&lt;br /&gt;
$GLOBALS[&amp;#039;TYPO3_DB&amp;#039;]-&amp;gt;debugOutput = true;&lt;br /&gt;
&lt;br /&gt;
So wird z.B. das SQL-Stement Ausgegeben, das zu einem Fehler geführt hat.&lt;br /&gt;
Tutorial by typo3.kj187.de&lt;br /&gt;
&lt;br /&gt;
== PHP-Skripte einbinden ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== mit PHP_SCRIPT ===&lt;br /&gt;
&lt;br /&gt;
Im Typo Script:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
##############################&lt;br /&gt;
### temporäres Test Script ###&lt;br /&gt;
##############################&lt;br /&gt;
&lt;br /&gt;
temp.phpScript = PHP_SCRIPT&lt;br /&gt;
temp.phpScript {&lt;br /&gt;
   file = demo/test.inc.php&lt;br /&gt;
   myVerySpecialOwnParameter = Hallo Welt&lt;br /&gt;
   myParamArray {&lt;br /&gt;
      a = 2&lt;br /&gt;
      b = 5&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Im Skript text.inc.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Use the debug-function to view the config&lt;br /&gt;
// array $conf given by TypoScript:&lt;br /&gt;
debug( $conf );&lt;br /&gt;
&lt;br /&gt;
$contentArr[] = &amp;quot;Test&amp;quot;;&lt;br /&gt;
$contentArr[] = $conf[&amp;#039;file&amp;#039;];&lt;br /&gt;
$contentArr[] = $conf[&amp;#039;myVerySpecialOwnParameter&amp;#039;];&lt;br /&gt;
$contentArr[] = implode( $conf[&amp;#039;myParamArray.&amp;#039;], &amp;#039;, &amp;#039; );&lt;br /&gt;
&lt;br /&gt;
// Put all your output to $content,&lt;br /&gt;
// that TYPO3 will display for you:&lt;br /&gt;
$content = implode( $contentArr, &amp;#039;&amp;lt; br /&amp;gt;&amp;#039; );&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== mit PHP_SCRIPT_EXT ===&lt;br /&gt;
Typo3 | Externe PHP Scripte einbinden&lt;br /&gt;
&lt;br /&gt;
Haben Sie ihr Projekt auf Typo3 umgestellt und wollen dennoch ihre eigenen PHP-Scripte verwenden? Dann machen Sie folgendes.&lt;br /&gt;
&lt;br /&gt;
Schreiben Sie in das SETUP Feld des Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tt_content.script = CASE&lt;br /&gt;
tt_content.script {&lt;br /&gt;
key.field = select_key&lt;br /&gt;
test = PHP_SCRIPT_EXT&lt;br /&gt;
test.file = fileadmin/dein_script.php&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um das Script jetzt als Contentelement in die Seite einzubinden, legen Sie einen neuen Seiteninhalt an. Wechseln Sie von Typ = Text auf Typ = Skript. In das CODE Feld müssen Sie jetzt nur noch test eintragen und sie sind fertig. &lt;br /&gt;
&lt;br /&gt;
Dies ist die einfachste Methode. Die Ausgabe des Scripts wird aber nicht in den Cache aufgenommen! Diese Funktion wird leider nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
Tutorial by typo3.kj187.de&lt;br /&gt;
&lt;br /&gt;
Anmerkung Steff: Für die Cache Funktion kann man z.B. eine Einfache Extension basteln.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
===Einträge aus Bildausrichtungen im Backend entfernen===&lt;br /&gt;
aus cron_cssstyledimgtext&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
if (!defined (&amp;#039;TYPO3_MODE&amp;#039;))     die (&amp;#039;Access denied.&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
t3lib_extMgm::addPItoST43($_EXTKEY,&amp;#039;pi1/class.tx_croncssstyledimgtext_pi1.php&amp;#039;,&amp;#039;_pi1&amp;#039;,&amp;#039;&amp;#039;,1);&lt;br /&gt;
&lt;br /&gt;
$_EXTCONF = unserialize($_EXTCONF);&lt;br /&gt;
if ($_EXTCONF[&amp;#039;addPageTS&amp;#039;])	{&lt;br /&gt;
	t3lib_extMgm::addPageTSConfig(&amp;#039;&lt;br /&gt;
TCEFORM.tt_content.imageorient.types.image.removeItems = 8,9,10,17,18,25,26&lt;br /&gt;
&amp;#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;FE&amp;#039;][&amp;#039;XCLASS&amp;#039;][&amp;#039;tslib/class.tslib_content.php&amp;#039;]=t3lib_extMgm::extPath($_EXTKEY).&amp;#039;class.ux_tslib_content.php&amp;#039;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Bilder in eigener Extension rendern ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel benutzte Variablen:&lt;br /&gt;
 $BildAdresse&lt;br /&gt;
 $ParameterFuerImgTag&lt;br /&gt;
 $Alttext&lt;br /&gt;
&lt;br /&gt;
In PHP-Datei der Extension:&lt;br /&gt;
&lt;br /&gt;
 $this-&amp;gt;conf[&amp;quot;imageBeispiel.&amp;quot;][&amp;quot;file&amp;quot;]=&amp;quot;uploads/pics/&amp;quot;.$BildAdresse;&lt;br /&gt;
 $this-&amp;gt;conf[&amp;quot;imageBeispiel.&amp;quot;][&amp;quot;params&amp;quot;]=$ParameterFuerImgTag;&lt;br /&gt;
 $this-&amp;gt;conf[&amp;quot;imageBeispiel.&amp;quot;][&amp;quot;altText&amp;quot;]=$Alttext;&lt;br /&gt;
 $Bild=$this-&amp;gt;cObj-&amp;gt;IMAGE($this-&amp;gt;conf[&amp;quot;imageBeispiel.&amp;quot;]);&lt;br /&gt;
 $Content.=$Bild;&lt;br /&gt;
&lt;br /&gt;
In Typoscript Setup&lt;br /&gt;
&lt;br /&gt;
 plugin.tx_hoTest_pi1 {     //hier Plugin-Name&lt;br /&gt;
 imageArtikel{&lt;br /&gt;
     file.maxW = {$ho_Test.BildWidthNews}  &lt;br /&gt;
     imageLinkWrap = 1&lt;br /&gt;
     imageLinkWrap {&lt;br /&gt;
       enable = 1&lt;br /&gt;
       bodyTag = &amp;lt;BODY bgColor=white&amp;gt;&lt;br /&gt;
       wrap = |&lt;br /&gt;
       width = 400m&lt;br /&gt;
       height = 400&lt;br /&gt;
       JSwindow = 1&lt;br /&gt;
       JSwindow.newWindow = 1&lt;br /&gt;
       JSwindow.expand = 17,20&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Der Wert {$ho_Test.BildWidthNews} kann aus Constants übernommen werden.&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch&lt;br /&gt;
Konstanten von Constants im Setup verwenden&lt;br /&gt;
und&lt;br /&gt;
Konstanten für Constant-Editor bereitstellen&lt;br /&gt;
&lt;br /&gt;
(aus www.easy-office4you.de/ 10.1.2006)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Spalten der Seiten umbenennen ===&lt;br /&gt;
&lt;br /&gt;
Um die Spalten der Seite im Backend beliebig umzubenennen und/oder zusätzliche eigene Spalten zu verwenden, muß die Extension zed_more_columns installiert werden und dann in der Datei ext_tables.php die Spalten-Namen eingeben werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
 $TCA[&amp;quot;tt_content&amp;quot;][&amp;quot;columns&amp;quot;][&amp;quot;colPos&amp;quot;][&amp;quot;config&amp;quot;][&amp;quot;items&amp;quot;] = array (&lt;br /&gt;
 &amp;quot;0&amp;quot; =&amp;gt; array (&amp;quot;Mitte||Mitte||||||||&amp;quot;,&amp;quot;0&amp;quot;),&lt;br /&gt;
 &amp;quot;1&amp;quot; =&amp;gt; array (&amp;quot;Links||Links||||||||&amp;quot;,&amp;quot;1&amp;quot;),&lt;br /&gt;
 &amp;quot;2&amp;quot; =&amp;gt; array (&amp;quot;Rechts||Rechts||||||||&amp;quot;,&amp;quot;2&amp;quot;),&lt;br /&gt;
 &amp;quot;3&amp;quot; =&amp;gt; array (&amp;quot;Teaser||Teaser||||||||&amp;quot;,&amp;quot;3&amp;quot;),&lt;br /&gt;
 &amp;quot;4&amp;quot; =&amp;gt; array (&amp;quot;Fusszeile||Fusszeile||||||||&amp;quot;,&amp;quot;4&amp;quot;)&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
== Bei Extension dafür sorgen, daß im Backend kein Sortierungs-Button entsteht ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In der Datei ext_tables.php der Extension folgende Zeile ändern&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;sortby&amp;quot; =&amp;gt; &amp;quot;name&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
ändern in&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;default_sortby&amp;quot; =&amp;gt; &amp;quot;ORDER BY name&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
Anstatt &amp;quot;name&amp;quot; kann natürlich auch ein anderes Suchkriterium verwendet werden.&lt;br /&gt;
&lt;br /&gt;
== Ausgaben im HTML-Header in Extensions programmieren ==&lt;br /&gt;
Manchmal möchte man bestimmte Angaben in den Header schreiben, um zum Beispiel ein JavaScript einzubinden o.ä.&lt;br /&gt;
&lt;br /&gt;
Man könnte im statischen TypoScript für das Objekt page etwas hernehmen. Das funktioniert aber nur wenn das PAGE Objekt auch wirklich page heißt.&lt;br /&gt;
&lt;br /&gt;
Also besser mit einer Typo3 Eigenen Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel - JavaScript einbinden&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function includeJavaScript() {&lt;br /&gt;
  $js .= &amp;#039;&amp;lt;script src=&amp;quot;&amp;#039;.t3lib_extMgm::siteRelPath($this-&amp;gt;extKey).dirname($this-&amp;gt;scriptRelPath).&amp;#039;/JS-Verzeichnis/js-file.js&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;!-- //--&amp;gt;&amp;lt;/script&amp;gt;&amp;#039;;&lt;br /&gt;
  $GLOBALS[&amp;#039;TSFE&amp;#039;]-&amp;gt;additionalHeaderData[$this-&amp;gt;extKey] = $js;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Aufruf der Funktion:&lt;br /&gt;
$content=$this-&amp;gt;includeJavaScript(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Variable $this-&amp;gt;extKey wird normalerweise immer in der Klassendefinition der Extensiongesetzt und enthält den Namen der Extension (z.B. meineextension)&lt;br /&gt;
&lt;br /&gt;
Für $this-&amp;gt;scriptRelPath gilt das gleiche. Hier steht der Pfad ab dem Extension Ordner (z.B. pi1/class.tx_meineExtension_pi1.php)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachige Extensions ==&lt;br /&gt;
Seit der Version 4 hat sich die Vorgehensweise bei der Lokalisierung geändert. Um zu verstehen wie die Lokalisierung von Backend, Frontend etc. funktioniert gibt es hier eine kleine Übersicht:&lt;br /&gt;
[[Sprachverwaltung und Lokalisierung in Typo3]]&lt;br /&gt;
&lt;br /&gt;
== $GLOBALS[&amp;#039;TSFE&amp;#039;] ==&lt;br /&gt;
&lt;br /&gt;
TSFE ist ein Abbild der Klasse tslib_fe, die kannst Du auch untersuchen.&lt;/div&gt;</summary>
		<author><name>109.193.152.215</name></author>
	</entry>
</feed>