symfony3 templates

luego de crear nuestra aplicacion

composer create-project symfony/framework-standard-edition my_project_name
***
la estructura creada es la siguiente:


***

como vemos en la carpeta app, se encuentra

practica recomendada:
la carpeta Resources, donde tenemos la carpeta views
donde (como buena practica) debemos guardar las vistas de nuestro proyecto.

ventajas de guardar las vistas en app/Resources/views/:

-centralizamos la ubicacion de las vistas asi no debemos buscarlas dentro de todos los bundles que pudiera tener el proyecto.
-simplificamos la nomenclatura de los nombres logicos de las vistas.

otra opcion:

otra opcion muy usuada es la de recrear dentro de la carpeta del bundle en src, nuestra propia carpeta Resources/views

en ese caso si por ejemplo quisieramos referirnos a index.html.twig
lo deberemos hacer asi:

AppBundle:Default:index.html.twig

***
en cambio del modo anterior, lo ubicaremos simplemente asi:

default/index.html.twig

**
recomendacion:

para nombres de carpetas y templates se recomienda usar snake case, asi los nombres quedan como_esto

nota:

usamos twig porque es rapido, ya que cada tempplate se compila en una clase nativa php y cacheada.
(en modo DEV, el template se re-compila automaticamente despues de cualquier cambio)

herencia de templates y layouts

en symfony un template "hijo" puede sobreescribir cualquiera de los "bloques" del template padre, o base.

ejemplo:

{# app/Resources/views/base.html.twig #}
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>{% block title %}Test Application{% endblock %}</title>
    </head>
    <body>
        <div id="sidebar">
            {% block sidebar %}
                <ul>
                    <li><a href="/">Home</a></li>
                    <li><a href="/blog">Blog</a></li>
                </ul>
            {% endblock %}
        </div>

        <div id="content">
            {% block body %}{% endblock %}
        </div>
    </body>
</html>
***
en este caso tenemos 3 bloques: title, sidebar y body .
entonces, un template hijo, o que hereda de base, podria ser algo asi:

{# app/Resources/views/blog/index.html.twig #}
{% extends 'base.html.twig' %}

{% block title %}My cool blog posts{% endblock %}

{% block body %}
    {% for entry in blog_entries %}
        <h2>{{ entry.title }}</h2>
        <p>{{ entry.body }}</p>
    {% endfor %}
{% endblock %}
***

en donde el nombre del template base, es relativa
al directorio app/Resources/views

**
obviamente si en el template hijo no se sobre escribe algun bloque, este toma el contenido
definido por default en el template base.

si no se quiere sobreescribir del todo el contenido de un bloque padre, y por el contrario se quiere incluir el contenido por default y agregarle otro más, se puede  escribir en el bloque del hijo

{{   parent()   }}

{% block sidebar %}
    <h3>Table of Contents</h3>

    {# ... #}

    {{ parent() }}
{% endblock %}

**

como habiamos visto, los templates pueden residir en 2 lugares:

app/Resources/views

o en:

src/MiBundle/Resources/views

la mayoria van a estar en la primera ubicacion, entonces:

cada vez que querramos extender o renderizar algo como

app/Resources/views/base.html.twig

escribiremos, base.html.twig

y cuando querramos extender o renderizar algo como

app/Resources/views/blog/index.html.twig

escribiremos blog/index.html.twig

***
podemos tambien incluir templates dentro de otros usando la funcion
{{ include() }} 
ejemplo:


 {{ include('article/article_details.html.twig', { 'article': article }) }}

kdkd
Links a otras paginas

use simplemente la funcion path() con el nombre del route definido en el controller
ejemplo:


<a href="{{ path('welcome') }}">Home</a>
**
si la route necesita un parametro, se lo envia de un modo similar a cuando enviamos variables a
un template incluido:

/**
     * @Route("/article/{slug}", name="article_show")
     */
    public function showAction($slug)
**
{# app/Resources/views/article/recent_list.html.twig #}
{% for article in articles %}
    <a href="{{ path('article_show', {'slug': article.slug}) }}">
        {{ article.title }}
    </a>
{% endfor %}
**

incluir hojas de estilo y javascript en twig

{# app/Resources/views/base.html.twig #}
<html>
    <head>
        {# ... #}

        {% block stylesheets %}
            <link href="{{ asset('css/main.css') }}" rel="stylesheet" />
        {% endblock %}
    </head>
    <body>
        {# ... #}

        {% block javascripts %}
            <script src="{{ asset('js/main.js') }}"></script>
        {% endblock %}
    </body>
</html>
**
obviamente si para una pagina particular necesitamos ademas incluir una hoja de estilo particular
se haria (como ya hemos visto) incluyendo la del base asi:

{# app/Resources/views/contact/contact.html.twig #}
{% extends 'base.html.twig' %}

{% block stylesheets %}
    {{ parent() }}

    <link href="{{ asset('css/contact.css') }}" rel="stylesheet" />
{% endblock %}

*












No hay comentarios:

Publicar un comentario

linux ubuntu mint actualizar chrome

 desde una terminal: $ sudo apt update $ sudo apt install google-chrome-stable