SlideShare a Scribd company logo
1 of 91
Download to read offline
Punkt.de - 4. November 2009   Inspiring people to
Fluid Templating              share
Fluid Templating
                 04.11.2009



Sebastian Kurfürst <sebastian@typo3.org>
TYPO3 v4 und v5


                   v4   v5




                             Inspiring people to
Fluid Templating             share
Inspiring people to
Fluid Templating   share
Was ist eine Template Engine?
           Daten
          Data                        Template
          Data




                   Template Engine


                   gerenderte Daten
                        Data
                        Data
                                       Inspiring people to
Fluid Templating                       share
Inspiring people to
Fluid Templating   share
Template Engines heute
Klass. TYPO3
 Templating        Smarty   PHPTAL




                             Inspiring people to
Fluid Templating             share
Template Engines heute

Klassisches TYPO3 Templating
    marker / subpart-basiert
    kein Kontrollfluss
    nicht erweiterbar
    Arbeit mit Arrays oder Objekten schwierig




                                         Inspiring people to
Fluid Templating                         share
Template Engines heute

Klassisches TYPO3 Templating

                   ###CONTENTS###

                     <h2>###TITLE###</h2>
                           Text

                   ###CONTENTS###




                                            Inspiring people to
Fluid Templating                            share
Template Engines heute

Klassisches TYPO3 Templating



      Eine Schleife implementieren
                    Text




                              Inspiring people to
Fluid Templating              share
Template Engines heute

       Klassisches TYPO3 Templating


###CONTENTS###
                           $subEl = getSubpart(“SUBELEMENT“);
  <ul>                                  Text
                           $out = ‘‘;
    ###SUBELEMENT###
                           foreach ($recordList as $record) {
      <li>###TITLE###</li>
                               $out .= substituteMarker($subEl, ‘TITLE‘, $record[‘title‘]);
    ###SUBELEMENT###
                           }
  </ul>
                           return substituteSubpart($template, ‘SUBELEMENT‘, $out);
###CONTENTS###




                                                                 Inspiring people to
       Fluid Templating                                          share
Inspiring people to
Fluid Templating   share
Template Engines heute

Smarty

   <ul>
   {foreach from=$myArray item=foo}
      <li>{$foo}</li>
   {/foreach}
   </ul>




                                      Inspiring people to
Fluid Templating                      share
Template Engines heute

Smarty
    PHP4-basiert
    eigene {...}-Syntax - keine Autocompletion
    Funktionen gehören zum Sprachumfang - keine
    Namespaces
    alle Funktionen eingebaut
    Selbstgeschriebene Funktionen können vom
    Namen her miteinander kollidieren


                                         Inspiring people to
Fluid Templating                         share
Template Engines heute

PHPTAL

<div class="item" tal:repeat="item itemsArray">
  <span tal:condition="item/hasDate" tal:replace="item/
getDate"/>
  <a href="${item/getUrl}" tal:content="item/getTitle"/>
 <p tal:content="value/getContent"/>
</div>




                                      Inspiring people to
Fluid Templating                      share
Template Engines heute

PHPTAL
    well-formed XML, but NOT VALID (no DTD /
    Schema)
    Semantik teilweise unintuitiv
    PHP im template möglich
    Keine autocompletion
    Schwer erweiterbar



                                       Inspiring people to
Fluid Templating                       share
Template Engines heute

Nachteile aktueller Engines
    Nicht vollständig objektorientiert / brechen
    objektorientierte Paradigmen an einigen Stellen
    schwer zu benutzen für nicht-HTML-Templates
    keine Autocompletion in Editoren
    nicht einfach erweiterbar




                                         Inspiring people to
Fluid Templating                         share
Inspiring people to
Fluid Templating   share
Inspiring people to
Fluid Templating   share
Einordnung - v4, v5 -
                   Transition




                                           Inspiring people to
Fluid Templating                           share
Wieso noch eine Template Engine?




                         Inspiring people to
Fluid Templating         share
Ziele von Fluid




                                     Inspiring people to
Fluid Templating                     share
The Zen of
              Templating



simpel   mächtig
                    http://www.sxc.hu/photo/821903
The Zen of
                 Templating



intuitiv   leicht erweiterbar
                        http://www.sxc.hu/photo/821903
simple, elegante
                                                    template engine




http://www.flickr.com/photos/josefstuefer/9699426/
Viele Hilfestellungen
für den Template-Autor
Einfache und
                    saubere
                Erweiterbarkeit


http://www.sxc.hu/photo/338064
Unterstützung vieler
 Ausgabe-Formate
Inspiring people to
Fluid Templating   share
Kern-
                                 konzepte

http://www.sxc.hu/photo/816749
Kernkonzepte

Variablen
$this->view->assign(‘blogTitle’,
$blog->getTitle());


<h1>The name of the blog is:
{blogTitle}</h1>

                           Inspiring people to
Fluid Templating           share
Kernkonzepte

Object Accessors
$this->view->assign(‘blog’, $blog);
<h1>The name of the blog is:
         {blog.title}</h1>
Author: {blog.author}
                     $blog->getAuthor();


                            Inspiring people to
Fluid Templating            share
Kernkonzepte

     ViewHelpers                 Namespace-
                                 Deklaration
     {namespace f=F3FluidViewHelpers}
v5


     <f:link.action action=“someAction“>
        Administration           ViewHelper
     </f:link>                      Aufruf



                                   Inspiring people to
     Fluid Templating              share
Kernkonzepte

     ViewHelpers                 Namespace-
                                 Deklaration
     {namespace f=Tx_Fluid_ViewHelpers}
v4


     <f:link.action action=“someAction“>
        Administration           ViewHelper
     </f:link>                      Aufruf



                                   Inspiring people to
     Fluid Templating              share
Fluid Core enthält keine Ausgabelogik,
     und keine Kontrollstrukturen!
<f:...>

Jeder Tag ist eine
     Klasse!
v4



     {namespace f=Tx_Fluid_ViewHelpers}
             <f:for>...</f:for>
 Tx_Fluid_ViewHelpers_ForViewHelper
v5



      {namespace f=F3FluidViewHelpers}
              <f:for>...</f:for>
     F3FluidViewHelpersForViewHelper
v5



     {namespace f=F3FluidViewHelpers}
     <f:link.action>...</f:link.action>
F3FluidViewHelpersLinkActionViewHelper
Kernkonzepte

Arrays
<f:link.action action=“show“
  arguments=“{blog: blog, name:
‘Hello’}“>
  show posting
</f:link>


                         Inspiring people to
Fluid Templating         share
Kernkonzepte

Grundbestandteile
    Object accessors: {blog.title}
    ViewHelpers: <f:for each=“{blog.posts}“
    as=“post“>...</f:for>
    Arrays




                                         Inspiring people to
Fluid Templating                         share
simple loop




Fortgeschrittene
       Konzepte
Formulare



                   v4           v5




                                     Inspiring people to
Fluid Templating                     share
Fortgeschrittene Konzepte

 Formulare
/**
 * Displays a form for creating a new blog
 *
 * @param F3BlogDomainModelBlog $newBlog A fresh blog object taken as a basis for the rendering
 * @return string An HTML form for creating a new blog
 * @dontvalidate $newBlog
 */
public function newAction(F3BlogDomainModelBlog $newBlog = NULL) {
       $this->view->assign('newBlog', $newBlog);
}

/**
 * Creates a new blog
 *
 * @param F3BlogDomainModelBlog $newBlog A fresh Blog object which has not yet been added to the repository
 * @return void
 */
public function createAction(F3BlogDomainModelBlog $newBlog) {
       $this->blogRepository->add($newBlog);
       $this->pushFlashMessage('Your new blog was created.');
       $this->redirect('index');
}


                                                                                Inspiring people to
 Fluid Templating                                                              share
Fortgeschrittene Konzepte

     Formulare
     <f:form method="post" action="create" object="{newBlog}" name="newBlog">
          <label for="identifier">Identifier<br />
          <f:form.textbox property="identifier" id="identifier" />
          <br />
          <label for="name">Title</label><br />
          <f:form.textbox property="title" id="title" />
          <br />
          <label for="description">Description</label><br />
          <f:form.textarea property="description" rows="2" cols="40"
id="description" />
          <br />
          <f:form.submit value="Create blog" />
     </f:form>
</f:section>

                                                        Inspiring people to
     Fluid Templating                                   share
Fortgeschrittene Konzepte




Code Text




                            Inspiring people to
Fluid Templating            share
Fortgeschrittene Konzepte

 Formulare
/**
 * Displays a form for creating a new blog
 *
 * @param F3BlogDomainModelBlog $newBlog A fresh blog object taken as a basis for the rendering
 * @return string An HTML form for creating a new blog
 * @dontvalidate $newBlog
 */
public function newAction(F3BlogDomainModelBlog $newBlog = NULL) {
       $this->view->assign('newBlog', $newBlog);
}

/**
 * Creates a new blog
 *
 * @param F3BlogDomainModelBlog $newBlog A fresh Blog object which has not yet been added to the repository
 * @return void
 */
public function createAction(F3BlogDomainModelBlog $newBlog) {
       $this->blogRepository->add($newBlog);
       $this->pushFlashMessage('Your new blog was created.');
       $this->redirect('index');
}


                                                                                Inspiring people to
 Fluid Templating                                                              share
Fortgeschrittene Konzepte

 Formulare
/**
 * Displays a form for creating a new blog
 *
 * @param F3BlogDomainModelBlog $newBlog A fresh blog object taken as a basis for the rendering
 * @return string An HTML form for creating a new blog
 * @dontvalidate $newBlog
 */
public function newAction(F3BlogDomainModelBlog $newBlog = NULL) {
       $this->view->assign('newBlog', $newBlog);
}

/**
 * Creates a new blog
 *
 * @param F3BlogDomainModelBlog $newBlog A fresh Blog object which has not yet been added to the repository
 * @return void
 */
public function createAction(F3BlogDomainModelBlog $newBlog) {
       $this->blogRepository->add($newBlog);
       $this->pushFlashMessage('Your new blog was created.');
       $this->redirect('index');
}


                                                                                Inspiring people to
 Fluid Templating                                                              share
Inspiring people to
Fluid Templating   share
Layouts und Partials



                   v4      v5




                                Inspiring people to
Fluid Templating                share
Inspiring people to
Fluid Templating   share
Fortgeschrittene Konzepte

Layouts
<f:layout name="master" />
<f:section name="main">
  <h1> My content</h1>
</f:section>




                            Inspiring people to
Fluid Templating            share
Fortgeschrittene Konzepte

Layouts
<html> ...
<body>
  <f:render section="main" />
</body>




                            Inspiring people to
Fluid Templating            share
Fortgeschrittene Konzepte

Partials
<f:render partial="list"
arguments="{settings: settings}"/>




                            Inspiring people to
Fluid Templating            share
Inspiring people to
Fluid Templating   share
Fortgeschrittene Konzepte

Inline-Notation
<link rel="stylesheet"
href="<f:uri.resource
path='myCss.css' />" />




                            Inspiring people to
Fluid Templating            share
Fortgeschrittene Konzepte

Inline-Notation
<link rel="stylesheet"
href="{f:uri.resource(path:
'myCss.css')}" />




                              Inspiring people to
Fluid Templating              share
Fortgeschrittene Konzepte

Inline-Notation


<f:format.date format="Y-m-d">
{post.date}</f:format.date>
      Kein
   Leerzeichen
     erlaubt!



                            Inspiring people to
Fluid Templating            share
Fortgeschrittene Konzepte

Inline-Notation
<f:format.padding padLength="40">
<f:format.date format="Y-m-d">
{post.date}</f:format.date>
</f:format.padding>


                            Inspiring people to
Fluid Templating            share
Inspiring people to
Fluid Templating   share
Fortgeschrittene Konzepte

Inline-Notation
{post.date
-> f:format.date(format:'Y-m-d')
-> f:format.padding(padLength:40)}




                            Inspiring people to
Fluid Templating            share
XSS-Vorbeugung




                                    Inspiring people to
Fluid Templating                    share
Fortgeschrittene Konzepte

Cross Site Scripting
<h2><?= $post->getTitle() ?></h2>
<p><?= $post->getContents() ?></p>

                            !!!

                                  Inspiring people to
Fluid Templating                  share
Fortgeschrittene Konzepte

Cross Site Scripting
Ruby:
<%= h(...) %>



 Explizit!
                            Inspiring people to
Fluid Templating            share
Fortgeschrittene Konzepte

Cross Site Scripting
<h2>{post.title}</h2>
<p>{post.contents}</p>
                            automatisch
                              escaped




 Implizit!
Fluid Templating                          Inspiring people to
                                          share
Fortgeschrittene Konzepte

Automatische XSS-Vorbeugung
    alle ObjectAccessors, welche nicht in
    Argumenten stehen, werden escaped
    <f:..... foo="{bar}">{something}</f:...>

                         nicht    escaped
                        escaped




                                               Inspiring people to
Fluid Templating                               share
Boolesche Werte




                                     Inspiring people to
Fluid Templating                     share
Fortgeschrittene Konzepte

Conditions
<f:if condition="CONDITION">
</f:if>



{f:if(condition:"CONDITION", then:'...')}


                              Inspiring people to
Fluid Templating              share
Fortgeschrittene Konzepte

Conditions
<f:if condition="CONDITION">
 <f:then>...</f:then>
 <f:else>...</f:else>
</f:if>
{f:if(condition:"CONDITION", then:'...',
else: '...')}
                              Inspiring people to
Fluid Templating              share
Fortgeschrittene Konzepte

Conditions
{booleanValue}
{someValue} == {otherValue}
{someNumber} % 2
{someValue} == {f:viewHelper()}
NICHT: {someValue} == 'String'
                            Inspiring people to
Fluid Templating            share
Fortgeschrittene Konzepte

Conditions
    Boolesche Werte haben immer die Form
    XX Operator YY
    XX / YY ist Object Accessor, Inline Notation, Zahl,
    aber KEIN String.
    Operator ist z.B. >, >=, <, <=, %, !=, ==
    Dies ist immer möglich, wenn Argument vom
    Typ boolean registriert ist



                                            Inspiring people to
Fluid Templating                            share
Fortgeschrittene Konzepte

Standard-ViewHelper
    Kontrollstrukturen
    Formular-Helper
    Format-ViewHelper




                            Inspiring people to
Fluid Templating            share
Fortgeschrittene Konzepte

<f:cObject>
<!-- im Template -->
<f:cObject typoscriptObjectPath="lib.myCounter">{posts.count}</f:cObject>
<!-- oder -->
<f:cObject typoscriptObjectPath="lib.myCounter" data=“{posts.count}“ />
<!-- oder -->
{posts.count->f:cObject(typoScriptObjectPath: 'lib.myCounter')}

<!-- im TypoScript Setup -->
lib.myCounter = TEXT
lib.myCounter {
  current = 1
  wrap = <strong> | </strong>
}


                                                     Inspiring people to
Fluid Templating                                     share
Fortgeschrittene Konzepte

<f:cObject>
<!-- im Template -->
<f:cObject typoscriptObjectPath="lib.myCounter">{post}</f:cObject>
<!-- oder -->
<f:cObject typoscriptObjectPath=“lib.myCounter“ data=“{post}“ />
<!-- oder -->
{post -> f:cObject(typoscriptObjectPath: 'lib.myCounter')}

 <!-- im TypoScript Setup -->
 lib.myCounter = COA
 lib.myCounter {
  10 = TEXT
  10.field = title
  20 = TEXT
  20.field = author
  wrap = <strong> | </strong>
                                                     Inspiring people to
 }
Fluid Templating                                     share
Fortgeschrittene Konzepte

<f:translate>
<f:translate key=“name“ default="Standard" />

{f:translate(key: 'name', default: 'My Name')}

<f:translate key="foo" arguments="{0:post.name,
1:post.author}" />
in der locallang.xml: "%1$s (by %0$s)"




                                           Inspiring people to
Fluid Templating                           share
Fortgeschrittene Konzepte

Zusammenfassung
    Formulare
    Layouts und Partials
    Inline-Notation und Chaining von VHs
    XSS-Vorbeugung
    intuitive Syntax für boolesche Werte
    mächtige Standard-ViewHelper Library



                                           Inspiring people to
Fluid Templating                           share
Eigene ViewHelper




                                  Inspiring people to
Fluid Templating                  share
Eigene ViewHelper

v4   Aufgabe: Gravatar ViewHelper
         soll eine E-Mail-Adresse bekommen, und den
         Gravatar-ViewHelper ausgeben, falls vorhanden.
         Erwartete Ausgabe:
         <img src=“http://www.gravatar.com/avatar/md5
         ($email).jpg“ />




                                             Inspiring people to
     Fluid Templating                        share
Eigene ViewHelper

v4   Aufgabe: Gravatar ViewHelper
         Erwartete Verwendung:

         {namespace blog=Tx_Blog_ViewHelpers}
         <blog:gravatar email=“sebastian@typo3.org“ />




                                            Inspiring people to
     Fluid Templating                       share
Eigene ViewHelper

v4   1. ViewHelper-Skelett anlegen
     class Tx_Blog_ViewHelpers_GravatarViewHelper
       extends Tx_Fluid_Core_AbstractViewHelper {
        public function render() {
           return ‘Hello World‘;
        }
     }




                                           Inspiring people to
     Fluid Templating                      share
Eigene ViewHelper

v4     2. Implementieren!
                                 PHPDoc
                           muss für Validierung
     /**                       existieren.
      * @param string $email The email to render as gravatar
      */
     public function render($email) {
        return ‘http://www.gravatar.com/gravatar/‘ . md5($email);
     }
                                           Alle Methodenparameter
                                       werden automatisch ViewHelper-
                                                 Argumente.




                                                           Inspiring people to
       Fluid Templating                                    share
Inspiring people to
Fluid Templating   share
Fluid intern

                       TemplateView        View Helpers (Tags)
v5           v4     TemplateView       View Helpers (Tags)


     v5 v4                        Fluid Core




                                                Inspiring people to
 Fluid Templating                               share
http://www.sxc.hu/photo/1132907
Autocompletion
Balance
Ressourcen
    Forge-Projekte "Fluid" und "MVC Framework"
    (und dazugehöriger SVN)
    https://svn.typo3.org/TYPO3v4/CoreProjects/
    MVC/ -> Extbase, Fluid (v4), Blog Example,
    Viewhelpertest




                                         Inspiring people to
Fluid Templating                         share
????
   ??
   ??
    ?
 ??
  ?
 ?
inspiring people to share.

More Related Content

What's hot

WordPress Developers Israel Meetup #1
WordPress Developers Israel Meetup #1WordPress Developers Israel Meetup #1
WordPress Developers Israel Meetup #1
Yoav Farhi
 
PloneNG: What's new in Plone 4.2, 4.3, and beyond
PloneNG: What's new in Plone 4.2, 4.3, and beyondPloneNG: What's new in Plone 4.2, 4.3, and beyond
PloneNG: What's new in Plone 4.2, 4.3, and beyond
David Glick
 
Making your Drupal fly with Apache SOLR
Making your Drupal fly with Apache SOLRMaking your Drupal fly with Apache SOLR
Making your Drupal fly with Apache SOLR
Exove
 

What's hot (20)

Drupal 8 theming deep dive
Drupal 8 theming deep diveDrupal 8 theming deep dive
Drupal 8 theming deep dive
 
One Man Band - Drupal Lightning Talks
One Man Band - Drupal Lightning TalksOne Man Band - Drupal Lightning Talks
One Man Band - Drupal Lightning Talks
 
Creating Your First WordPress Plugin
Creating Your First WordPress PluginCreating Your First WordPress Plugin
Creating Your First WordPress Plugin
 
Rebrand WordPress Admin
Rebrand WordPress AdminRebrand WordPress Admin
Rebrand WordPress Admin
 
Introduction to Drupal (7) Theming
Introduction to Drupal (7) ThemingIntroduction to Drupal (7) Theming
Introduction to Drupal (7) Theming
 
The Way to Theme Enlightenment 2017
The Way to Theme Enlightenment 2017The Way to Theme Enlightenment 2017
The Way to Theme Enlightenment 2017
 
WordPress Structure and Best Practices
WordPress Structure and Best PracticesWordPress Structure and Best Practices
WordPress Structure and Best Practices
 
Drupal Theme Development
Drupal Theme DevelopmentDrupal Theme Development
Drupal Theme Development
 
Introduction to WordPress Theme Development
Introduction to WordPress Theme DevelopmentIntroduction to WordPress Theme Development
Introduction to WordPress Theme Development
 
Writing your Third Plugin
Writing your Third PluginWriting your Third Plugin
Writing your Third Plugin
 
Twig for Drupal 8 and PHP | Presented at OC Drupal
Twig for Drupal 8 and PHP | Presented at OC DrupalTwig for Drupal 8 and PHP | Presented at OC Drupal
Twig for Drupal 8 and PHP | Presented at OC Drupal
 
WordPress Developers Israel Meetup #1
WordPress Developers Israel Meetup #1WordPress Developers Israel Meetup #1
WordPress Developers Israel Meetup #1
 
NewBCamp09: Turning your design into a WordPress Theme
NewBCamp09: Turning your design into a WordPress ThemeNewBCamp09: Turning your design into a WordPress Theme
NewBCamp09: Turning your design into a WordPress Theme
 
WordPress theme development from scratch : ICT MeetUp 2013 Nepal
WordPress theme development from scratch : ICT MeetUp 2013 NepalWordPress theme development from scratch : ICT MeetUp 2013 Nepal
WordPress theme development from scratch : ICT MeetUp 2013 Nepal
 
<Head> Presentation: Plugging Into Wordpress
<Head> Presentation: Plugging Into Wordpress<Head> Presentation: Plugging Into Wordpress
<Head> Presentation: Plugging Into Wordpress
 
Introduction to Module Development (Drupal 7)
Introduction to Module Development (Drupal 7)Introduction to Module Development (Drupal 7)
Introduction to Module Development (Drupal 7)
 
Cms & wordpress theme development 2011
Cms & wordpress theme development 2011Cms & wordpress theme development 2011
Cms & wordpress theme development 2011
 
PloneNG: What's new in Plone 4.2, 4.3, and beyond
PloneNG: What's new in Plone 4.2, 4.3, and beyondPloneNG: What's new in Plone 4.2, 4.3, and beyond
PloneNG: What's new in Plone 4.2, 4.3, and beyond
 
Childthemes ottawa-word camp-1919
Childthemes ottawa-word camp-1919Childthemes ottawa-word camp-1919
Childthemes ottawa-word camp-1919
 
Making your Drupal fly with Apache SOLR
Making your Drupal fly with Apache SOLRMaking your Drupal fly with Apache SOLR
Making your Drupal fly with Apache SOLR
 

Viewers also liked

MED312 Introduction and twitter signup - What Is Web2Point0
MED312 Introduction and twitter signup - What Is Web2Point0MED312 Introduction and twitter signup - What Is Web2Point0
MED312 Introduction and twitter signup - What Is Web2Point0
_
 
13208268 pss7
13208268 pss713208268 pss7
13208268 pss7
13208268
 
MED306 introduction
MED306 introductionMED306 introduction
MED306 introduction
_
 
091516 new media cafe
091516 new media cafe091516 new media cafe
091516 new media cafe
NPLUS
 

Viewers also liked (8)

MED312 Introduction and twitter signup - What Is Web2Point0
MED312 Introduction and twitter signup - What Is Web2Point0MED312 Introduction and twitter signup - What Is Web2Point0
MED312 Introduction and twitter signup - What Is Web2Point0
 
MED316 - Introduction and Twitter signup
MED316 - Introduction and Twitter signupMED316 - Introduction and Twitter signup
MED316 - Introduction and Twitter signup
 
MED316 - Mobile Phone As Camera And Screen - Viral Videos
MED316 - Mobile Phone As Camera And Screen - Viral VideosMED316 - Mobile Phone As Camera And Screen - Viral Videos
MED316 - Mobile Phone As Camera And Screen - Viral Videos
 
Taya - Day cap dien so 1 Taiwan
Taya - Day cap dien so 1 TaiwanTaya - Day cap dien so 1 Taiwan
Taya - Day cap dien so 1 Taiwan
 
13208268 pss7
13208268 pss713208268 pss7
13208268 pss7
 
MED306 introduction
MED306 introductionMED306 introduction
MED306 introduction
 
MED306 Transmedia Narratives
MED306 Transmedia NarrativesMED306 Transmedia Narratives
MED306 Transmedia Narratives
 
091516 new media cafe
091516 new media cafe091516 new media cafe
091516 new media cafe
 

Similar to Schulung Fluid Templating

An Introduction to Tornado
An Introduction to TornadoAn Introduction to Tornado
An Introduction to Tornado
Gavin Roy
 

Similar to Schulung Fluid Templating (20)

Fluid - Templating for professionals - T3CON09
Fluid - Templating for professionals - T3CON09Fluid - Templating for professionals - T3CON09
Fluid - Templating for professionals - T3CON09
 
Fluid - The Zen of Templating
Fluid - The Zen of TemplatingFluid - The Zen of Templating
Fluid - The Zen of Templating
 
Fluent Development with FLOW3
Fluent Development with FLOW3Fluent Development with FLOW3
Fluent Development with FLOW3
 
EECI 2010 - The Power of ExpressionEngine's Dynamic Templates
EECI 2010 - The Power of ExpressionEngine's Dynamic TemplatesEECI 2010 - The Power of ExpressionEngine's Dynamic Templates
EECI 2010 - The Power of ExpressionEngine's Dynamic Templates
 
Kickass
KickassKickass
Kickass
 
T3CON11 - Extreme Fluid - Patrick Lobacher typovision
T3CON11 - Extreme Fluid - Patrick Lobacher typovision T3CON11 - Extreme Fluid - Patrick Lobacher typovision
T3CON11 - Extreme Fluid - Patrick Lobacher typovision
 
RESTful API development in Laravel 4 - Christopher Pecoraro
RESTful API development in Laravel 4 - Christopher PecoraroRESTful API development in Laravel 4 - Christopher Pecoraro
RESTful API development in Laravel 4 - Christopher Pecoraro
 
Web Development with Sinatra
Web Development with SinatraWeb Development with Sinatra
Web Development with Sinatra
 
An Introduction to Tornado
An Introduction to TornadoAn Introduction to Tornado
An Introduction to Tornado
 
Django Introduction & Tutorial
Django Introduction & TutorialDjango Introduction & Tutorial
Django Introduction & Tutorial
 
Atomic design
Atomic designAtomic design
Atomic design
 
MVC for TYPO3 4.3 with extbase
MVC for TYPO3 4.3 with extbaseMVC for TYPO3 4.3 with extbase
MVC for TYPO3 4.3 with extbase
 
CodeIgniter PHP MVC Framework
CodeIgniter PHP MVC FrameworkCodeIgniter PHP MVC Framework
CodeIgniter PHP MVC Framework
 
Zen and the Art of Claroline Module Development
Zen and the Art of Claroline Module DevelopmentZen and the Art of Claroline Module Development
Zen and the Art of Claroline Module Development
 
Remixing Confluence with Speakeasy - AtlasCamp 2011
Remixing Confluence with Speakeasy - AtlasCamp 2011Remixing Confluence with Speakeasy - AtlasCamp 2011
Remixing Confluence with Speakeasy - AtlasCamp 2011
 
Staging Drupal: Change Management Strategies for Drupal
Staging Drupal: Change Management Strategies for DrupalStaging Drupal: Change Management Strategies for Drupal
Staging Drupal: Change Management Strategies for Drupal
 
Staging Drupal: Change Management Strategies for Drupal
Staging Drupal: Change Management Strategies for DrupalStaging Drupal: Change Management Strategies for Drupal
Staging Drupal: Change Management Strategies for Drupal
 
Migrate yourself. code -> module -> mind
Migrate yourself. code -> module -> mindMigrate yourself. code -> module -> mind
Migrate yourself. code -> module -> mind
 
Валентин Мацвейко та Владислав Мойсеєнко — D8: Migrate Yourself: code->module...
Валентин Мацвейко та Владислав Мойсеєнко — D8: Migrate Yourself: code->module...Валентин Мацвейко та Владислав Мойсеєнко — D8: Migrate Yourself: code->module...
Валентин Мацвейко та Владислав Мойсеєнко — D8: Migrate Yourself: code->module...
 
Expression Engine Designer
Expression Engine   DesignerExpression Engine   Designer
Expression Engine Designer
 

More from Sebastian Kurfürst (7)

The Current State of TYPO3 Phoenix -- T3CON11
The Current State of TYPO3 Phoenix -- T3CON11The Current State of TYPO3 Phoenix -- T3CON11
The Current State of TYPO3 Phoenix -- T3CON11
 
FLOW3 Goes Semantic
FLOW3 Goes SemanticFLOW3 Goes Semantic
FLOW3 Goes Semantic
 
Advanced Fluid
Advanced FluidAdvanced Fluid
Advanced Fluid
 
Fluid for Designers
Fluid for DesignersFluid for Designers
Fluid for Designers
 
Workshop Extension-Entwicklung mit Extbase und Fluid
Workshop Extension-Entwicklung mit Extbase und FluidWorkshop Extension-Entwicklung mit Extbase und Fluid
Workshop Extension-Entwicklung mit Extbase und Fluid
 
FLOW3 - der aktuelle Stand. TYPO3 Usergroup Dresden
FLOW3 - der aktuelle Stand. TYPO3 Usergroup DresdenFLOW3 - der aktuelle Stand. TYPO3 Usergroup Dresden
FLOW3 - der aktuelle Stand. TYPO3 Usergroup Dresden
 
Continuous Integration at T3CON08
Continuous Integration at T3CON08Continuous Integration at T3CON08
Continuous Integration at T3CON08
 

Recently uploaded

Recently uploaded (20)

Simplifying Mobile A11y Presentation.pptx
Simplifying Mobile A11y Presentation.pptxSimplifying Mobile A11y Presentation.pptx
Simplifying Mobile A11y Presentation.pptx
 
Event-Driven Architecture Masterclass: Challenges in Stream Processing
Event-Driven Architecture Masterclass: Challenges in Stream ProcessingEvent-Driven Architecture Masterclass: Challenges in Stream Processing
Event-Driven Architecture Masterclass: Challenges in Stream Processing
 
Introduction to use of FHIR Documents in ABDM
Introduction to use of FHIR Documents in ABDMIntroduction to use of FHIR Documents in ABDM
Introduction to use of FHIR Documents in ABDM
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
JavaScript Usage Statistics 2024 - The Ultimate Guide
JavaScript Usage Statistics 2024 - The Ultimate GuideJavaScript Usage Statistics 2024 - The Ultimate Guide
JavaScript Usage Statistics 2024 - The Ultimate Guide
 
UiPath manufacturing technology benefits and AI overview
UiPath manufacturing technology benefits and AI overviewUiPath manufacturing technology benefits and AI overview
UiPath manufacturing technology benefits and AI overview
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
JohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptx
 
Choreo: Empowering the Future of Enterprise Software Engineering
Choreo: Empowering the Future of Enterprise Software EngineeringChoreo: Empowering the Future of Enterprise Software Engineering
Choreo: Empowering the Future of Enterprise Software Engineering
 
Decarbonising Commercial Real Estate: The Role of Operational Performance
Decarbonising Commercial Real Estate: The Role of Operational PerformanceDecarbonising Commercial Real Estate: The Role of Operational Performance
Decarbonising Commercial Real Estate: The Role of Operational Performance
 
API Governance and Monetization - The evolution of API governance
API Governance and Monetization -  The evolution of API governanceAPI Governance and Monetization -  The evolution of API governance
API Governance and Monetization - The evolution of API governance
 
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
 
Quantum Leap in Next-Generation Computing
Quantum Leap in Next-Generation ComputingQuantum Leap in Next-Generation Computing
Quantum Leap in Next-Generation Computing
 
Stronger Together: Developing an Organizational Strategy for Accessible Desig...
Stronger Together: Developing an Organizational Strategy for Accessible Desig...Stronger Together: Developing an Organizational Strategy for Accessible Desig...
Stronger Together: Developing an Organizational Strategy for Accessible Desig...
 
Working together SRE & Platform Engineering
Working together SRE & Platform EngineeringWorking together SRE & Platform Engineering
Working together SRE & Platform Engineering
 
Modernizing Legacy Systems Using Ballerina
Modernizing Legacy Systems Using BallerinaModernizing Legacy Systems Using Ballerina
Modernizing Legacy Systems Using Ballerina
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
Portal Kombat : extension du réseau de propagande russe
Portal Kombat : extension du réseau de propagande russePortal Kombat : extension du réseau de propagande russe
Portal Kombat : extension du réseau de propagande russe
 
WebRTC and SIP not just audio and video @ OpenSIPS 2024
WebRTC and SIP not just audio and video @ OpenSIPS 2024WebRTC and SIP not just audio and video @ OpenSIPS 2024
WebRTC and SIP not just audio and video @ OpenSIPS 2024
 
2024 May Patch Tuesday
2024 May Patch Tuesday2024 May Patch Tuesday
2024 May Patch Tuesday
 

Schulung Fluid Templating