# Ejemplos
En cualquier parte de Channels (Sitios, Widgets y Plantillas), puedes usar Liquid para crear contenido dinámico. A continuación, se muestran varios ejemplos para diferentes casos de uso.
# Desplegar Listado de Entradas de un Tipo
En Páginas de Contenido, puedes generar un listado de todas las Entradas de un Tipo. En este ejemplo, se obtienen todas las Entradas del Tipo product
en el Espacio My Bank
. La variable entries
de la línea 1 obtiene un array del objeto Entry. Este array se itera para mostrar el meta.uuid
y meta.title
de cada Entrada por fila.
{% assign entries = spaces['my-bank'].types['product'].entries %}
<p>Products:</p>
<ul>
{% for entry in entries %}
<li>{{ entry.meta.uuid }} -- {{ entry.meta.title }}</li>
{% endfor %}
</ul>
Para usar estos ejemplos en tu sitio, debes reemplazar el ID de Espacio y Tipo con tu información. Estos IDs se encuentran como el Identificador de tu Espacio y el Identificador de tu Tipo de Contenido.
En el caso de una entrada de cardinalidad única (ej. un aviso de privacidad), puedes usar entry
para desplegar la URL de la siguiente manera:
Visit our <a href="{{ spaces['my-bank'].types['privacy'].entry.url }}">Privacy Policy</a>.
# Desplegar Cantidad Total de Entradas
Para acceder a la cantidad total de entradas que retorna un filtro de contenido, puedes usar el filtro de Liquid entries.size
, por ejemplo:
{% assign entries = spaces['my-bank'].types['products'].entries %}
<p>You have a total of {{ entries.size }} products!</p>
# Filtrar Entradas
Para filtrar las entradas, puedes usar los siguientes atributos:
- by_uuid
- by_slug
- by_category
- by_type
- by_tag
- by_lang
- filter_by
Todos los filtros deben recibir un array de Entries y es posible concatenar múltiples filtros.
# Filtro
En el siguiente ejemplo, filtramos las Entradas de tipo post
con categoría news
. Luego, mostramos todas las Entradas de tipo news
:
{% assign entries = spaces['my-bank'].types['post'].entries | by_category: 'news' %}
<p>News:</p>
<ul>
{% for entry in entries %}
<li><a href="entry.url">{{ entry.meta.title }}</a></li>
{% endfor %}
# Filtro concatenado
En el siguiente ejemplo, filtramos las Entradas de tipo post
con categoría news
y que además tengan el tag campaign
. Luego, mostramos las noticias que cumplen todos los criterios:
{% assign entries = spaces['my-bank'].types['post'].entries | by_category: 'news' | by_tag: 'campaign' %}
<p>News for you!</p>
<ul>
{% for entry in entries %}
<li><a href="entry.url">{{ entry.meta.title }}</a></li>
{% endfor %}
# Filter_by
El filtro filter_by
se utiliza para atributos meta o campos personalizados del Tipo de Contenido, por ejemplo:
{% assign entries = spaces['space_uid'].types['type_uid'].entries | filter_by: field: 'field_name' | sort_by: 'fields.date' , 'desc' | limit 8 %}
{% for entry in entries %}
entry: {{ entry.meta.uuid }} -- {{ entry.meta.title }}<br />
{% endfor %}
Si quieres negar un valor dentro del filtro de campos, puedes usar not
dentro del filtro:
{% assign entries = spaces['space_uid'].types['type_uid'].entries | filter_by: field: 'field_name', not: nil %}
{% for entry in entries %}
entry: {{ entry.meta.uuid }} -- {{ entry.meta.title }}<br />
{% endfor %}
La selección de entradas siempre retorna un array, por lo que es necesario iterar sobre el resultado o acceder al primer elemento, en caso de filtrar por un único UUID:
{% assign entries = spaces['space_uid'].types['type_uid'].entries | by_uuid: 'entry_uuid' %}
{% assign entry = entries.first %}
Puedes paginar las entradas usando el filtro paginated
y mostrar los enlaces de paginación con el filtro pagination_links
, por ejemplo:
{% assign entries = spaces['space_uid'].types['type_uid'].entries | paginated: 10 %}
<ul>
{% for entry in entries %}
<li>{{ entry.meta.slug }}</li>
{% endfor %}
</ul>
{{ entries | pagination_links }}
En el caso anterior, se paginará el listado de entradas con 10 elementos por página y al final del listado aparecerán los enlaces de la paginación. Puedes navegar por cada página usando el parámetro GET page
en la URL (ej. mi-pagina.com/landing?page=2
).
Atención
Ten en cuenta que si tienes más de un widget que use la paginación de contenido, al usar los parámetros GET per_page
y page
en la URL, todos los widgets con paginación de la página se verán afectados por esos parámetros.
Atención
Para usar la paginación en un widget personalizado, se debe cambiar el filtro asociado a la paginación por {{ entries | pagination_links_remote }}
. Esto es necesario dado que los widgets personalizados se cargan de forma asíncrona. Junto con el cambio anterior, se debe asegurar que JQuery esté disponible en el sitio y recordar que al usar los enlaces de paginación, solo cambiará el HTML del widget y no se ejecutará nuevamente el JavaScript del widget.
# Ordenamiento de Entradas
De la misma forma en que se puede filtrar por categoría (by_category
), tags (by_tags
) y por UUID (by_uuid
), se puede crear un filtro para ordenar los resultados por los atributos "meta" (name
, slug
, created_at
, updated_at
, published_at
) de las entradas usando los filtros sort_by
, de la siguiente forma:
{% assign entries = spaces['space_uid'].types['type_uid'].entries | sort_by: 'published_at','asc' %}
Los valores posibles para el orden son asc
y desc
. Por defecto, si el parámetro no se especifica, se usa desc
.
Los valores posibles para sort_by
son: name
, published_at
, created_at
, updated_at
, slug
y field
.
Para ordenar por un campo personalizado, debes usar como parámetro el fields.uid
del campo:
{% assign entries = spaces['space_uid'].types['type_uid'].entries | filter_by: field: 'field_name', eq: 'value_to_filter' | sort_by: 'fields.date' , 'desc' | limit 8 %}
{% for entry in entries %}
entry: {{ entry.meta.uuid }} -- {{ entry.meta.title }}<br />
{% endfor %}
# Geolocalización de Entradas
Para las entradas con campos de ubicación, se pueden generar mapas fácilmente con los filtros static_map
y dynamic_map
, que usan Google Maps Static API y Google Maps Javascript API, respectivamente. El siguiente ejemplo genera mapas para el campo Locations
con un tamaño de 600x300 px, un zoom de nivel 5, tipo de mapa 'roadmap' y un icono personalizado.
{{ entry.fields.['Locations'] | static_map: '600x300',5,'roadmap','https://goo.gl/5y3S82'}}
El filtro dynamic_map
acepta un atributo adicional para controlar la visibilidad de los controles de zoom, arrastre y pantalla completa.
{{ entry.fields['Locations'] | dynamic_map: '600x300',5,'roadmap','https://goo.gl/5y3S82',true}}
Tip
Para usar los atributos de las entradas, puedes usar la notación con punto o con corchetes. Así, {{ entry.meta.slug }}
retorna el mismo valor que {{ entry.meta['slug'] }}
. Si cuentas con un campo llamado location
, puedes usarlo tanto como {{ entry.fields.location }}
o {{ entry.fields['location'] }}
.