.. include:: /Includes.rst.txt :navigation-title: ViewHelpers .. _viewhelpers-syntax: ========================= Fluid Syntax: ViewHelpers ========================= ViewHelper calls can be written using two distinct syntaxes—tag syntax and inline syntax. ViewHelpers are grouped into namespaces and can be organized in folders. When a ViewHelper is called in a template, you specify the namespace identifier, followed by a colon and the path to the ViewHelper, separated by dots: .. code-block:: namespace:folder.subFolder.name .. _viewhelper-tag-notation: Tag syntax ========== The tag syntax works just like HTML or XML. Tags can either be self-closing or can have a content, which can include other HTML tags or ViewHelper calls. .. code-block:: xml lowercase Variable is foo Variable is bar Variable is something else {myString} .. _viewhelper-inline-notation: Inline syntax ============= .. tip:: There is an online tool to convert tag-based syntax to inline syntax: `Fluid Converter `__ The inline syntax works using curly braces `{}`. Most ViewHelpers can also be used with the inline syntax, although the syntax might get more complicated depending on the use case. .. code-block:: xml {f:constant(name: '\Vendor\Package\Class::CONSTANT')} {f:format.case(value: 'lowercase', mode: 'upper')} {myVariable -> f:format.case(mode: 'upper')} ViewHelpers that operate on a singular input value can usually be chained, which can make templates more readable: .. code-block:: xml {myString -> f:format.case(mode: 'upper') -> f:replace(search: 'foo', replace: 'bar') -> f:format.trim()} The inline syntax can also be indented and can contain trailing commas and whitespace: .. code-block:: xml {f:render( partial: 'MyPartial', arguments: { foo: 'bar', }, )} .. _viewhelper-syntax-comparison: ViewHelper syntax comparison ============================ Depending on the situation, it might be better to use the inline syntax instead of the tag syntax and vice versa. Here is a more complex example that shows where the inline syntax is still possible, but might make things more complicated: .. code-block:: xml And its inline syntax variant: .. code-block:: xml {f:render(section:'MySection', arguments: {item: item}) -> f:if(condition: item) -> f:for(each: myArray, as: 'item')} Please note that, in chained inline notation, the `f:if` ViewHelpers should not use their usual `then` or `else` attributes, as they would directly output their value and thus break the chain! .. _viewhelper-namespaces-syntax: ViewHelper namespaces ===================== There are two syntax variants to import a ViewHelper namespace into a template. In the following examples, `blog` is the namespace available within the Fluid template and `MyVendor\BlogExample\ViewHelpers` is the PHP namespace to import into Fluid. By default, the `f` namespace is predefined by Fluid. Depending on your setup, additional global namespaces, defined directly via the :ref:`ViewHelperResolver `, might be available. HTML tag syntax with xmlns attribute ------------------------------------ .. code-block:: xml This is useful for various IDEs and HTML autocompletion. The :html:`` element itself will not be rendered if the attribute :html:`data-namespace-typo3-fluid="true"` is specified. The namespace is built using the fixed `http://typo3.org/ns/` prefix followed by the vendor name, package name, and the fixed `ViewHelpers` suffix. .. important:: Do not use `https://typo3.org/` (HTTPS instead of HTTP). Fluid would not be able to detect this namespace to convert it to the PHP class name prefixes. Remember: This is a unique XML namespace, it does not need to contain a valid URI. Curly braces syntax ------------------- .. code-block:: xml {namespace blog=MyVendor\BlogExample\ViewHelpers} Any line that uses the curly braces syntax results in a blank line. Multiple statements can be on either one line or across multiple lines.