viernes, 10 de julio de 2020

Localizando archivos de plantilla twig con depuracion en drupal 8

Si deseas saber que template esta generando un marcado para un elemento particular de una pagina puedes utilizar la opcion de depuracion por defecto de twig. Esta opcion mostrara comentarios HTML al mismo tiempo que la salida inclyendo los hooks utilizados en el tema, sugerencias para nombres de templates al igual que el nombre exacto del archivo twig utilizado para mostrar contenido en una seccion particular del marcado.

Para habilitar la depuracion de los templates twig puedes ir a sites/default/services.yml de tu instalacion de drupal 8 estableciendo dentro de este archivo el valor de la variable debug en true. Para instrucciones completas para depuracion en twig lee Depurando templates compilados en twig.

Luego de limpiar el cache al inspeccionar el elemento de la pagina veras el resultado de la depuracion del template twig como el siguiente:

<!-- THEME DEBUG -->
<!-- THEME HOOK: 'node' -->
<!-- FILE NAME SUGGESTIONS:
   * node--view--frontpage--page-1.html.twig
   * node--view--frontpage.html.twig
   * node--1--teaser.html.twig
   * node--1.html.twig
   * node--article--teaser.html.twig
   * node--article.html.twig
   * node--teaser.html.twig
   x node.html.twig
-->
<!-- BEGIN OUTPUT from 'core/themes/classy/templates/content/node.html.twig' -->

<article data-history-node-id="1" data-quickedit-entity-id="node/1" role="article" class="contextual-region node node--type-article node--promoted node--view-mode-teaser" about="/node/1" typeof="schema:Article" data-quickedit-entity-instance-id="0">
....
</article>

<!-- END OUTPUT from 'core/themes/classy/templates/content/node.html.twig' -->


Ahora te explicare tres puntos referentes a esta salida:

Las sugerencias de nombre estan en el orden mas especifico al menos especifico.
La sugerencia actual para el nombre del template esta marcado con una 'x' a su lado
Entre BEGIN OUTPUT y END OUTPUT encontraras la ruta completa del template que esta siendo mostrado.

En este caso vemos el marcado para un nodo que esta encapsulado con informacion de depuracion que puede ser de tu utilidad. Drupal incluye el hook que se esta utilizando, algunas sugerencias para nombres de template y la localizacion exacta del archivo de template que muestra el contenido actual.


Depurando plantillas compiladas en twig drupal 8

El motor de twig proporciona opciones para configurar su depuración, cargar automáticamente (recompilación) plantillas, y almacenamiento en caché compilado templates (plantillas) en el sistema de archivos. Por defecto, el motor de la plantillas twig compila templates en código PHP y almacena el código compilado en memoria. El código compilado no es adecuado para el desarrollo, ya que los cambios en las plantillas Twig no se actualizan inmediatamente en su sitio de Drupal. La Caché de twig se puede borrar mediante la interfaz para limpiar caché de Drupal, pero para el desarrollo en curso es más fácil cambiar la configuración de Drupal para que twig no almacene en caché nada en absoluto.

Ten en cuenta que en la mayoría de los casos es probable que desees desactivar también Render caché API. Si no lo haces tendrás que vaciar la caché antes de ver los cambios en el archivo twig porque cuando el Render API utiliza el template asociado a twig para generar el HTML y luego almacena en caché el código HTML generado y la plantilla Twig no se utiliza en las páginas subsecuentes.

Como habilitar la depuracion con la consola de Drupal 8

drupal site:mode dev

Este comando cambiara la siguiente configuracion dentro del archivo sites/default/services.yml de tu instalacion de drupal 8.

twig.config: { debug: true, auto_reload: true, cache: false }

Al ejecutar el comando deberias poder ver algo similar a esto:


Como habiliar la depuracion manual

  1. Busca el archivo services.yml de tu sitio, probablemente situado en sites/default/services.yml
  2. Si services.yml aún no existe; copia default.services.yml y cambiale el nombre a services.yml.
  3. Edite el archivo services.yml y activar una o más de las opciones de depuración se definen a continuación.
  4. Reconstruye la caché.
Localiza los parámetros twig.config en tu services.yml y hacer los siguientes cambios:

parameters:
  twig.config:
    debug: true

Opciones de depuracion de twig

debug: true
Cuando debug esta en true:
  • El macado de cada plantilla Twig está rodeado de comentarios HTML que contienen información del tema, como sugerencias de nombres de archivos de plantilla.
  • Ten en cuenta que esta depuración de marcado hará pruebas automatizadas que comprueban directamente la renderizacion del HTML. Al ejecutar pruebas automatizadas, 'twig_debug' se debe establecer en FALSE.
  • La función dump () se puede utilizar en plantillas Twig para obtener información acerca de las variables de la plantilla.
  • Los templates Twig se vuelven a compilar automáticamente cada vez que el código fuente cambia.
  • No se recomienda en entornos de producción (por defecto: false).

Twig auto-reload

auto_reload: true
  • Recompila automáticamente las plantillas Twig cada vez que el código fuente cambia. Si no proporcionas un valor para twig_auto_reload, se determina con base al valor de twig_debug.
  • No se recomienda en entornos de producción (por defecto: null).

Twig cache

cache: false
  • Por defecto, las plantillas Twig se compilan y almacenan en el sistema de archivos para aumentar el rendimiento. Deshabilitar la caché en Twig será recompilar las plantillas desde el codigo fuente cada vez que se utilizan. En la mayoría de los casos la configuracion twig_auto_reload debe estar habilitada en lugar de deshabilitar la caché de twig.
  • No se recomienda en entornos de producción (por defecto: true).
 Drupal render cache

De forma predeterminada, Drupal almacena en caché cualquier renderizacion que realiza para bloques y entidades, para acelerar la carga de páginas subsiguientes. Esto significa que los cambios a plantillas twig para estos no tendrán efecto inmediatamente. La configuración render caché utilizar la caché Null back-end desactiva efectivamente esto.

Para desactivar la caché de render, descomentar las siguientes líneas de la parte inferior de settings.php, copie sitios / example.settings.local.php a los sitios / default / settings.local.php, y claro los cachés de Drupal:

viernes, 20 de noviembre de 2015

Trabajando con templates twig en drupal 8

Drupal 8 permite sobre escribir todas los templates que son utilizados para generar salida HTML por tanto puedes controlar completamente el marcado de salida entre un tema personalizado. Existen plantillas para cada elemento de la pagina empezando de HTML de alto nivel hasta pequenos campos.

Sobreescribiendo templates (plantillas) en drupal 8

Puedes sobreescribir los template core de drupal 8 agregando templates a tu tema personalizado que siga las reglas de convencion para nombres de archivos de templates.

Para sobre escribir templates debes:
  1. Ubicar el template que deseas sobre escribir
  2. Copiar el archivo template (de plantilla) de su localizacion base a tu carpeta de tema
  3. Opcionalmente renombrar el template de acuerdo a la convencion de nombres para especificar un subconjunto de areas donde el archivo de template sera utilizado.
  4. Modifica el template a tu gusto.
Una vez que copies un archivo de template a tu carpeta de tema y limpies el cache de drupal 8 empezaras a utilizar tu instancia de template en lugar de la version base. Puedes averiguar que templates estan en uso para cualquier parte de la pagina utilizando las herramientas de depuracion de twig.

Desarrollo de temas (themes) en drupal 8


La transicion de cambios en el desarrollo de temas (themes) de la version 7 a la version 8 de drupal ha sido muy significativa.

En esta guia tratare de orientarte al desarrollo de temas tratando de darte un enfoque de los cambios que ha sufrido esta transicion de la version 7 de esta manera comprenderas los nuevos conceptos y enfoques.

Se ha dejado de dar soporte para los PHPTemplates (plantillas en php) en drupal 8. En esta nueva version entra en escena el marcado a traves de twig. Este cambio propiciara mayor seguridad debido a que las llamadas a PHP no existen mas en los archivos que conforman el tema, al mismo tiempo esto hace facil el desarrollo para las personas que no suelen desarrollar.

Abordaremos la siguiente lista de temas para que puedas desarrollar tus propios temas en drupal 8:

Definiendo un archivo .info.yml para nuestro tema en drupal 8
Estructura de archivos de un tema en drupal 8
Twig en drupal 8
Agregando regiones al tema en drupal 8
Agregando hojas de estilos (CSS) y JavaScript (JS) a nuestro tema en drupal 8
Temas con clase y selectores CSS
Creando un subtema en drupal 8
Incluyendo estilos por defecto a imagenes con tu tema en drupal 8
Utilizando atributos en los templates (plantillas)
Trabajando con breakpoints en Drupal 8
Diferencia entre el desarrollo de temas en Drupal 6, 7 y 8


Templates Twig en drupal 8

Twig es un motor de plantillas desarrollado en PHP y es parte del framework Symfony 2.

En Drupal 8 Twig viene a reemplazar los PHPTemplates que se venian utilizando en la version de Drupal 7. Uno de los resultados de este cambio es que todas las funciones de un tema (theme_*) y los archivos de extension *.tpl.php han sido reemplazados por archivos de template *.html.twig.

Organizacion de archivos CSS en drupal 8

Este articulo te ayudara a comprender la manera como drupal 8 organiza los archivos CSS.

Estructura de archivos

Los conjuntos de reglas deberan ser agrupadas en archivos logicos que deberan separar los contextos de los archivos CSS para que puedan ser eficientemente agregados y sobre escritos por otros desarrolladores.

Drupal 8 aplica la siguiente estructura:
  1. Base — CSS reset/normalize ademas de estilos para elementos HTML.
  2. Layout — Macro ajustes de un sitio web incluyendo cualquier sistema de grillas.
  3. Component — discreto, elementos UI (de interfaz de usuario) reutilizables.
  4. State — estilos que tienen que ver con los cambios a componentes del lado del cliente.
  5. Theme — puramente estilos visuales (“look-and-feel”) para un componente.
Estas categorias ayudan a mantener los estilos CSS con diferentes propositos y alejados de los demas. Drupal 8 recomienda la siguiente guia base para estructurar archivos CSS:

Archivos CSS para modulos en drupal 8

Todos los archivos CSS de un modulo deben ser colocados dentro de un directorio llamado 'css' y desglosarse en uno o mas como los siguientes archivos:

nombre_modulo.module.css: Este archivo debe contener la cantidad minima de estilos para que el modulo funcione. Esto incluye el layout, componentes y estilos de estados.

nombre_modulo.theme.css: Este archivo debe contener estilos extra para hacer que la funcionalidad del módulo estéticamente agradable. Esto por lo general sólo se compone de estilos para el tema.

nombre_modulo.admin.css: Este archivo debe contener los estilos mínimos necesarios para obtener las pantallas de administración funcionales. Esto incluye estilos de diseño, componentes y estilos de estados. En las pantallas de administración, el módulo puede optar por cargar el * .module.css además de el archivo * .admin.css.

Los módulos no deben tener ningún estilo de base. Los módulos core de Drupal 8 no tienen ningún estilo de base. En lugar el core de Drupal 8 utiliza la biblioteca Normalize.css argumentada con la libreria drupal.base.css.

Si un módulo adjunta un archivo CSS en un archivo de plantilla, el archivo CSS debe tener el mismo nombre que el archivo de plantilla (template), por ejemplo, si el archivo template se nombra "sistema-plugin-ui-form.html.twig" el archivo CSS correspondiente debería llamarse "sistema-plugin-ui-form.css"

Archivos CSS para temas en drupal 8

  1. Separa siempre los estilos para Base, Diseño y para componentes en sus propios archivos. (Drupal agregará estos archivos separados en un solo archivo, por lo que no hay ningún problema de rendimiento con esta práctica.)
  2. Para temas complejos, considera colocar cada familia de componentes o componente en su propio archivo.
  3. Las reglas de estado, incluyendo preguntas de los medios, deberían incluirse con el componente al que se aplican.
  4. Las reglas temáticas pueden o no pueden tener su propio archivo (s). Los temas starter separan sus CSS en archivos separados. De lo contrario, incluye reglas temáticas con su correspondiente componente.
La mayoria de temas deberian tener al menos los siguientes archivos:

+ css
    - base.css
    - layout.css
    - components.css

Opcionalmente los pueden desglosar. Una mas compleja estructura y con enfoque mobile first (primero movil) podria verse asi:

+ css
    + base
        - normalize.css
        - elements.css
    + layout
        - layout.css
        - layout--medium.css
        - layout--wide.css
    + components
        - button.css
        - dropdown.css
        - pagination.css
        - tabs.css
        …
    + theme
        - theme--light.css
        - theme--dark.css

Agregacion de CSS en drupal 8

En drupal 7 y versiones anteriores la opcion "group" y "every page" de drupal_add_css() controlaba que archivos podrian ser agregados juntos.  Los grupos donde CSS_SYSTEM, CSS_DEFAULT (para modulos en drupal) y CSS_THEME (para temas en drupal) y la opcion every_page option era una simple bandera booleana. Esto se traduce en tener mas de 6 archivos agregados.

En drupal 8 ahora los temas tienen la habilidad de sobre escribir las hojas de estilos sin afectar la opcion "every page" ("cada pagina") de la hoja de estilos original. Esto significa que el CSS cargado condicionalmente permanece condicionalmente cargado,

Esto tambien significa que ahora es sencillo para los temas afectar estilos cargados condicionalmente. Por tanto, todos los CSS agregados al tema no necesitan cargar mas estilos de carga condicionados. Esto simplifica enormemente la estrategia por defecto que drupal 8 puede emplear. En lugar de tener 6 archivos agregados, podriamos tener solamente 2.

1. El agregado "Every page" ("cada pagina") incluye:
  1. Estilos base de librerias (por ejemplo Normalize.css y drupal.base.css) y luego temas de drupal.
  2. Estilos de layouts de modulos de drupal y luego temas de drupal.
  3. Estilos de componentes (y sus estados asociados y temas) de los modulos de drupal y luego de los temas de drupal.
  4. Estilos de estado que no estan incluidos con componentes de los modulos de drupal y luego de los temas de drupal.
  5. Estilos de temas que no estan incluidos con componentes de los modulos de drupal y luego de los temas de drupal.
2. Los conditionally-loaded (cargados condicionalmente) agregados

Estilos de layout desde los modulos de drupal y los temas de drupal.
Estilos de componentes (y sus estados asociados y temas) de los modulos y luego de los temas de drupal.
Estilos de estado que no son incluidos con componentes de modulos y luego de los temas de drupal.
Estilos de temas que no son incluidos con componentes de modulos y luego de los temas de drupal.

Nota: Nunca deberían haber estilos base cargados condicionalmente.

 El orden de los estilos entre un agregado estan determinados por la opcion "weight" (peso) de la funcion drupal_add_css() el cual sera el siguiente:

/**
* The default weight for CSS rules that style HTML elements ("base" styles).
*/
const CSS_BASE = -200;

/**
* The default weight for CSS rules that layout a page.
*/
const CSS_LAYOUT = -100;

/**
* The default weight for CSS rules that style design components (and their associated states and themes.)
*/
const CSS_COMPONENT = 0;

/**
* The default weight for CSS rules that style states and are not included with components.
*/
const CSS_STATE = 100;

/**
* The default weight for CSS rules that style theme and are not included with components.
*/
const CSS_THEME = 200;


El archivo agregado por si mismo es determinado por la opcion "group" (grupo) y la bandera "every page" (cada pagina) de la funcion drupal_add_css(). El valor por defecto de la opcion "group" (grupo) es la constanate CSS_AGGREGATE_DEFAULT. El core de drupal no proporciona otras constantes de agregado pero las contribuciones pueden definir sus propios grupos de agregados.

SMACSS y SASS/COMPASS

Cuando se combinan los conceptos de SMACSS y SASS/COMPASS pueden proveer mucho control sobre la salida css. Podemos utilizar el concepto de SASS globbing para tener multiples archivos .scss y solamente un archivo css con el uso de parciales.

jueves, 19 de noviembre de 2015

Estructura de archivos de un tema en drupal 8

En drupal 8 un tema es una coleccion de archivos que definen la capa de presentacion. Solamente los archivos .info.yml son requeridos sin embargo la mayoria de temas y subtemas utilizaran otros archivos. Este articulo lista los archivos y carpetas que encontraras dentro de un tema o subtema tipico.

Ubicacion de los temas en drupal 8


Debes colocar los temas en el directorio "themes" de tu instalacion de drupal 8. Dentro de este directorio se encuentran temas que vienen dentro del core tales como Bartik y Seven los cuales se encuentran en el directorio core/themes.

Es una buena practica colocar los temas de contribucion en una carpeta llamada "contrib" (este directorio debe ser creado manualmente) y tus propios temas dentro de una carpeta llamada "custom".

Los nombres de temas deben iniciar con letras minisculas y utilizar guion bajo en caso sean nombres compuestos ejemplo: mi_tema_personalizado

La estructura parcial de tu instalacion de drupal podria ser la siguiente:

  |-core
  |  |-modules
  |  |-themes
  |  |  |-bartik
  |  |  |-seven
  ..
  |-modules
  |-themes
  |  |-contrib
  |  |  |-zen
  |  |  |-basic
  |  |  |-bluemarine
  |  |-custom
  |  |  |-fluffiness


Estructura de la carpeta de un tema

Este es un ejemplo de los archivos y directorios que encontraras tipicamente dentro de un tema:


  |-fluffiness.breakpoints.yml
  |-fluffiness.info.yml
  |-fluffiness.libraries.yml
  |-fluffiness.theme
  |-config
  |  |-install
  |  |  |-fluffiness.settings.yml
  |  |-schema
  |  |  |-fluffiness.schema.yml
  |-css
  |  |-style.css
  |-js
  |  |-fluffiness.js
  |-images
  |  |-buttons.png
  |-logo.png
  |-screenshot.png
  |-templates
  |  |-maintenance-page.html.twig
  |  |-node.html.twig



*.info.yml

Cada tema debe contener un archivo  .info.yml. Sobre todo este archivo define metadatos, hojas de estilo (CSS) y regiones para bloques, es el unico archivo requerido dentro de un tema.

*.libraries.yml

Los archivos .libraries.yml son utilizados para definir las librerias CSS o JavaScript que podra cargar nuestro tema.

*.breakpoints.yml

 Los archivos .breakpoints.yml definen donde un tema responsive necesita adaptarse a diferentes dispositivos moviles. 

*.theme

 El archivo .theme es un archivo PHP que contiene todas la condiciones logicas y datos preprocesandola antes de mostrarla.

css/

 Es buena idea almacenar los archivos CSS en un subdirectorio 'css'. Los temas core de Drupal 8 organizan sus archivos CSS siguiendo la guia de estilos SMACSS. Para que un tema cargue archivos css deben ser definidos previamente en un archivo .libraries.yml y puede ser sobre-escrito o eliminado en el archivo .info.yml.

Haz clic aqui para leer mas acerca de la organizacion de archivos css en drupal 8

images/

Es una buena practica almacenar los archivos en un directorio 'images'

screenshot.png

 Si un archivo screenshot.png se encuentra dentro del tema se mostrara en la pagina 'Apariencia' ('Appearance'). Alternativamente este screenshot se puede definir en el archivo .info.yml.

templates/

Los archivos template dentro de este directorio proveen marcado HTML y algo de logica de presentacion. En  drupal 8 los archivos templates (*.html.twig) deben ser almacenados en este directorio. Si sigues la convencion de nombres particular entonces drupal 8 reemplazara las plantillas core por las que tu proporciones, permitiendo sobre escribir el marcado por defecto.

Estructura core del tema Bartik

 Para darte un ejemplo de la estructura de un tema core que viene en drupal 8 puede apreciar en tu instalacion la estructura para el tema Bartik localizada en la siguiente ruta: core/themes/bartik

  |-bartik.breakpoints.yml
  |-bartik.info.yml
  |-bartik.libraries.yml
  |-bartik.theme
  |-color
  |  |-color.inc
  |  |-preview.css
  |  |-preview.html
  |  |-preview.js
  |-config
  |  |-schema
  |  |  |-bartik.schema.yml
  |-css
  |  |-colors.css
  |  |-layout.css
  |  |-maintenance-page.css
  |  |-print.css
  |-images
  |  |-add.png
  |  |-required.svg
  |  |-tabs-border.png
  |-logo.svg
  |-screenshot.png
  |-templates
  |  |-block--search-form-block.html.twig
  |  |-block--system-branding-block.html.twig
  |  |-block--system-menu-block.html.twig
  |  |-block.html.twig
  |  |-comment.html.twig
  |  |-field--taxonomy-term-reference.html.twig
  |  |-maintenance-page.html.twig
  |  |-node.html.twig
  |  |-page.html.twig
  |  |-status-messages.html.twig