Рейтинг:0

Как сделать так, чтобы ссылка на пользовательский модуль отображалась в /admin/config?

флаг cn

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

При просмотре admin/config/MYMODULE форма действительно отображается, просто ее не видно на странице /admin/config.

Вот моя файловая структура (за исключением ненужных файлов):

* Файл формы — это всего лишь пример формы, чтобы попытаться отобразить его на странице администратора.

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

МОЙ МОДУЛЬ.Настройки:
  путь: '/admin/config/system/MYMODULE'
  значения по умолчанию:
    _form: '\Drupal\MYMODULE\Form\myModuleSettingsForm'
    _title: 'Настройки моего модуля'
  требования:
    _permission: «администрирование конфигурации сайта»

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

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

МОЙ МОДУЛЬ.links.menu.yml

МОЙ МОДУЛЬ.Настройки:
  title: 'Настройки моего модуля'
  description: 'Изменить настройки myModule'
  имя_маршрута: MYMODULE.settings
  родитель: system.admin_config_system

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

дорожка:
  path_to_sound: '/modules/custom/MYMODULE/myModule.mp3'

myModuleSettingsForm.php

<?php

пространство имен Drupal\MYMODULE\Form;

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

/**
 * Настройте примерные параметры для этого сайта.
 */
класс myModuleSettingsForm расширяет ConfigFormBase {

  /**
   * Настройки конфигурации.
   *
   * @var строка
   */
  const SETTINGS = 'MYMODULE.settings';

  /**
   * {@inheritdoc}
   */
  публичная функция getFormId() {
    вернуть 'MYMODULE_admin_settings';
  }

  /**
   * {@inheritdoc}
   */
  защищенная функция getEditableConfigNames() {
    возвращаться [
      статический :: НАСТРОЙКИ,
    ];
  }

  /**
   * {@inheritdoc}
   */
  общедоступная функция buildForm (массив $ form, FormStateInterface $ form_state) {
    $config = $this->config(static::SETTINGS);

    $form['example_thing'] = [
      '#тип' => 'текстовое поле',
      '#title' => $this->t('Вещи'),
      '#default_value' => $config->get('example_thing'),
    ];

    вернуть parent::buildForm($form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
  публичная функция submitForm (массив и $ форма, FormStateInterface $ form_state) {
    // Получить конфигурацию.
    $this->configFactory->getEditable(static::SETTINGS)
      // Установите отправленный параметр конфигурации.
      ->set('example_thing', $form_state->getValue('example_thing'))
      // Вы можете установить сразу несколько конфигураций, сделав
      // несколько вызовов set().
      -> сохранить();

    родитель::submitForm($form, $form_state);
  }

}

Насколько я понимаю, теперь я должен видеть эту форму на странице конфигурации, но я этого не делаю, несмотря на очистку кеша и т. д.Я следовал документации, чтобы сделать это, и даже ссылался на другие популярные модули, поэтому я действительно не уверен, что делаю неправильно.

Рейтинг:0
флаг ne

Использовать родитель: system.admin_config для ссылки меню нужен маршрут, который имеет _controller: '\Drupal\system\Controller\SystemController::systemAdminMenuBlockPage' в качестве контролера. И только теперь вы можете добавлять детей в эту ссылку.

родитель: system.admin_config для создания новых тематических блоков. Хотя вы могли бы использовать родитель: system.admin_config_content, родитель: system.admin_config_system и т. д., чтобы добавить свою ссылку в существующий блок.

Так что либо переключатель родитель: system.admin_config к родитель: system.admin_config_content например в ваших ссылках Yaml и в вашем маршрутизации Yaml путь к путь: '/admin/config/content/MYMODULE' чтобы добавить свою ссылку в блок "Создание контента".

Или настройте файлы MYMODULE.routing.yml и MYMDOULE.links.menu.yml так, чтобы они выглядели так, как показано ниже, вместо этого создайте новый тематический блок и пусть ваша ссылка будет его дочерним элементом.

МОЙ МОДУЛЬ.routing.yml:

МОЙ МОДУЛЬ.Настройки:
  путь: '/admin/config/MYMODULE'
  значения по умолчанию:
    _controller: '\Drupal\system\Controller\SystemController::systemAdminMenuBlockPage'
    _title: 'МойМодуль'
  требования:
    _permission: 'доступ к административным страницам'

МОЙ МОДУЛЬ.example_thing:
  путь: '/admin/config/MYMODULE/пример-вещь'
    _form: '\Drupal\MYMODULE\Form\myModuleSettingsForm'
    _title: 'Пример'
  параметры:
    _admin_route: ИСТИНА
  требования:
    _permission: 'доступ к административным страницам'

МОЙ МОДУЛЬ.links.menu.yml

МОЙ МОДУЛЬ.Настройки:
  название: 'МойМодуль'
  имя_маршрута: MYMODULE.settings
  родитель: system.admin_config
  описание: «Настроить MyModule»
  вес: -10

МОЙ МОДУЛЬ.example_thing:
  title: 'Пример'
  родитель: MYMODULE.settings
  description: 'Пример конфигурации вещи'
  вес: 0
  имя_маршрута: MYMODULE.example_thing
Joseph avatar
флаг cn
Я понимаю и ценю этот ответ, спасибо. Тем не менее, я проверил добавление его в существующий блок, например, в систему, как вы сказали, и он все еще не появляется.
leymannx avatar
флаг ne
@Joseph â Если вы переключились на `parent: system.admin_config_system` в своих ссылках Yaml, переключитесь на `path: '/admin/config/system/MYMODULE'` в маршрутизации Yaml. Сбросьте кеш, конечно, и если это все еще не работает, просто взгляните на кодовую базу Drupal, особенно на все модули. Есть масса примеров того, как правильно разместить ссылку на странице /admin/config.Например https://git.drupalcode.org/project/drupal/-/blob/9.3.9/core/modules/system/system.routing.yml#L153-159 и https://git.drupalcode.org/ проект/drupal/-/blob/9.3.9/core/modules/system/system.links.menu.yml#L115-120.
Joseph avatar
флаг cn
Я отредактировал свой вопрос, чтобы изменить ссылки и файлы маршрутизации на то, что они есть сейчас, которые являются почти идентичными копиями того, как это делается в приведенных вами примерах, и он все равно не появится. Я что-то упустил, или есть что-то еще, что может помешать его работе?
No Sssweat avatar
флаг ua
«Есть ли что-то еще, что может помешать ему работать?» Можете ли вы воспроизвести проблему с модулем при новой установке Drupal, если нет, то да, что-то мешает работать должным образом @Joseph

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

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