Skip to content

Commit

Permalink
[DOCU] merged extbase and fluid documentation into the new git repo
Browse files Browse the repository at this point in the history
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
froemken committed Jul 11, 2013
1 parent 1084b23 commit 21e5a37
Show file tree
Hide file tree
Showing 129 changed files with 7,385 additions and 12 deletions.
109 changes: 109 additions & 0 deletions Documentation/Extbase/ExtendExtbaseExtension.rst
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,
),
),
119 changes: 119 additions & 0 deletions Documentation/Extbase/FirstExtbaseExtension.rst
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
Binary file added Documentation/Extbase/Images/Domainmodelling.jpg
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.
21 changes: 21 additions & 0 deletions Documentation/Extbase/Includes.txt
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
56 changes: 56 additions & 0 deletions Documentation/Extbase/Index.rst
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
14 changes: 14 additions & 0 deletions Documentation/Extbase/Settings.yml
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 Documentation/Extbase/Step1Introduction/DependencyInjection.rst
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.
Loading

0 comments on commit 21e5a37

Please sign in to comment.