Рейтинг:2

Пользовательский ответ AJAX не срабатывает при действии флага

флаг mw

Я пытаюсь запускать пользовательские функции javascript одновременно с тем, как люди взаимодействуют с определенными флагами на моем сайте, я следовал этот учебник о том, как реагировать на действия «Пометить/снять пометку», и этот сайт как настроить пользовательские ответы ajax, за исключением того, что он просто не может объединить два

Код внутри моего файла FlagSubscriber.php (из первой ссылки на учебник) выглядит следующим образом:

класс FlagController реализует EventSubscriberInterface {

    публичная функция onFlag (FlaggingEvent $event) {    
      дпм('Тестовый текст');

      $response = новый AjaxResponse();
      $ответ->добавитькоманду(
        новый ПримерКоманда()
      );
      вернуть $ответ;
    } 

    /**
     * {@inheritdoc}
     */
    общедоступная статическая функция getSubscribedEvents() {
      возвращаться [
        FlagEvents::ENTITY_FLAGGED => [['onFlag']]
      ];
    }
  }

Он запускает текст dpm при следующей загрузке страницы, но, похоже, он вообще не запускает мой пользовательский ответ Ajax, даже если я пытаюсь запустить стандартный Ответ Аякса отсюда. Есть ли места, где вы не можете запускать такие запросы Ajax Response?

Рейтинг:1
флаг cn

События пометки не связаны с ответами, поэтому вы не сможете вернуть их оттуда. Иной подход заключается в создать абонента маршрута, и измените flag.action_link_flag и flag.action_unlink_flag маршруты, заменив контроллер на свой собственный, например.

защищенная функция alterRoutes(RouteCollection $ collection) {
  если ($ маршрут = $ коллекция-> получить ('flag.action_link_flag')) {
    $route->setDefault('_controller', 'Drupal\custom_module\Controller\CustomController::flag');
  }
  если ($ маршрут = $ коллекция-> получить ('flag.action_link_flag')) {
    $route->setDefault('_controller', 'Drupal\custom_module\Controller\CustomController::unflag');
  }
}

Ваш собственный контроллер будет расширять исходный контроллер флага (Друпал\флаг\контроллер\экшнлинкконтроллер), используйте его методы для создания исходного ответа, а затем просто добавьте свои команды JS в конец.

класс CustomController расширяет ActionLinkController {

  флаг публичной функции (FlagInterface $flag, $entity_id) {
    $response = parent::flag($flag, $entity_id);
    $ответ->добавитькоманду(...);
    вернуть $ответ;
  }

  // То же самое для unflag()

}

Для полного покрытия вам также может понадобиться сделать что-то похожее на flag.action_link_flag_nojs и flag.action_link_unflag_nojs маршруты. Но если ваш функционал чисто JS и не должен присутствовать для пользователей без него, возможно, не стоит заморачиваться.

Andrew Morris avatar
флаг mw
Абсолютно потрясающе, я только что настроил несколько новых пользовательских триггеров AJAX, которые срабатывают, как только я нажимаю кнопку, и это именно то, что мне нужно. Большое спасибо: D

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.