Hinweise


Antwort
 
LinkBack (25) Themen-Optionen Thema durchsuchen
Alt 14.08.2007, 22:31   24 links from elsewhere to this Post. Click to view. #1
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User

[Workshop] TYPO3 - Extension Programmierung


Teil 1 - Einführung

Ziel ist es eine ganz einfache Extension zu erstellen. Sie soll uns nur Titel, Datum, einen Text, ein Bild und einen Link ausgeben.
Sinn ist es, die grundsätzliche Arbeitsweise zu verstehen und die Arbeitsweise von Typo3 nachzuvollziehen.

Vorbereitung

Wir installieren folgende Extensions:
- kickstarter (Wizard für Basisextensions)
- extdeveval (Offline-Doku und Tools)
- cc_debug (Debug mit Optionen)

Der Anfang

ist in diesem Fall der leichteste :-)
Für unsere Planung: Wir brauchen eine Tabelle mit den Feldern
- Datum
- Text
- Bild
- Link

Die Extension soll tp_test heissen. Normalerweise besorgt man sich einen Useraccount bei typo3.org und kann dann einen Key (der Name der Extension) registrieren, um Eindeutigkeit zu haben. In unserem Fall ist das egal, da wir nicht planen, die Extension zu veröffentlichen.

Der Kickstarter

Wir rufen den Kickstarter auf, nur wo?
etwas versteckt: Wir rufen den Extensionmanager auf, im oberen Menü wählen wir "make new Extension".
Bei "Enter extension key:" tragen wir unseren key ein (tp_test) und klicken auf "Update ..."


Nun kanns losgehen.
1) Wir klicken auf das + neben General info und tragen ein paar Infos ein, dann wieder auf Update.



2) Wir legen unsere Tabelle an (+ neben New Database Tables)
Der Einfachheit halber tragen wir nur Namen, Titel ein und erlauben Datensätze auf normalen Seiten (Allowed on pages)
Wir scrollen nach unten und legen das erste Feld an (Titel)
- title (fieldname) = Name des DB-Feldes
- Titel (field title) = Label des Feldes im Backend
- String Input (field type) = Typ des Feldes




nach update gehts zum nächsten Feld, das Datum
- date
- Datum
- Date

nun der text
- text
- Text
- Textarea with RTE

nach update erscheinen zusätzliche Optionen, wir wählen Typical basic setup (new "Bodytext" field based on CSS stylesheets)

nun das Bild

- image
- Bild
- Files

nach dem Update checken wir "Show thumbnails"

nun der Link

- link
- Link
- Link

update, wir haben die Tabelle fertig.
Wir scrollen nochmal nach oben und wählen bei "Label-field" unseren Titel an, Update.


Nun gehts zum letzten Schritt - wir wollen die Extension ja in unsere Seite einfügen können.

Wir klicken auf das + neben Frontend Plugins, tragen unseren Titel ein, update, fertig.



Wir speichern unsere Extension: klick auf "View result" => Write to location Write
(wir können alles voreingestellt lassen)
Danach wird uns die Option "Install extension" angeboten, die wir wahrnehmen, es wird die Tabelle angezeigt, wir übernehmen mit update (make updates).


Wie, wars das schon ?
offensichtlich Wir haben eine Extension.

Na das will ich jetzt aber sehen. Wir suchen uns eine leere Seite, wechseln auf die Listenansicht und klicken auf "neuer Datensatz"
Ganz unten wird uns "Meine TP-Items" angeboten - Klasse



Wow, nach klick öffnet sich das fertige Eingabeformular



Vor lauter Begeisterung wollen wir mal einige Datensätze anlegen. Die Ausgabe erfolgt dann in Teil 2.
__________________

TYPO3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten


Alt 14.08.2007, 22:32   #2
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
Teil 2 - Die Extension (der eigentliche PHP-Teil)

Als ertes schauen wir uns mal die erzeugten Dateien an (im Verzeichnis typo3conf/ext/tp_test)

- doc
-- wizard_form.dat (für den kickstarter relevant)
-- wizard_form.html (für den kickstarter relevant)
- pi1 (das ist unsere Extensionklasse)
-- static
--- editorcfg.txt (Die RTE-Konfiguration)
-- class.tx_tptest_pi1.php (unsere Hauptklasse)
-- locallang.xml (die Sprachdatei unserer Hauptklasse)
- ChangeLog (hier können wir Versionsbeschreibungen einfügen)
- ext_emconf.php (die Infos zur Extension)
- ext_icon.gif (das Extension-Icon, sichtbar im Extensionmanager)
- ext_localconf.php (Konfigurationsdatei)
- ext_tables.php (Konfiguration des TCA)
- ext_tables.sql (Die Tabellendefinitionen)
- icon_tx_tptest_items.gif (Das Icon für unsere Datensätze)
- locallang_db.xml (Die Sprachdatei für die Labels im backend)
- README.txt (Notizen)
- tca.php (das TCA-Array unserer Extension)

Es taucht ein Begriff auf: TCA (Table Configuration Array). Eine genauere Beschreibung dieses Arrays finden wir unter [1]

Für uns ist jetzt die pi1-Klasse entscheidend, wir öffnen die class.tx_tptest_pi1.php und die locallang.xml im Editor.
Der Kickstarter hat uns schon einiges an Code erzeugt. Dies ist nur ein Demo, wir schauen uns das mal an
PHP-Code:
class tx_tptest_pi1 extends tslib_pibase {
    var 
$prefixId      'tx_tptest_pi1';        // Same as class name
    
var $scriptRelPath 'pi1/class.tx_tptest_pi1.php';    // Path to this script relative to the extension dir.
    
var $extKey        'tp_test';    // 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();
        
    
        
$content='
            <strong>This is a few paragraphs:</strong><br />
            <p>This is line 1</p>
            <p>This is line 2</p>
    
            <h3>This is a form:</h3>
            <form action="'
.$this->pi_getPageLink($GLOBALS['TSFE']->id).'" method="POST">
                <input type="hidden" name="no_cache" value="1">
                <input type="text" name="'
.$this->prefixId.'[input_field]" value="'.htmlspecialchars($this->piVars['input_field']).'">
                <input type="submit" name="'
.$this->prefixId.'[submit_button]" value="'.htmlspecialchars($this->pi_getLL('submit_button_label')).'">
            </form>
            <br />
            <p>You can click here to '
.$this->pi_linkToPage('get to this page again',$GLOBALS['TSFE']->id).'</p>
        '
;
    
        return 
$this->pi_wrapInBaseClass($content);
    }

Die main-Funktion wird aufgerufen, wenn wir das Plugin in einer Seite haben - das wollen wir jetzt machen. Wenn wir die Seite uns anschauen, sollten wir folgende Ausgabe sehen:



Was passiert da?
In der Funktion wird die Ausgabe in der Variablen $content gesammelt und am Schluss zurückgegeben (Kein echo oder print!).
Wir sehen laufend etwas mit pi_ - was soll das?

Unsere Hauptklasse ist eine Erweiterung der Klasse tslib_pibase. Diese befindet sich in typo3/sysext/cms/tslib/class.tslib_pibase.php
Alle Methoden dieser Klasse lassen sich also über $this->methode() aufrufen.

Was sind piVars?
Jede pi-Klasse hat ein eigenes Array für GET/POST-Variablen. Damit man sich nicht in die Quere kommt, ist das Array mit dem Prefix der Klasse versehen, in unserem Beispiel
tx_tptest_pi1[irgendwas]
Damit wir darauf leich zugreifen können werden diese am Anfang in ein Array verfrachtet ($this->pi_setPiVarDefaults();) und sind über $this->piVars['irgendwas'] abrufbar. Dabei ist es egal, ob es GET oder POST-Vars sind.
Das schauen wir uns mal an, wir wollen debug nutzen (cc_debug installiert?)
Wir fügen folgende Zeile vor dem return ein:
PHP-Code:
debug($this->piVars); 
Alternativ können wir auch ohne cc_debug ausgeben:
PHP-Code:
t3lib_div::debug($this->piVars,'unser debug'); 
Wir erhalten eine Ansicht unseres piVar-Arrays. Das überprüfen wir, in dem wir einfach über die Url eine Var hinzufügen:
index.php?id=15&tx_tptest_pi1[test]=20 wobei die 15 natürlich durch die Id der aktuellen Seite zu ersetzen ist.
nun sollten wir die Variable test in unserem Array sehen.

$this->pi_loadLL();
=> mit dieser Anweisung wird die Sprachdatei geladen. Wir schauen sie uns an, es ist ein xml-Array
Wichtig ist die Sektion <languageKey index="default" type="array"> , die immer da sein muss. Default ist immer die englische Sprache, wollen wir auch deutsch anbieten, kopieren wir diese Sektion und fügen sie darunter an und ändern nach index="de"
Die Labels lassen sich in unserer pi1 einfach aufrufen mit $this->pi_getLL('labelname') - wunderbar, Mehrsprachigkeit ist also kein Thema mehr.

Zusätzlich lässt sich unsere Extension über Typoscript konnfigurieren, die Konfiguration wird in $conf übergeben und ist in der Klasse über $this->conf abrufbar.
Wir testen das und tragen in unser Setup folgende Zeilen ein:
Code:
plugin.tx_tptest_pi1 {
   test = 20
   test1 = 15
   help = Ich bin ein Hilfetext
}
Nach speichern wollen wir sehen, ob es in der Extension ankommt, wir fügen folgende Debug-Anweisung ein:
PHP-Code:
debug($this->conf); 
Wir sollten folgendes sehen:



Ein globales Objekt spielt für uns eine Rolle, es ist das $GLOBALS['TSFE']-Array. Ein debug dieses Arrays sprengt den Rahmen, es sind alle Objekte für das Rendern der Seite enthalten.
Für uns sind erstmal nur 2 Sachen wichtig:
$GLOBALS['TSFE']->id das ist die id der aktuellen Seite
$GLOBALS['TSFE']->page das sind die Infos der aktuellen Seite (der komplette Datensatz aus pages mit der uid der aktuellen Seite)

Wir brauchen uns diese Infos also nicht aus der DB holen.
Wir nutzen das gleich mal und basteln uns einen Link:

PHP-Code:
$content.=$this->pi_linkToPage($GLOBALS['TSFE']->page['title'],$GLOBALS['TSFE']->id); 
wir sollten einen Link auf die aktuelle Seite mit dem Titel der Seite als Linktext sehen.

Woher kenne ich die Methoden der pibase ?
Wir haben uns ja extdeveval installiert, im BE haben wir oben eine Leiste mit der Offline-Doku, alle Methoden der pibase sehen wir durch Klick auf pibase.

Ihr könnt ein wenig damit spielen, bevor es dann zur relevanten Ausgabe kommt (im nächsten Teil)


[1] http://typo3.org/documentation/docum...e_api/current/
__________________

TYPO3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer

Geändert von steffenk (15.08.2007 um 15:29 Uhr).
steffenk ist offline   Mit Zitat antworten
Alt 15.08.2007, 12:34   #3
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
Teil 3 - wir wollen unsere Datensätze ausgeben
Also auf zur Ausgabe. Wir löschen alles was zu $content gehört und fangen an.

Wir wollen 2 Sachen ausgeben
- eine Liste aller Datensätz
- eine Detailansicht

Beides soll auf der gleichen Seite passiseren, die Unterscheidung wird über einen GET-Parameter gehen (item), der die uid des Datensatzes enthält.



Da wir in unserer Extension kein HTML erzeugen wollen, machen wir uns ein HTML-Template, das wir im root der Extension speichern
HTML-Code:
<!-- ###LISTVIEW### -->
<h2>Listenansicht</h2>
<ul>
    <!-- ###ROW### -->
    <li>###LINK###</li>
    <!-- ###ROW### -->
</ul>
<!-- ###LISTVIEW### -->


<!-- ###DETAILVIEW### -->
<h2>Detailansicht</h2>
<p>###BACKLINK###</p>
<h3>###TITLE###</h3>
<p>###DATUM###</p>
<div>###TEXT###</div>
<p>###IMAGE###</p>
<p>###LINK###</p>
<!-- ###DETAILVIEW### -->
Das eingebaute Template-System ist extrem einfach. Es gibt 3 Teile
###MARKER### (einfache Marker)
<!-- ###SUBPARTMARKER -->...<!-- ###SUBPARTMARKER --> (einfache Subparts)
<!-- ###LINKSUBPARTMARKER -->...<!-- ###LINKSUBPARTMARKER --> (einfache Subparts für Links)

Wir sammeln unsere Marker in Arrays
$markerArray -> es werden die Marker durch den entsprechenden Inhalt ersetzt
$subpartArray -> es werden die Subparts durch den entsprechenden Inhalt ersetzt
$linkpartArray -> es werden die Links gesetzt nach dem Muster $linkpartArray[0] ... $linkpartArray[1]

zum Ersetzen haben wir eine Funktion:
$content = $this->cObj->substituteMarkerArrayCached($subpart,$markerArray,$subpartArray,$linkpartArray);

Wir wollen das Template laden:
PHP-Code:
$this->template=$this->cObj->fileResource('EXT:tp_test/template.html'); 
wir sehen was schönes: EXT: ist das Synonym für den Pfad typo3conf/ext.

Für die Ansichten machen wir also eine Fallunterscheidung
PHP-Code:
if($this->piVars['item']) {
    
$content $this->detailView();
} else {
    
$content $this->listView();

wir haben also die Ansichten in 2 Funktionen ausgelagert, damit es übersichtlicher bleibt.

Wir wollen uns einmal die fertige Extension anschauen

PHP-Code:
class tx_tptest_pi1 extends tslib_pibase {
    var 
$prefixId      'tx_tptest_pi1';        // Same as class name
    
var $scriptRelPath 'pi1/class.tx_tptest_pi1.php';    // Path to this script relative to the extension dir.
    
var $extKey        'tp_test';    // The extension key.
    
var $pi_checkCHash true;
    var 
$template;
    var 
$id;
    
/**
     * 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();
        
        
#ein paar Vorbelegungen
        
$this->id=$GLOBALS['TSFE']->id;
        
$this->template=$this->cObj->fileResource('EXT:tp_test/template.html');
        
        
#welche Ansicht?
        
if($this->piVars['item']) {
            
$content $this->detailView();
        } else {
            
$content $this->listView();
        }
    
        return 
$this->pi_wrapInBaseClass($content);
    }
    
    function 
listView() {
        
#unser Subpart
        
$subpart=$this->cObj->getSubpart($this->template,'###LISTVIEW###'); 
        
#eine einzelne Reihe
        
$singlerow=$this->cObj->getSubpart($subpart,'###ROW###'); 
        
        
#Datensätze holen
        
$res=$GLOBALS['TYPO3_DB']->exec_SELECTquery(
        
'*',   #select
        
'tx_tptest_items'#from
        
'hidden=0 and deleted=0 and pid='.$this->id,  #where
        
$groupBy='',
        
$orderBy='',
        
$limit='');
        
        if(
$res) {
            
$liste='';
            while(
$row=$GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
                
$markerArray['###LINK###']=$this->pi_linkTP($row['title'],array($this->prefixId.'[item]'=> $row['uid']));
                
$liste .= $this->cObj->substituteMarkerArrayCached($singlerow,$markerArray); 
            }
            
$subpartArray['###ROW###']=$liste;
        } else {
            return 
$this->pi_getLL('nodata');
        }
        
        
        return 
$this->cObj->substituteMarkerArrayCached($subpart,$markerArray,$subpartArray,array());     
        
    }
    
    function 
detailView() {
        
#unser Subpart
        
$subpart=$this->cObj->getSubpart($this->template,'###DETAILVIEW###'); 
        
        
#Datensatz holen
        
$record=$this->pi_getRecord('tx_tptest_items',$this->piVars['item']);
        
        
#Marker füllen
        
$markerArray['###TITLE###']=$record['title'];
        
$markerArray['###DATUM###']=date('d.m.Y',$record['date']);
        
$markerArray['###TEXT###']=$this->pi_RTEcssText($record['text']);
        
$markerArray['###IMAGE###']=$this->cObj->IMAGE(array(
            
'file' => 'uploads/tx_tptest/'.$record['image'],
            
'file.maxW' => 140,
        ));
        
$markerArray['###LINK###']=$this->cObj->typolink($record['link'],array(
            
'parameter' => $record['link'],
            
'extTarget' => '_blank',
        ));
        
        
#backlink als einfachen Link ohne Parameter
        
$markerArray['###BACKLINK###']=$this->pi_linkToPage($this->pi_getLL('back'),$this->id);
        
        return 
$this->cObj->substituteMarkerArrayCached($subpart,$markerArray,array(),array());     
    }
    

und die entsprechende locallang.xml

Code:
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<T3locallang>
	<meta type="array">
		<type>module</type>
		<description>Language labels for plugin &quot;tx_tptest_pi1&quot;</description>
	</meta>
	<data type="array">
		<languageKey index="default" type="array">
            <label index="back">Back to list</label>
			<label index="nodata">no data available!</label>
		</languageKey>
        <languageKey index="de" type="array">
            <label index="back">zurück zur Liste</label>
			<label index="nodata">keine Daten vorhanden!</label>
		</languageKey>
	</data>
</T3locallang>
Achtung: die locallang.xml muss im utf8-Format gespeichert werden!


Erklärungen
Datenbank: wir müssen keine Verbindung aufbauen, da die bereits besteht. Statt normale mysql-Anweisungen nutzen wir die TYPO3-DBwrapper-Klasse. Das hat den Grund, da das nicht nur für mySql funktioniert, sondern auch mit dBal mit anderen DB-Engines funktioniert. Der Syntax ist in der Doku der extdeveval erklärt, klick auf DB.
Als Faustregel kann man die üblichen php-Befehle benutzen nach dem Muster
mysql_query($sql) => $GLOBALS['TYPO3_DB']->sql_query($sql)
mysql_num_rows($res) => $GLOBALS['TYPO3_DB']->sql_num_rows($res)
usw.

cObj (Abk. für Content-Object) ist die Klasse tslib_content (typo3/sysext/cms/tslib/class.tslib_content.php)
Die Objekte und Methoden finden wir wieder bei extdeveval unter cObj

Die Funktion $this->pi_RTEcssText wandelt einen Richtext in das entsprechende HTML um.

Soweit erstmal, ich denke, das es nicht besonders kompliziert war - wenn Fragen auftauchen, können die hier gestellt werden,

Erstmal viel Spass beim Nachbauen und Experimentieren !
__________________

TYPO3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer

Geändert von steffenk (15.08.2007 um 15:28 Uhr).
steffenk ist offline   Mit Zitat antworten
Alt 15.08.2007, 15:26   #4
TP-Moderator
 
Benutzerbild von Rizzo
 
Registriert seit: Aug 2004
Ort: Kaiserslautern
Rizzo ist einer der Eckpfeiler des TP - ohne ihn geht nichtsRizzo ist einer der Eckpfeiler des TP - ohne ihn geht nichtsRizzo ist einer der Eckpfeiler des TP - ohne ihn geht nichtsRizzo ist einer der Eckpfeiler des TP - ohne ihn geht nichtsRizzo ist einer der Eckpfeiler des TP - ohne ihn geht nichtsRizzo ist einer der Eckpfeiler des TP - ohne ihn geht nichtsRizzo ist einer der Eckpfeiler des TP - ohne ihn geht nichtsRizzo ist einer der Eckpfeiler des TP - ohne ihn geht nichtsRizzo ist einer der Eckpfeiler des TP - ohne ihn geht nichtsRizzo ist einer der Eckpfeiler des TP - ohne ihn geht nichtsRizzo ist einer der Eckpfeiler des TP - ohne ihn geht nichts
Spitzenklasse, Steffen!
Sehr ausführlich und verständlich erklärt, was den Einstieg in die Extension-Programmierung gewiss enorm erleichtert.
Rizzo ist offline   Mit Zitat antworten
Alt 15.08.2007, 15:59   #5
TP-Supporter
 
Benutzerbild von Stefan_G
 
Registriert seit: May 2005
Ort: Tecklenburg
Stefan_G hilft, wo's gehtStefan_G hilft, wo's gehtStefan_G hilft, wo's geht
Moin,

wow, ist echt außergewöhnlich und beeindruckend, was Du an Know-How an die T3-Gemeinde weitergibst. Hut ab!!!

//Stefan
Stefan_G ist offline   Mit Zitat antworten
Alt 16.08.2007, 12:41   #6
TP-Moderator
 
Benutzerbild von Rizzo
 
Registriert seit: Aug 2004
Ort: Kaiserslautern
Rizzo ist einer der Eckpfeiler des TP - ohne ihn geht nichtsRizzo ist einer der Eckpfeiler des TP - ohne ihn geht nichtsRizzo ist einer der Eckpfeiler des TP - ohne ihn geht nichtsRizzo ist einer der Eckpfeiler des TP - ohne ihn geht nichtsRizzo ist einer der Eckpfeiler des TP - ohne ihn geht nichtsRizzo ist einer der Eckpfeiler des TP - ohne ihn geht nichtsRizzo ist einer der Eckpfeiler des TP - ohne ihn geht nichtsRizzo ist einer der Eckpfeiler des TP - ohne ihn geht nichtsRizzo ist einer der Eckpfeiler des TP - ohne ihn geht nichtsRizzo ist einer der Eckpfeiler des TP - ohne ihn geht nichtsRizzo ist einer der Eckpfeiler des TP - ohne ihn geht nichts
Hallo

ich habe mal über den Extension Manager nach extdeveval gesucht und die Extension installiert. Danach kommt es im BE im oberen Frame zu folgender Fehlermeldung:
Code:
Fatal error: Cannot re-assign $this in C:\xampp\htdocs\typo3\typo3conf\ext\extdeveval\class.tx_extdeveval_fetchContentTopMenu.php on line 36
Was unter PHP 4 noch ging führt mit PHP 5 zu diesem Fehler, weil dort als Parameter der Name &$this gewählt wurde.

Um das Problem zu beseitigen muß man einfach die Klasse im Editor öffnen (Pfad steht ja in der Fehlermeldung) und &$this durch etwas anderes ersetzen, z.B. &$that ... Allerdings ist mir, um ehrlich zu sein, nicht klar wieso da überhaupt ein Parameter angegeben wird, (dazu noch als Referenz) da innerhalb der Methode gar nicht darauf zugegriffen wird. Man könnte also genauso gut den Parameter weg lassen, was bei mir genauso problemlos funktioniert.

Hat man das so abgeändert und die Datei gespeichert, drückt man F5 und bekommt im Typo3 BE auch die nützliche Toolbar, wie man sie oben auf dem Screenshot (z.B. beim Kickstarter) sieht.

Ich weiß nicht ob andere das Problem auch haben oder ob mir der Extension Manager eine veraltete Version der Extension untergeschoben hat. Jedenfalls kann es ja nichts schaden es mal hier posten, falls noch jemand das selbe Problem hat.
Rizzo ist offline   Mit Zitat antworten
Alt 16.08.2007, 12:52   #7
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
ja das ist bekannt - es sind einige Extensions, die mit php 5.2 aus genau dem Grund nicht gehen.
Ich habe das auch in der dev-Liste gepostet, aber bis die Autoren reagieren dauert es immer etwas
__________________

TYPO3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 18.08.2007, 11:39   #8
TP-Moderator
 
Benutzerbild von Adromir
 
Registriert seit: Jun 2004
Ort: Hannover
Adromir lebt für das TP und seine UserAdromir lebt für das TP und seine UserAdromir lebt für das TP und seine UserAdromir lebt für das TP und seine UserAdromir lebt für das TP und seine UserAdromir lebt für das TP und seine UserAdromir lebt für das TP und seine User
Wirklich klasse Workshop.. Hab ihn mir gleich gebookmarked..
__________________
Je größer der Deppenfaktor, desto gigantischer das Bescheidwissergefühl
-Dieter Nuhr
Adromir ist offline   Mit Zitat antworten
Alt 23.08.2007, 18:09   #9
TP-Newbie
 
Registriert seit: Mar 2007
Ort: Hamburg
sbvm macht alles soweit korrekt
Thumbs up

Bitte um kleine Erläuterung


Hallo Steffenk!

Ich bin begeistert!!!!!!!!!!
Dieser Workshop kommt wie gerufen!!!!!
Spitze - Super - danke!!!!!

Ich würde mich aber über eine kleine zusätzliche Erläuterung freuen:

Ich habe etwas Schwierigkeiten der Aufgabenstellung bzw.
mit der Übersetzung des nachfoldenden Codes:

PHP-Code:
if($this->piVars['item']) 
$content $this->detailView(); } 
else { 
$content $this->listView(); } 
Vielleicht steht da:
Wenn die aktuelle Seite = der übergebenen ID
dann rufe die Funktion detailView() auf
ansonsten die Funktion listView();

Ich vermute, es hat was mit den unterschiedlichen Möglichkeiten zu tun,
das Plugin aufzurufen. Aber wie sind die (gemeint)?

Vielen Dank im voraus.

Viele Grüße
sbvm
sbvm ist offline   Mit Zitat antworten
Alt 23.08.2007, 19:03   #10
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
Hi,

das ist eine ganz einfache Weiche. In der Liste sind alle "items" mit Link, in diesem Link wird die ID des Items übergeben.

In der Weiche wird abgefragt: Ist im der Url eine Item-ID ? Dann zeige die Einzelansicht dieses Items, wenn nicht dann zeige mir die Liste.
__________________

TYPO3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 25.08.2007, 17:38   #11
TP-Newbie
 
Registriert seit: Mar 2007
Ort: Hamburg
sbvm macht alles soweit korrekt

Link auf einen Datensatz?


Hallo SteffenK!

Dank Dir für die schnelle Antwort. Ich bemühe mich zu verstehen.
Da ich aber noch kein eingefleischter TYPO3-er bin, fällt es mir nicht ganz einfach.

Also, ein Link auf die Seite auf der sich das Plugin befindet, sieht z.B. so aus:
http://blablabla/index.php?id=42

Wie sieht nun aber ein Link auf einen Datensatz aus?
Vermutlich muss da noch was dran, aber wie?

Ich bedanke mich vielmals im voraus.

sbvm
sbvm ist offline   Mit Zitat antworten
Alt 26.08.2007, 13:16   #12
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
dazu musst Du Dir nur die Links anschauen, die die listview generiert:
PHP-Code:
$markerArray['###LINK###']=$this->pi_linkTP($row['title'],array($this->prefixId.'[item]'=> $row['uid'])); 
diese Links sehen dann so aus:
http://blablabla/index.php?id=42&tx_tptest_pi1[item]=1
__________________

TYPO3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 26.08.2007, 17:26   #13
TP-Newbie
 
Registriert seit: Mar 2007
Ort: Hamburg
sbvm macht alles soweit korrekt
Hallo Steffenk!

Dank Dir nochmal für die Antwort. Das ist jetzt soweit klar.

Leider läuft das Ding bei mir noch immer nicht.
Deshalb noch einmal eine Verständnisfrage:

Nachfolgende Befehlsfolge verstehe ich noch überhaupt nicht
Zitat:
$liste .= $this->cObj->substituteMarkerArrayCached($singlerow, $markerArray);
$subpartArray['###ROW###']=$liste;
$content = $this->cObj->substituteMarkerArrayCached($subpart, $markerArray, $subpartArray, array());
Was macht da das array() am Ende?
Hast Du einen Link, wo ich die Syntax nachlesen kann?

Ist die Befehlfolge gleichzusetzen mit der nachfolgenden, die ich in meinem Buch finde:

Zitat:
// Ersetzen untergeordneten Subpart durch Inhalte
$content .=$this->cObj->substituteMarkerArrayCached ($singlerow, $markerArray);
// Ersetzen alle Subparts die in einem anderen Subpart liegen
$content = $this->cObj->substituteSubpart ($subpart, "###ROW###", $content);
Ich danke Dir noch einmal im voraus.

Viele Grüße
sbvm
sbvm ist offline   Mit Zitat antworten
Alt 26.08.2007, 17:56   #14
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
Die Funktion substituteMarkerArrayCached erwartet 4 Parameter
PHP-Code:
#subpart = HTML
#markerArray = Array mit Markern
#subpartArray = Array mit Subparts
#linkpartArray = Array mit Linkarrays
substituteMarkerArrayCached($subpart$markerArray$subpartArray$linkpartArray); 
mit array() übergebe ich ein leeres Array. Da die letzten 2 Parameter optional sind, könnte man das auch weglassen, also ist das das Gleiche:
PHP-Code:
substituteMarkerArrayCached($subpart$markerArray,array(),array());
substituteMarkerArrayCached($subpart$markerArray); 
In der Schleife kumuliere ich also das HTML und ersetze nur in dem Subpart (###ROW###) die Marker.
Nach der Schleife ersetze ich den ganzen Subpart ###ROW### mit dem kumulierten HTML.

Für den Umgang mit den Templates gibt es auch hier ein bischen Lektüre:
http://wiki.typo3.org/index.php/Exte...HTML-Templates

der Syntax der Funktion substituteMarkerArrayCached ist in extdeveval unter cObj einzusehen.
__________________

TYPO3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 10.09.2007, 10:57   #15
TP-Newbie
 
Registriert seit: Sep 2007
timo12 macht alles soweit korrekt
Hallo,

ich komme mit dem tutorial eig ganz gut zurecht, das Nachbauen hat auch ganz gut geklappt. Allerdings bekomme ich im Frontend keine Daten angezeigt, die ich eingegeben habe! Woran könnte das liegen? Ich habe einen Sysordner erstellt in dem die inhalte abgelegt sind und habe in der extension die sysordner auch als Startpunkt eingestellt. soweit müsste doch alles passen?!
hat jemand eine idee? Im Vorraus schon mal danke!

Gruß Timo
timo12 ist offline   Mit Zitat antworten
Antwort

  Aktuelles Thema
  TP Hilfe Forum > Web-Editoren & Coding > Traum-Dynamik > Workshops und Tutorials
[Workshop] TYPO3 - Extension Programmierung [Profi] [Workshop] TYPO3 - Extension Programmierung
« [Tutorial] Caching - Dynamische Seiten beschleunigen | [Tutorial] Login Systeme von Einfach bis Profi »

LinkBacks (?)
LinkBack to this Thread: http://www.traum-projekt.com/forum/73-workshops-und-tutorials/101411-workshop-typo3-extension-programmierung.html
Erstellt von For Type Datum
www.paeps.technik.uni-landau.de: Links This thread Refback 05.01.2010 13:30
TYPO3.net - eigenes Extension-Template mit daten befüllen This thread Refback 28.03.2009 00:10
Allgemeine APIs: Inside TYPO3 ? Ein Blick in das Innere des CMS » t3n Magazin This thread Refback 27.03.2009 12:39
PHP in bestehende Seite einbinden This thread Refback 04.02.2009 22:32
Tut-Auswahl This thread Refback 11.01.2009 13:41
TYPO3.net - Brauche Hilfe beim Ändern oder Erstellen einer Erweiterung !! This thread Refback 06.01.2009 16:12
TYPO3.net - step by step anleitung eigenes template in extension This thread Refback 13.11.2008 23:08
TYPO3.net - cc_debug keine ausgabe This thread Refback 10.10.2008 14:56
TYPO3.net - main function der extension wird im frontend nicht ausgegeben/aufgerufen This thread Refback 14.08.2008 23:36
Tut-Auswahl This thread Refback 09.08.2008 10:13
PHP Programmierer - Typo3 Entwickler This thread Refback 09.07.2008 13:55
Webdesign Starnberg Tutzing Suchmaschinenoptimierung | just4freaks.de This thread Refback 10.05.2008 11:23
typo3 This thread Refback 07.05.2008 14:55
TYPO3 - Extension Programmierung Tutorial - just4freaks.de This thread Refback 25.04.2008 09:33
[TYPO3] Was spricht fr Typo3? - PSD-Tutorials.de - Forum This thread Pingback 08.04.2008 20:05
Popular pages tagged with "typo3" on del.icio.us This thread Refback 01.02.2008 15:12
TYPO3.net - Typo3 Extension aus Buch Praxiswissen (Kap.11) This thread Refback 01.02.2008 15:08
Typo3: EXPERIMENTER Page This thread Refback 28.01.2008 10:08
TYPO3.net - Online-Terminvereinbarung: brauche ich eine eigene Extension? This thread Refback 10.01.2008 16:35
TYPO3.net - cc_debug keine ausgabe This thread Refback 06.01.2008 01:51
TYPO3.net - Seiteninhalt leer This thread Refback 11.11.2007 01:28
PHP developer - PHP Programmierer - Typo3 Entwickler - PHP Entwickler - Typo3 Program This thread Refback 30.08.2007 09:30
TYPO3.net - Links zum Thema Extension schreiben This thread Refback 21.08.2007 19:04
TYPO3.net - extension mit mehreren Seiten This thread Refback 21.08.2007 13:14
TYPO3.net - Workshop Extensionprogrammierung This thread Refback 15.08.2007 14:58

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:08 Uhr.

Powered by: vBulletin Version 3.7 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd. / Search Engine Friendly URLs by vBSEO 3.2.0 ©2008, Crawlability, Inc.
Traum-Projekt.com | Suchen | Archiv | Impressum | Kontakt | | | Nach oben |



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67