Puncte:0

Adăugarea JavaScript într-un hook_entity_type_presave() hook

drapel es

Încerc să adaug Javascript într-un hook_entity_type_presave(), dar nu se declanșează.

Este posibil să adăugați în acest cârlig?

Am încercat fără succes -- codul meu este mai jos -- și acest exemplu pe Drupal.org: https://www.drupal.org/docs/drupal-apis/javascript-api/add-javascript-to-your-theme-or-module ...descrie procesul de adăugare a javascript în contextul altor două module personalizate, utilizând hook_element_info_alter() și hook_page_attachments().

Modulul meu:

modulul_meu
  my_module.biblioteci
  modulul_meu.modul
  my_module.info.yml
  js
    url-parameter.js

my_module.libraries:

parametru URL:
  versiunea: 1.x  
  js:
    js/url-parameter.js: {}
  dependențe:
    - core/jquery

modulul_meu.modul


funcția my_module_node_presave(Drupal\node\NodeInterface $entity) {

  //alt cod legat de cârligul de presare, care funcționează bine

  //Încerc să încarc JS-ul aici, dar nu se declanșează:

  $attachments['#attached']['library'][] = 'js/url-parameter.js';
  
}

js\url-parameter.js:

(funcție (jQuery) {
  jQuery(document).ready(funcție() {
    alert("bună ziua");
    console.log('Încărcat');
  });
})(jQuery);

drapel cn
Dacă ați putea să actualizați întrebarea și să descrieți puțin mai detaliat care este obiectivul dvs. final, cred că v-ar ajuta - nu puteți atașa JS într-un cârlig de pre-salvare (ei bine, probabil că ați putea, cu forța), dar nu prea face sens să te gândești oricum să-l atașezi acolo - JS-ul tău personalizat ar fi cu siguranță aplicabil numai anumitor pagini/contexte și nu există nicio garanție că pagina/contextul va fi în domeniu de fiecare dată când entitatea este salvată. Așa că ar fi bine să știi exact ce vrei să se întâmple
scaffolding avatar
drapel es
Mulțumesc @Clive. Scopul cârligului de presalvare este de a adăuga o imagine și un text consistent de erou la anumite tipuri de noduri (adică un anumit tip de pagină de eveniment). Scuze, am eliminat acea logică când am încercat să simplific codul pentru această întrebare. Gândirea mea a fost: în timp ce adaug imaginea și textul eroului, aș dori, de asemenea, să adaug un script la aceleași tipuri de noduri. Adăugarea JS în același cârlig ar funcționa, dar dacă aveți o recomandare pentru o abordare mai bună, vă rugăm să trimiteți un mesaj.
drapel cn
Probabil că doriți să vă gândiți la separarea acestei logici - setarea datelor nodului este cu siguranță o sarcină pentru cârligul de presalvare, dar, probabil, JS aparține paginii nodului, nu operației de salvare, așa că ar putea fi mai bine atașat condiționat la vizualizarea nodului. . Există un exemplu aici: https://drupal.stackexchange.com/questions/231160/attach-javascript-library-and-settings-to-a-node-page, probabil că ar trebui să adăugați o logică suplimentară pentru a verifica dacă câmpurile eroului sunt populate și apoi atașați biblioteca
Puncte:3
drapel us

hook_entity_presave() și hook_ENTITY_TYPE_presave() nu trebuie să presupună că entitatea a fost editată folosind un formular sau că o pagină a fost afișată utilizatorilor. Aceste cârlige sunt, de asemenea, invocate atunci când o entitate este creată programatic, de exemplu cu următorul cod, care ar putea fi folosit și într-un hook_cron() implementare.

$valori = [
  'type' => 'articol',
  'title' => 'Titlul articolului',
  'uid' => 1,
  'status' => TRUE,
];
$nod = \Drupal::entityManager()->getStorage('nod')->create($values);
$nod->salvare();

Cârligul invocat înainte ca o entitate să fie randată este hook_entity_view() (sau hook_ENTITY_TYPE_view()). Folosind unul dintre aceste cârlige, un modul poate adăuga o matrice de randare suplimentară $build, de exemplu cu $build['#attached']['library'][] = 'js/url-parameter.js';.

Ca exemplu de cod, $display->getComponent() ar trebui să fie folosit pentru a verifica că câmpul de entitate a fost setat să fie randat, deoarece utilizatorii administratori pot ascunde câmpurile din /admin/structure/types/manage/article/display (pentru Articol tipul de conținut). De exemplu, cu următoarele setări, aș ascunde un câmp personalizat de entitate și Etichete câmp pentru Articol tipul de conținut.

captură de ecran

As verifica si valoarea lui $view_mode transmise acelor cârlige, deoarece acea valoare spune de ce este randat nodul. De exemplu, când modulul Căutare indexează nodurile, $view_mode este egal cu „index_căutare”; când un nod este adăugat la un flux RSS, $view_mode este egal cu 'rss'. În aceste cazuri, probabil că nu doriți să adăugați o bibliotecă.

scaffolding avatar
drapel es
Mulțumesc @apaderno, voi încerca această abordare, cred că asta va rezolva problema.
scaffolding avatar
drapel es
Doar confirm, acest lucru m-a ajutat să rezolv această problemă. Mulțumesc @apaderno

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.