Extbase/Fluid. Tipps, Tricks und Stolperfallen. (eine Einführung)



Ähnliche Dokumente
Extbase/Fluid. Kennenlernen und ausprobieren. (Eine Einführung)

TYPO3 Gestern, Heute, Morgen

Einführung in die Programmierung

Einführung in. Bittorrent

Objektorientierte Programmierung

Architektur des agimatec-validation Frameworks

GITS Steckbriefe Tutorial

Dieses Tutorial gibt eine Übersicht der Form Klassen von Struts, welche Besonderheiten und Unterschiede diese aufweisen.

WEBAPPLIKATIONEN MIT PHP. Wo gibt es Hilfe? Wie fang ich an?

BBCode v2.0. Einleitung...2 Installation... 3 Bugfixliste Inhaltsverzeichnis. Überarbeiteter BBCode + neuem Interface.

Zusammenfassung der letzten Vorlesungen. - Ergänzungen zu Menüs /Sprachumschaltung. - indexed search

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Einführung in das Web Content Management System (CMS) Typo3

Einrichten einer mehrsprachigen Webseite mit Joomla (3.3.6)

Das Content-Management-System OpenCms im Vergleich mit TYPO3 und Joomla. Seminarvortrag von Wolfgang Neuß

Metadateneditoren für ArcGIS

Templates für CMSMadeSimple

Newsletter mit TYPO3. TYPO3-Consultant.de Matthias Stübner

Studentische Lösung zum Übungsblatt Nr. 7

Workshop Java Webentwicklung Tapestry. Ulrich Stärk

Der/die KursleiterIn kann sowohl die Einträge als auch die geposteten Kommentare in allen drei Blog- Typen bearbeiten, kommentieren und löschen.

1. Zusammenfassung der letzten Vorlesung

WPF Steuerelemente Listbox, ComboBox, ListView,

Einführung in Javadoc

Referenzen TYPO3 Projekt Slider für Reiseberichte Stand: Februar 2015

5 Zweisprachige Seiten

WPF Bindung. Dr. Beatrice Amrhein

Sigrid Born Jari-Hermann Ernst. Content Management mit TYPO3 CMS. Inklusive CD-ROM

TYPO3-Blockseminar. am 23. und 30. September Sibylle Nägle, Tanja Bode. TYPO3 Blockseminar, Seite 1

EXT: Patenschaften. EXT: Patenschaften - dd_sponsorship EXT: Patenschaften

InfoPoint vom 9. November 2011

Programmieren in Java

anschauen live mitmachen verstejen

Migration von statischen HTML Seiten

Referenz Frontend: Responsive Webdesign

Inhaltsverzeichnis. Vorwort 13

Umstellung News-System auf cms.sn.schule.de

Menü auf zwei Module verteilt (Joomla 3.4.0)

Einführung in die Programmierung

Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

4. AuD Tafelübung T-C3

DataTables LDAP Service usage Guide

PKV- Projektanlage Assistent

HTML5 HOCKEYSTICK EXPANDABLE BANNER v1.0

Anleitung Typo3-Extension - Raumbuchungssystem

Vererbung & Schnittstellen in C#

Webseiten mit fragwürdigen Aufrufen von "spy & track" - Unternehmen

1. Zusammenfassung der letzten Vorlesung

Factory Method (Virtual Constructor)

mobilepoi 0.91 Demo Version Anleitung Das Software Studio Christian Efinger Erstellt am 21. Oktober 2005

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Modellierung und Programmierung 1

Objektorientierte Programmierung mit C++ Vector und List

Typo3: Nachrichten verfassen

Vorkurs C++ Programmierung

Praktikum Datenbanksysteme. Ho Ngoc Duc IFIS - Universität zu Lübeck

Erwin Grüner

Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten

Fotogalerie mit PWGallery in Joomla (3.4.0) erstellen

Pfötchenhoffung e.v. Tier Manager

Die Entwicklung eines Glossars (oder eines kontrollierten Vokabulars) für ein Unternehmen geht üblicherweise in 3 Schritten vor sich:

Referenzen Typo3. Blog der Internetagentur Irma Berscheid-Kimeridze Stand: Juni 2015

Praxiswissen TYPO3 CMS 7 LTS

Typo3 Schulung: Fortgeschrittene I an der Hochschule Emden/Leer

Objektorientierte Programmierung

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Argelander Institut für Astronomie. Persönliche Website

TYPO3-Version 6.2: Die News-Extension ( tt_news ) für TOP-Meldungen einsetzen

Referenzen Frontend und PHP

Klausur in Programmieren

Objektorientierte Programmierung. Kapitel 12: Interfaces

Tritt beim Aufruf ein Fehler aus, so wird eine MessageBox mit dem Fehlercode und der Kommandozeile angezeigt.

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Django - ein Python Web-Framework

Suchbäume. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Handbuch zu SoSci Survey an der OVGU

1. Adressen für den Serienversand (Briefe Katalogdruck Werbung/Anfrage ) auswählen. Die Auswahl kann gespeichert werden.

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

News & RSS. Einleitung: Nachrichten er-(veröffentlichen) und bereitstellen Nachrichten erstellen und bereitstellen

TYPO3 Slide Lightwerk GmbH

Georgienseite TYPO3 LTS7 Projekt Georgienseite TYPO3 LTS 7 responsiv Stand: Juni 2016

doubleslash Net-Business GmbH

5. Tutorium zu Programmieren

ACCESS das Datenbankprogramm. (Einführung) DI (FH) Levent Öztürk

Stand: Adressnummern ändern Modulbeschreibung

Änderungen im Vertrags-Manager

Der transparente Look. Die Struktur, die oben angegeben wurde, ist im Anwendungsdesigner, wie in der nächsten Grafik ersichtlich, abgebildet.

Skalierbare Webanwendungen mit Python und Google App Engine

Schulung Marketing Engine Thema : Einrichtung der App

Bedienung des Web-Portales der Sportbergbetriebe

Tutorial: Eigene Module und Extensions entwickeln. version: 0.1 Author: Anja Beuth

<script type="text/javascript"> <! <%= page(page.searchsuggestionsscript) %> // > </script>

Volker Krell. Patrick Lobacher. 100 Tipps. für TYP03 CMS. Typische Fehler erkennen und vermeiden. 2. Auflage. Source Press. Open

Computeranwendung und Programmierung (CuP)

Stapelverarbeitung Teil 1

L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016

Universal Gleismauer Set von SB4 mit Tauschtextur u. integrierten Gleismauerabschlüssen!

Ich liebe Java && Ich liebe C# Rolf Borst

Transkript:

Extbase/Fluid Tipps, Tricks und Stolperfallen (eine Einführung) Seite: 1 / 42

Inhalte Einführung/Überblick Fluid ohne Extbase Extbase Konventionen (Naming, phpdoc,...) Vom Pfad abweichen Eigene Erweiterungen Stolperfallen Links / Hilfen Seite: 2 / 42

Über mich Stefan Neufeind Aus Neuss Tätig für SpeedPartner GmbH, ein Internet-Service-Provider (ISP) (Consulting, Entwicklung, Administration) Individuelle TYPO3-Entwicklungen Hosting, Housing, Managed Services Domains / Domain-Services xdsl, IP-Upstream, IPv6 Aktive Mitarbeit im Community-Umfeld (PHP/PEAR, TYPO3, Linux) Autor für z.b. t3n, ix, Internet World,... Seite: 3 / 42

Einführung/Überblick Ziele des Vortrags: Einstieg geben Grober Überblick Aufbauend auf Standard-Beispiel blog_example Wichtigsten Konventionen erläutern Standard-Fehler vermeiden Berührungsängste nehmen Spaß an Arbeit mit Extbase/Fluid vermitteln Vorbereitet sein für Umstieg auf FLOW3 Seite: 4 / 42

Einführung/Überblick Hintergrund zur Entwicklung: Klassische TYPO3-Architektur weit verbreitet Gemeinsame Basis für Extensions ( tslib_pibase ) Teilweise sehr unterschiedliche Ansätze für Aufbau von Extensions Templating in Extensions überwiegend Marker-basiert Zusammengesetzt aus Platzhaltern (Markern) und Blöcken (Subparts) In 2006 Entscheidung TYPO3 neu zu schreiben Aufteilung in Framework (FLOW3) und das eigentliche CMS (TYPO3 v5) Moderne Architektur und Software-Entwicklungs-Paradigmen Nutzung aktueller Möglichkeiten (PHP 5.2+) Domain-driven design, MVC (Model-View-Controller) Seite: 5 / 42

Einführung/Überblick Zusammenhang und Zusammenarbeit TYPO3v4 und TYPO3v5: Okt. 2008: Transition Days in Berlin Verabschiedung des The Berlin Manifestio Beschluss TYPO3 v4 weiterzuentwickeln (auch nach TYPO3 v5-release) Übergang TYPO3 v4 zu TYPO3 v5 ermöglichen/vereinfachen War für TYPO3 v4 Grundlage zur Entscheidung für Eine moderne, neue Basisklasse als Ersatz für tslib_pibase: Extbase Neue, flexible und erweiterbare Template-Engine: Fluid Seite: 6 / 42

Einführung/Überblick Neuer Ansatz für TYPO3 v4-extensions: Extbase-Framework: Konzepte und Lösungen von FLOW3 für TYPO3 v4.3+ verfügbar machen Struktur der Extensions, Konventionen, Schnittstellen (APIs) weitgehend gleich Leichten Übergang zu FLOW3/TYPO3v5 ermöglichen (Anpassungen erforderlich, jedoch Architektur und Schnittstellen ähnlich) Fluid für FLOW3 Basis ist Basis von Fluid für TYPO3v4 Fluid-Team entwickelte in wenigen Tagen ein Backporter -Tool Ermöglicht Fluid-Code von TYPO3v4 und FLOW3 synchron zu halten Beta von Extbase und Fluid im Herbst 2009 Aufnahme in TYPO3 Core mit Veröffentlichung von TYPO3 4.3.0 (Nov. 2009) Seite: 7 / 42

Fluid ohne Extbase Wechseln von Markern zu Fluid? Marker-Konzept: einfach und bekannt Jedoch fast zu minimalistisch und wenig Umfangreiche Templates erfordern teils sehr kreative Lösungen (Schleifen,...) Unterschiedliche Lösungsansätze mit Stärken/Schwächen Umsetzungen in manchen Fällen fehleranfällig Fluid: strukturiert, flexibel, erweiterbar Übersichtlicher Aufbau Kontrollstrukturen: Verzweigungen / Schleifen Objektorientierung Erweiterbarkeit (ViewHelper,...) Seite: 8 / 42

Fluid ohne Extbase Einfaches Beispiel mit Markern: HTML-Basis / Ziel: <ul> <li style= background:red >Name1</li> <li style= background:green >Name2</li> <li style= background:red >Name3</li> </ul> Im Template: <!-- ###NAMELIST### begin --> <ul> <!-- ###ROW_ODD### begin --> <li style="background:red">###name###</li> <!-- ###ROW_ODD### begin --> <!-- ###ROW_EVEN### begin --> <li style="background:green">###name###</li> <!-- ###ROW_EVEN### begin --> </ul> <!-- ###NAMELIST### end --> Seite: 9 / 42

Fluid ohne Extbase Einfaches Beispiel mit Markern: Extension-Code (Auszug): $templatecode = $this->cobj->fileresource('ext:'. $this->extkey. '/res/marker.htm'); $template = array(); $template['namelist'] = $this->cobj->getsubpart($templatecode,'###namelist###'); $template['row_odd'] = $this->cobj->getsubpart($template['namelist'],'###row_odd###'); $template['row_even'] = $this->cobj->getsubpart($template['namelist'],'###row_even###'); $contentlist = ''; $odd = true; foreach($names as $name) { if($odd) { $contentlist.= $this->cobj->substitutemarker($template['row_odd'], '###NAME###', $name); else { $contentlist.= $this->cobj->substitutemarker($template['row_even'],'###name###',$name); $odd = ($odd == false); $content = $template['namelist']; $content = $this->cobj->substitutesubpart($content, '###ROW_ODD###', ''); $content = $this->cobj->substitutesubpart($content, '###ROW_EVEN###', $contentlist); Seite: 10 / 42

Fluid ohne Extbase Einfaches Beispiel mit Fluid: HTML-Basis / Ziel: <ul> <li style= background:red >Name1</li> <li style= background:green >Name2</li> <li style= background:red >Name3</li> </ul> Im Template: <ul> <f:for each="{names" as="name"> <f:cycle values="{0: 'red', 1: 'green'" as="alternate"> <li style="background:{alternate">{name</li> </f:cycle> </f:for> </ul> Seite: 11 / 42

Fluid ohne Extbase Einfaches Beispiel mit Fluid: Extension-Code (Auszug): $view = t3lib_div::makeinstance('tx_fluid_view_templateview'); $controllercontext = t3lib_div::makeinstance('tx_extbase_mvc_controller_controllercontext'); $controllercontext->setrequest(t3lib_div::makeinstance('tx_extbase_mvc_request')); $view->setcontrollercontext($controllercontext); $template = t3lib_extmgm::extpath($this->extkey). 'res/marker_fluid.htm'; $view->settemplatepathandfilename($template); $view->assign('names', $names); $content = $view->render(); Seite: 12 / 42

Extbase Konzept: Domain-driven design: Umfeld der Problemstellung Gemeinsame Sprache (Begrifflichkeiten,...) Objekt-Modell mit Eigenschaften, Funktionalitäten und Beziehungen Model-View-Controller (MVC): Model: kapselt Anwendungslogik und -daten sowie Zugriffs- und Speicherlogik Controller: stellt nach außen sichtbare, aufrufbare Funktionalitäten bereit, koordiniert Funktionalität welche im Model implementiert wird View: Ausgabelogik, Darstellung der Daten (bei Extbase in der Regel mit Fluid) Seite: 13 / 42

Extbase Konventionen: Klassen: UpperCamelCase Methoden & Variablen: lowercamelcase Bildung von Namen Für Klassennamen: Tx_[ExtensionName]_[Ebene1]_[Ebene2]... z.b. Tx_BlogExample_Controller_BlogController, Tx_BlogExample_Domain_Model_Blog Verzeichnisse/Dateien: einzelne Bestandteile durch Verzeichnisse abgebildet z.b. Classes/Controller/BlogController.php oder Classes/Domain/Model/Blog.php Datenbank: lower-case mit Unterstrichen, z.b. tx_blogexample_domain_model_blog Struktur: Objekte sind in einem Repository gesammelt, welches die Verwaltung übernimmt Persistence-Manager übernimmt Speicherung / Rekonstruktion von Objekten Optional: Validatoren übernehmen die Prüfung von Objekten und Werten Ausgabe aus Rahmen (Layout), Template und Blöcke (Partials) zusammengesetzt Seite: 14 / 42

Extbase Überblick über Standard-Beispiel blog_example : Besteht aus: Blog * 1 Administrator 0..* Post * 1 Author 0..* 0..* Comment Tag Ansatz: Blogs enthalten Posts, welche mit Kommentaren/Tags versehen sein können Funktionalitäten z.b. eines Blog-Post (siehe PostController): Listenansicht (Index), Einzelansicht, Erzeugen (+ Speichern), Editieren (+ Updaten), Löschen Seite: 15 / 42

Extbase... Live-Demo blog_example... To-Do: Installation Einbindung in eine Seite Anlegen von Storage Folder und Einträgen Funktionstests Stolperfallen bei ersten Schritten: Statische Konfiguration inkludieren Storage Folder angeben Anlagen eines Administrator und einer Person per Backend Person muss einen name (statt username ) erhalten, sonst kein Dropdown-Eintrag sichtbar Seite: 16 / 42

Extbase Verzeichnis-/ Datei-Struktur: Seite: 17 / 42

Extbase Konfigurationen / Abhängigkeiten: Üblicherweise Nutzung von Konventionen statt expliziten Angaben ( Convention over configuration ) Alternativ explizite Konfiguration (Tabellennamen, Spaltennamen, Abhängigkeiten) Methodenparameter ( Type Hinting ) TypoScript Standardmäßig unter Configuration/TypoScript, siehe constants.txt / setup.txt Für Extension: unterhalb plugin.tx_ourextension Für alle Extensions: unterhalb config.tx_extbase Seite: 18 / 42

Extbase Konfigurationen / Abhängigkeiten: TCA Standardmäßig unter Configuration/TCA in tca.php phpdoc (!) Angabe von Typen für Eigenschaften (Models) in Verbindung mit TCA somit Angabe der Verbindungen zwischen Objekten Validatoren für Objekte und Eigenschaften sowie @dontvalidate Lade-/Verarbeitungsanweisungen ( @lazy, @cascade remove ) Seite: 19 / 42

Extbase Konfigurationen / Abhängigkeiten: class Tx_BlogExample_Domain_Model_Blog extends Tx_Extbase_DomainObject_AbstractEntity { /** * The blog's title. * * @var string * @validate StringLength(minimum = 1, maximum = 80) */ protected $title = ''; /** * The posts of this blog * * @var Tx_Extbase_Persistence_ObjectStorage<Tx_BlogExample_Domain_Model_Post> * @lazy * @cascade remove */ protected $posts; /** * Adds a post to this blog * * @param Tx_BlogExample_Domain_Model_Post $post * @return void */ public function addpost(tx_blogexample_domain_model_post $post) { $this->posts->attach($post); Seite: 20 / 42

Extbase Konfigurationen / Abhängigkeiten: class Tx_BlogExample_Controller_PostController extends Tx_Extbase_MVC_Controller_ActionController { //... /** * Displays a form for creating a new post * * @param Tx_BlogExample_Domain_Model_Blog $blog The blog the post belogs to * @param Tx_BlogExample_Domain_Model_Post $newpost Fresh post object as basis for rendering * @return string An HTML form for creating a new post * @dontvalidate $newpost */ public function newaction(tx_blogexample_domain_model_blog $blog, Tx_BlogExample_Domain_Model_Post $newpost = NULL) { $this->view->assign('authors', $this->personrepository->findall()); $this->view->assign('blog', $blog); $this->view->assign('newpost', $newpost); Seite: 21 / 42

Extbase Konfigurationen / Abhängigkeiten: class Tx_BlogExample_Controller_PostController extends Tx_Extbase_MVC_Controller_ActionController { //... /** * Creates a new post * * @param Tx_BlogExample_Domain_Model_Blog $blog The blog the post belogns to * @param Tx_BlogExample_Domain_Model_Post $newblog Fresh post object, not yet added to repo * @return void */ public function createaction(tx_blogexample_domain_model_blog $blog, Tx_BlogExample_Domain_Model_Post $newpost) { $blog->addpost($newpost); $newpost->setblog($blog); $this->flashmessages->add('your new post was created.'); $this->redirect('index', NULL, NULL, array('blog' => $blog)); Seite: 22 / 42

Extbase Ausgaben: Per Fluid Verschiedene Ausgabetypen ( format ) möglich standardmäßig HTML mit Endung.html Alternativ z.b. txt, json oder pdf möglich Rahmen (Layout), z.b. Resources/Private/Layouts/default.html <h1>blog Example</h1> <hr /> <f:renderflashmessages class="tx-extbase-flash-message" /> <f:render section="content" /> <hr /> <p> TYPO3 Association</p Seite: 23 / 42

Extbase Ausgaben: Template, z.b. Resources/Private/Templates/Post/new.html <f:layout name="default" /> <f:section name="content"> <div class="csc-header csc-header-n1"> <h1 class="csc-firstheader">create a new Post</h1></div> <f:render partial="formerrors" arguments="{for: 'newpost'" /> <f:form method="post" controller="post" action="create" name="newpost" object="{newpost" arguments="{blog : blog"> <label for="author">author <span class="required">(required)</span></label><br /> <f:form.select property="author" options="{authors" optionvaluefield="uid" optionlabelfield="fullname"><select><option>dummy</option></select> </f:form.select><br /> <label for="title">title <span class="required">(required)</span></label><br /> <f:form.textbox property="title" /><br /> <label for="content">content <span class="required">(required)</span></label><br /> <f:form.textarea property="content" rows="8" cols="46" /><br /> <f:form.submit class="submit" value="submit"/> </f:form> </f:section> Seite: 24 / 42

Extbase Ausgaben: Blöcke (Partials), z.b. Resources/Private/Partials/formErrors.html <f:form.errors for="{for"> <div class="error"> {error.message <f:if condition="{error.propertyname"> <p> <strong>{error.propertyname</strong>: <f:for each="{error.errors" as="errordetail"> {errordetail.message </f:for> </p> </f:if> </div> </f:form.errors> Seite: 25 / 42

Extbase... Live-Demo blog_example... To-Do: Funktionstests Linkerzeugung (Fluid-ViewHelper) Validatoren Fehlerausgaben Redirects Seite: 26 / 42

Vom Pfad abweichen Eigene ViewHelper (Fluid): Eigener Implode-ViewHelper, Implementierung z,b. unter Classes/ViewHelpers/ImplodeViewHelper.php class Tx_OurOwn_ViewHelpers_ImplodeViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper { /** * @param array $array List of values * @param string $glue Glue used to join values * * @return string */ public function render($array,$glue = ',') { return implode($glue,$array); Verwendung in Fluid-Template {namespace ourown = Tx_OurOwn_ViewHelpers... <ourown:implode array="{answers" glue=", " /> Seite: 27 / 42

Vom Pfad abweichen Eigene ViewHelper (Fluid): Eigener For-ViewHelper mit festen von/bis-werten (Ausgabe fester Anzahl von Elementen), Implementierung z,b. unter Classes/ViewHelpers/ForViewHelper.php class Tx_OurOwn_ViewHelpers_ForViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper { //... public function render($start,$until,$as = null,$array = null,$arrayvalue = null) { $returnvalue = ''; //... for($i = (int)$start;$i<(int)$until;$i++) { if($array!== null && $arrayvalue!== null && count($array) > $i) $this->templatevariablecontainer->add($arrayvalue, $array[$i]); elseif($arrayvalue!== null) $this->templatevariablecontainer->add($arrayvalue, null); if($as!== null) $this->templatevariablecontainer->add($as, $i); $returnvalue.= $this->renderchildren(); if($arrayvalue!== null) $this->templatevariablecontainer->remove($arrayvalue); if($as!== null) $this->templatevariablecontainer->remove($as); return $returnvalue; Seite: 28 / 42

Vom Pfad abweichen Eigene ViewHelper (Fluid): Eigener For-ViewHelper mit festen von/bis-werten (Ausgabe fester Anzahl von Elementen), Verwendung in Fluid-Template {namespace ourown = Tx_OurOwn_ViewHelpers... <ourown:for start="0" until="6" array="{entries" arrayvalue="oneentry"> <f:if condition="{oneentry.comment"> <f:then> <td>{oneentry.comment</b></td> </f:then> <f:else> <td>- no comment -</td> </f:else> </f:if> </ourown:for> Seite: 29 / 42

Vom Pfad abweichen Eigene ViewHelper (Fluid): Eigener InArray-ViewHelper Implementierung z,b. unter Classes/ViewHelpers/InArrayViewHelper.php class Tx_OurOwn_ViewHelpers_InArrayViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper { /** * @param mixed $needle The searched value * @param mixed $array The array */ public function render($needle,$array) { if (is_object($array)) { if (!$array instanceof Traversable) { throw new Tx_Fluid_Core_ViewHelper_Exception('ForViewHelper only supports arrays and objects implementing Traversable interface', 1248728393); $array = $this->converttoarray($array); return in_array($needle,$array); //... Seite: 30 / 42

Vom Pfad abweichen Eigene ViewHelper (Fluid): Eigener InArray-ViewHelper Verwendung in Fluid-Template; hier z.b. auch verschachtelt mit einem Standard if-viewhelper {namespace ourown = Tx_OurOwn_ViewHelpers... <f:if condition="{ourown:inarray(needle:'{ourobj.name' array:'{testarray')"> <f:then> JA </f:then> <f:else> NEIN </f:else> </f:if> Seite: 31 / 42

Vom Pfad abweichen Eigene ViewHelper (Fluid): Eigener PageBrowser-ViewHelper als Adapter zu bestehender Pagebrowser-Extension Implementierung z,b. unter Classes/ViewHelpers/PageBrowserViewHelper.php class Tx_OurOwn_ViewHelpers_PageBrowserViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper { //... public function render($numberofpages,$prefixid,$pageparametername = 'page') { // Get default configuration $conf = $GLOBALS['TSFE']->tmpl->setup['plugin.']['tx_pagebrowse_pi1.']; // Modify this configuration // Modify this configuration $conf += array( $conf += array( 'pageparametername' => $prefixid ' '.$pageparametername, 'pageparametername' => $prefixid. ' '.$pageparametername, 'numberofpages' => intval($numberofpages) 'numberofpages' => intval($numberofpages) ); ); // Get page browser $cobj // Get page = t3lib_div::makeinstance('tslib_cobj'); browser $cobj->start(array(), = t3lib_div::makeinstance('tslib_cobj'); ''); return $cobj->start(array(), $cobj->cobjgetsingle('user', ''); $conf); return $cobj->cobjgetsingle('user', $conf); Verwendung in Fluid-Template <nmrc:pagebrowser numberofpages="5" prefixid="{prefixid" pageparametername="page" /> Seite: 32 / 42

Vom Pfad abweichen Abspeichern mehrerer Datensätze in einem Submit (Extbase): Problem: Extbase nimmt (derzeit) eigentlich nur einen Datensatz zur Speicherung entgegen Eleganter per $this->propertymapper->mapandvalidate(...), jedoch derzeit noch Probleme: http://lists.typo3.org/pipermail/typo3-project-typo3v4mvc/2010-january/002618.html class Tx_OurOwn_Controller_ValuesController extends Tx_OurOwn_Controller_BaseController { //... public function savevaluesaction(tx_ourown_domain_model_item $item, $valuearray) { foreach($item->getvalues() as $value) { if(in_array($value->getuid(), array_keys($valuearray))) { $newvalue = $ValueArray[$value->getUid()]; // @todo Extbase validator if($newvalue >= 0 && $newvalue <= 100) $item->setfinalratingvalue($newvalue); $this->redirect('index', 'Item'); Seite: 33 / 42

Vom Pfad abweichen Abspeichern mehrerer Datensätze in einem Submit (Extbase): Problem: Extbase nimmt (derzeit) eigentlich nur einen Datensatz zur Speicherung entgegen <f:form method="post" controller="item" action="savevalues" name="item" arguments="{item : item" > <table cellspacing="0" cellpadding="0"> <tr> <f:for each="{valuearray" as="valueinfo"> <td> <f:form.textbox name="valuearray[{valueinfo.value.uid]" size="3" value="{valueinfo.value.value" /> </td> </f:for> </tr> <tr> <td colspan="6" align="right"> <f:form.submit style="width:120px;margin-right:5px;" value="submit" /> </td> </tr> </table> </f:form> Seite: 34 / 42

Vom Pfad abweichen Manuelle Abfragen in Repository (Extbase): Daten werden manuell aus beliebiger Quelle geholt und per DataMapper in Objekt geladen Nur zur Verdeutlichung was möglich WÄRE! DON'T DO THIS! class Tx_OurOwn_Domain_Repository_ProfilRepository extends Tx_Extbase_Persistence_Repository { //... public function getprofildata($id) { $profildaten = t3lib_div::makeinstance('tx_ourown_domain_model_profildaten'); $res = $GLOBALS["TYPO3_DB"]->exec_SELECTquery( '*', 'tx_ourown_profil_daten', 'profil_id='.$id'); $found = $GLOBALS["TYPO3_DB"]->sql_num_rows($res); If ($found) { $profildaten->loadrow(mysql_fetch_assoc($res)); return $profildaten; Seite: 35 / 42

Vom Pfad abweichen Manuelle Abfragen in Repository (Extbase): Sauberer Ansatz: z.b. Konfiguration der Datenquelle und Verwendung des PersistenceManager plugin.tx_myextension { persistence { classes { Tx_MyExtension_Domain_Model_Person { mapping { tablename = tt_address recordtype = Tx_MyExtension_Domain_Model_Person columns { birthday.maponproperty = dateofbirth street.maponproperty = thoroughfare (Quelle: Buch TYPO3-Extensions mit Extbase & Fluid, O'Reilly, Rau/Kurfürst) Seite: 36 / 42

Vom Pfad abweichen Stolperfalle: Finale Speicherung erfolgt automatisch erst am Ende einer Anfrage (Extbase): ObjectStorage nimmt Daten entgegen. Diese werden jedoch erst nach einer Anfrage (automatisch) vom PersistenceManager gespeichert. Falls vorher Zugriff auf alle Werte benötigt, selbst die Speicherung auslösen public function saveandfindaction(tx_ourown_domain_model_subject $subject, Tx_OurOwn_Domain_Model_Item $item = null, $message = '') { if($item!= null) { $item = t3lib_div::makeinstance('tx_ourown_domain_model_item'); $item->setsubject($subject); $this->itemrepository->add($item); $persistencemanager = t3lib_div::makeinstance('tx_extbase_persistence_manager'); $persistencemanager->persistall(); $allitems = $this->itemrepository->findbysubject($subject); if(count($allitems) >= 6) { $subject->setstatus('closed'); $this->subjectrepository->update($subject); $this->view->assign('subject', $subject); $this->view->assign('allitems', $allitems); Seite: 37 / 42

Vom Pfad abweichen Kleinere Standard-Extbase-Stolperfallen: @lazy im phpdoc benötigt, sofern sich Objekte gegenseitig referenzieren Ansonsten erfolgt der automatische Ladevorgang in einer Endlosschleife @dontvalidate im phpdoc angeben bei newaction() Speicherung erfolgt (üblicherweise) über separate Action, welche validiert Wenn Validierung fehlschlägt, wird die vorherige Action wieder aufgerufen (newaction()) Endlosschleife sofern diese Fehleingaben zur Wiedervorlage auch validieren würde Falls Einträge nicht gefunden werden Storage-PID kontrollieren 1.Ausgangspunkt im Formular des Plugins 2.TypoScript-Setup plugin.tx_extensionname.persistence.storagepid (kommaseparierte Liste) 3.TypoScript-Setup config.tx_extbase.persistence.storagepid (kommaseparatierte Liste) 4.Auf Wurzelseite des Seitenbaums Seite: 38 / 42

Vom Pfad abweichen Kleinere Standard-Extbase-Stolperfallen: Falls Einträge nicht gefunden werden Storage-PID kontrollieren 1.Ausgangspunkt im Formular des Plugins 2.TypoScript-Setup plugin.tx_extensionname.persistence.storagepid (kommaseparierte Liste) 3.TypoScript-Setup config.tx_extbase.persistence.storagepid (kommaseparatierte Liste) 4.Auf Wurzelseite des Seitenbaums Falls Einträge an falsche Stelle geschrieben werden Storage-PID kontrollieren 1.TypoScript-Setup plugin.tx_extensionname.persistence.classes. VollerKlassenName.newRecordStoragePid (einzelne PID) 2.TypoScript-Setup config.tx_extbase.persistence.classes. VollerKlassenName.newRecordStoragePid (einzelne PID) 3.Ansonsten je erstes Objekt aus o.g. Punkten (1-4) von Lesereihenfolge, letztlich also Wurzelseite des Seitenbaums Seite: 39 / 42

Links / Hilfen viewhelpertest: https://svn.typo3.org/typo3v4/coreprojects/mvc/viewhelpertest/ extbase_kickstarter: https://svn.typo3.org/typo3v4/extensions/extbase_kickstarter/trunk/ doc_extbase: https://svn.typo3.org/typo3v4/coreprojects/mvc/doc_extbase/trunk/ Extension "efempty" (siehe TER): Extbase/Fluid, leerer Container für erste Experimente Extbase/Fluid Cheat-Sheet: http://www.typofaktum.de/fileadmin/slides/extbasefluidcheatsheettypofaktum.pdf TYPO3 4.3: verstehen, implementieren, erweitern (Videotraining) Addison-Wesley/video2brain, Aster/Hauser/Neufeind, ISBN 978-3-8273-6290-2 TYPO3-Extensions mit Extbase & Fluid (Buch) O' Reilly, Rau/Kurfürst, ISBN 978-3-8972-1965-6 TYPO3-Extensions. Professionelle Frontend- und Backend-Programmierung Hanser, Ebner/Lobacher/Ulbrich, 978-3-4464-1557-7 Seite: 40 / 42

Fazit Es gibt viel zu entdecken! Seite: 41 / 42

Kontakt Danke fürs Zuhören sowie viel Erfolg und Spaß mit Extbase/Fluid! Link zu den Slides: http://talks.speedpartner.de Bei Fragen stehen wir selbstverständlich gerne zur Verfügung: Stefan Neufeind, neufeind@speedpartner.de SpeedPartner GmbH, http://www.speedpartner.de/ Seite: 42 / 42