Vés al contingut

Català (Canviar idioma)

  • Català
  • Castellano
  • English
Català
Logo Ajuntament de Barcelona
Català
Ajuntament de Barcelona

Català (Canviar idioma)

  • Català
  • Castellano
  • English
Barcelona Capital Cultural i Científica
Inici Druida

User account menu

  • Entra
Inici
Instruccions de navegació del menú

Instruccions per als usuaris del lector de pantalla i del teclat

Per poder utilitzar aquest menú calen les tecles de cursor. El menú té fins a tres nivells:

  • Primer nivell: opcions del menú principal
  • Segon nivell: subopcions per a elements del primer nivell
  • Tercer nivell: subopcions per a elements del segon nivell

Instruccions de navegació:

  • Navegueu fent servir les tecles de cursor horitzontals en el primer nivell del menú.
  • Display and browse on the second level using the vertical arrow keys.
  • Utilitzeu la tecla d’escapada per tornar al primer nivell.
  • Utilitzeu la tecla de cursor dreta per mostrar el tercer nivell.
  • Navegueu pel tercer nivell fent servir les tecles de cursor verticals.
  • Utilitzeu la tecla d’escapada per tornar al segon nivell.
  • De manera alternativa, feu servir la tecla d’introducció per mostrar qualsevol nivell.
  • Actualitat
    Actualitat
    • Actualitat
    • Bloc d'actualitat
  • BCN Noticies
    BCN Noticies
    • Noticies
    • Noticies Mercè (multilist)
  • BCN Guia
    BCN Guia
    • Guia
    • Guia gràcia (multilist)
    • Guia block list
  • BCN Iris
    BCN Iris
    • IRIS Alcalde
    • Recollida i neteja de l'espai urbà > Recollida de mobles i trastos vells > Recollida mobles abandonats al carrer
    • Recollida i neteja de l'espai urbà > Recollida selectiva porta a porta > Bujol/bossa/cubell/cartrons no recollit/da, sense adhesiu d'incidència
  • BCN Planol
    BCN Planol
    • Planol Guia IDs
    • Planol Guia
    • Planol Punts
    • Planol Simple Guia IDs
    • Planol Simple Guia
    • Planol Simple Punts
  • BCN Cards
    BCN Cards
    • BCN Cards list
    • BCN Cards Personal Card
    • BCN Cards Agenda
    • BCN Cards Export
    • BCN Cards Partit
    • BCN Cards - Districtes - Ciutat Vella
    • BCN Cards - Transparència - Ciutat Vella
    • BCN Cards - Membres - BComu
    • BCN Cards fields
      • BCN Cards fields
      • BCN Cards fields
      • BCN Cards fields
    • BCN Cards Aj.
      • BCN Cards Aj.
      • BCN Cards Aj.
      • BCN Cards Aj. Equip de govern
      • BCN Cards Aj. Commissioners
    • BCN Cards Exemple
      • BCN Cards Exemple
      • BCN Cards Exemple
      • Inserció del link amb funció de Twig
      • Inserció de card amb funció de Twig
  • BCN Cards Transp.
    BCN Cards Transp.
    • BCN Cards Transp. Càrrecs municipals i eventuals
    • BCN Cards Transp. Càrrecs electes
    • BCN Cards Transp. Comissionats
    • BCN Cards Transp. Consellers districte
    • BCN Cards Transp. Sindicatura greuges
    • BCN Cards Transp. Gerents
    • BCN Cards Transp. Gerents i directors
    • BCN Cards Transp. Eventuals
    • BCN Cards Transp. Càrrecs hab. nacional
    • BCN Cards Transp. Equip de govern
  • BCN Casaments
    BCN Casaments
    • BCN Casaments Barcelona
    • BCN Casaments District
    • BCN Casaments Saló de Cent
  • Bloc
Instruccions de navegació del menú

Instruccions per als usuaris del teclat

Per poder utilitzar aquest menú calen les tecles de cursor. El menú té fins a tres nivells:

  • Primer nivell: opcions del menú principal
  • Segon nivell: subopcions per a elements del primer nivell
  • Tercer nivell: subopcions per a elements del segon nivell

Instruccions de navegació:

  • Navegueu fent servir les tecles de cursor verticals en el primer nivell del menú.
  • Utilitzeu la tecla de cursor dreta per mostrar el segon nivell.
  • Navegueu pel segon nivell fent servir les tecles de cursor verticals.
  • Utilitzeu la tecla d’escapada per tornar al primer nivell.
  • Utilitzeu la tecla de cursor dreta per mostrar el tercer nivell.
  • Navegueu pel tercer nivell fent servir les tecles de cursor verticals.
  • Utilitzeu la tecla d’escapada per tornar al segon nivell.
  • De manera alternativa, feu servir la tecla d’introducció per mostrar qualsevol nivell.
  • Actualitat
    Actualitat
    • Actualitat
    • Bloc d'actualitat
  • BCN Noticies
    BCN Noticies
    • Noticies
    • Noticies Mercè (multilist)
  • BCN Guia
    BCN Guia
    • Guia
    • Guia gràcia (multilist)
    • Guia block list
  • BCN Iris
    BCN Iris
    • IRIS Alcalde
    • Recollida i neteja de l'espai urbà > Recollida de mobles i trastos vells > Recollida mobles abandonats al carrer
    • Recollida i neteja de l'espai urbà > Recollida selectiva porta a porta > Bujol/bossa/cubell/cartrons no recollit/da, sense adhesiu d'incidència
  • BCN Planol
    BCN Planol
    • Planol Guia IDs
    • Planol Guia
    • Planol Punts
    • Planol Simple Guia IDs
    • Planol Simple Guia
    • Planol Simple Punts
  • BCN Cards
    BCN Cards
    • BCN Cards list
    • BCN Cards Personal Card
    • BCN Cards Agenda
    • BCN Cards Export
    • BCN Cards Partit
    • BCN Cards - Districtes - Ciutat Vella
    • BCN Cards - Transparència - Ciutat Vella
    • BCN Cards - Membres - BComu
    • BCN Cards fields
      • BCN Cards fields
      • BCN Cards fields
      • BCN Cards fields
    • BCN Cards Aj.
      • BCN Cards Aj.
      • BCN Cards Aj.
      • BCN Cards Aj. Equip de govern
      • BCN Cards Aj. Commissioners
    • BCN Cards Exemple
      • BCN Cards Exemple
      • BCN Cards Exemple
      • Inserció del link amb funció de Twig
      • Inserció de card amb funció de Twig
  • BCN Cards Transp.
    BCN Cards Transp.
    • BCN Cards Transp. Càrrecs municipals i eventuals
    • BCN Cards Transp. Càrrecs electes
    • BCN Cards Transp. Comissionats
    • BCN Cards Transp. Consellers districte
    • BCN Cards Transp. Sindicatura greuges
    • BCN Cards Transp. Gerents
    • BCN Cards Transp. Gerents i directors
    • BCN Cards Transp. Eventuals
    • BCN Cards Transp. Càrrecs hab. nacional
    • BCN Cards Transp. Equip de govern
  • BCN Casaments
    BCN Casaments
    • BCN Casaments Barcelona
    • BCN Casaments District
    • BCN Casaments Saló de Cent
  • Bloc
  1. Inici

Bloc

09/06/2025

Drupal amb Lazy builder i BigPipe

A Drupal, l'API de renderitzat (Render API) és capaç de detectar continguts que són molt dinàmics i ajornar-ne el renderitzat. Això passa gràcies a un procés anomenat autoplaceholdering que fa ús de #lazy_builder callbacks (funcions de retorn). Fem una ullada a alguns conceptes bàsics.

Lazy Builders a Drupal: Carregar només el just… i quan cal

Imagina que vas a un restaurant i demanes un menú amb molts plats. El cambrer podria portar-te tot de cop (el que triga molt i omple la taula de seguida), o podria portar-te primer allò essencial, i després, la resta.

Això és, més o menys, el que fan els lazy builders a Drupal: permeten que primer es carregui el contingut estàtic i després el contingut més dinàmic. Amb aquesta tècnica, s’aconsegueix que l’experiència de l’usuari sigui més ràpida, fluïda i, de passada, ajuda que Google ens miri amb millors ulls.

 


 

Relació amb el rendiment, la UX i el SEO (mètriques web)

Les mètriques web són una iniciativa de Google per oferir una guia unificada sobre els indicadors de qualitat essencials per oferir una gran experiència d’usuari a la web.

Com que Google mou prop del 90% de les cerques, això és força rellevant: la teva puntuació en Core Web Vitals afecta el teu SEO.

Drupal, amb el seu potent sistema de memòria cau i eines com BigPipe, pot destacar si utilitzem Lazy Builders de manera estratègica.

Actualment hi ha 3 mètriques:

Largest Contentful Paint (LCP): mesura quant triga a carregar el contingut visible més gran de la pantalla. És una mètrica clau perquè els usuaris interpreten aquest temps com un indicador de si la pàgina carrega ràpidament.

L’ús de Lazy Builders pot reduir la càrrega inicial enviant primer els blocs visibles més pesats com a placeholders, permetent que el contingut principal es carregui més ràpidament.

Interaction to Next Paint (INP): mesura el temps que triga el navegador a respondre a la primera interacció de l’usuari (com fer clic en un enllaç o botó, o fer servir un control de JavaScript).

Amb menys contingut carregant-se al principi, el navegador pot respondre més ràpid a les primeres accions.

Cumulative Layout Shift (CLS): mesura el moviment inesperat del contingut a la pàgina. Per exemple, si estàs llegint un article i una imatge carrega a la part superior, desplaçant el text, això suma al CLS.

Tenint placeholders amb una alçada definida, s’eviten aquests salts visuals pel retard en carregar contingut.

 


 

Què són els Lazy Builders?

Els Lazy Builders són una manera d’indicar a Drupal que tenim contingut que s’hauria de carregar de forma diferida. Amb això, Drupal detecta que hi ha una part del contingut que s’ha de carregar posteriorment i, en lloc de mostrar-lo de seguida, posa un “espai reservat” (placeholder). Continua generant la resta de la pàgina, i després aquell espai es reemplaça pel contingut real, ja sigui durant el mateix procés (al servidor) o més endavant (al navegador), segons la configuració del teu lloc.

Si utilitzes el mòdul BigPipe, que està inclòs al nucli des de Drupal 8.3 i al perfil estàndard des de la 8.5, aquest procés és encara millor: els marcadors es reemplacen amb contingut real mentre l’usuari ja veu la pàgina, donant una sensació de velocitat molt bona.

 


 

Com funcionen?

Quan Drupal troba un #lazy_builder dins un render array:

  1. Reemplaça el contingut per un placeholder únic.
  2. Renderitza i desa a la memòria cau l’HTML amb aquests placeholders.
  3. Segons l'estratègia de render:
    • Amb "single flush", Drupal genera tot de cop i retorna la pàgina completa.
    • Amb BigPipe, s’envia l'HTML principal i els placeholders es completen progressivament amb JavaScript al navegador.

Si estàs creant un bloc o contingut renderitzable a Drupal, pots definir un lazy builder així dins el render array:

return [
 '#lazy_builder' => ['\Drupal\meu_modul\Controller\MiClase::miFuncio', ['argument1']],
 '#create_placeholder' => TRUE,
];

Això li diu a Drupal:

  • Quina funció ha de generar aquest contingut.
  • Que ha de crear un placeholder, no mostrar-ho de seguida.

I dins d'aquesta funció defines què mostraràs, com qualsevol bloc o contingut renderitzat.

*Important: aquesta funció ha de ser estàtica i pública, i els arguments han de ser segurs (mai objectes o dades complexes).

 


 

Quan convé usar lazy builders?

  • Contingut que canvia molt sovint
    Per exemple, nombre d’usuaris connectats, dades en temps real o notícies. Posar això dins la memòria cau general provocaria que s'invalidés tota la pàgina cada pocs minuts.
  • Contingut personalitzat per a cada usuari
    Com ara el nom del usuari, l’avatar o menús d'accés ràpid. Sense lazy builder, caldria una versió cachejada per cadascun, cosa que fa créixer exponencialment les combinacions possibles.
  • Contingut que triga molt a generar-se
    Si tens un bloc que crida una API externa o fa moltes consultes, millor que no freni tota la pàgina. Posant-lo com a lazy builder, es mostra quan estigui llest.

     


 

Però no tot és màgia… Quan NO és tan útil?

Si la pàgina està totalment cachejada amb Page Cache (i no hi ha sessió d’usuari), els lazy builders no es posen en marxa...

Per què?
Perquè el navegador rep una pàgina HTML ja generada i guardada, amb tot el contingut estàtic. No cal construir res nou, per tant els placeholders ni tan sols hi apareixen: està tot “precuinat”.

 


 

Conclusió

Els lazy builders a Drupal són una eina molt útil per millorar el rendiment del lloc, especialment quan hi ha continguts personalitzats, dinàmics o pesats de generar.

En combinació amb BigPipe, el potencial és enorme: la pàgina es mostra ràpidament i es completa mentre l’usuari ja l’està llegint. La sensació de velocitat és real.

En resum:

  • Separes el contingut urgent del pesat.
  • L’usuari veu abans el que importa.
  • La teva memòria cau es conserva millor i el servidor pateix menys.

No tot necessita lazy load, però si s'usa correctament, pot transformar el teu Drupal.

Mostra'n més Mostra'n menys Llegeix més
09/06/2025

Syslog

El mòdul Syslog a Drupal és una eina que permet registrar esdeveniments del lloc als fitxers de registre del sistema utilitzant el protocol estàndard Syslog. Aquest mòdul és útil per integrar el registre d'esdeveniments de Drupal amb els sistemes de monitoratge de servidors existents.

Syslog

El mòdul Syslog a Drupal és una eina que permet registrar esdeveniments del lloc als fitxers de registre del sistema utilitzant el protocol estàndard Syslog. Aquest mòdul és útil per integrar el registre d'esdeveniments de Drupal amb els sistemes de monitoratge de servidors existents.

Característiques principals:

  1. Compatibilitat amb estàndards: Utilitza el protocol Syslog, que és àmpliament suportat en sistemes operatius com Linux, Unix i macOS.
  2. Substitució del registre en la base de dades: En lloc de registrar els esdeveniments a la base de dades, el mòdul Syslog envia aquests esdeveniments al sistema de registre del servidor, reduint la càrrega de la base de dades.
  3. Configuració flexible: Permet filtrar i classificar els missatges segons la seva gravetat, com ara advertiments, errors o informació general.
  4. Millor integració amb eines externes: Els esdeveniments registrats mitjançant Syslog poden ser analitzats per eines externes com Splunk, Logstash o Graylog.

Avantatges:

  • Redueix la sobrecàrrega a la base de dades en delegar els registres al sistema operatiu.
  • Ofereix una millor integració amb els sistemes de monitoratge i auditoria centralitzats.
  • És altament configurable i adequat per a entorns de producció.

Consideracions:

  • Requereix accés i configuració del sistema operatiu per habilitar Syslog.
  • No emmagatzema els esdeveniments directament a Drupal, fet que pot dificultar l'accés als desenvolupadors sense accés al servidor.

Aquest mòdul és ideal per a llocs de trànsit elevat que necessiten una solució de registre eficient i escalable.

 

Instal·lació de rsyslog en sistemes basats en Debian/Ubuntu

sudo apt update sudo apt install rsyslog -y
 

Activar el mòdul Syslog a Drupal (forma part del core)

drush pm:en syslog

Crear el fitxer /etc/rsyslog.d/drupal.conf amb el següent codi:

# Optional Comment if $programname startswith 'drupal' then {    action(type="omfile" File="/var/log/drupal.log")    & stop # Evita que syslog escrigui en altres fitxers com /var/log/syslog. }

Amb aquest codi, ens assegurem que Syslog ignori altres escriptures que no pertanyin a Drupal i les emmagatzemi en el fitxer drupal.log.

A més, afegirem al fitxer /etc/rsyslog.conf la següent línia al final:

local0.* /var/log/drupal.log

Amb això, fem que els logs apuntin a aquest fitxer i després reiniciem el servei.


Desactivar DBLOG

Ara podem desactivar el servei DBLOG per evitar registres duplicats:

drush pm:un dblog

Documentació oficial del mòdul Syslog a Drupal


Lectura en temps real des de Bash amb tail

Per veure en temps real els logs emmagatzemats, podem utilitzar el següent comandament:

tail -f /var/log/drupal.log

Altres formes més avançades de lectura es poden fer amb ELK Stack (Elasticsearch, Logstash i Kibana), tal com es detalla a continuació.

 

Procés de lectura de Syslog amb ELK (Elastic Stack)

ELK (ElasticSearch, Logstash, Kibana) és una solució popular per a la centralització, anàlisi i visualització de logs.

1. Configuració del servidor per enviar logs

  • Instal·lar un agent: Configurar un agent com Filebeat en el servidor on es generen els logs. Aquest agent s'encarrega de recollir i enviar els fitxers de logs al sistema ELK.

2. Processament amb Logstash

  • Configuració de Logstash: Logstash processa les dades de Syslog abans d'enviar-les a Elasticsearch.

3. Emmagatzematge en Elasticsearch

  • Indexació de logs: Elasticsearch emmagatzema les dades indexades per permetre consultes ràpides. Els logs s'organitzen en índexs per facilitar cerques eficients.

4. Visualització en Kibana

  • Configuració d'un dashboard: A Kibana, es poden crear visualitzacions per analitzar les dades:
    • Utilitzar filtres i gràfics per segmentar logs per gravetat, data, origen, etc.
    • Configurar alertes per a esdeveniments específics, com errors crítics o intents d'accés fallits.

Resum del flux de treball:

  1. Recollida: Filebeat o Syslog envien els logs a ELK.
  2. Processament: Logstash filtra i transforma les dades.
  3. Emmagatzematge: Elasticsearch indexa els logs.
  4. Visualització: Kibana permet analitzar i monitoritzar les dades.

Documentació i enllaços d'interès:

  • Guia d’Elasticsearch
  • Referència de Logstash
  • Documentació de Filebeat
  • Guia de Kibana
Mostra'n més Mostra'n menys Llegeix més
09/06/2025

Recipes

A partir de la versión 10.3 del core de Drupal, se incorporo un nuevo tipo de extensión llamado Recipes(recetas) y que si bien cumple una función similar a las ya existentes como los Profiles(perfiles de instalación) o módulos, posee algunas particularidades que pueden resultarnos muy útiles. 

A partir de la versión 10.3 del core de Drupal, se incorporo un nuevo tipo de extensión llamado Recipes(recetas) y que si bien cumple una función similar a las ya existentes como los Profiles(perfiles de instalación) o módulos, poseen algunas particularidades que pueden resultarnos muy útiles. 
Hasta la actualidad, poseíamos los Profiles, que servían como punto de arranque para tener, desde el inicio, un producto adaptado a nuestras necesidades. En este sentido, las recipes comparten esta funcionalidad, ya que se pueden hacer recetas que estén disponibles al momento de inicializar un proyecto, pero la diferencia mas notable entre ambos, reside en que los profiles solo están disponibles al momento de inicializar el proyecto y solo puede usarse uno por sitio.

 


API's

Las recetas funcionan sobre 4 API's:

- Recipes (propia recipes).
- Action (alterar configuracion[plugins]).
- Checkpoint (como fallback, requerido para deshacer si la recipe falla)
antes de aplicar una recipe, crea una marca para volver atras si falla, sino se borra .
- Default content (importar contenido por defecto).

 


Caracteristicas

 Repasemos un poco las características de las recetas:

- No se instalan, se aplican (Actúan a modo de script) (no dejan huella, una vez aplicadas no dejan rastro)
- No contienen código 
- Mediante dependencias las recipes pueden llegar a instalar código, esto es, módulos y temas gráficos, pero ellas como tal no contienen archivos PHP
- Pueden modificar la configuración existente (mediante un nuevo soporte llamado config actions)
- Pueden crear contenido
- No borran nada (en principio estan pensadas para no borrar nada)

 


Estructura

Dentro de una receta, encontraremos al menos un archivo que es el recipe.yml, que tiene una estructura de este tipo:

Nombre y descripción:

name: 'Drupal Base'
description: 'A recipe tailored to best practices for kickstarting a new Drupal 10 project.

Tipo

En las recetas, el tipo es similar al paquete (package) en los módulos, agrupa recetas según criterio de utilidad. El tipo 'Site' significa que la receta será listada como una opción en el instalador.

type: 'Content type'

Recipes

Si la receta depende de otras, se listarán aquí. Todas se aplicarán antes que ella misma.

recipes:
	- editorial_ui_for_publishers
	- another_recipe

Install

Dependencias generales (módulos o temas gráficos) de la receta.

install:
	- node
	- text

Config import

La receta puede controlar qué entidades de configuración instalar o no de las provistas por los módulos listados en sus dependencias.

config:
	import:
		easy_breadcrumb:
			- views.view.easy_breadcrumbs
		node:
			- node.type.article
		text: *

En el ejemplo "text" lleva un asterisco que indica que debe importarse toda la configuración de ese modulo.

Config actions

Aquí se relacionan las 'config actions' o acciones a realizar sobre configuración existente. Se declara el nombre de la configuración a tratar, la acción concreta a realizar (esto lo hace un plugin) y posibles argumentos. 
En el ejemplo, el rol de usuario 'Editor' será creado si no existe y luego obtendrá varios permisos para trabajar sobre el tipo de contenido Artículo.

config:
	actions:
		user.role.editor:
			ensure_exists:
				label: 'Editor'
			grantPermissions:
				- 'delete any article content'
				- 'edit any article content'

Content

Se puede proveer un directorio con contenido a crear una vez la configuración de la receta se haya instalado.

content:
	node:
		foo.yml

 


Importar una receta

Vía comando PHP:

php core/scripts/drupal recipe recipes/recipe_name

Vía drush:

drush recipe [RUTA RECETA]

Si su receta tiene un archivo «composer.json», puede alojarse en Packagist.org para que se pueda encontrar e incluir en cualquier proyecto. Sin embargo, para descargar la receta en un directorio «recipes» es necesario realizar algunos cambios en el archivo «composer.json» del proyecto:

composer require oomphinc/composer-installers-extender:2.0.1

Actualizar las claves «installer-types» e «installer-paths» en el «composer.json»

"installer-types": ["drupal-recipe"], 
"installer-paths": {
 "web/recipes/{$name}": [ "type:drupal-recipe" ]
}

Con esto, cuando solicites a Composer una receta, la colocará automáticamente en el directorio «recipes» de tu proyecto, de forma similar a como gestiona módulos o temas. Una vez que esto está configurado, puede utilizar Composer para requerir el paquete como de costumbre.

composer require foo/bar

 


Enlaces de interés

  • En Drupal.org hay algunas recetas que podemos probar, ver como están formadas y funcionan: Recipes Cookbook
  • DrupalCamp Spain 2024 - Teoría y práctica sobre Drupal recipes
Mostra'n més Mostra'n menys Llegeix més
09/06/2025

SDC

Single-Directory Components ens permet la implementació de components a Drupal. Els components són parts de l’aplicació web amb un propòsit concret, per ser usats de forma modular i reutilitzable, com podria ser la creació d’un botó o d’un bàner.

Què és SDC?

Single-Directory Components ens permet la implementació de components a Drupal. Els components són parts de l’aplicació web amb un propòsit concret, per ser usats de forma modular i reutilitzable, com podria ser la creació d’un botó o d’un bàner.

 


Estructura dels components

Estan formats principalment pels següents fitxers, que es carregaran de manera automàtica en incloure el component a la nostra plantilla o mòdul si els fitxers estan nomenats correctament:

  • TWIG: Plantilla amb l'estructura HTML.
  • YML: Metadades necessàries per definir el component.
  • Recursos CSS i JS (opcional).

 

A més, es poden afegir elements extra com imatges, README, SCSS, etc.

 

Exemple en l'estructura d'un component, col·locat dins d'un tema o mòdul, a la carpeta components:

 

button
| - button.component.yml (requerit)
| - button.twig (requerit)
| - button.css
| - button.js

 


Principals avantatges i inconvenients

Avantatges:

  • Millora l'organització dels components, encapsulant tot el que està relacionat amb el recurs dins d'una carpeta. Això facilita molt les millores, el manteniment i la comprensió dels elements.
  • Millora l’escalabilitat dels components si s’aniden correctament.
  • Millora la reutilització dels components en altres projectes.

 

Inconvenients:

  • Per a paràmetres genèrics del tema (per exemple, variables per als colors), cal seguir important dades externes al mòdul, fet que impedeix un encapsulament complet.
  • Si es comencen a generar components molt petits, pot acabar dificultant el desenvolupament per la dificultat de trobar-los o adonar-se que ja existeixen.
  • Pot ser que realment no aporti gaire si el lloc no requereix molta reutilització d’elements i, en canvi, només redueixi el rendiment.

 


Metadades

Aquí tenim un exemple senzill de metadades per a un component que generarà un modal:

 

name: Modal
props:
  type: object
  properties:
    title:
      type: string
      title: Title
      description: The modal title.
    classes:
      type: string
      title: Classes
      description: Extra classes to be added to modal element.
    text:
      type: string
      title: Text
      description: The text inside the modal.
    close_button:
      type: boolean
      title: Close button
      description: If TRUE, the modal will show a close button.

 


Càrrega del component

Podem carregar el component als nostres fitxers twig de dues maneres diferents.

 

La primera és amb include:

 

{{ include ('mytheme:modal', {
  title: 'Atención',
  text: 'Está previsto un mantenimiento de la web de 13:00 a 14:00',
  close_button: true,
}) }}

 

La segona és amb embed:

 

{% embed 'mytheme:modal' with {
  title: 'Atención',
  text: 'Está previsto un mantenimiento de la web de 13:00 a 14:00',
  close_button: true,
} %} {% endembed %}

 


Estendre components

Una de les propietats més potents de SDC és la possibilitat d’estendre components per fer ajustos particulars. Per exemple, podem estendre la modal per crear una modal-primary, de manera que el nou component tindrà estils o classes noves que li donaran un aspecte més específic.

 

Això ho faríem mitjançant el yml, i incloent, per exemple, un nou fitxer CSS que aportarà noves regles a l’element:

 

name: Modal Primary
extends: modal

 

El fitxer twig del modal-primary podria ser així:

 

{{ include ('mytheme:modal', { classes: 'modal-primary' }) }}

 

Nota: L’exemple potser no és el més pràctic, és merament didàctic.

 


Props i Slots

Fins ara hem vist exemples de components als quals passem dades de forma estructurada (clau:valor). Això són els props (com també es pot apreciar al fitxer yml d'exemple).

 

A més d’aquests, tenim un altre tipus de dades, els slots. Aquests són dades desestructurades, com components anidats o HTML, que no estan definits a l'esquema JSON de clau:valor i no són tipats.

 

Exemple de slots amb un slider:

 

name: Slider
slots:
  slide1:
    title: Slide 1
    description: "Slide 1"
  slide2:
    title: Slide 2
    description: "Slide 2"
  slide3:
    title: Slide 3
    description: "Slide 3"

 

Per utilitzar el slider, carregarem els 3 slides com a components extra que passarem per omplir els slots:

 

{% embed 'mytheme:slider' %}
  {% block slide_1 %}
    {{ include('mytheme:slide', { title: 'Slide A', description: 'This is the slider A' }) }}
  {% endblock %}
  {% block slide_2 %}
    {{ include('mytheme:slide', { title: 'Slide B', description: 'This is the slider B' }) }}
  {% endblock %}
  {% block slide_3 %}
    {{ include('mytheme:slide', { title: 'Slide C' }) }}
  {% endblock %}
{% endembed %}

 

El problema de carregar els slots d’aquesta manera és que s’haurien de definir espais exactes (3 en aquest cas), i no seria dinàmic:
 

<div class="slider">
  {% block slide_1 %}{% endblock %}
  {% block slide_2 %}{% endblock %}
  {% block slide_3 %}{% endblock %}
</div>

 


Slots dinàmics

Per carregar slots de manera dinàmica, hauríem de definir el twig així:

 

<div class="slider">
  {% for slide in slots.slides %}
    <div class="slider-slide">
      {{ slide|raw }}
    </div>
  {% endfor %}
</div>

 

Les metadades:

 

label: "Slider"
slots:
  slides:
    title: 'Slides'
    description: "Array con los slides del slider."

 

El bloc d'inserció del component:

 

{{ include('mytheme:slider', {
  slots: {
    slides: [
      include('mytheme:slide', { title: 'Slide A', description: 'This is the slider A' }),
      include('mytheme:slide', { title: 'Slide B', description: 'This is the slider B' }),
      include('mytheme:slide', { title: 'Slide C' }),
    ]
  }
}) }}

 


Consideracions

Variables externes

Per resoldre el problema de variables SCSS globalitzades, es poden importar dins del fitxer SCSS del component:

@import "../../scss/vars";

Una altra solució seria generar variables CSS i usar-les dins del component.

Llibreries externes

Per utilitzar llibreries externes, com Bootstrap, es poden definir al YML:

name: "Button"
description: "A reusable button component based on Bootstrap." 
libraries: 
  - mytheme/bootstrap
props:
  type: object
  properties:
    text:
      type: string
      title: Text
      description: The button text.

Format correcte de càrrega dels components

Els components s’han d’incloure en el format nom_tema:component.

{{ include ('@mytheme/components/modal.twig', {
    title: 'Atención',
    text: 'Está previsto un mantenimiento de la web de 13:00 a 14:00',
    close_button: true,
}) }}

 


URLs interessants

Documentació oficial

https://www.drupal.org/docs/develop/theming-drupal/using-single-directory-components

 

DrupalCamp 2023 - SDC

DrupalCamp Spain 2023 - Diseño basado en componentes usando Single Directory Components (SDC)

Mostra'n més Mostra'n menys Llegeix més
Logo de l'Ajuntament de Barcelona
  • Ajuntament de Barcelona
  • Institut Municipal d'Informàtica