Com a bones pràctiques i de forma general per qualsevol projecte web:
Per desenvolupar amb Drupal s'utilitzarà composer per fer la instal·lació i gestionar els patches i les dependències. Utilitzarem la darrera versió estable de Drupal compatible amb la nostre versió de PHP:
$ composer create-project drupal/recommended-project DIRECTORY-PROJECTE 10.*
Per evitar problemes de versions definirem la versió PHP de l'entorn en el composer.json
per instal·lar les versions compatibles dels paquets i evitar incompatibilitats. Les versions PHP són: LAMP4 = 8.2 (servidors antics: LAMP 2 = 5.3, LAMP 3 = 7.2 i LAMP3HA = 7.4)
$ composer config platform.php 8.2.26
"prefer-stable": true, "config": { "sort-packages": true, "process-timeout": 0, "platform": { "php": "X.Y.Z" } }
Per seguretat el projecte disposarà d'un subdomini que apuntarà a la carpeta /web on hi haurà el core de drupal i els mòduls, themes i fitxers de la web.
Els directori de /vendors i els fixters privats /private i les configuracions del site /config/sync aniran a l'arrel del projecte i no seràn accessibles per URL directe.
$ composer require 'drupal/responsivewrappers:^2.0' --prefer-dist
Per afegir un patch editarem el fitxer composer.json i afegirem el fitxers de diferències el-fix-a-aplicat.patch a la secció "patches" d'aquest. Indicarem sempre una petita descripció del que fa aquell hotfix i una referència al fitxer que cal aplicar.
Exemple composer.json:
"extra": { "patches": { "drupal/address": { "Drupal Addess fix default syncing": "patches/address_syncing.patch" } } }
Un cop editat el composer.json un simple: $ composer update
serà suficient perquè s'apliqui el hotfix.
Això garantirà que el fix es segueix aplicant automàticament al llarg de les actualitzacions i no caldrà re-aplicar els hotfixes cada cop que s'actualitza el codi.
Si enlloc de parxejar el mòdul general de tots els sites volem aplicar el hotfix només al nostre projecte farem el següent:
$ composer update --with-dependencies --prefer-dist
Les versions dels mòdul s'han de definit de la següent manera:
"dompdf/dompdf": "2.0.3" == millor ==> "^2.0" "drupal/address": "^1.10@beta" == millor ==> "^1.10" "drupal/core-recomended": "10.2.10" == millor ==> "10.2.*"
Tots els projectes utilitzaran el settings.local.php con configuració general de la web estarà en el settings.php però els configruació específiques de l'entorn (com per exemple l'usuari/password de la base de dades) estaran al settings.local.php.
La LAMP3HA utilitza una plataforma en alta disponibilitat amb tres nodes MariaDB. Dos nodes poden fer de master i un de slave, pel que poden configurar el sistema com a master/master/slave o master/slave/slave.
Per connectar-se es fa a través del balancejador maxScale:
Desenvolupament: 192.168.156.88:3307
Tots els projectes drupal sempre definiran un prefix a les seves taules (unes poques lletres identificatives del projecte seguides d'un guió baix, per exemple: $prefix = 'db_'). Si és un projecte donat d'alta al GVUS es pot utilitzar el codi del projecte per prefixar les taules.
Tots els projectes Drupal de la Diputacció de Barcelona portaran instal.lat i activt el següent mòdul:
composer require 'drupal/diba_integration'
Aquest mòdul inclou la integracció amb el VUS i la resta de mòduls que utilitza la corporacció per fer manteniment o estadístiques
La Diputació de Barcelona utilitza el projecte VUS com a sistema de Validació d'USuaris corporatius. Actualment hi ha un mòdul d'integració del Drupal 8/9/10 amb el VUS que pots incorporar al teu projecte utilitzant el composer.
Per afegir el mòdul VUS o la sincronització de l'organigrama, municipis o comarques al teu projecte et cal demanar accés al repositori privat del GitLab on es manté aquest mòdul. Un cop tens un usuari amb accés simplement has d'afegir el repositori al fitxer composer.json de l'arrel del teu project, quedant de la següent forma:
"repositories": [ { "type": "vcs", "url": "https://gitlab.com/diputacioBCN/drupal8/vus" }, { "type": "vcs", "url": "https://gitlab.com/diputacioBCN/drupal8/taxonomy_dibasync" }, { "type": "vcs", "url": "https://gitlab.com/diputacioBCN/drupal8/tag-manager-cookie-warn" } ]
I requerir els mòduls que necesitis en el teu projecte:
composer require 'drupal/vus' composer require 'drupal/tag_manager_cookie_warn' composer require 'drupal/taxonomy_dibasync'
Aquesta comanda afegirà automàticament la darrera versió del mòdul al teu projecte i l'actualitzarà cada cop que surti una nova versió i llencis un: composer udpate
del teu projecte.
Un cop hagis incorporat el mòdul del VUS al teu projecte simplement has de desplegar el codi i activar el mòdul a la teva instal·lació del Drupal.
Els alres 2 mòduls serveixen per:
No usarem mòduls de Drupal que hagin tingut molt poc us, és a dir, que a la informació del projecte digui que el mòdul l'estan usant molt pocs sites.
El mòdul reCAPTCHA no és gratuït per la nostra organtizació, per tant, no l'usarem.
Per tal de no acumular fitxer innecesaris cal marcar al fitxer settings.php o settings.local.php la variable:
$config['file.settings']['make_unused_managed_files_temporary'] = TRUE;
Sinó els fitxers o imatges que algun cop s'han pujat al servidor no s'esborren MAI.
Aquesta configuració NO es retroactiva, pel que si cal fer neteja i revisar els fitxers i imatges no utilitzats al servidor es poden utilitzar mòduls com Audit Files [4] o Fancy file delete [5] o File Delete [6].
Per fer webs amb disseny corporatiu hi ha un tema que ja aplica el disseny corporatiu. Es recomana crear un sub-tema pel projecte per tal de poder sobre-escriure tot allò que es necessiti del tema original.
Diba Clean, és el tema corporatiu mantingut que alhora és un subtema del tema Boostrap basat en Bootstrap 5: https://www.drupal.org/project/diba_clean
Instal·lació:
composer require 'drupal/diba_clean'
Per crear el teu sub-tema del projecte el fitxer el-meu-tema.info.yml hauria de tenir un format silimar a això:
name: El meu tema type: theme description: 'Tema del meu projecte desenvolupat per XYZ.' base theme: diba_core
Nota: Això només aplica en el cas de fer una web amb disseny corporatiu complet.
Si el teu projecte utilitza llibreries, cal vincular la seva actualització via composer.
Per fer això farem el següent:
composer require --prefer-dist composer/installers
. Aquest paquet facilit la instal·lació amb el composer de paquets en directoris diferents al "/vendors" (per exemple "/libraries").installer-paths
" del "composer.json" assegurat que existeix la ruta: "web/libraries/{$name}": ["type:drupal-library"],
"repositories": [ { "type": "package", "package": { "name": "google/charts", "version": "45", "type": "drupal-library", "extra": { "installer-name": "google_charts" }, "dist": { "url": "https://www.gstatic.com/charts/loader.js", "type": "file" }, "require": { "composer/installers": "~1.0" } } } ]
I per últim podem llençar la següent comanda per afegir la dependència de la nova llibreria pel nostre projecte i es descarregarà i actualitzarà la llibreria a la carpeta /libraries del nostre projecte amb totes les seves dependències: composer require --prefer-dist google/charts:45
Exemple referenciant una llibreria externa compactada en un zip (Chosen):
{ "type": "package", "package": { "name": "harvesthq/chosen", "version": "1.8.7", "type": "drupal-library", "extra": { "installer-name": "chosen" }, "dist": { "url": "https://github.com/harvesthq/chosen/releases/download/v1.8.7/chosen_v1.8.7.zip", "type": "zip" }, "require": { "composer/installers": "~1.0" } } }
Per efegir-la:
composer require harvesthq/chosen:1.8.7
Exemple d'un fitxer d'un projecte corporatiu: composer.json [7]
Si un mòdul utilitza vàries llibreries externes, per exemple múltiples llibreries JS es una bona pràctica que el mateix mòdul defineixi les seves dependències en el seu propi fitxer de configuració i utilitzar el Composer Merge Plugin [8]per afegir descarregar totes les llibreries externes.
Un exemple concret són les llibreries que utilitza el mòdul Webform, i que és la via recomanada per instal·lar-les:
https://www.drupal.org/node/3003140 [9]
Per tal de donar resposta a altres necessitats, a la Diputació de Barcelona s'han desenvolupat altres mòduls que poden ser d'utilitat pels projectes de la corporació:
Tot projecte ha de tenir, com a mínim, els següents rols:
Per defecte sempre ha d'existir un usuari amb rol superadministrador amb nom: admindiba, que correspondrà a l'usuari amb identificador 1 (uid=1) i serà l'utilitzat per l'Oficina Tècnica d'Internet per administrar la web i tindrà tots els permisos.. Anirà associat al rol administrador.
Els rols, com el rol Gestor, que gesiona usuaris/rols, no podrà mai assignar-se el rol administrador. Recomanem algun dels següents mòduls, per evitar-ho:
L'entorn de producció utilitza un reverse proxy pel que cal configurar-lo als settings:
$settings['reverse_proxy'] = TRUE; $settings['reverse_proxy_addresses'] = [@$_SERVER['REMOTE_ADDR']]; $settings['reverse_proxy_trusted_headers'] = \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_FOR | \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_HOST | \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_PORT | \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_PROTO | \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED;
Cal definir al drupal els trusted_host corporatius al fitxer de settings que en cas de tenir subdoini diba seràn:
$settings['trusted_host_patterns'] = [ '^diba\.cat$', '^.+\.diba\.cat$', '^diba\.es$', '^.+\.diba\.es$', ];
Definirem el directori de fitxers privats, de configuració i de temporals fora de la part accesible per url i dins de la carpeta del projecte:
$settings["config_sync_directory"] = '../config/sync'; $settings['file_private_path'] = '../private'; $settings['file_temp_path'] = '../private/tmp';
A més, cal habilitar les opcions de transliteracció peruqè els fitxers i imatges que s'afegeixin a tarvés del backoffice es transliterin automàticament als caràcters ASCII96, en minúscules i sense espais ni caràcters especials.
Els recursos del servidor son limitats, per tant, a l'igual que les cerques de contingut no poden mostrar infinits resultats ja que això penalitzaria molt la web i s'han de paginar, s’ha de preveure que si és genera un fitxer, d’un o varis continguts que poden anar creixent amb el temps, la descarregar del fitxer s'ha de fer en diversos fitxers. Una solució és fer que el fitxer a descarregar sigui el resultat d'una cerca paginada, així que cada pàgina permet descarregar un fitxer nou. Tingueu en conta que afegir imatges, consumeix molts recursos, així que intenteu afegir el mínim d'imatges i el més optimitzades possibles.
Els camps d'imatge definirem un mida màxima d'imatge, així evitem que Drupal guardi imatges gegants, amb un màxim de pes, de per exemple 10MB, segons les necessitats.
Al mostrar la imatge, definirem un estil d'imatge de Drupal per visualitzar-la (Els estils d'imatge es defineixen a: /admin/config/media/image-styles i s'assignen al gestionar la presentació del tipus de contingut que té la imatge.) Amb això optimitzem la pàgina web perquè carregui la web ràpidament amb la imatge de les mides exactes a les necessitades.
Si el ckeditor permet pujar imatges, limitarem també les dimensions i pes màxim d'aquestes (/admin/config/content/formats/).
Si a l'executar composer, aquest dona problemes de timeout, és poden afegir les següents instruccions:
"config": { "process-timeout": 0, },
Adjunt | Mida |
---|---|
Exemple de fitxer composer.json d'un projecte corporatiu [7] | 8.28 KB |
Enllaços:
[1] https://www.drupal.org/docs/develop/standards
[2] https://www.diba.cat/accessibilitat
[3] https://validator.w3.org/
[4] https://www.drupal.org/project/auditfiles
[5] https://www.drupal.org/project/fancy_file_delete
[6] https://www.drupal.org/project/file_delete
[7] https://comunitatdstsc.diba.cat/sites/comunitatdstsc.diba.cat/files/composer.json_.txt
[8] https://github.com/wikimedia/composer-merge-plugin
[9] https://www.drupal.org/node/3003140
[10] https://www.drupal.org/project/diba_carousel
[11] https://www.drupal.org/project/responsivewrappers
[12] https://comunitatdstsc.diba.cat/%E2%80%8Bhttps%3A/%252Fwww.drupal.org/project/yasm
[13] https://www.drupal.org/project/role_delegation
[14] https://www.drupal.org/project/roleassign
[15] https://www.drupal.org/project/userprotect
[16] https://www.diba.cat/avislegal