Top Banner
Inspiring people to share Advanced Fluid
50

Advanced Fluid

May 14, 2015

Download

Documents

In this talk, advanced features of Fluid are shown.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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.