Înțelegerea actualizărilor și post-actualizărilor pentru actualizări de succes ale site-ului Drupal
Publicat: 2023-04-25În timpul actualizărilor de bază sau al actualizărilor modulelor, este esențial să asigurați stabilitatea și integritatea site-ului dvs. Drupal. Din fericire, modulul Update API și Update/Post Update Hooks sunt aici pentru a vă ajuta.
Modulul Update API oferă cârligele necesare pentru actualizarea codului și modulelor de pe site-ul dvs. Drupal. Aceste cârlige nu sunt altceva decât cârlige de actualizare și post-actualizare care permit dezvoltatorilor să personalizeze actualizările în funcție de nevoile lor.
În acest articol, vom discuta despre API-ul de actualizare, ce sunt cârligele de actualizare și post-actualizare și când și cum ar trebui utilizate. Înțelegând ambele tipuri de cârlige, vă puteți actualiza cu succes site-ul Drupal cu un efort minim. Să începem!

API-ul de actualizare
În timp ce lucrați pe un site existent, atunci când actualizați codul într-un modul, poate fi necesar să actualizați datele stocate, astfel încât datele stocate să fie compatibile cu noul cod. Este posibil să fi observat în fața dvs. erori precum „Site-ul web a întâmpinat o eroare neașteptată”. Înfricoșător nu!? Știu! Aici ne vine în ajutor API-ul de actualizare Drupal.
Dacă actualizarea se află între două versiuni minore ale modulului dvs. în cadrul aceleiași versiuni majore de bază Drupal, puteți utiliza API-ul de actualizare pentru a actualiza datele. Update API vă permite să furnizați cod care realizează o actualizare a datelor stocate ori de câte ori modulul face o modificare a modelului său de date. Modificarea modelului de date se referă la orice modificare care face ca datele stocate pe un site existent să fie incompatibile cu baza de cod actualizată a site-ului respectiv. Aceste modificări ale modelului de date implică:
Actualizarea schemei de configurare
- Adăugarea/eliminarea/redenumirea unei chei de configurare.
- Modificarea tipului de date al cheii de configurare.
- Modificarea valorii implicite așteptate a unei chei de configurare etc.
Actualizarea schemei bazei de date
- Adăugarea/modificarea/eliminarea unui tabel sau câmp al bazei de date.
- Mutarea datelor stocate într-un câmp sau tabel diferit.
- Modificarea formatului datelor stocate etc.
Actualizarea entităților și câmpurilor
- Adăugarea unui câmp de bază nou la un tip de entitate existent.
- Actualizarea unui câmp de la un tip învechit la un tip nou etc.
Actualizarea Datelor
- Manipulați datele stocate pe un site existent.
Lucrul cu cârlige de actualizare
Hook hook_update_N() este folosit pentru a introduce o actualizare între versiunile minore ale unui modul. Aceste cârlige sunt plasate în modulul dumneavoastră în fișierul *.install .
Hook_update_N() este scris sub forma (nume modul)_update_(număr). Aici N cuprinde:
- 1 sau 2 cifre se referă la compatibilitatea de bază a Drupal (Drupal 8, 9, 10 etc.)
- Următoarea cifră este pentru versiunea majoră a modulului dvs
- Ultimele 2 cifre pentru numărare secvențială, începând cu 01
Exemplu:
example_update_9201(): prima actualizare pentru versiunile 9.x-2.x.
Unde „exemplu” este numele modulului, prima cifră se referă la versiunea de bază a Drupal „9”, numărul „2” se referă la versiunea majoră a modulului, iar ultimele două cifre „01” indică prima funcție de actualizare scrisă pentru modul „exemplu”.
Partea numerică a funcției de implementare a cârligului (adică, 9201 în exemplul de mai sus) este stocată în baza de date pentru a ține evidența actualizărilor care au fost deja executate. Deci nu ar trebui să renumerotați niciodată funcțiile de actualizare.
Pentru a cunoaște versiunea curentă a schemei a unui modul „exemplu stocat în baza de date”, utilizați:
drush php-eval "echo drupal_get_installed_schema_version('example');"

Pentru a seta manual versiunea curentă a schemei a unui „exemplu” de modul înapoi la „9201”, utilizați:
drush php-eval "echo drupal_set_installed_schema_version('example', '9201');"

Notă: Încercați să evitați să utilizați funcția drupal_set_installed_schema_version() pe site-urile de producție, deoarece vă actualizează direct baza de date. Îl puteți folosi în mediile de testare locale sau inferioare în timpul dezvoltării pentru a reseta versiunea schemei.
Adăugați o descriere adecvată în comentariul blocului de document înainte de funcția de actualizare, deoarece va fi tipărită pentru utilizatori în timp ce o rulează.
Structure of hook_update_N(): /** * A aimple hook_update_N() hook. */ function example_update_9201() { // Code goes here. }
Aceste cârlige sunt executate în ordine sortată, adică example_update_9201() cârligul se execută înainte de example_update_9202(), următorul este 9203, 9204 și așa mai departe.
De asemenea, puteți modifica ordinea sortată a acestor cârlige, introducând dependențe între cârlige. Utilizați hook_update_dependencies() pentru a rula actualizări între două cârlige de actualizare.

Toate cârligele de actualizare sunt executate în lot și acceptă, de asemenea, procesarea în lot a articolelor. Toate cârligele de actualizare au acces la un parametru $sandbox care poate fi folosit pentru a crea procese batch în hook-urile de actualizare pentru a procesa date uriașe simultan, fără a cauza timeout-ul PHP.

Un exemplu simplu de cârlig de actualizare pentru a adăuga o nouă cheie de configurare:
În prezent, fișierul example_module.settings.yml conține:


Pentru a adăuga o nouă „descriere” cheie la configurație:
- Adăugați cheia „descriere” în fișierul de setări

- Adăugați update_hook în fișierul example_module.install:

- Utilizați drush updb pentru a rula hook.

- Verificați configurația actualizată, noua „descriere” cheie este actualizată.

Lucrul cu cârlige Post Update
Hook hook_post_update_NAME(), similar cu hook-ul de actualizare, este folosit pentru a introduce o actualizare. Dar acest cârlig este destinat în principal să actualizeze datele, cum ar fi entitățile. Aceste hook-uri sunt executate după ce toate hook_update_N() sunt executate. În această etapă, Drupal este deja complet reparat, astfel încât să puteți utiliza orice API din site.
Aceste cârlige sunt plasate într-un fișier *.post_update.php din modulul dumneavoastră.
Hook_post_update_NAME() este scris sub forma (nume modul)_post_update_(orice nume). Aici NUME poate fi orice nume de mașină arbitrar. Această denumire alfanumerică a funcțiilor din fișier este singurul lucru care asigură ordinea de execuție a acestui hook.
Similar cu actualizările hooks, adăugați o descriere adecvată în comentariul docblock înainte de post_update hook. De asemenea, nu reutilizați același nume de cârlig.
Structura hook_post_update_NAME():
/** * A aimple hook_post_update_NAME() hook. */ function example_post_update_test() { // Code goes here. }
La fel ca în cazul hook-urilor de actualizare, utilizați parametrul $sandbox pentru a indica faptul că API-ul Batch ar trebui să fie utilizat pentru hook-urile dvs. post_update.
Un exemplu simplu despre utilizarea cârligului post-actualizare pentru a actualiza termenul de date:
- În prezent, toți termenii din vocabularul Etichetelor au un câmp „Exemplu de testare” dezactivat.

- Adăugați un cârlig post_update în fișierul example_module.post_update.php pentru a activa câmpul „Exemplu de testare” pentru toți termenii existenți.

- Utilizați drush updb pentru a rula hook.

- Verificați datele actualizate ale termenului, caseta de selectare „Exemplu de testare” trebuie să fie activată.

Cum să rulezi aceste cârlige!
Puteți folosi comanda Drush pentru a executa aceste cârlige, drush updb. Acesta construiește lotul în următorii pași:
- Toate cârligele de actualizare sunt descoperite.
- Rezolvă dependența și sortează ordinea acestora.
- Cârligele sunt plasate pentru procesarea în lot.
- În continuare, toate cârligele Post sunt descoperite.
- Dacă există cârlige post_update și dacă update_hook a rulat anterior, atunci cache-urile sunt șterse.
- Apoi, împingeți fiecare cârlig post_update în lot.
- Executați lotul.
Un avantaj major pe care îl are hook-ul post-actualizare față de hook-ul de actualizare este că Drupal este complet funcțional în momentul în care este rulată post-actualizare. Acest lucru permite dezvoltatorilor să folosească orice serviciu Drupal în timp ce folosesc cârligul post-actualizare. Cu ajutorul hook-ului de actualizare, nu trebuie să presupunem că Drupal este complet reparat și să evitați invocarea altor hook-uri, API-uri de entități etc.
Gânduri finale
Când încercați să vă remediați site-ul prin actualizarea config/schema bazei de date, încercați să utilizați cârlige de actualizare. Când vine vorba de manipularea datelor stocate, resalvarea configurațiilor, actualizarea entităților de conținut, ștergerea cache-ului etc., atunci cârligele post-actualizare sunt mai potrivite de utilizat.
Sincer să fiu, nu există o documentație clară pe Drupal.org cu privire la când să folosești ce cârlig! Există o problemă deschisă care solicită îmbunătățirea documentației privind utilizarea acestor două cârlige la care puteți contribui dacă doriți.
Dar, pe baza experienței dezvoltatorilor și luând în considerare modulele de bază Drupal 9 și 10 ca exemplu, utilizați cârlige de actualizare pentru a efectua operațiuni CRUD pe configurații sau baze de date (adică reparați site-ul) și utilizați cârlige post-actualizare pentru entitățile de conținut CRUD ( apoi remediați datele de pe site-ul actualizat), deoarece cârligele post-actualizare sunt rulate după cârligele de actualizare.
Ți-a plăcut să citești acest articol? Arată-ne puțină dragoste și abonează-te astăzi la buletinul nostru informativ săptămânal!