Рейтинг:0

Добавление Javascript в хук hook_entity_type_presave()

флаг es

Я пытаюсь добавить Javascript в хук hook_entity_type_presave(), но он не срабатывает.

Можно ли добавить в этот хук?

Я безуспешно пытался - мой код ниже - и этот пример на Drupal.org: https://www.drupal.org/docs/drupal-apis/javascript-api/add-javascript-to-your-theme-or-module ...описывает процесс добавления javascript в контексте двух других пользовательских модулей с использованием hook_element_info_alter() и hook_page_attachments().

Мой модуль:

мой_модуль
  my_module.libraries
  мой_модуль.модуль
  мой_модуль.info.yml
  js
    URL-параметр.js

мой_модуль.библиотеки:

URL-параметр:
  версия: 1.х  
  js:
    js/url-parameter.js: {}
  зависимости:
    - ядро/jquery

мой_модуль.модуль


функция my_module_node_presave (Drupal\node\NodeInterface $entity) {

  //другой код, относящийся к хуку presave, который отлично работает

  // Я пытаюсь загрузить JS здесь, но он не срабатывает:

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

js\url-параметр.js:

(функция (jQuery) {
  jQuery (документ) .ready (функция () {
    Сообщить("Привет");
    console.log('Загружено');
  });
})(jQuery);

флаг cn
Если бы вы могли обновить вопрос и более подробно описать, какова ваша конечная цель, я думаю, это помогло бы - вы не можете прикрепить JS к хуку предварительного сохранения (ну, вы, вероятно, могли бы принудительно), но на самом деле это не делает смысл думать о том, чтобы прикрепить его туда в любом случае - ваш пользовательский JS наверняка будет применим только к определенным страницам/контекстам, и нет никакой гарантии, что страница/контекст будет в области видимости каждый раз, когда сущность будет сохранена. Так что было бы хорошо точно знать, что вы хотите, чтобы произошло
scaffolding avatar
флаг es
Спасибо @Клайв. Целью хука предварительного сохранения является добавление согласованного основного изображения и текста к определенным типам узлов (например, к определенному типу страницы события). Извините, я удалил эту логику, пытаясь упростить код для этого вопроса. Я подумал: пока я добавляю главное изображение и текст, я также хотел бы добавить скрипт к тем же типам узлов. Добавление JS в тот же хук будет работать, но если у вас есть рекомендации по лучшему подходу, отправьте нам сообщение.
флаг cn
Вы, вероятно, захотите подумать об отделении этой логики - установка данных узла, безусловно, является работой для хука предварительного сохранения, но, возможно, JS принадлежит странице узла, а не операции сохранения, поэтому вместо этого может быть лучше условно привязан к представлению узла. . Здесь есть пример: https://drupal.stackexchange.com/questions/231160/attach-javascript-library-and-settings-to-a-node-page, предположительно вам нужно добавить дополнительную логику, чтобы проверить, поля героя заполнены, а затем прикрепите библиотеку
Рейтинг:3
флаг us

hook_entity_presave() и hook_ENTITY_TYPE_presave() не следует предполагать, что объект был отредактирован с использованием формы или страница была показана пользователям. Эти хуки также вызываются, когда сущность создается программным путем, например, с помощью следующего кода, который также можно использовать в крючок_cron() выполнение.

$значения = [
  'тип' => 'статья',
  'title' => 'Заголовок статьи',
  'ид' => 1,
  'статус' => ИСТИНА,
];
$node = \Drupal::entityManager()->getStorage('node')->create($values);
$узел->сохранить();

Хук, вызываемый перед рендерингом сущности, крючок_entity_view() (или же крючок_ENTITY_TYPE_view()). Используя один из этих хуков, модуль может добавить дополнительный массив рендеринга в $сборка, например с $build['#attached']['library'][] = 'js/url-parameter.js';.

В качестве примера кода $дисплей->получитькомпонент() следует использовать для проверки того, что поле объекта настроено для отображения, поскольку пользователи-администраторы могут скрывать поля из /admin/structure/types/manage/article/display (для Статья Тип содержимого). Например, со следующими настройками я бы скрыл настраиваемое поле объекта, а Теги поле для Статья Тип содержимого.

Скриншот

Я бы также проверил значение $view_mode передается этим хукам, поскольку это значение говорит, почему узел отображается. Например, когда модуль поиска индексирует узлы, $view_mode равно 'search_index'; когда узел добавляется в RSS-канал, $view_mode равно 'rss'. В этих случаях вы, вероятно, не захотите добавлять библиотеку.

scaffolding avatar
флаг es
Спасибо @apaderno, попробую этот подход, думаю, это решит проблему.
scaffolding avatar
флаг es
Просто подтверждаю, это помогло мне решить эту проблему. Спасибо @apaderno

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

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