Attention

TYPO3 v9 has reached its end-of-life September 30th, 2021 and is not maintained by the community anymore. Looking for a stable version? Use the version switch on the top left.

You can order Extended Long Term Support (ELTS) here: TYPO3 ELTS.

Adding a template

In Extbase frontend templates are stored in a subdirectory: EXT:store_inventory/Resources/Private/Templates - if not configured otherwise. The name of the subdirectory in the Templates/ folder is derived from the corresponding controller name (without the Controller suffix). The class name \MyVendor\StoreInventory\Controller\StoreInventoryController will result in the directory name StoreInventory/.

In the directory StoreInventory/ we can now create the template file for our list view. As our list view is rendered by the list action, the template should be List.html. The action name, without the action suffix.

EXT:store_inventory/Resources/Private/Templates/StoreInventory/List.html looks like this:

<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers">
<table border="1" cellspacing="1" cellpadding="5">
    <tr>
        <td>Product name</td>
        <td>Product description</td>
        <td>Quantity</td>
    </tr>
    <f:for each="{products}" as="product">
        <tr>
            <td align="top">{product.name}</td>
            <td align="top">
                <f:format.crop maxCharacters="100">{product.description}</f:format.crop>
            </td>
            <td align="top">{product.quantity}</td>
        </tr>
    </f:for>
</table>
</html>

The inventory is rendered as a table. We can access the array of products we assigned to the view ($this->view->assign('products', $products)) with {products}. Tags starting with <f: are Fluid ViewHelper tags. The code inside the for tag is repeated for each product in products. The ViewHelper f:crop shortens the containing text to at max 100 characters length. Within the brackets we can access the products and their properties. If there is a dot after the object name, the getters are automatically called. So {product.description} uses the getter method getDescription() from the domain model in file EXT:store_inventory/Classes/Domain/Model/Product.php.

Just creating the template is not yet enough to get the list in the frontend. We need to add an element that can be inserted on a page in the TYPO3 backend to tell TYPO3 where exactly we want to render our product list. This element is a so-called "Frontend-Plugin".