50
Inspiring people to share Advanced Fluid

Advanced Fluid

Embed Size (px)

DESCRIPTION

In this talk, advanced features of Fluid are shown.

Citation preview

Page 1: Advanced Fluid

Inspiring people toshareAdvanced Fluid

Page 3: Advanced Fluid

Basic Ingredientshttp://www.sxc.hu/photo/816749

Page 4: Advanced Fluid

Inspiring people toshareAdvanced Fluid

Variables

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

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

Page 5: Advanced Fluid

Inspiring people toshareAdvanced Fluid

Object Accessors

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

<h1>The name of the blog is: {blog.title}</h1> Author: {blog.author}

Getters are called automatically can be nested

Page 6: Advanced Fluid

Inspiring people toshareAdvanced Fluid

ViewHelpersOutput logic is encapsulated in View Helpers (Tags)

{namespace f=F3\Fluid\ViewHelpers}<f:link.action action=“someAction“>Administration</f:link.action>

{namespace f=Tx_Fluid_ViewHelpers}<f:link.action action=“someAction“>Administration</f:link.action>

Namespace f is included automatically

NamespaceDeclaration

Invocation of a tagv4

v5

Page 7: Advanced Fluid

Inspiring people toshareAdvanced Fluid

Arrays

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

JSON object syntax objects as arguments can be

used!

Page 8: Advanced Fluid

Inspiring people toshareAdvanced Fluid

Summary: Basic IngredientsObject accessors: {blog.title}

ViewHelpers: <f:for each=“{blog.posts}“ as=“post“>...</f:for>

Arrays

Page 9: Advanced Fluid

Advanced Features

http://www.flickr.com/photos/sackerman519/4248877127/

Page 10: Advanced Fluid

Inspiring people toshareAdvanced Fluid

Forms - Edit Blog Post

<f:form action="update" object="{post}" name="post"> <label for="author">Author</label><br /> <f:form.textbox property="author.name" /><br />

<label for="title">Title</label><br /> <f:form.textbox property="title" /><br />

<label for="content">Content</label><br /> <f:form.textarea property="content" rows="5" cols="40" /><br /></f:form>

property binding

object bound to form

Page 11: Advanced Fluid

Inspiring people toshare

<f:form action="create" object="{newPost}" name="newPost"> <label for="author">Author</label><br /> <f:form.textbox property="author.name" /><br />

<label for="title">Title</label><br /> <f:form.textbox property="title" /><br />

<label for="content">Content</label><br /> <f:form.textarea property="content" rows="5" cols="40" /><br /></f:form>

Advanced Fluid

Forms - New Blog PostUsed

on Validation Error

Page 12: Advanced Fluid

<f:form action="create" object="{newPost}" name="newPost"> <label for="author">Author</label><br /> <f:form.textbox property="author.name" /><br />

<label for="title">Title</label><br /> <f:form.textbox property="title" /><br />

<label for="content">Content</label><br /> <f:form.textarea property="content" rows="5" cols="40" /><br /></f:form>

<f:form action="update" object="{post}" name="post"> <label for="author">Author</label><br /> <f:form.textbox property="author.name" /><br />

<label for="title">Title</label><br /> <f:form.textbox property="title" /><br />

<label for="content">Content</label><br /> <f:form.textarea property="content" rows="5" cols="40" /><br /></f:form>

Code Duplication!

Page 13: Advanced Fluid

Inspiring people toshare

<f:form action="create" object="{newPost}" name="newPost"> <f:render partial="BlogPostForm" /></f:form>

Resources/Private/Partials/BlogPostForm.html

<label for="author">Author</label><br /><f:form.textbox property="author" /><br />

<label for="title">Title</label><br /><f:form.textbox property="title" /><br />

<label for="content">Content</label><br /><f:form.textarea property="content" rows="5" cols="40" /><br />

Advanced Fluid

Removing the Duplication

Page 14: Advanced Fluid

Use Partials to remove Duplication

Ausstecher-bild

Partialsremoveduplication

Page 15: Advanced Fluid

Inspiring people toshareAdvanced Fluid

Improving the Edit Form<h2>{post.title}</h2>

<f:form action="update" object="{post}" name="post"> <f:render partial="BlogPostForm" /></f:form>

XSS?

Page 16: Advanced Fluid

Inspiring people toshareAdvanced Fluid

Improving the Edit Form<h2><script> stealSessionAndSendTo('[email protected]')</script></h2>

<f:form action="update" object="{post}" name="post"> <f:render partial="BlogPostForm" /></f:form>

Page 17: Advanced Fluid

Inspiring people toshareAdvanced Fluid

Improving the Edit Form<h2>{post.title}</h2>

<f:form action="update" object="{post}" name="post"> <f:render partial="BlogPostForm" /></f:form>

AutomaticallyEscaped!

Page 18: Advanced Fluid

Secure byDefault

Page 19: Advanced Fluid

Inspiring people toshareAdvanced Fluid

Improving the Edit Form<h2>{post.title}</h2><f:format.date format="Y-m-d">{post.date}</f:format.date>

<f:form action="update" object="{post}" name="post"> <f:render partial="BlogPostForm" /></f:form>

Page 20: Advanced Fluid

Inspiring people toshareAdvanced Fluid

Improving the Edit Form<h2>{post.title}</h2>{post.date -> f:format.date(format:"Y-m-d")}

<f:form action="update" object="{post}" name="post"> <f:render partial="BlogPostForm" /></f:form>

Page 21: Advanced Fluid

Inspiring people toshareAdvanced Fluid

Tag Syntax vs Inline Syntax<link rel="stylesheet" href="<f:uri.file path='myStyle.css' />" />

<link rel="stylesheet" href="{f:uri.file(path: 'myStyle.css')}" />

Both have theiruse-cases!

Page 22: Advanced Fluid

Sushi-Bild

Don't fearthe Inline

Syntax!

sxc.hu: 1097400_18260778.jpg

Page 23: Advanced Fluid

Inspiring people toshareAdvanced Fluid

Page 24: Advanced Fluid

Inspiring people toshareAdvanced Fluid

Render Date as Image<h2>{post.title}</h2>{post.date -> f:format.date(format:"Y-m-d") -> f:cObject(typoscriptObjectPath: 'lib.dateAsImage')}

TypoScript

lib.dateAsImage = IMAGElib.dateAsImage { file = GIFBUILDER file { 10 = TEXT 10.current = 1 }}

Use TypoScriptwhere it makes

sense.

Page 25: Advanced Fluid

Inspiring people toshareAdvanced Fluid

Summary: Advanced FeaturesForms

XSS Protection

Inline Syntax

cObject ViewHelper

Page 26: Advanced Fluid

ToDo: Developing ViewHelpers-> Bild vom Kochen / Backen?

MESSERBLOCK / Messer an wand

http://freerangestock.com/details.php?gid=37&pid=11545

DevelopingViewHelpers

Page 27: Advanced Fluid

Fluid Core does not contain any output logic, and no control structures!

Page 28: Advanced Fluid

<f:...>

Every tag is a class!

Page 29: Advanced Fluid

v5 {namespace f=F3\Fluid\ViewHelpers}

<f:for>...</f:for>

F3\Fluid\ViewHelpers\ForViewHelper

Page 30: Advanced Fluid

v4 {namespace f=Tx_Fluid_ViewHelpers}

<f:for>...</f:for>

Tx_Fluid_ViewHelpers_ForViewHelper

Page 31: Advanced Fluid

v4 {namespace f=Tx_Fluid_ViewHelpers}

<f:link.action>...</f:link.action>

Tx_Fluid_ViewHelpers_Link_ActionViewHelper

Page 32: Advanced Fluid

Inspiring people toshareAdvanced Fluid

AbstractViewHelper

AbstractTagBasedViewHelper AbstractConditionViewHelper

AbstractWidgetViewHelper

Page 33: Advanced Fluid

Inspiring people toshareAdvanced Fluid

AbstractViewHelper{namespace blog=Tx_BlogExample_ViewHelpers}<blog:greeting name="Kasper" />

class Tx_BlogExample_ViewHelpers_GreetingViewHelper extends ...AbstractViewHelper {

/** * @param string name */public function render($name) {

return 'Hello ' . $name;}

}

Page 34: Advanced Fluid

Inspiring people toshareAdvanced Fluid

Example: <f:image src="myImage.png" width="200" />

With AbstractViewHelper:public function render($src) { return '<img src="' . $src . '" />'; // TODO: Scaling} XSS!

Page 35: Advanced Fluid

Inspiring people toshareAdvanced Fluid

TagBasedViewHelperExample: <f:image src="myImage.png" width="200" />

With TagBasedViewHelper:

protected $tagName = 'img';

public function render($src) { $this->tag->addAttribute('src', $src); return $this->tag->render();}

Page 36: Advanced Fluid

Inspiring people toshareAdvanced Fluid

TagBasedViewHelper

Default Arguments: class, id, style, ...

additionalAttributes

<f:form.textbox additionalAttributes="{dojoType: 'dijit.form.TextBox'}" />

Additional Goodies

Page 37: Advanced Fluid

Inspiring people toshareAdvanced Fluid

IfViewHelper<f:if condition="{blog.posts}"> <f:then> ... display blog posts ... </f:then> <f:else> No Blog Posts Available </f:else></f:if>

<li class="{f:if(condition: iteration.isFirst, then: 'isFirstElement')}">Some Element</li>

Page 38: Advanced Fluid

Inspiring people toshareAdvanced Fluid

IfViewHelperclass IfViewHelper extends ...AbstractConditionViewHelper { /** * @param boolean $condition View helper condition */ public function render($condition) { if ($condition) { return $this->renderThenChild(); } else { return $this->renderElseChild(); } }}

Page 39: Advanced Fluid

Inspiring people toshareAdvanced Fluid

Widgets

Page 40: Advanced Fluid
Page 41: Advanced Fluid

Inspiring people toshareAdvanced Fluid

Widgets encapsulatecomplex (view-related)

functionality.

AJAXAutocompletionPagination

Alphabetical listingGoogle Maps

Calendar

Sortable grid

Page 42: Advanced Fluid

Inspiring people toshareAdvanced Fluid

It's simple to use them!

Page 43: Advanced Fluid

Inspiring people toshareAdvanced Fluid

It's simple to write them!

Page 44: Advanced Fluid

http://www.sxc.hu/photo/983682

Creating ViewHelpers is easy!

Page 46: Advanced Fluid

Inspiring people toshareAdvanced Fluid

TA

Page 47: Advanced Fluid

Inspiring people toshareAdvanced Fluid

Autocompletion

Page 48: Advanced Fluid

Inspiring people toshareAdvanced Fluid

Autocompletion

Page 49: Advanced Fluid

Inspiring people toshareAdvanced Fluid

?????????????

Page 50: Advanced Fluid

inspiring people to share.