Рейтинг:0

How would one make a variable in a module's JS editable via admin menu?

флаг cn

Say I have a library that is attached to a page that brings along with it some JavaScript. For this example, let's say the JavaScript has a variable which is the path to an image that the JS displays. This would look something like:

variable.setAttribute('src', drupalSettings.path.baseUrl + pathToPicture)

Now let's say I want to have pathToPicture configurable via Admin Menu so that one may add their own path to their own picture, instead of using the one that is defaulted to.

How might one go about accomplishing this task? I know the basics of setting up a form and adding it to the admin menu, but I don't know enough to complete something like this on my own. If there is existing documentation on this sort of procedure, I'd appreciate being directed towards it. Otherwise any ideas are welcome. Thanks!

leymannx avatar
флаг ne
Например, вы можете передавать переменные из PHP в JS (drupalSettings) из хука предварительной обработки. Итак, сохраните свое изображение где-нибудь, возможно, в профиле пользователя, затем выполните предварительную обработку в массиве рендеринга, где вам нужен JS, получите текущего пользователя, получите его изображение, получите URL-адрес изображения и передайте его в drupalSettings.
No Sssweat avatar
флаг ua
Вот идея: пожалуйста, предоставьте код вашей формы и код хука процесса, если он у вас уже есть.
apaderno avatar
флаг us
Поскольку в вопросе говорится *чтобы кто-то мог добавить свой собственный путь к своей части изображения*, как бы вы этого добились и как использование кода JavaScript сделало бы это возможным? С кодом, показанным в ответе, вы получаете значение, переданное из PHP в JavaScript, но как пользователи могут изменить это значение, не имея доступа к форме настроек? Если у них есть доступ к форме, они просто отправляют форму.
apaderno avatar
флаг us
Если бы я хотел, чтобы конечные пользователи устанавливали значение, которое затем использовалось бы в моем модуле, я бы создал форму, к которой они могли бы получить доступ, чтобы установить это значение. Затем мой код будет использовать это значение там, где это необходимо. Мне не нужно было бы писать код JavaScript, чтобы достичь этого.
Рейтинг:2
флаг de

Представьте себе модуль под названием Configurable Picture. Вы хотите, чтобы путь к изображению можно было настроить через пользовательский интерфейс администратора. Путь — это строка, поэтому первое, что нужно сделать, — определить конфигурацию пути. В этом случае объект конфигурации будет configurable_picture.settings путь_к_картинке.

configurable_picture/config/schema/configurable_picture.schema.yml:

configurable_picture.settings:
  тип: config_object
  label: 'Настраиваемые параметры изображения'
  сопоставление:
    путь_к_картинке:
      тип: строка
      label: 'Путь к изображению'

Следующим шагом является создание формы конфигурации, которая позволяет вам редактировать элемент конфигурации, определенный в приведенной выше схеме. Вот документация по созданию форм конфигурации: https://www.drupal.org/docs/drupal-apis/configuration-api/working-with-configuration-forms

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

Чтобы указать этот параметр конфигурации в файле JavaScript, необходимо выполнить два шага. Первый — добавить зависимость к core/drupalSettings в вашу библиотеку JS.

конфигурируемая_картинка/configurable_picture.libraries.yml:

картина_форма:
  js:
    путь/к/file.js: {}
  зависимости:
    - настройки ядра/друпала

Затем вы прикрепляете библиотеку и настройки к форме:

$form['#attached']['library'][] = 'configurable_picture/picture_form';
// Ключ configurableSettings станет пространством имен внутри 
// объект drupalSettings в файле JS.
$form['#attached']['drupalSettings']['configurablePicture'] = [
  // Установить путь на основе значения, сохраненного в конфигурации:
  'pathToPicture' => \Drupal::config('configurable_picture')->get('path_to_picture'),
];

Затем path/to/file.js может получить доступ к объекту настроек следующим образом:

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

  функция getPathToPicture() {
    вернуть drupalSettings.configurablePicture.pathToPicture;
  }

  // Или из объекта настроек в Drupal.behaviors:
  Drupal.behaviors.configurablePicture = {
    прикрепить: функция (контекст, настройки) {
      console.log(settings.configurablePicture.pathToPicture);
    }
  };
}(jQuery, Drupal, настройки drupal));
Joseph avatar
флаг cn
Спасибо за это. Раньше я использовал drupalSettings для такого рода связи, так что я думаю, что эта часть будет легкой. Я обновил свой исходный пост, чтобы показать, как выглядит моя текущая файловая структура (за исключением файла JS), потому что, хотя я считаю, что правильно следовал инструкциям, на странице конфигурации не появляется форма. Вы видите что-то явно неправильное в моем коде?
Jaypan avatar
флаг de
Я ответил на ваш первоначальный вопрос о том, как передать переменную конфигурации в JS. Ваша проблема с неработающей формой конфигурации — это новая тема, и вам следует открыть для нее новую ветку. Ответы Drupal — это форум с одним вопросом и одним ответом, новые вопросы получают новые темы.
Jaypan avatar
флаг de
Кроме того, вы должны опубликовать свой фактический код, а не заменять все на mymodule. Слишком легко пропустить опечатки, когда вы не показываете фактический код.
Joseph avatar
флаг cn
Хорошо, извините, я очень новичок в этом и беспокоился о том, чтобы засорить форум множеством вопросов, особенно если у них есть простые решения.
Jaypan avatar
флаг de
Все хорошо - мы все проходим через то же самое, что и вы, когда пришли сюда! Добро пожаловать в Drupal Answers, и мы здесь, чтобы ответить на вопросы о Drupal, так что не стесняйтесь открывать темы, чтобы задавать вопросы.
Joseph avatar
флаг cn
Привет, @Jaypan, у меня есть вопрос о твоем ответе. Что такое .pathToFile? Я не могу найти документацию по нему или заставить его работать. Я получаю эту ошибку в консоли: Невозможно прочитать свойства неопределенного (чтение «pathToFile»). Я неправильно понимаю, что вы делаете?
Jaypan avatar
флаг de
Вы должны заменить его фактическим путем к вашему файлу JS. Поэтому, если у вас есть `file.js` в папке `js` вашего модуля, вы должны поместить `js/file.js: {}`.
Joseph avatar
флаг cn
Да, извините, я понял, я имел в виду, когда вы используете его здесь, например: `console.log(settings.configurablePicture.pathToFile);` .pathToFile должен быть заменен путем к файлу JS? Это кажется странным?
Jaypan avatar
флаг de
Правильный. `settings` содержит настройки для текущего `контекста`. Это две переменные, которые передаются в метод `.attach` поведения Drupal. При первоначальной загрузке документа «контекст» — это весь документ, а «настройки» — это весь объект «drupalSettings». Но поведение Drupal также вызывается, когда новые элементы вставляются в DOM с помощью Ajax, а «настройки» содержат настройки для нового «контекста». Вы можете по-прежнему ссылаться на `drupalSettings`, однако он содержит как настройки начальной загрузки страницы, так и загрузку ajax, что делает ее менее упорядоченной.
Jaypan avatar
флаг de
Я должен добавить, что `settings.configurablePath.pathToFile` заменяется путем к файлу. Предполагая, что это путь, как вы описали, вам потребуется добавить корень Drupal: `settings.path.baseUrl + settings.configurablePath.pathToFile`.
Joseph avatar
флаг cn
Так вот как это должно выглядеть? `console.log(drupalSettings.path.baseUrl + settings.pathToSound.js/configurablePicture.js);`? Это все еще не имеет для меня особого смысла, почему я связываю файл JS, когда я уже в файле JS?
Jaypan avatar
флаг de
Нет, это будет заменено путем к картинке, а не к файлу JS. Вы правы, что этот код находится в файле JS. Любое значение, которое вы ввели в форму на странице конфигурации, будет в `ssettings.configurablePath.pathToPicture`
Jaypan avatar
флаг de
Кроме того, вызов console.log просто для того, чтобы вы могли видеть значение в своей консоли JS, оно вам не нужно для выполнения вашего кода. Это инструмент отладки. Единственная важная часть — это `settings.configurablePath.pathToFile`.
Joseph avatar
флаг cn
Хорошо, я вижу, где путаница. Я думал, что мне нужно заменить часть `.pathToFile` в `settings.configurablePath.pathToFile` на что-то другое. Я вижу, что ты сейчас говоришь. Тем не менее, использование `settings.configurablePath.pathToFile` дает мне эту ошибку: `drupal.js?v=9.3.9:16 Uncaught TypeError: Cannot read properties of undefined (чтение 'pathToFile')`, потому что я не думаю, что в вашем например, pathToFile когда-либо передается в файл JS через вложение? Может из-за этого не работает?
Jaypan avatar
флаг de
Извините, `pathToFile` была опечаткой. Предполагается, что это `pathToPicture`. Я обновлю пост.
Joseph avatar
флаг cn
Я понял, спасибо за помощь. Я думаю, что я могу перепутать configurable_picture и configurablePicture во вложениях формы, но я не уверен. Последний вопрос о вашем коде; библиотека и настройки, которые вы прикрепляете к форме, попадают в buildForm, но как будет выглядеть submitForm? Мой pathToPicture не получает должной связи между формой и файлом JS
Jaypan avatar
флаг de
Я не понимаю вопроса. Библиотека прилагается - какое отношение это имеет к обработчику отправки?

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

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