picea/docs/02-control-structure-extend...

4.3 KiB

Control structure - extends / section

A nice feature of most robust templating engine is the ability to inherit from other view.

Picea follows a similar train of tought, since it's also possible create a chain of inheritance using extends which have definable parts you can declare using section.

Basic extends (string $path)

You must provide a valid $path from which the template will be inherited.

[PICEA] So, using this code:

path/base/layout.phtml

<!DOCTYPE html>
<html>
    <head>
        {% section "head" %}
            <meta charset="utf-8">
            <meta name="viewport" content="width=device-width, initial-scale=1">
            <title>{{ title() }} - AnExampleApp</title>
        {% section %}
    </head>
    <body>
        <header id="header"">
            {% section "header" %}{% view "path/base/navigation" %}{% endsection %}
        </header>
        <main id="main">{% section "main" %}{% endsection %}</main>
        <footer id="footer">
            {% section "footer" %}
                &copy; Copyright {{ date('Y') }}
            {% endsection %}
        </footer>
    </body>
</html>

path/home.phtml

{% extends "path/base/layout" %}

{% title "Home page" %}

{% section "main" %}
    <h1>Welcome !</h1>
    {# @TODO integrate our new blog engine below ! #}
    <article>
        This is our new blog ! We hope you are gonna enjoy your stay on our new platform !
    </article>
{% endsection %}

[HTML] Would render as such :

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Home page - AnExampleApp</title>
    </head>
    <body>
        <header id="header"">
            <nav>
                <a href="#home">Home</a>
                <a href="#login">Login</a>
            </nav>
        </header>
        <main id="main">
            <h1>Welcome !</h1>
            
            <article>
                This is our new blog ! We hope you are gonna enjoy your stay on our new platform !
            </article>
        </main>
        <footer id="footer">
            &copy; Copyright 2022
        </footer>
    </body>
</html>

Inherit an already extended view

We could use the previous file path/home and generate, let's say, the same page, but without a navigation menu.

[PICEA] So, using this code:

path/home-navless.phtml

{% extends "path/home" %}

{% section "header" %}{% endsection %}

[HTML] Would render as such :

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Home page - AnExampleApp</title>
    </head>
    <body>
        <header id="header""></header>
        <main id="main">
            <h1>Welcome !</h1>
            
            <article>
                This is our new blog ! We hope you are gonna enjoy your stay on our new platform !
            </article>
        </main>
        <footer id="footer">
            &copy; Copyright 2022
        </footer>
    </body>
</html>

Notice that the <header> tag is now empty, since we've redeclared it in our navless view.

Overview of section (string $name, array $options)

In your $name variable, accepted characters are alpha-numeric and those specific caracters : .-_:, so names suches as :

`body.content`
`my-cool-section:heading`
`MyOtherSection`
`_another_accepted_name`

Allowed options are :

string `action` : allowed are `prepend`, `default`, `append` 
int `order` : if you must

Actions can also be passed using specials tokens :

section.prepend and section.append can also be used without passing an action option.

path/home-nav.phtml

{% extends "path/home" %}

{% section "header" %}
    <a href="#mylink">First link here !</a>
{% endsection %}

path/home-admin-nav.phtml

{% extends "path/home-nav" %}

{% section.prepend "header" %}
    <h4>My new NAV header</h4>
{% endsection %}

{% section.append "header" %}
    <a href="#mylink">Second link here !</a>
{% endsection %}

[HTML] Would render as such :

<h4>My new NAV header</h4>
<a href="#mylink">First link here !</a>
<a href="#mylink">Second link here !</a>