Zum Inhalt springen

Suche einfasches Bsp. Ext. für Dateneingabe duch HP-user

Erstellt am 15. April 2008 · 9 Antworten · letzte Antwort am 19. April 2008

Tags: Frage

sefer ·

Hi,

ich beginne gerade mit extension programmierung und habe auch schon "erfolgreich" einige tutorials absolviert (WOW).

Z.B. die CD_collection von Kasper. Jetzt weiß ich wie man ein FE-Plugin erzeugen kann, wie man die Tabellen anlegt miteinander verknüpft und die Daten im BE erstellt.

Nun suche ich ein einfaches Beispiel dass mir zeigt wie ich Daten ändere/erzeuge ohne mich im BE anzumelden.

Habe schon bei vielen Extensions nachgesehen(zb. Linklist oder tt_guest usw.), aber die sind alle im Code so umfangreich dass ich da nicht durchblicke.

Irgendein Tip für mich oder ein Tutorial wo das erklärt wird?

thx,
Sefer

Gregor ·

Hier mal ein kleines Code-Schnipsel, etwas zusammengestrichen, aber er sollte das Grundprinzip verdeutlichen, wenn man was ganz simples möchte:

function main($content, $conf) {
		$this->conf = $conf;
		$this->pi_setPiVarDefaults();
		$this->pi_loadLL();
		$this->pi_USER_INT_obj=1;	
		$this->init($conf);

		$postArray = t3lib_div::_POST();

		if($postArray['saveNewData'] == 1){
			
		$insertValuesArray = array(
			'pid' => BELIEBIGE_STORAGE-PAGE-ID,
			'a' => $postArray['field1'],
			'b' => 'NOCHWAS'	
			);
		$newDataQuery = $GLOBALS['TYPO3_DB']->exec_INSERTquery(
				'TABELLENNAME',
				$insertValuesArray
			);

		$content = "Super, alles gespeichert";

		}else{
			$content = '
			<form name="new_data_form" action="URL ZUR SELBEN SEITE" method="post" enctype="multipart/form-data">
			<input type="text" name="field1" id="field1" value="" />
			<input type="hidden" name="saveNewData" id="saveNewData" value="1" />
			<input type="submit" value="Save" />
			</form>
			';
		}

	return $this->pi_wrapInBaseClass($content);
}

Ist jetzt evtl. nicht 100% fehlerfrei, aber das wäre ein sehr simples Beispiel für ein Formular in einer FE-Extension, wo du ein Formular generierst, ausfüllst und absendest. Und das Script führt, sofern es eine erfolgreich gesetzte Post-Variable vorfindet, das entsprechende Insert-Query aus.

Wenn das Formuar frei zugänglich sein soll, dann würde ich noch einige Sicherheitsfunktionen einbauen, um Schindlunder bei der Dateneingabe zu verhindern, aber der obige Code soll einfach nur das grundsätzliche Prinzip zeigen.

Letztendlich ist es aber zu 99,9% identisch mit der Standardvorgehensweise für die Verarbeitung von Formulardaten in PHP, daher dürfte das, sobald du dich etwas in Typo3 orientiert hast, kein echtes Problem mehr darstellen, sofern du auch ohne Typo3 ein eigenes Formular erstellen könntest in PHP.

Gruß
Gregor

sefer ·

Super, sowas habe ich gesucht. Jetzt versuche ich mich hiermit durchzuhangeln, um die CD Sammlung durch den FE-User zu erweitern.

Danke,
Sefer

sefer ·

So, nun habe ich den ganzen Code bearbeitet und noch einiges hinzugefügt und so ziemlich alles was ich verstanden habe kommentiert.

Um nachzuvollziehen was ich gemacht habe, muss man mit dem Kickstarter zunächst das Grundgerüst erzeugen. Hier ein Step by Step [Dauer 5-10 Min]
1.Im Typo BE-einloggen
2. Tools-->Ext Manager
3. Neue Extension anlegen
4. Enter extension Key: CD3
5. General info +
---Category: Frontend Plugin

6.New Database Tables +
---Tablename: tx_cd3_artist
---Title of the table:Artist
---Allowed on pages: aktivieren
---Allowed in "Insert Records" field in content elements:aktivieren
---Add "Save and new" button in forms: aktivieren

---NEW FIELD:
-----Field name: first_name
-----Field title: First Name
-----Field type: String Input

7.Update

8.Auf der selben Seite der Tabelle:
---Label-field:first_name
---FIELD: first_name
----Required:aktivieren

9.Frontend Plugins +
---Enter a title for the plugin:CD3

10.View result
11. WRITE
12.Install Extension
13.Make Updates
###########
##Die Extension ist nun erstellt und installiert nun muss man noch diese als Plugin einfügen und im Template bekanntmachen
###########
14. Web-->Liste-->Rootpage-->DEIN_TEMPLATE : bearbeiten
----Include static (from extensions): von Objekte CD3 hinzufügen und speichern

15.Eine neue Seite erstellen und das FE-Plugin CD3 erzeugen
16.Meinen PHP-Code von unten so wie er ist komplett übernemen und in die Datei "typo3conf/ext/cd3/pi1/class.tx_cd3_pi1.php" übernehmen

17. Als letztes noch die PID des Plugins deiner Seite ermitteln und in den Zeilen 53 und 79 anpassen, also 454 ersetzen durch deine PID, wo deine Datensätze sind.

<?php
/***************************************************************
*  Copyright notice
*
*  (c) 2008 Sefer 

***************************************************************/

require_once(PATH_tslib.'class.tslib_pibase.php');


/**
 * Plugin 'CD3' for the 'cd3' extension.
 *
 * @author	Sefer 
 * @package	TYPO3
 * @subpackage	tx_cd3
 */
class tx_cd3_pi1 extends tslib_pibase {
	var $prefixId      = 'tx_cd3_pi1';		// Same as class name
	var $scriptRelPath = 'pi1/class.tx_cd3_pi1.php';	// Path to this script relative to the extension dir.
	var $extKey        = 'cd3';	// The extension key.
	var $pi_checkCHash = true;
	
	/**
	 * The main method of the PlugIn
	 *
	 * @param	string		$content: The PlugIn content
	 * @param	array		$conf: The PlugIn configuration
	 * @return	The content that is displayed on the website
	 */
	function main($content, $conf) {
                $this->conf = $conf;
                $this->pi_setPiVarDefaults();
                $this->pi_loadLL();
                $this->pi_USER_INT_obj=1; 
                
                //Diese Zeile musste ich aukommentieren, weil ich eine Fehlerausgabe hatte      
                //$this->init($conf);

                //Hier wird die postArray Variable erzeugt, diese bekommt ihren Inhalt von t3lib_div::_POST(); bzw. vom Formular 
                $postArray = t3lib_div::_POST();
                
                //Wenn im Formular "Save" gedrückt wird, dann wird 'saveNewData gleich 1 gesetzt' und die Daten werden in die DB übertragen.
                //Das Formular unter else wird nicht angezeigt
                if($postArray['saveNewData'] == 1){
                      
                //Ein Array wird erzeugt, welches die Werte enthält die über das Formular mit Hilfe von Post gesendet werden
                //Wichtig hierbei ist, dass man manuell die pid des Sysordners angeben muss, wo die Daten im BE angelegt werden sollen
                //Vielleicht sollte man für pid den Wert automatisch ermitteln lassen z.B. die pid von der aktuellen Seite 
                $insertValuesArray = array(
                        'pid' => 454,
                        'first_name' => $postArray['field1'],
                               
                        );
                
                //Es wird zwar ein Array erzeugt, dieses wird aber nur dazu genutzt, um eine Insertabfrage zu starten
                //Das eigentliche passiert mit Hilfe von 'exec_INSERTquery(Tabelle,newValues)
                //Die in insertValuesArray vorhandenen Daten werden in der Tabelle 'tx_cd3_artist' hinzugefügt
                $newDataQuery = $GLOBALS['TYPO3_DB']->exec_INSERTquery(
                                'tx_cd3_artist',
                                $insertValuesArray
                        );
                
                //Die content-Variable enthält alle Elemente die ausgegeben werden
                $content = "Super, alles gespeichert";
                
                //So erzeugt man automatisch einen Link auf die Seite aktuelle Seite
                //Würde man einfach die Seite Aktualisieren, dann wird die PostVariable erneut gesendet
                $content.= '<p>'.$this->pi_linkToPage('Hier klicken, um zum Formular zurück zu gelangen!',$GLOBALS['TSFE']->id).'</p>';
                
                //Der Inhalt aus der $content-Variablen  von der Funktion getList() wird  ebf. ausgegeben.
                $content.=$this->getList();
                
                //Falls noch nicht auf 'save' geklickt wurde dann wird das Formular ausgegeben
                }else{
                        $content = '
                        <form name="new_data_form" action="index.php?id=454" method="post" enctype="multipart/form-data">
                        <input type="text" name="field1" id="field1" value="" />
                        <input type="hidden" name="saveNewData" id="saveNewData" value="1" />
                        <input type="submit" value="Save" />
                        </form>
                        ';
                        //Der Inhalt aus der $content-Variablen  von der Funktion getList() wird  ebf. ausgegeben.
                        $content.=$this->getList();
                }

        return $this->pi_wrapInBaseClass($content);
}
	
	/**
	 * Die Funktion getList liest alle Items mit Hilfe der Funbktion getItems aus und gibt diese als Tabelle aus.
	 * Um die Tabelle anzuzeigen genügt es folgendes in der main-Funktion hinzuzufügen:
	 * $content.=$this->getList();   	 
	 */
	 
	 function getList() {
	 
	 //$rows enthält alle Datensätze die von getItems ermittelt wurde
   $rows=$this->getItems();
   	
   	$content='<br />Dies ist der Inhalt von der Tabelle: tx_cd3_artist';
   	$content.='<br />FELDNAME: first_name';
   	 //Die Schleife wird solange wiederholt, bis alle Datensätze gelesen worden sind.
   	 //Jeder einzelne Datensatz kann nun über die Variable $row ["FELDNAME"]angesprochen werden
   	 while(list($c,$row)=each($rows))	{
   	
		 // Die 
       //$content.="<table border="4"><tr><td>".($row["first_name"])."</td></tr></table>";
       $content.="<br />".($row["first_name"]);
       
    // Es gibt zwar kein Feld Namens 'last_name', aber wenn, dann würde man es einfach so ansprechen
     //$content.="<tr><td>".($row["last_name"])."</td></tr></table>";
		 
     }
     return $content;
    }
    
    
    /**
    * Die Funktion getItems führt ein einfaches SQL-Statement durch und speichert diesen in der Variablen $query
    * Das Ergebnis wird als array in der Variablen $out gespeichert und als return an die aufrufende Stelle zurückgegeben    
    */    
	function getItems()	{
     //ICH HABE KEINE AHNUNG WAS GENAU DIESER TEIL MACHT
     /* Auf jeden Fall muss ich ihn auskommentieren ,weil es sonst einen Fehler gibt
                // pid_list is the pid/list of pids from where to fetch the guest items.
		$config["pid_list"] = trim($this->cObj->stdWrap($this->conf["pid_list"],$this->conf["pid_list."]));
		$config["pid_list"] = $config["pid_list"] ? implode(t3lib_div::intExplode(",",$config["pid_list"]),",") : $GLOBALS["TSFE"]->id;
		list($pid) = explode(",",$config["pid_list"]);
    */
    
		$query = "SELECT * FROM  tx_cd3_artist ORDER BY first_name"; // WHERE pid IN (".$pid.") ORDER BY sorting";
		$res = mysql(TYPO3_db,$query);
		$out=array();
		while($row = mysql_fetch_assoc($res))	{
			$out[]=$row;
		}
		return $out;
	}
}



if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/cd3/pi1/class.tx_cd3_pi1.php'])	{
	include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/cd3/pi1/class.tx_cd3_pi1.php']);
}

?>

Nun habe ich aber noch folgende Fragen:
zu Zeile 40:

$this->init($conf);

Ich musste diesen auskommentieren, weil ich folgende Fehlermeldung erhalte:
Fatal error: Call to undefined method tx_cd3_pi1::init() in /var/www/alfa2_1/typo3conf/ext/cd3/pi1/class.tx_cd3_pi1.php on line 55

Wozu ist der Code gut?

zu Zeile 127-129:

 // pid_list is the pid/list of pids from where to fetch the guest items.
		$config["pid_list"] = trim($this->cObj->stdWrap($this->conf["pid_list"],$this->conf["pid_list."]));
		$config["pid_list"] = $config["pid_list"] ? implode(t3lib_div::intExplode(",",$config["pid_list"]),",") : $GLOBALS["TSFE"]->id;
		list($pid) = explode(",",$config["pid_list"]);

Was macht dieser genau?

Danke,
Sefer

Gregor ·
sefer schrieb

Nun habe ich aber noch folgende Fragen:
zu Zeile 40:

$this->init($conf);

Ich musste diesen auskommentieren, weil ich folgende Fehlermeldung erhalte:
Fatal error: Call to undefined method tx_cd3_pi1::init() in /var/www/alfa2_1/typo3conf/ext/cd3/pi1/class.tx_cd3_pi1.php on line 55

Wozu ist der Code gut?

Sorry, das kommt davon, wenn man nen Teil des Codes aus ner eigenen Extension rauskopiert. $this->init($conf) ruft bei mir standardmäßig eine init-Funktion auf, in der sämtliche Konfigurationseinstellungen (z.B. aus Flexform, Typoscript etc.) ausgelesen und in $this->conf gespeichert werden. Da bei deiner Extension aber keine Init-Funktion vorhanden ist, spuckt er dir die entsprechende Fehlermeldung aus.

sefer schrieb

zu Zeile 127-129:

 // pid_list is the pid/list of pids from where to fetch the guest items.
		$config["pid_list"] = trim($this->cObj->stdWrap($this->conf["pid_list"],$this->conf["pid_list."]));
		$config["pid_list"] = $config["pid_list"] ? implode(t3lib_div::intExplode(",",$config["pid_list"]),",") : $GLOBALS["TSFE"]->id;
		list($pid) = explode(",",$config["pid_list"]);

Was macht dieser genau?

Danke,
Sefer

Ich weiß nicht genau, wo du den Schnippsel her hast, aber er macht im Prinzip nichts anderes, als die pid_list (im Regefall eine Liste von Seiten-IDs, in der die Datensätze für die betreffende Extension gespeichert werden) auszulegen und z.B. MySQL-Abfragen aufzubereiten. Im konkreten Fall sucht er nach er Konfiguration via Typoscript ($this->conf["pid_list."]) und greift alternativ auf die aktuelle Seite ($GLOBALS["TSFE"]->id) zurück.

Wenn du bei der Darstellung von deinen CD-Einträgen erstmal nicht gezielt abhängig von unterschiedlichen Storage Foldern unterschiedliche Ergebnisse haben möchtest, dann würde ich diesen Abschnitt einfach ignorieren und bei den Datenbankabfragen einfach ne allgemeine Selektion ohne Auswahl der pid machen lassen.

Gregor

sefer ·

Hi Gregor,

erstmal vielen Dank für die ausführlichen Infos.

Nun bin ich schon in meiner lernphase ziemlich weiter als vor zwei Tagen.
1.Ich weiß nun wie man eine Extension (Grundgerüst) per Kickstarter erstellt.
2.Wie man die Daten ausgibt mit getItems() und getList()
3.Wie man als FE-User Daten eingibt:
Über
<form>
...
mitHilfe des "$postArray = t3lib_div::_POST();"
...
</form>

Nächste Lernziele:
1.Per "Typoscript Object Browser" die PID des Sysfolders der Datensätze setzen.
[siehe Hierzu Punkt 17 vom Beitrag : 17.04.2008 [21:10]]

2.Ein HTML-Template mit MARKERN für die Datenausgabe verwenden.
[Hierzu habe ich diese Seite gefunden:
http://wiki.typo3.org/index.php/Extension_Development,_using_HTML-Templates]

3.Die Sichere Dateneingabe über das Formular, damit SQL-injection verhindert werden kann.
[keine Ahnung wie ich hier vorgehe, vielleicht finde ich irgendwo Codeschnipsel]

Für tips in der Vorgehensweise wäre ich natürlich dankbar,
Sefer

sefer ·

Hier die Lösung zu folgendem Punkt:

Nächste Lernziele:
1.Per "Typoscript Object Browser" die PID des Sysfolders der Datensätze setzen.
[siehe Hierzu Punkt 17 vom Beitrag : 17.04.2008 [21:10]]

Vorgehensweise:
1.Datei "typo3conf/ext/cd3/pi1/static/constants.txt" anlegen:

plugin.cd3 {
  # cat=cd3/links; type=int+; label=cd3Sysfolder
  SysfolderID = 100
}

2.Datei "typo3conf/ext/cd3/pi1/static/setup.txt" anlegen:

plugin.tx_cd3_pi1 {
  cd3SysfolderID = {$plugin.cd3.SysfolderID}
}

3.Zugriff auf Variable in der Funktion main (class.tx_cd3_pi1.php):

  $cd3SysfolderID = $conf["cd3SysfolderID"];
$content='<br>Dies ist der Inhalt des $cd3SysfolderID: '.$cd3SysfolderID;

Nun kann man den Wert mit dem Constant Editor oder dem TS Object Browser ändern:
WEB-->Template-->Rootpage:

Sehr wichtig, man muss den CACHE leeren, sonst werde die Änderungen nicht übernommen!

Jetzt habe ich aber hierzu noch eine Frage, wofür ist in der Funktion main() der Folgende Code gut?

$this->conf=$conf;

thx,
Sefer

just2b ·

Hallo,

damit alles aus $conf auch in anderen Funktionen zur Verfügung steht, denn in aller Regel hat man mehr als nur die main()

Georg