Рейтинг:0

Как создать модуль с настройками по умолчанию

флаг cn

У меня есть модуль, над которым я работаю, который ссылается на звуковой файл и воспроизводит его, когда что-то происходит. У меня это так, что в конфигурации администратора есть кнопка, чтобы установить путь к файлу по умолчанию, который является файлом, который поставляется с модулем. Кроме того, можно загрузить свой собственный файл, и он переключится на воспроизведение этого файла, когда это произойдет. Проблема в том, что модуль при новой установке ничего не делает, когда я хочу, чтобы этот звук по умолчанию звучал сразу после установки. Я попытался сделать это с файлом settings.yml, однако попытка получить доступ к этим данным возвращает значение null, пока я не войду в конфигурацию администратора и либо не установлю его по умолчанию, либо не загружу свой собственный файл.

Вот посмотрите на файлы:

МОЙ МОДУЛЬ.settings.yml

pathToSound: '/assets/sound.mp3'

МОЙМОДУЛЬ.schema.yml

МОЙ МОДУЛЬ.Настройки:
  тип: config_object
  label: 'Настройки MYMODULE'
  сопоставление:
    путь к звуку:
      тип: строка
      лейбл: 'Путь к звуку'

МОЙ МОДУЛЬ.модуль

<?php

используйте Drupal\Core\Form\FormStateInterface;

функция MYMODULE_page_attachments (массив и $ вложения) {
  $attachments['#attached']['library'][] = 'МОЙ МОДУЛЬ/МОЙ МОДУЛЬ';
  $attachments['#attached']['drupalSettings']['MYMODULE'] = [
  'pathToSound' => \Drupal::config('MYMODULE.settings')->get('pathToSound'),
  ];
}

МОЙМОДУЛЬ.js

/**
 * @файл
 */
(функция ($, Друпал) {
  'использовать строгий';

  Drupal.behaviors.MYMODULE = {
    /**
     * Поведение присоединения Drupal.
     */

    прикрепить: функция (контекст, настройки) {
      // Запускается, когда кеш очищается для воспроизведения звука.
      $('тело', контекст).once('МОЙ МОДУЛЬ').каждый(функция () {
        console.log(settings.MYMODULE.pathToSound);
        var sound = document.createElement('аудио');
        sound.setAttribute('src', settings.MYMODULE.pathToSound);
        звук.играть();
      });
    },
  };
  })(jQuery, Drupal, drupalSettings, один раз);

Я пытался исключить как можно больше нерелевантного кода. Во всяком случае, есть также форма, которая редактирует MYMODULE.settings «pathToSound», когда модуль настроен в меню администратора. Наконец, есть файл JS, который воспроизводит звук. Как я уже сказал, это работает после настройки в меню администратора, но не раньше. Мне интересно, прежде чем он будет настроен, pathToSound возвращает null, даже если он установлен в MYMODULE.settings. Буду признателен за любые идеи, спасибо!

РЕДАКТИРОВАТЬ: Скорректированный код в соответствии с предложениями, все еще не работает. Также добавлен JS, который запускает журнал консоли, который возвращает значение null.

4uk4 avatar
флаг cn
После того, как вы настроили модуль в меню администратора, вы можете экспортировать конфигурацию и использовать ее в качестве шаблона для конфигурации модуля по умолчанию. Я думаю, проблема в том, что файл yaml хранит значение на втором уровне, а вы извлекаете значение с первого уровня.
флаг ru
Вы поместили файл settings.yml в подпапку `config/install` вашего модуля?
apaderno avatar
флаг us
С этим объектом конфигурации код должен вызывать `\Drupal::config('myModule.settings')->get('path.pathToSound')`, чтобы получить значение *pathToSound*. Однако схема не будет соответствовать объекту конфигурации; это тоже надо менять. Также проверьте, что файл .settings.yml находится в правильном каталоге, как предложил @Hudri.
Joseph avatar
флаг cn
settings.yml находится в правильном каталоге, и я попытался изменить код и файл схемы, как предлагает @apaderno, но безрезультатно. Как мне экспортировать конфигурацию после настройки модуля, как предлагает 4uk4?
apaderno avatar
флаг us
После установки модуля изменение файла конфигурации или файла схемы не помогает. Модуль необходимо предварительно удалить; затем вы можете изменить эти файлы.
Рейтинг:2
флаг us

Схема конфигурации должна соответствовать файлу конфигурации. Например, следующие совпадают.

myModule.settings.yml

pathToSound: '/assets/sound.mp3'

моймодуль.схема.yml

флеш.настройки:
  тип: config_object
  label: "Сбросить настройки"
  сопоставление:
    путь к звуку:
      тип: строка
      лейбл: 'Путь к звуку'

В таком случае, \Drupal::config('myModule.settings')->get('pathToSound') вернул бы путь к звуку стоимость.

Для файла конфигурации, содержащего следующие строки, эта схема не будет работать.

дорожка:
  pathToSound: '/assets/sound.mp3'

Правильная схема будет следующая.

флеш.настройки:
  тип: config_object
  label: 'Сбросить настройки'
  сопоставление:
    дорожка:
      тип: отображение
      label: 'Настройки пути'
      сопоставление:
        путь к звуку:
          тип: строка
          label: 'Путь к звуку'

В таком случае, \Drupal::config('myModule.settings')->get('path.pathToSound') вернул бы путь к звуку стоимость.

Как примечание, изменение схемы конфигурации или файла конфигурации после установки модуля не помогает. Drupal уже загрузил значения по умолчанию из файла конфигурации и по-прежнему будет использовать предыдущую схему конфигурации.
Чтобы Drupal заметил, что оба файла были изменены, сначала необходимо удалить модуль, изменить файлы и переустановить модуль.

Joseph avatar
флаг cn
Спасибо. Обновлено снова, чтобы показать текущую схему и файлы настроек. Все еще не работает, но должно быть так, как вы предложили, чтобы это выглядело
Joseph avatar
флаг cn
Этот код действительно работает, раньше он не работал из-за внешней проблемы.

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

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