# Control structure - View (or `include`) / Block

There is three ways to include other views into your current view `{% view %} / {% include %}` or 
using `{% block %}{% endblock %}`.

The order of loading depends on the order given within your directory configuration; the first file found from it 
will be used. 

## Inline `view` (string $path, array|null $arguments = null)

You must provide a valid `$path` from which the template will be loaded. If no `$arguments` are provided, defined 
variables from the caller's scope will be given (from `get_defined_vars()`).

**[PICEA]** So, using this code:

*path/base/nav.phtml*
```html
<nav>
    {% foreach $navigation as $index => $navItem %}
        {% view "path/base/nav-item", [ 'item' => $navItem, 'index' => $index] %}
    {% endforeach %}
</nav>
```

*path/base/nav-item.phtml*
```html
<a href="{{ $item->anchor }}" tabindex="{{ $index }}">{{ $item->name }}"</a>
```

**[HTML]** Could render such as :
```html
<nav>
    <a href="#top">Top</a>
    <a href="#bottom">Bottom</a>
    <a href="#left">Left</a>
    <a href="#right">Right</a>
</nav>
```

## `include` (string $path) content from external file

Whenever you need to `include` a raw file from one of your view directories

## Reusable `block` (string $path, ...$arguments) / `endblock`

A better way to achieve this behaviour could be to create a `block` which you can define as needed.

**[PICEA]** So, using this code:

*path/base/nav.phtml*
```html
<nav>
    {% foreach $navigation as $index => $navItem %}
        {% block "path/base/nav-item-block", $navItem->name, $navItem->anchor, $index %}{% endblock %}
    {% endforeach %}
</nav>
```

*path/base/nav-item-block.phtml*
```html
{% arguments string $name, string $anchor, int $index = 0 %}

<a href="{{ $anchor }}" tabindex="{{ $index }}">{{ $name }}"</a>
```

**[HTML]** Would render the same as the `view` example :
```html
<nav>
    <a href="#top">Top</a>
    <a href="#bottom">Bottom</a>
    <a href="#left">Left</a>
    <a href="#right">Right</a>
</nav>
```

### Extending a `block` using `define` and `slot`

You might need to define some custom content inside of a `block`.

You can do so by using `define` and `slot`.

**[PICEA]** So, using this code:

*path/base/nav.phtml*
```html
<nav>
    {% foreach $navigation as $index => $navItem %}
        {% block "path/base/nav-item-block", $navItem->name, $navItem->anchor, $index %}
            {% slot "attributes" %} class="nav-item" href="{{ $anchor }}" {% endslot %}
        {% endblock %}
    {% endforeach %}
</nav>
```

*path/base/nav-item-block.phtml*
```html
{% arguments string $name, string $anchor, int $index = 0 %}

{% define slot %}

<a {% slot "attributes" %}href="{{ $anchor }}" tabindex="{{ $index }}"{% endslot %}>{{ $name }}"</a>
```

**[HTML]** Would render the same as the `view` example :
```html
<nav>
    <a href="#top">Top</a>
    <a href="#bottom">Bottom</a>
    <a href="#left">Left</a>
    <a href="#right">Right</a>
</nav>
```