2018-05-17 18:56:06 +00:00
|
|
|
# Plantillas de artículos
|
|
|
|
|
|
|
|
Las plantillas de artículos son archivos YML con la estructura de campos
|
|
|
|
a utilizar en la creación de un artículo. Dependiendo del tipo de
|
|
|
|
artículo que elijamos, el editor del artículo cargará los campos
|
|
|
|
necesarios.
|
|
|
|
|
|
|
|
Las plantillas residen en la colección `_templates` como archivos
|
|
|
|
markdown. Esto permite que Jekyll los cargue como una colección a
|
|
|
|
través de esa feature ya implementada, reciclando código.
|
|
|
|
|
|
|
|
Además, permite que las plantillas tengan, además de una estructura de
|
|
|
|
datos YAML por defecto, un cuerpo por defecto, si quisiéramos tener una
|
|
|
|
estructura del documento también.
|
|
|
|
|
|
|
|
## Estructura del documento
|
|
|
|
|
|
|
|
```
|
|
|
|
---
|
|
|
|
title: ""
|
|
|
|
categories: []
|
|
|
|
tags: []
|
|
|
|
related_articles: []
|
|
|
|
destacado: false
|
|
|
|
resumen: ""
|
|
|
|
descripcion_detallada: ""
|
|
|
|
---
|
|
|
|
|
|
|
|
# Título de primer nivel
|
|
|
|
|
|
|
|
Un resumen que quieras poner aquí. Esto irá en el editor de texto.
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
Entonces, en un primer momento, el formulario se arma en base a los
|
|
|
|
tipos de datos que se espera en un campo. Si el valor es `""`, se
|
|
|
|
espera un campo de texto, si es `[]`, se espera un array y así.
|
|
|
|
|
|
|
|
Pero:
|
|
|
|
|
|
|
|
* Cómo distinguir entre un campo de texto largo y uno más corto?
|
|
|
|
|
|
|
|
* El campo `related_articles` debería ser autocompletado a partir de los
|
|
|
|
títulos de otros artículos cargados, entonces cómo indicar esto?
|
|
|
|
|
|
|
|
La conversión de cyber-women.com debería ser así:
|
|
|
|
|
|
|
|
```
|
|
|
|
---
|
|
|
|
categories: []
|
|
|
|
cover: ""
|
|
|
|
lang:
|
|
|
|
es: ""
|
|
|
|
en: ""
|
|
|
|
ar: ""
|
|
|
|
layout: ""
|
|
|
|
title: ""
|
|
|
|
objetivos: ""
|
|
|
|
tags: []
|
|
|
|
permalink: ""
|
|
|
|
dir: ""
|
|
|
|
---
|
|
|
|
```
|
|
|
|
|
|
|
|
Pero acá no se puede distinguir que en realidad en `cover` y en
|
|
|
|
`permalink` van paths, que los idiomas se autocompletan con titulos de
|
|
|
|
otra colección, que `tags` y `categories` se autocompletan con valores
|
|
|
|
que hay en otros artículos y que `dir` es uno de `ltr` o `rtl`.
|
|
|
|
|
|
|
|
`dir` es fácil, se pone un array con los valores que van:
|
|
|
|
|
|
|
|
```
|
|
|
|
---
|
|
|
|
categories: []
|
|
|
|
cover: ""
|
|
|
|
lang:
|
|
|
|
es: ""
|
|
|
|
en: ""
|
|
|
|
ar: ""
|
|
|
|
layout: ""
|
|
|
|
title: ""
|
|
|
|
objetivos: ""
|
|
|
|
tags: []
|
|
|
|
permalink: ""
|
|
|
|
dir: [ ltr, rtl ]
|
|
|
|
---
|
|
|
|
```
|
|
|
|
|
|
|
|
La otra opción es hacer una lista de las propiedades que se
|
|
|
|
autocompletan, por ejemplo, los campos estándar:
|
|
|
|
|
|
|
|
* `categories`
|
|
|
|
* `tags`
|
|
|
|
* `cover`
|
|
|
|
* `layout`
|
|
|
|
* `dir`
|
|
|
|
|
|
|
|
Ya tienen programáticamente sus valores. Pero sería laburo doble porque
|
|
|
|
el editor de plantillas tiene que poder crear campos arbitrarios con
|
|
|
|
valores predeterminados.
|
|
|
|
|
|
|
|
Aunque el editor de plantillas todavía no lo necesitamos hacer?
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
---
|
|
|
|
categories: [site/categories]
|
|
|
|
cover: string
|
|
|
|
lang:
|
|
|
|
es: en/title:en/slug
|
|
|
|
en: es/title:es/slug
|
|
|
|
ar: ar/title:ar/slug
|
|
|
|
layout: site/layouts
|
|
|
|
title: string
|
|
|
|
objetivos: text
|
|
|
|
tags: [site/tags]
|
|
|
|
permalink: string
|
|
|
|
dir: [ ltr, rtl ]
|
|
|
|
---
|
|
|
|
```
|
|
|
|
|
|
|
|
Donde `site/categories` equivale a `@site.everything_of('categories')` y
|
|
|
|
`en/slug` a `@site.everything_of('slug', lang: 'en')`.
|
|
|
|
|
|
|
|
Al separar con `:`, estamos diciendo qué valores mostrar y a cuáles
|
|
|
|
mapearlos, entonces `en/slug:en/title` muestra un selector de todos los
|
|
|
|
títulos, pero almacena el slug correspondiente.
|
|
|
|
|
|
|
|
Para saber si un valor es un array, encontramos un array y miramos
|
|
|
|
dentro qué tipos de valores vamos a rellenar.
|
|
|
|
|
|
|
|
luego, el editor de plantillas de posts permite crear estos tipos de
|
|
|
|
campos con un formulario dinamico
|
|
|
|
|
|
|
|
Las plantillas tienen un layout correspondiente. Luego se puede sugerir
|
|
|
|
y que las usuarias lo cambian.
|
|
|
|
|
|
|
|
No es necesario definir los campos estandar `categories`, `lang`,
|
|
|
|
`layout`, `title`, `tags`, `slug`, `permalink` y `dir`.
|
|
|
|
|
|
|
|
|
|
|
|
Finalmente, solo es necesario definir los campos extra:
|
|
|
|
|
|
|
|
```
|
|
|
|
---
|
|
|
|
cover: string
|
|
|
|
objetivos: text
|
|
|
|
habilidades: 'posts/habilidades'
|
|
|
|
conocimientos: ['posts/conocimientos']
|
|
|
|
sesiones_ejercicios_relacionados: ['posts/slug:posts/title']
|
|
|
|
destacado: false
|
|
|
|
---
|
|
|
|
```
|
|
|
|
|
|
|
|
Donde `string` y `text` indican valores de texto de distintos largos
|
|
|
|
(`text` y `textarea` en el formulario), `false` un valor binario (un
|
|
|
|
`checkbox`) y `coleccion/valor` y
|
|
|
|
`coleccion/valor:coleccion/valor_a_mostrar` en valores tomados de otras
|
|
|
|
colecciones. Cuando están entre `[]`, permite múltiples valores.
|
|
|
|
|
|
|
|
Entonces, para resumir:
|
|
|
|
|
|
|
|
* La plantilla se coloca en `_templates/nombre_de_la_plantilla.markdown`
|
|
|
|
* Es un documento Jekyll con _frontmatter_ y contenido
|
|
|
|
* El _frontmatter_ trae los campos extra a completar desde la carga de
|
|
|
|
artículos
|
|
|
|
* El `slug` de la plantilla se convierte en el `layout` sugerido del
|
|
|
|
post, es decir que debería existir un
|
|
|
|
`_layouts/nombre_de_la_plantilla.html` correspondiente.
|
|
|
|
* El `_config.yml` del sitio debe contener:
|
|
|
|
|
|
|
|
```yaml
|
|
|
|
collections:
|
|
|
|
- templates
|
|
|
|
```
|
|
|
|
|
|
|
|
Para poder cargar la colección de plantillas.
|
|
|
|
|
|
|
|
TODO: agregarlo especificamente en `app/models/site.rb` al cargar el
|
|
|
|
sitio.
|
2018-06-15 21:34:33 +00:00
|
|
|
|
|
|
|
## Plantillas complejas
|
|
|
|
|
|
|
|
Algunas plantillas necesitan comportamientos más complejos, por ejemplo
|
|
|
|
cuando un campo es requerido o no es público.
|
|
|
|
|
|
|
|
```
|
|
|
|
campo:
|
|
|
|
help: "Un texto de ayuda"
|
|
|
|
public: false
|
|
|
|
required: true
|
|
|
|
value: {bool,string,text,array,url,email}
|
|
|
|
min: 0
|
|
|
|
max: 100
|
|
|
|
multiple: false
|
|
|
|
```
|
|
|
|
|
|
|
|
Ahora los `value` pueden estar anidados, es decir que dentro de cada
|
|
|
|
value puede haber una serie de `campo` con los mismos valores.
|
|
|
|
|
|
|
|
Las plantillas más simples asumen ciertos valores por defecto:
|
|
|
|
|
|
|
|
```
|
|
|
|
help: nil
|
|
|
|
public: true
|
|
|
|
required: false
|
|
|
|
min: nil
|
|
|
|
max: nil
|
|
|
|
multiple: true
|
|
|
|
```
|