forked from TYPO3-Documentation/TYPO3CMS-Guide-Extbase
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[DOCU] merged extbase and fluid documentation into the new git repo
Change-Id: I294b6a93a4d5001e180c01542e841ed7a232d985 Reviewed-on: https://review.typo3.org/22207 Reviewed-by: Stefan Neufeind Tested-by: Stefan Neufeind Reviewed-by: Stefan Froemken Tested-by: Stefan Froemken
- Loading branch information
Showing
129 changed files
with
7,385 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
.. ================================================== | ||
.. FOR YOUR INFORMATION | ||
.. -------------------------------------------------- | ||
.. -*- coding: utf-8 -*- with BOM. ÄÖÜäöüß | ||
.. include:: Includes.txt | ||
|
||
Erweitern der Extbase Extension | ||
=============================== | ||
|
||
Dieses Tutorial baut auf das Tutorial zum Erstellen der ersten Extbase Extension auf. | ||
|
||
Anzeigen der Kategorien in der Detailansicht | ||
--------------------------------------------- | ||
|
||
Das Template für die Detailansicht findet Ihr hier: | ||
|
||
:: | ||
|
||
typo3conf/ext/productoverview/Resources/Private/Partials/Product/Properties.html | ||
|
||
Ihr seht, dass nur *title* und *price* ausgegeben werden. Die Verknüpfungen von Domainmodellen kann der Extension | ||
Builder derzeit nicht darstellen, deshalb müsst Ihr das selber nach holen. Fügt nun die Zeile für die *category* | ||
ein. Das Template sollte nun so aussehen: | ||
|
||
:: | ||
|
||
<table class="tx-productoverview" > | ||
<tr> | ||
<td> | ||
<f:translate key="tx_productoverview_domain_model_product.title" /> | ||
</td> | ||
<td> | ||
{product.title} | ||
</td> | ||
</tr> | ||
<tr> | ||
<td> | ||
<f:translate key="tx_productoverview_domain_model_product.price" /> | ||
</td> | ||
<td> | ||
{product.price} | ||
</td> | ||
</tr> | ||
<tr> | ||
<td> | ||
<f:translate key="tx_productoverview_domain_model_product.categories" /> | ||
</td> | ||
<td> | ||
<ul> | ||
<f:for each="{product.categories}" as="category"> | ||
<li>{category.category}</li> | ||
</f:for> | ||
</ul> | ||
</td> | ||
</tr> | ||
</table> | ||
|
||
Ihr seht, dass vom *Product* per Punktnotation auf das verknüpfte Domainmodel *Category* zugegriffen werden | ||
kann. Das ist das Prinzip eines *Aggregate Root*. Da Ihr pro Produkt mehrere Kategorien anlegen könnt, | ||
müssen diese Kategorien mit Hilfe einer Schleife durch laufen werden. Pro Durchlauf wird dann die Eigenschaft | ||
*category* in einer Liste ausgegeben. | ||
|
||
Speichert dieses Template ab, leert den Cache und ladet Euer Plugin nochmal neu. Die Kategorien zu den Produkten | ||
werden nun in einer Liste aufgeführt. | ||
|
||
Mehrfachverwendung von Kategorien | ||
--------------------------------- | ||
|
||
Derzeit könnt Ihr zwar pro Produkt ein oder mehrere Kategorien zuordnen, aber es ist nicht möglich eine bereits | ||
vorhandene Kategorie einem Produkt zuzuordnen. Um dieses Verhalten zu ändern geht Ihr in diese Datei: | ||
|
||
:: | ||
|
||
typo3conf/ext/productoverview/Configuration/Tca/Product.php | ||
|
||
ersetzt diesen Eintrag hier:: | ||
|
||
'categories' => array( | ||
'exclude' => 0, | ||
'label' => 'LLL:EXT:productoverview/Resources/Private/Language/locallang_db | ||
.xml:tx_productoverview_domain_model_product.categories', | ||
'config' => array( | ||
'type' => 'inline', | ||
'foreign_table' => 'tx_productoverview_domain_model_category', | ||
'foreign_field' => 'product', | ||
'maxitems' => 9999, | ||
'appearance' => array( | ||
'collapseAll' => 0, | ||
'levelLinksPosition' => 'top', | ||
'showSynchronizationLink' => 1, | ||
'showPossibleLocalizationRecords' => 1, | ||
'showAllLocalizationLink' => 1 | ||
), | ||
), | ||
), | ||
|
||
mit diesem:: | ||
|
||
'categories' => array( | ||
'exclude' => 0, | ||
'label' => 'LLL:EXT:productoverview/Resources/Private/Language/locallang_db.xml:tx_productoverview_domain_model_product.categories', | ||
'config' => array( | ||
'type' => 'select', | ||
'foreign_table' => 'tx_productoverview_domain_model_category', | ||
'foreign_field' => 'product', | ||
'maxitems' => 9999, | ||
), | ||
), |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,119 @@ | ||
.. ================================================== | ||
.. FOR YOUR INFORMATION | ||
.. -------------------------------------------------- | ||
.. -*- coding: utf-8 -*- with BOM. ÄÖÜäöüß | ||
.. include:: Includes.txt | ||
|
||
Erstellen einer Extbase Extension | ||
================================= | ||
|
||
Die erste Extension - Schritt fuer Schritt | ||
------------------------------------------ | ||
|
||
Ihr müsst Euch zu aller erst von dem Gedanken der alten piBase-Programmierung lösen und begreifen, | ||
dass die Programmierung auf Extbase nicht direkt mit Quellcode beginnt, sondern schon während dem Gespräch mit dem | ||
Kunden. Als Programmierer muss klar sein, was der Kunde will. Je besser Ihr ihn versteht, | ||
desto besser könnt Ihr planen und Planung ist für Extbaseprogrammierung das A und O. | ||
|
||
Im folgenden Verlauf werdet Ihr eine Produktübersicht erstellen, bei der auf der ersten Seite die Produkte | ||
als Liste dargestellt werden und nach einem Klick auf den Produkttitel in die Detailansicht gewechselt wird. Da die | ||
Anzahl der Produkte stark variieren kann, wird es eine Seitennavigation geben, mit der der Webseitenbesucher durch die | ||
Produkte navigieren kann. | ||
|
||
.. tip:: | ||
|
||
Auf Grund von Mehrsprachigkeit solltet Ihr alle Datenbankspalten in englischer Sprache anlegen. Spalten wie | ||
*ist_gefraessig* sind einfach sehr schlecht zu lesen. | ||
|
||
Den Extension Builder installieren | ||
---------------------------------- | ||
|
||
Um eine Extension auf Basis von Extbase zu erstellen, müsst Ihr den Extension Builder (extension_builder) über den | ||
Extension Manager installieren. Ihr erhaltet nach der Aktivierung dieser Extension einen neuen Eintrag *Extension | ||
Builder* in der linken Menüleiste des TYPO3-Backends. Nach einem Klick auf diesen neuen Eintrag landet Ihr auf der | ||
Einstiegsseite des *Extension Builders*, die Euch erst mal ein paar grundsätzliche Dinge erklärt. Über die Selectbox | ||
oben könnt Ihr zwischen der *Einstiegsseite* und dem *Domain Modelling* wechseln. | ||
|
||
Informationen zur Extension eingeben | ||
------------------------------------ | ||
|
||
Nach der Auswahl von *Domain Modelling* aus der Selectbox, erscheint nun ein Formular in dem Ihr weitere | ||
Informationen zu der Extension angeben könnt und eine weiße karierte Fläche. | ||
|
||
Tragt nun folgende Daten in das Formular ein: | ||
|
||
- Name: Product Overview | ||
|
||
- Key: productoverview | ||
|
||
- description: This extension shows a paginated product overview including a simple single view | ||
|
||
- persons: Tragt hier Eure Daten ein. | ||
|
||
- Frontend Plugin: | ||
|
||
* Name: Products | ||
|
||
* Key: products | ||
|
||
Den Pluginnamem findet Ihr später in der Selectbox für die Plugins innerhalb der Seiteninhalte wieder. Der Pluginkey | ||
wird von Extbase mit dem Extensionkey zusammengesetzt und bildet so einen TYPO3 weiten eindeutigen Bezeichner: | ||
productoverview_products | ||
|
||
Domain Modelle anlegen | ||
---------------------- | ||
|
||
Das Formular für die Extensionkonfiguration könnt Ihr mit dem kleinen Pfeil oben rechts im Formular schließen. Nun | ||
steht Euch die komplette kariente Fläche zur weiteren Bearbeitung zur Verfügung. Per Drag and Drop könnt Ihr nun | ||
aus dem Kasten "New Model Object" ein eigenes Domainmodel herausziehen und auf der weißen Fläche platzieren. Dieses | ||
Model nennt Ihr "Product". Nach dem Aufklappen der *Domain Object Settings* aktiviert Ihr die Checkbox *Is | ||
Aggregate Root* und setzt die Beschreibung auf "Product". | ||
|
||
Aktiviert bei den *Default Actions" die beiden Checkboxen: *list* und *show* | ||
|
||
Legt 2 Eigenschaften vom Typ *String* an: title und price | ||
|
||
Für die Verknüpfung zu den Kategorien müsst Ihr noch eine Relation anlegen. Klickt auf *Add* und tragt als name | ||
"categories" ein. Da mehrere Kategorien möglich sein sollen wählt Ihr auf der Selectbox "1:N" aus. | ||
|
||
Legt nun ein weiteres Domainmodel an und benennt es "Category". Im Bereich der "Domain Object Settings" vergebt Ihr | ||
diesmal nur eine description aber lasst die Checkbox "Aggregate Root" unmarkiert. Auch Actions werden für dieses | ||
Domainmodel nicht benötigt. | ||
|
||
Legt 1 Eigenschaft vom Typ String an: category | ||
|
||
Im Domainmodel *Product* könnt Ihr nun von der Relation *category* eine Linie zu dem Model *Category* ziehen. | ||
|
||
.. figure:: Images/Domainmodelling.jpg | ||
:alt: Domainmodelling | ||
:width: 700 | ||
|
||
Extension aktivieren | ||
-------------------- | ||
|
||
Geht nun in den Extension Manager und aktiviert die Extension *productoverview*. Bei diesem Vorgang werden auch die | ||
fehlenden Datenbanktabellen erstellt. | ||
|
||
Plugin einbinden | ||
---------------- | ||
|
||
Legt eine neue Seite an und bindet das neu erstellte Plugin mit dem Namen "Product" auf Eurer Seite ein. Wenn alles | ||
geklappt hat, dann erscheint im Frontend eine leere Tabelle mit den beiden Tabellen-Überschriften *title* und *price*. | ||
|
||
Datensätze anlegen | ||
------------------ | ||
|
||
Legt im TYPO3-Seitenbaum eine neue Seite vom Typ *Ordner* an. Auf dieser Seite könnt Ihr nun neue Datensätze vom Typ | ||
*Product* erstellen. Damit diese Daten in Eurem Plugin angezeigt werden, müsst Ihr diesem mitteilen, | ||
wo sich die Daten befinden. Geht dazu in Euer Plugin auf den Tab *Verhalten*. Tragt im Bereich *Datensatzsammlung* | ||
die uid der Seite mit den Product-Datensätze ein. Nun erscheinen die Datensätze auch im Frontend | ||
|
||
Designanpassungen | ||
----------------- | ||
|
||
Jede Extension, die über den Extension Builder erstellt wurde bringt ein kleines CSS mit. Derzeit sind die | ||
Tabellenspalten extremst eng beieinander. Erstellt nun ein +extTemplate für Eure Seite und bindet das Extension | ||
Template von Eurer Extension ein. Danach erscheint Eure Tabelle ein wenig aufgeräumter. | ||
|
||
Viel Spaß mit Eurer ersten Extbase Extension |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
.. ================================================== | ||
.. FOR YOUR INFORMATION | ||
.. -------------------------------------------------- | ||
.. -*- coding: utf-8 -*- with BOM. | ||
|
||
.. This is 'Includes.txt'. It is included at the very top of each and | ||
every ReST source file in this documentation project (= manual). | ||
|
||
|
||
.. ================================================== | ||
.. DEFINE SOME TEXTROLES | ||
.. -------------------------------------------------- | ||
|
||
.. role:: typoscript(code) | ||
|
||
.. role:: ts(typoscript) | ||
:class: typoscript | ||
|
||
.. role:: php(code) | ||
|
||
.. highlight:: php |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
.. ================================================== | ||
.. FOR YOUR INFORMATION | ||
.. -------------------------------------------------- | ||
.. -*- coding: utf-8 -*- with BOM. ÄÖÜäöüß | ||
.. include:: Includes.txt | ||
|
||
Extbase Guide | ||
============= | ||
|
||
What is Extbase? | ||
---------------- | ||
|
||
Extbase is a framework for TYPO3 extension development. It was introduced with | ||
TYPO 4.3 in 2009 and is bound to entirely replace the classic way of writing | ||
TYPO3 extension (pibase). Most important it is a gateway for TYPO3 4.x/6.x to | ||
version Phoenix as it is a backport of FLOW3 technology. | ||
|
||
Should I use Extbase? | ||
--------------------- | ||
|
||
If you develop an extension for TYPO3 you should most definitely use Extbase. | ||
The days of piBased extensions are numbered. Extbase gives you the benefit of a | ||
modern, clear and highly structured way of PHP development with a hidden bonus: | ||
If you know Extbase, getting into FLOW3 will be much, much easier for you. Another | ||
bonus: Porting Extbase extensions to Phoenix will be a walk in the park, whereas | ||
porting a piBased extension to Phoenix will be incredibly laborious if possible at | ||
all, and pobably a very bad experience for everyone involved. | ||
|
||
How do I get started with Extbase? | ||
---------------------------------- | ||
|
||
* You should definitively check out the Extbase documentation section. | ||
* The TYPO3 extension repository (TER) already holds lots of extensions based on | ||
Extbase, inspect the code. | ||
* Also check out how to get Extbase support. | ||
|
||
Want to contribute? | ||
------------------- | ||
|
||
Do you want to take part in making Extbase, TYPO3, and the world an even better | ||
place/project? We would love to welcome you to the team if you want to contribute | ||
in a substantial way. Click here for more info. | ||
|
||
**Inhaltsverzeichnis** | ||
|
||
.. toctree:: | ||
:maxdepth: 1 | ||
:titlesonly: | ||
:glob: | ||
|
||
FirstExtbaseExtension | ||
ExtendExtbaseExtension | ||
Step1Introduction/Index | ||
Step2SystemCheck/Index | ||
Step3Documentation/Index |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
# Settings.yml | ||
|
||
--- | ||
conf.py: | ||
<<<<<<< HEAD | ||
copyright: 2013 - | ||
project: Offizieller Extbase Guide (Entwurf) | ||
======= | ||
copyright: 2013- | ||
project: Offizieller TYPO3 Fluid Guide (Entwurf) | ||
>>>>>>> FETCH_HEAD | ||
version: 0.0.0 | ||
release: 0.0.0 | ||
... |
39 changes: 39 additions & 0 deletions
39
Documentation/Extbase/Step1Introduction/DependencyInjection.rst
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
.. ================================================== | ||
.. FOR YOUR INFORMATION | ||
.. -------------------------------------------------- | ||
.. -*- coding: utf-8 -*- with BOM. ÄÖÜäöüß | ||
.. include:: ../Includes.txt | ||
|
||
Dependency Injection | ||
==================== | ||
|
||
Sehr häufig kommt es vor, dass Objekte von anderen Objekten abhängig sind. So sind | ||
z.B. Objekte, die für Inhaltselemente zuständig sind abhängig von Seitenobjekten. | ||
Also immer wenn wir ein Inhaltsobjekt instanziieren, muss auch das abhängige | ||
Seitenobjekt instanziiert werden. Innerhalb des abhängigen Objektes, in unserem Fall | ||
das Seitenobjekt, sieht man immer wieder einen Konstruktor, der das Objekt | ||
initialisiert. Nicht selten wurden in solchen Konstruktoren weitere abhängige Objekte | ||
eingebunden. Solch ein Objekt könnte zum Beispiel ein Seitenbaumobjekte oder eine Art | ||
Rootlineobjekt sein. | ||
|
||
Egal wie Ihr diese abhängigen Objekte nun einbindet, sei es mit new oder | ||
t3lib_div::makeInstance(), spätestens beim Testen Eurer Software werdet Ihr auf | ||
Probleme stoßen. Wollt Ihr innerhalb des Seitenobjektes eine Methode testen, dann | ||
seit Ihr schon bei der Instanziierung diesen Objektes dazu gezwungen auch ein | ||
Seitenbaumobjekt und ein Rootlineobjekt einzubinden, weil diese fest im Konstruktor | ||
verankert sind. | ||
|
||
Dieses Problem lässt sich mit Hilfe von Dependency Injections lösen. Innerhalb von | ||
Extbase wurden sämtliche Konstruktore entfernt bzw. überarbeitet und die Einbindung | ||
von abhängigen Klassen wurde in eigene kleine Methoden ausgelagert. Ab jetzt konnte | ||
man das aktuelle Objekt instanziieren OHNE eine Abhängigkeit zu anderen Objekten | ||
herstellen zu müssen. | ||
|
||
In Bezug auf phpUnit gibt es sogar noch einen weiteren Vorteil: Ihr könnt nun ein | ||
völlig fremdes Objekt als abhängiges Objekt für Euer Seitenbaumobjekt einbinden. Hier | ||
noch ein besseres Beispiel: Falls Euer abhängiges Objekt ein Datenbankobjekt ist, | ||
könntet Ihr nun phpUnit anweisen z.B. ein Datenbankobjekt einzubinden, dass sich die | ||
Daten aus einer RAM-Tabelle zieht und auch dort wieder zurückschreiben kann. Auf | ||
diese Weise würdet Ihr nicht in die Versuchung kommen beim Testen Eures Programmes | ||
mit den Echtdaten in Kontakt zu kommen. |
Oops, something went wrong.