Comment ajouter un module à la page admin / config?

27

Je travaille sur un module dans Drupal 7. J'ai ajouté une implémentation hook_menu:

$items['admin/config/content/mymodule'] = [
  'title'            => 'MyModule',
  'description'      => 'Configure MyModule settings.',
  'page callback'    => 'mymodule_get_form',
  'page arguments'   => ['mymodule_admin_settings'],
  'file'             => 'mymodule.admin.inc',
  'access arguments' => ['administer mymodule'],
  'menu_name'        => 'mymodule',
];

... et une ligne de configuration vers mymodule.info:

configure = admin/config/content/mymodule

Un lien Configurer pour MyModule apparaît maintenant sur la page admin / modules , mais comment puis-je également afficher le module sur la page admin / config ? Ou la page admin / config est-elle réservée aux seuls modules principaux?

Matt V.
la source

Réponses:

9

En regardant le code de system_admin_config_page () , qui est le rappel de page pour admin / config, je remarque qu'il contient les lignes suivantes:

if ($admin = db_query("SELECT menu_name, mlid FROM {menu_links} WHERE link_path = 'admin/config' AND module = 'system'")->fetchAssoc()) {
  $result = db_query("
    SELECT m.*, ml.*
    FROM {menu_links} ml
    INNER JOIN {menu_router} m ON ml.router_path = m.path
    WHERE ml.link_path != 'admin/help' AND menu_name = :menu_name AND ml.plid = :mlid AND hidden = 0", $admin, array('fetch' => PDO::FETCH_ASSOC));
  foreach ($result as $item) {
    _menu_link_translate($item);
    if (!$item['access']) {
      continue;
    }
    // ...
  }
  // ...
}

La première requête sélectionne le champ nom_menu pour le menu associé au chemin admin / config, qui par défaut est la gestion; la deuxième requête sélectionne tous les menus qui ont la même valeur pour nom_menu et dont le parent est admin / config.

Comme votre menu utilise une valeur différente pour nom_menu, il n'est pas sélectionné dans la deuxième requête et il n'est pas affiché dans la page admin / config.

kiamlaluno
la source
24

Si vous le faites comme ça, avec le rappel system.module pour l'élément parent, vous obtenez la belle page de liste lorsque vous visitez 'admin / config / mymodule'

/**
 * Implements hook_menu().
 */
function MYMODULE_menu() {

  $items = [];

  $items['admin/config/mymodule'] = [
    'title'            => 'My configuration section',
    'description'      => 'This is the parent item',
    'position'         => 'left',
    'weight'           => -100,
    'page callback'    => 'system_admin_menu_block_page',
    'access arguments' => ['administer site configuration'],
    'file'             => 'system.admin.inc',
    'file path'        => drupal_get_path('module', 'system'),
  ];

  // Need at least one child item before your section will appear.
  $items['admin/config/mymodule/item'] = [
    'title'            => 'First item',
    'description'      => 'This is the first child item in the section',
    'page callback'    => 'mymodule_item_callback',
    'access arguments' => ['administer site configuration'],
  ];

  return $items;
}
wynz
la source
3
N'oubliez pas que vous devrez désactiver et activer le module pour que les modifications de menu prennent effet.
jevon
5
@jevon: l'effacement du cache (menu) est suffisant pour voir les changements.
Bart
le cache de menu peut être effacé en utilisant drush sur la ligne de commande en utilisant drush cc menu- ref: drupal.stackexchange.com/a/58621/1082
therobyouknow
3

Supprimez la partie 'nom_menu', qui n'est pas nécessaire.

Berdir
la source
1

J'ai également eu des problèmes avec cela sur la page de configuration. La seule façon d'ajouter le lien à la page de configuration était de déclarer deux éléments de menu comme ça, avec le lien parent dans 'admin / config / module' et un lien enfant dans 'admin / config / module / manage' .

  $items['admin/config/whh-maps'] = array(
    'title' => 'World Hiphop configuration',
    'description' => 'Allows administrators to configure maps for WHH.',
    'position' => 'left',
    'weight' => -30,
    'page callback' => 'drupal_get_form',
    'page arguments' => array('whh_maps_form'),
    'access arguments' => array('administer whh maps'),
    'file' => 'whh_maps.admin.inc',
  );
  $items['admin/config/whh-maps/manage'] = array(
    'title' => 'Manage countries',
    'description' => 'Allows admins to edit country information',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('whh_maps_form'),
    'access arguments' => array('administer whh maps'),
    'file' => 'whh_maps.admin.inc',
    'weight' => -10,
  ); 
chhay
la source
1
$items['admin/config/user-interface/mymodule'] = array(
    'title' => 'My Module',
    'description' => 'description',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('my_admin_function'),
    'access arguments' => array('administer site configuration'),
);

$items['admin/config/user-interface/mymodule/manage'] = array(
    'title' => 'My Module',
    'type' => MENU_DEFAULT_LOCAL_TASK,
    'description' => 'description',
    'weight' => -10,
);
return $items;

cela a fonctionné pour moi.
En fait, je luttais pendant environ une demi-heure jusqu'à ce que je réalise que je ne retournais pas $ articles ... J'ai toujours l'impression de faire ça.

2pha
la source
0
/**
 * Implements hook_menu().
 */
function notification_menu() {

  $items = [];

  $items['admin/customize'] = [
    'title'            => 'Send Comment notifications',
    'discription'      => 'Admin will send notification to user about updates',
    'type'             => MENU_NORMAL_ITEM,
    'page callback'    => 'drupal_get_form',
    'page arguments'   => ['notification_form'],
    'access arguments' => ['access adminstration page'],
    'access callback'  => TRUE,
  ];

  return $items;
}

/**
 * Custom form.
 */
function notification_form($form, &$form_state) {

  $form['send_mail_to'] = [
    '#title'         => 'Send Mail To',
    '#discription'   => 'To whom you want to send form',
    '#size'          => 40,
    '#type'          => 'textfield',
    '#required'      => TRUE,
    '#default_value' => variable_get('send_mail_to'),
  ];

  //here the admin can wite subject for the mail.
  $form['mail_subject'] = [
    '#title'         => 'Subject',
    '#discription'   => 'the purpous of this mail',
    '#type'          => 'textfield',
    '#size'          => 40,
    '#maxlenght'     => 120,
    '#required'      => TRUE,
    '#default_value' => variable_get('mail_subject'),
  ];

  $form['mail_body'] = [
    '#title'         => 'Body',
    '#discription'   => 'the body of your mail.',
    '#type'          => 'textarea',
    '#row'           => 10,
    '#columns'       => 40,
    '#required'      => TRUE,
    '#default_value' => variable_get('mail_body'),
  ];

  $form['mail_bcc'] = [
    '#title' => 'BCC this mail to all',
    '#type'  => 'checkbox',

  ];

  return system_settings_form($form);
}
Nikhil Anant
la source
1
Cela ne répond pas à la question, car il ne dit pas pourquoi l'OP ne voit pas son module répertorié dans la page d'administration; de plus, les réponses uniquement codées ne sont pas très utiles. (Vérifiez le code: vous avez des fautes de frappe.)
kiamlaluno