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


 

miércoles, 18 de noviembre de 2015

Definiendo un archivo .info.yml para nuestro tema en drupal 8

Para empezar a desarrollar un tema en drupal 8 necesitas crear un archivo NOMBRETEMA.info.yml que provee meta etiquetas que permiten hacer saber a drupal de tu tema (theme). Esto es algo similar a como los archivos para modulos y perfiles de instalacion son definidos, por lo cual es necesario establecer la clave (key) llamada 'type' (tipo) en el archivo .info.yml para diferenciar al tema.

Te daremos una muestra de ejemplo de este archivo y una introduccion a lo que contiene este archivo.

Crea un archivo .info.yml

Crea un archivo .info.yml en la raiz de tu tema. En drupal 8 los temas que desarrolles los debes colocar en esta estructura:

  |-core
  |  |-modules
  |  |-themes
  |  |  |-bartik
  |  |  |-seven
  ..
  |-modules
  |-themes
  |  |-contrib
  |  |  |-zen
  |  |  |-basic
  |  |  |-bluemarine
  |  |-custom (Aqui podrias crear tu nuevo tema)
  |  |  |-
tema_personalizado

El tema (theme) que vamos a crear en este ejemplo se llamara tema_personalizado. El nombre del archivo .info.yml debera tener el mismo nombre que el directorio de nuestro tema, en nuestro caso sera tema_personalizado.info.yml. Luego de agregar este archivo el tema deberia ser listado en la administracion de drupal 8. La ruta para ver los temas disponibles es la siguiente: http://example.com/admin/appearance.

Este es el archivo tema_personalizado.info.yml

name: Tema Personalizado
type: theme
description: Tema personalizado para drupal 8.
core: 8.x
libraries:
  - tema_personalizado/global-styling
stylesheets-remove:
  - '@classy/css/components/tabs.css'
  - core/assets/vendor/normalize-css/normalize.css
regions:
  header: Header
  content: Content
  sidebar_first: 'Sidebar first'
  footer: Footer


 Keys (Claves)

La siguiente clave provee meta etiquetas acerca del tema para definir funcionalidades basicas

name: Fluffiness
Este es un campo requerido. Un nombre comprensible por cualquier persona, este aparecera en la pagina de administracion de drupal 8 donde podra ser activado.
 
description: Definicion del tema, una breve descripcion de lo que trata tu tema.
Este es un campo requerido

type: theme
Este es un campo requerido. El tipo de clave indica el tipo de extension por ejemplo si sera un tema, modulo o perfil. En el caso que desarrolles temas el type siempre sera "theme"

base theme: classy
Este es un campo requerido. El tema puede heredar los recursos de otro tema

core: 8.x
Este es un campo requerido. El core key especifica la version de drupal con la cual tu tema es compatible

version: 8.x-1.0
Este es el identificador de tu version del tema, no deberia ser especificado manualmente.

screenshot: fluffiness.png
Con esta clave puedes especificar una imagen previa de como se vera tu tema. Este screenshot se muestra en la pagina de appearance en la administracion de drupal 8.

libraries:
  - fluffiness/global-styling

Este key permite agregar librerias pueden ser utilizadas que pueden contener archivos CSS y JavaScript en todas las paginas donde el tema este activo.

 
Si este key se define de la siguiente manera:


global-styling:
  version: 1.x
  css:
    theme:
      css/style.css: {}
      css/print.css: { media: print }



Entonces esto resultara en agregar esto al html 


<link rel="stylesheet" href="css/style.css" media="all" />
<link rel="stylesheet" href="css/print.css" media="print" />



stylesheets-remove:
  - core/assets/vendor/normalize-css/normalize.css # 1
  - '@classy/css/components/tabs.css' # 2


#1: La clave stylesheets-remove elimina cualquier enlace a archivos CSS agregados por otro tema o modulo. La ruta completa del archivo CSS puede ser especificada en caso exista otro archivo con el mismo nombre.

#2: Existen casos en los cuales los archivos CSS o JavaScript core de drupal necesitan ser eliminados. En casos donde el archivo es parte de una libreria que pertenece a un modulo o tema un token puede ser utilizado. Nota que cuando se utiliza el token (@)  necesita estar entre comillas porque es una palabra reservada en YAML.







regions:
  header: Header
  content: Content # required!
  sidebar_first: 'Sidebar first'
  footer: Footer


Las regiones son declaradas como hijos de la key regions. Es requerido tenes una region de contenido.

miércoles, 28 de octubre de 2015

Recien ayer 9 de Octubre ha salido a luz la primer release candidata de la version 8 de Drupal.