Zum Inhalt springen

herangehensweise einer Extension programmierung

Erstellt am 11. November 2010 · 6 Antworten · letzte Antwort am 16. November 2010

Tags: Frage

maSuL ·

Hallo Leute,

ich wollte mal fragen wie man bei einer Extension Entwicklung vorgeht.

ich habe folgende Bücher gelesen:

1. Typo3 Kochbuch - von O'reilly
2. Typo3 und Typoscript Kochbuch - von Hanser
3. typo3 enterprise content manamgent
4. Typo3 Extension entwickeln - Addison Wesley
5. Typo3 das Handbuch für Entwickler - Galileo Computing)

dort wird detailiert beschrieben wie eine Extension aufgebaut ist je doch nicht wie man herangehen soll.

Hier ein beispiel:
ich möchte berechnen wieviel Mann und Frau eingenommen haben, als nächtest soll das ergebnis zusammen addiert werden und von Handy-, Internet, Essen, Bahnticket abgezogen in die Datendabnk gespeichert und als Tabelle ausgegeben werden
(siehe screenshot)

dies hab ich als PHP code realisiert, doch wie man ich es als extension?
hier der PHP CODE:

<form action="rechnung.php" method="post">

<table width="400" border="0">
  <tr>
    <td>frau einnahmen:</td>
    <td align="right"> <input type="text" name="frau"/> </td>
  </tr>
  <tr>
    <td>mann einnahmen:</td>
    <td align="right"><input type="text" name="mann"/></td>
  </tr>
  <tr>
    <td>Handy rechnung: </td>
    <td align="right"><input type="text" name="handyRechnung"/> </td>
  </tr>
  <tr>
    <td>Internet rechnung:</td>
    <td align="right"><input type="text" name="InternetRechnung"/> </td>
  </tr>
  <tr>
    <td>Essen im monat:</td>
    <td align="right"><input type="text" name="essenMonat"/></td>
  </tr>
  <tr>
    <td>Bahn Ticket einnahmen:</td>
    <td align="right"><input type="text" name="bahnTicket"/> </td>
  </tr>
  <tr>
    <td> </td>
    <td> </td>
  </tr>
  <tr>
    <td></td>
    <td align="right"><input type="submit" name="submit" value="Berechnen" /> </td>
  </tr>
</table>
<br />
<br />

</form>
<br />
<br />
<br />
<br />
<?php error_reporting(E_ALL); ini_set('display_errors', 1);

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// 	Datenbank Vervindung wird Hergestellt

$db = mysqli_connect('localhost', 'root', '', 'haushalt')
    or die('Fehler beim Verbinden mit MySQL-Server.');
// 	Datenbank Vervindung wird Hergestellt		
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// 	Überprüfen ob die daten gesetzt werden
if( isset( $_POST["frau"] )    && is_numeric( $_POST["frau"] ) && 
    isset( $_POST["mann"] ) && is_numeric( $_POST["mann"] ) )
{

	//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	// 	Post veriable umwandeln 
		 
	$einnahmen =  $_POST["frau"] 
				+ $_POST["mann"];
			   
	$ausgabe =    $_POST["handyRechnung"] 
				+ $_POST["InternetRechnung"] 
				+ $_POST["essenMonat"]
				+ $_POST["bahnTicket"];
	
	$ergebnis = $einnahmen - $ausgabe;
	
	$frau     = $_POST["frau"];
	$mann  = $_POST["mann"];
	$internet = $_POST["InternetRechnung"];
	$bahnticket = $_POST["bahnTicket"];
	$essen = $_POST["essenMonat"];
	
	// 	Post veriable umwandeln 
	//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
     

	//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	// 	Wenn die "berechnen" geklickt wird sollen die daten eingefügt
	if( isset($_POST['submit']) )
	{
		$sql_insert = "INSERT INTO rechnung (frau_einahmen, mann_einahmen, ausgaben,bahnticket, internet ,essen, netto, einnahmen )" .   
		"VALUES ('$frau', '$mann', '$ausgabe',  '$bahnticket', '$internet', '$essen', $ergebnis , '$einnahmen' )" ; 
				
		$result = mysqli_query( $db, $sql_insert)      
		or die("fehler bei result".mysqli_error($db));		
	}
	// 	Wenn die "berechnen" geklickt wird sollen die daten eingefügt
	//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
	
	//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	// 	Daten werden ausgewählt von der datenbank
	
 	$sql_select = "SELECT *  FROM rechnung"; 		
 	$result     = mysqli_query($db, $sql_select) ;
	// 	Daten werden ausgewählt von der datenbank
	//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 
	//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	// 	Tabellen kopf
 
	echo '<table bgcolor="F3F3F3"  cellpadding="5" cellspacing="0" width="900" border="1">';
	echo 	'<tr style="background:#EAEAEA none 0 0;">';
	echo 		'<td><b>frau Einnahmen</b></td>';	
	echo 		'<td><b>mann Einnahmen</b></td>';
	echo 		'<td><b>Einnahmen zusammen</b></td>';		
	echo 		'<td><b>ausgaben von beide</b></td>';
	echo 		'<td><b>U-Bahn Ticket</b></td>';		
	echo 		'<td><b>Internet</b></td>';				
	echo 		'<td><b>Essen</b></td>';
	echo 		'<td><b>Netto</b></td>';		
	echo   '</tr> ';
		
	// 	Tabellen kopf
	//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
			
	//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	// 	Tabellen Körper
	
	
	// variable wird definiert
	$t = '';
	while( $row = mysqli_fetch_assoc($result) )				
	{	
	
		$t.= 	'<tr>';
		$t.= 		'<td><b style="color:green;">'. $row['frau_einahmen'] .'</b></td>';	
		$t.= 		'<td><b style="color:green;">'. $row['mann_einahmen'] .'</b></td>';
		$t.= 		'<td><b style="color:green;">'. $row['einnahmen'] .'</b></td>';		
		$t.= 		'<td>'. $row['ausgaben'] .'</td>';
		$t.= 		'<td>'. $row['bahnticket'] .'</td>';		
		$t.= 		'<td>'. $row['internet'] .'</td>';				
		$t.= 		'<td>'. $row['essen'] .'</td>';	
		$t.= 		'<td ><b style="color:red;">'. $row['netto'] .'</b></td>';			
		$t.=   '</tr> ';		
		
			}	
		echo $t;
	// 	Tabellen Körper	
	//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
		
	//Tabelle schließen	
	
	
	
	
	echo '</table>';

	//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	// Ausgabe
	echo '<br /><br />';
	echo "Zusammen haben beide " . $einnahmen . " € Einnamen<br>";
	echo "Zusammen haben beide " . $ausgabe . " € Ausgaben<br>";
	echo "und können beide  " . $ergebnis . " € Sparen!<br>";
	// Ausgabe
	//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

}

// 	Überprüfen ob die daten gesetzt werden
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
	

mysqli_close($db); 	 ?>

rechnung.jpg

igorshmigor ·

Ich weiß nicht wie das jetzt mit Extbase und Fluid geht, aber mit der Oldschool-Methode war das eigentlich recht einfach.

Erstell mit dem Kickstarter ein Frontend-Plugin. Der Kickstarter wird einen Ordner pi1 anlegen. Darin gibt es dann die Datei class.tx_myextkey_pi1.php. Diese Datei hat eine Klasse tx_myextkey_pi1 mit einer Methode main. Darin kannst du dann deine Programm-Logik für die Frontend-Ausgabe reinschmeissen. Statt alles direkt auszugeben, beispielsweise über echo, sammelst du die Ausgabe in einer Variable, typischerweise $content, und gibst diese dann am Ende der Methode über return $content an TYPO3 zurück. Du kannst auch Teile des HTML-Codes in HTML-Templates auslagern, aber dazu schaust du dir am besten bereits existierende Extensions an, die das so gelöst haben. Überhaupt ist es immer sinnvoll, nach Beispiel-Extensions zu suchen, die etwas ähnliches machen. Die kannst du dann analysieren.

maSuL ·

Hallo igorshmigor,

mir ist bewust das ich änderungen in der class.tx_myextkey_pi1.php vornehmen muss in return $content rein schreiben, aber ich kann doch den php code 1:1 übetragen aus flogenden gründen

1. hab ich eine method="post"
2. eine datendank tabelle namens (frau_einahmen, mann_einahmen, ausgaben,bahnticket, internet ,essen, netto, einnahmen)
3. dann müssen die daten in die datendank mit dem insert rein gepackt werden

http://googlefinden.de/rechnung/index.php hier das script live kannste mal sehen wie es aussieht

igorshmigor ·

Wieso ist "post" ein Problem? Nutz die API. http://doxygen.frozenkiwi.com/typo3/html/df/d32/classtslib__pibase.html
Nutze beispielsweise piVars und pi_linkToPage. Das sollte doch in den Büchern dokumentiert sein. Auch das Schreiben der Daten in die Datenbank ist doch eigentlich vielerorts beschrieben.
Dazu kannst du beispielsweise

exec_INSERTquery ($table, $fields_values, $no_quote_fields=FALSE)

oder

exec_INSERTmultipleRows ($table, array $fields, array $rows, $no_quote_fields=FALSE)

nutzen.

Ich habe das "TYPO3-Profihandbuch", da stehen solche Sachen drin. Ich hätte gedacht, dass auch die Bücher "Typo3 Extension entwickeln" und "Typo3 das Handbuch für Entwickler" solche Fragen klären.

Das Anlegen der Datenbanktabelle ist über den Kickstarter schnell gemacht.

ViktoriaS ·

Hay maSuL!

Also, um es mit den einfachen Worten eines Anfängers auszudrücken:

1.) Für die Eingaben eine HTML-Form erstellen
2.) Per Kickstarter die Extension mit der gewünschten Tabelle generieren
3.) Inhalt der PHP-Datei class.tx_deinextname_pi1.php anpassen

Dabei ist der Code für die PHP-Datei in etwa so:

$marker = array();
$table  = 'tx_deinetabelle';
$tmpl   = $this->cObj->fileResource("deinehtmldatei" ) ;
$subpart = $this->cObj->getSubpart($tmpl, "###SUBPART1###" );
$subsub  = $this->cObj-> getSubpart($subpart, "###SUBPART2###" );
$content = ' ' ;

 // Beim Folge-Durchlauf, wenn Submit betätigt wurde 
  if($this->piVars['submit'] ) {
     
    $marker= array( 'pid' => 14, 
                    'tstamp' => time(),
                     'crdate' => time(), 
                     'hidden' => 1,
                     'cruser_id' => 1,
                     'einkommen'  => $this->piVars['in_einkommen'],
                     …..
     $res = $GLOBALS['TYPO3_DB']->exec_INSERTquery ($table, $marker);

Viele Grüße
Viki

maSuL ·

also muss ich nicht innerhalb der class.tx_deinextname_pi1 das formular erstellen sondern, lad eine externe html datei...

dein beispiel code bringt mehr licht rein.

ich mach das mal etwas einfacher, ich will ein inputfeld wo ich einen benuter eingebe und der mir diesen benutzer in die datenbank einpflegt.

datenbankname:username

'username'  => $this->piVars['in_einkommen']

<----- was kommt den in piVars['in_einkommen'] für eine varibale rein?

vielen dank und grüß zurück

ViktoriaS ·

Hay

Also, in meinem Beispiel ist:

'einkommen' der Name des Feldes in der Tabelle

und

'in_einkommen' der Name des Feldes aus der Form.

Also wird mit

'einkommen'  => $this->piVars['in_einkommen'],

das Array mit dem in der Form eingegebenen Wert befüllt. Mit dem anschließenden Befehl wird dann das Array in die Tabelle übertragen.

8-)

Viele Grüße
Viki