Рейтинг:1

Как-то подпишитесь/отреагируйте на addMessage

флаг cn

Я пытаюсь найти событие, на которое я могу подписаться для метода addMessage.

Мне нужно запускать некоторый код каждый раз, когда добавляется сообщение о состоянии. Отреагировав на это событие, мне нужно отправить переменную из php в JS. Я не смог найти событие для подписки, поэтому вместо этого я использовал предварительный процесс, как показано ниже.

<?php
функция mymodule_preprocess_status_messages(&$variables) {
  $variables['#attached']['drupalSettings']['send_me_to_js']['_variable'] = 'Переход к js...';
}

Этот предварительный процесс запускается каждый раз, когда используется addMessage, и отображается сообщение о состоянии, но переменная, которую мне нужно отправить в JS, не всегда отправляется.

Например, это работает для сообщений, созданных из ядра, и я получаю переменную в JS. Но когда Drupal Commerce использует addMessage (например, при добавлении товара в корзину в настройке ajax), запускается предварительный процесс, отображается сообщение о состоянии, но переменная недоступна в JS.

Вот javascript:

(функция ($, Drupal, drupalSettings) {

  Drupal.behaviors.alwave_alerts = {
    прикрепить: функция (контекст, настройки) {
      
      $('.мой-класс', контекст).once('уникальная-строка').each(функция () { 
        
        // Запуск после каждого вызова ajax
        $(документ).ajaxComplete(функция () {
          
          // Это иногда не определено, даже если препроцесс выше работает
          // и на экране появляется сообщение о статусе
          // (например, когда коммерция создает сообщение о статусе)
          console.log(settings.send_me_to_js);

        });
          
      });
  
    }
  };
  
}(jQuery, Drupal, настройки drupal));

Должен быть простой способ?

Обновлять:

Я обнаружил, что предварительный процесс не отправляет переменную в javascript только по запросам ajax. При загрузке первой страницы она отправляется, но последующие ajax-запросы не отправляют эту переменную в JS. Кажется, это последовательность, в которой вещи выполняются во время запросов ajax.

Итак, вопрос в том, как мне отправить переменную в JS из этого предварительного процесса при вызовах ajax?

Jaypan avatar
флаг de
На самом деле вы не сказали нам, что вы пытаетесь сделать, только как вы пытаетесь это сделать. Какова ваша общая цель здесь?
hga77 avatar
флаг cn
Переменная недоступна в JS при вызовах ajax. Как я могу сделать переменную из этого препроцесса доступной в JS во время вызовов ajax? Другими словами, когда сообщение о состоянии создается во время вызова ajax, эта функция «mymodule_preprocess_status_messages» будет работать, и внутри нее будет переменная, которая мне нужна, доступная в JS, $variables['message_list'].Как сделать эту переменную доступной в JS из запроса ajax (не htmlrequest или начальной загрузки страницы)? Переменная передается во время htmlrequest, но не последующих вызовов ajax. Он не определен в запросах ajax в JS.
Jaypan avatar
флаг de
Каков вариант использования?
hga77 avatar
флаг cn
@Jaypan, мне нужна переменная $variables['message_list'] в JS, чтобы я мог заменить сообщения о состоянии и создать их как плавающие всплывающие окна, используя стороннюю библиотеку javascript. Нет необходимости и в шаблоне status_masseges, так как разметка берется из библиотеки. Эта библиотека должна получать данные сообщений для создания сообщений, поэтому мне нужно указать эту переменную.
Jaypan avatar
флаг de
В прошлом я устанавливал плавающие сообщения о состоянии, изменяя шаблон в соответствии с выводом, а затем создавая файл JS, который вызывает JS, чтобы сделать сообщение всплывающим с помощью Drupal.behaviors. Но, похоже, вы решили сделать это так, как пытаетесь, к сожалению, у меня нет ответа на метод, который вы пытаетесь сделать, я знаю только, как я это сделал.
hga77 avatar
флаг cn
@Jaypen, спасибо за ответ. Я решил эту проблему и вскоре добавлю ответ. Я сейчас добавляю модуль. Вот страница проекта https://www.drupal.org/project/shoelace_messages
Рейтинг:0
флаг cn

Мне удалось решить эту проблему. По сути, проблема заключалась в том, что я не мог передать переменную из функции предварительной обработки в JavaScript во время запросов AJAX (как упоминалось несколько раз в этом выпуске). Итак, что я сделал:

  1. Внутри препроцесса я установил переменную частного временного хранилища для последующего использования во время запросов AJAX.
  2. Была создана пользовательская команда обратного вызова AJAX, которая принимает переменную и вызывает функцию JavaScript, которая, в свою очередь, получает переменную.
  3. Затем я подписываюсь на событие ответа, которое запускается при каждом запросе. Событие — KernelEvents::RESPONSE.
  4. Внутри обработчика этого события я проверяю, что мы находимся в AJAX-запросе, затем извлекаю переменную из временного хранилища, которая была установлена ​​ранее.
  5. Я использую пользовательскую команду AJAX, присваивая ей переменную tempstore, которая отправляет ее в JavaScript. Выполнено!

Вы можете найти полный код в этом модуле: https://www.drupal.org/project/shoelace_messages

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

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