Puncte:2

Răspunsul AJAX personalizat nu se declanșează la acțiunea Flag

drapel mw

Încerc să rulez funcții javascript personalizate în același timp în care oamenii interacționează cu anumite steaguri de pe site-ul meu, am urmărit acest tutorial despre cum să răspundeți la ambele acțiuni de semnalizare/anulare semnalare și acest site pentru cum să configurați răspunsurile personalizate ajax, cu excepția faptului că nu pare să poată combina cele două

Codul din fișierul meu FlagSubscriber.php (de la primul link de tutorial) arată ca cel de mai jos

clasa FlagController implementează EventSubscriberInterface {

    funcția publică onFlag(FlaggingEvent $event) {    
      dpm('Test text');

      $răspuns = AjaxResponse nou();
      $response->addCommand(
        nou ExampleCommand()
      );
      returnează $răspuns;
    } 

    /**
     * {@inheritdoc}
     */
    funcție publică statică getSubscribedEvents() {
      întoarcere [
        FlagEvents::ENTITY_FLAGED => [['onFlag']]
      ];
    }
  }

Rulează textul dpm data viitoare când pagina este încărcată, dar nu pare să ruleze deloc răspunsul meu personalizat Ajax, chiar dacă încerc să rulez un standard Răspuns Ajax de aici. Există unele locuri în care nu puteți rula astfel de solicitări de răspuns Ajax?

Puncte:1
drapel cn

Evenimentele de semnalare nu se ocupă de răspunsuri, așa că nu veți putea returna unul de acolo. O abordare diferită este să creați un abonat de rută, și modificați flag.action_link_flag și flag.action_unlink_flag rute, înlocuirea controlerului cu unul personalizat, de ex.

funcția protejată alterRoutes(RouteCollection $colecție) {
  dacă ($rută = $colecție->get('flag.action_link_flag')) {
    $route->setDefault('_controller', 'Drupal\custom_module\Controller\CustomController::flag');
  }
  dacă ($rută = $colecție->get('flag.action_link_flag')) {
    $route->setDefault('_controller', 'Drupal\custom_module\Controller\CustomController::unflag');
  }
}

Controlerul dvs. personalizat ar extinde controlerul de steag original (Drupal\flag\Controller\ActionLinkController), utilizați metodele sale pentru a genera răspunsul inițial și apoi puneți comanda (comenzile) JS la sfârșit.

clasa CustomController extinde ActionLinkController {

  semnalizare funcție publică (FlagInterface $flag, $entity_id) {
    $răspuns = parent::flag($flag, $entity_id);
    $response->addCommand(...);
    returnează $răspuns;
  }

  // Același lucru pentru unflag()

}

Pentru o acoperire completă, este posibil să trebuiască să faceți și ceva similar cu flag.action_link_flag_nojs și flag.action_link_unflag_nojs trasee. Dar dacă funcționalitatea dvs. este pur JS și nu trebuie să fie prezentă pentru utilizatorii fără ea, probabil că nu trebuie să vă deranjați.

Andrew Morris avatar
drapel mw
Absolut uimitor, tocmai am configurat niște noi declanșatoare AJAX personalizate care se declanșează de îndată ce apăs pe butonul, care este exact ceea ce căutam. Multumesc mult :D

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.