Puncte:1

Cumva abonați-vă/reacționați la addMessage

drapel cn

Încerc să găsesc un eveniment la care să mă pot abona pentru metoda addMessage.

Trebuie să declanșez un cod de fiecare dată când este adăugat un mesaj de stare. Reacționând la acest eveniment, trebuie să trimit o variabilă de la php la JS. Nu am putut găsi un eveniment la care să mă abonez, așa că am folosit un preproces, mai jos.

<?php
funcția mymodule_preprocess_status_messages(&$variabile) {
  $variables['#attached']['drupalSettings']['send_me_to_js']['_variable'] = 'Mergem la js...';
}

Acest preproces rulează de fiecare dată când se folosește addMessage și este afișat un mesaj de stare, dar variabila pe care trebuie să o trimită la JS nu este întotdeauna trimisă.

De exemplu, acest lucru funcționează pentru mesajele create din core și primesc variabila în JS. Dar când Drupal Commerce folosește addMessage (de exemplu, când adăugați un produs în coș în configurarea ajax), preprocesul rulează, se afișează mesajul de stare, dar variabila nu este disponibilă în JS.

Iată javascript-ul:

(funcție ($, Drupal, drupalSettings) {

  Drupal.behaviors.alwave_alerts = {
    atașați: funcție (context, setări) {
      
      $('.my-class', context).once('unique-string').each(function () { 
        
        // Rulați după fiecare apel ajax
        $(document).ajaxComplete(funcție () {
          
          // Aceasta este uneori nedefinită, chiar dacă rulează preprocesul de mai sus
          // și există un mesaj de stare pe ecran
          // (de exemplu, când comerțul creează un mesaj de stare)
          console.log(settings.send_me_to_js);

        });
          
      });
  
    }
  };
  
}(jQuery, Drupal, drupalSettings));

Trebuie să existe o cale ușoară?

Actualizați:

Am descoperit că preprocesul nu trimite variabila la javascript doar la cererile ajax. La încărcarea primei pagini, este trimisă, dar cererile ulterioare ajax nu trimit această variabilă la JS. Pare a fi ordinea în care lucrurile sunt executate în timpul solicitărilor ajax.

Deci întrebarea este: Cum trimit o variabilă la JS din acest preproces pe apelurile Ajax?

Jaypan avatar
drapel de
Nu ne-ai spus de fapt ce încerci să faci, ci doar cum încerci să faci asta. Care este obiectivul tău general aici?
hga77 avatar
drapel cn
Variabila nu este disponibilă în JS pentru apelurile ajax. Cum pot face o variabilă din acest preproces disponibilă în JS în timpul apelurilor ajax? Cu alte cuvinte, atunci când un mesaj de stare este creat în timpul unui apel ajax, această funcție „mymodule_preprocess_status_messages” va rula, iar în ea este o variabilă de care am nevoie disponibilă în JS, $variables['message_list'].Cum fac această variabilă disponibilă în JS dintr-o solicitare ajax (nu htmlrequest sau încărcarea inițială a paginii)? Variabila este transmisă în timpul cererii html, dar nu și în apelurile ajax ulterioare. Este nedefinit în cererile ajax din JS.
Jaypan avatar
drapel de
Care este cazul de utilizare?
hga77 avatar
drapel cn
@Jaypan, am nevoie de variabila $variables['message_list'] în JS, astfel încât să pot înlocui masele de stare și să le creez ca ferestre pop-up plutitoare, folosind o bibliotecă javascript terță parte. Nu este nevoie nici de șablonul status_masseges, deoarece marcajul provine din bibliotecă. Această bibliotecă trebuie să obțină datele despre mesaje pentru a crea mesajele, de aici motivul pentru care trebuie să îi dau această variabilă.
Jaypan avatar
drapel de
Am configurat mesaje de stare plutitoare în trecut, modificând șablonul pentru a se potrivi cu rezultatul, apoi creând un fișier JS care apelează JS pentru a face mesajul un pop-up folosind Drupal.behaviors. Dar se pare că ești gata să o faci așa cum încerci tu, din păcate nu am răspunsul la metoda pe care încerci să o faci, știu doar cum am făcut-o.
hga77 avatar
drapel cn
@Jaypen, mulțumesc pentru răspuns. Am rezolvat această problemă și voi adăuga răspunsul în scurt timp. Sunt în proces de a contribui la modul, Iată pagina proiectului https://www.drupal.org/project/shoelace_messages
Puncte:0
drapel cn

Am reusit sa rezolv aceasta problema. Practic, problema a fost că nu am putut trece o variabilă din funcția de preprocesare la JavaScript în timpul solicitărilor AJAX (după cum am menționat de mai multe ori în această problemă). Deci ce am facut:

  1. În interiorul preprocesului, am setat o variabilă de stocare temporară privată pentru utilizare ulterioară în timpul solicitărilor AJAX.
  2. A fost creată o comandă personalizată AJAX Callback, care acceptă variabila și invocă o funcție JavaScript, care la rândul său primește variabila.
  3. Apoi mă abonez la un eveniment de răspuns care rulează la fiecare solicitare. Evenimentul este KernelEvents::RESPONSE.
  4. În interiorul handler-ului pentru acest eveniment, verific că suntem într-o solicitare AJAX, apoi recuperez variabila din magazinul temporar, care a fost setată anterior.
  5. Folosesc comanda personalizată AJAX, oferindu-i variabila tempstore, care o trimite la JavaScript. Terminat!

Puteți găsi codul complet în acest modul: https://www.drupal.org/project/shoelace_messages

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.