관리자 / 구성 페이지에 모듈을 추가하는 방법은 무엇입니까?


27

Drupal 7에서 모듈을 작업 중입니다. 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',
];

... 그리고 mymodule.info의 구성 줄 :

configure = admin/config/content/mymodule

MyModule에 대한 구성 링크가 이제 관리 / 모듈 페이지에 나타나지만 관리 / 구성 페이지 에 모듈을 나열하려면 어떻게해야 합니까? 아니면 관리자 / 구성 페이지가 핵심 모듈 전용으로 예약되어 있습니까?

답변:


9

admin / config에 대한 페이지 콜백 인 system_admin_config_page () 코드를 보면 다음 줄이 포함되어 있습니다.

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;
    }
    // ...
  }
  // ...
}

첫 번째 쿼리는 admin / config 경로와 연관된 메뉴의 menu_name 필드를 선택합니다. 기본적으로 관리입니다. 두 번째 쿼리는 menu_name에 동일한 값을 가지며 부모가 admin / config 인 모든 메뉴를 선택합니다.

메뉴가 menu_name에 다른 값을 사용하므로 두 번째 쿼리에서 선택되지 않으며 admin / config 페이지에 표시되지 않습니다.


24

이렇게하면 부모 항목에 대한 system.module 콜백을 사용하여 '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;
}

3
메뉴 변경 사항을 적용하려면 모듈을 비활성화 및 활성화해야합니다.
jevon

5
@jevon : (메뉴) 캐시를 지우면 변경 사항을 볼 수 있습니다.
Bart

메뉴 캐시는 명령 행에서 drush를 사용하여 지울 수 있습니다. drush cc menu-ref : drupal.stackexchange.com/a/58621/1082
therobyouknow


1

구성 페이지 에서도이 문제가 발생했습니다. 구성 페이지에 링크를 추가 할 수있는 유일한 방법은 'admin / config / module'에 상위 링크와 '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,
  ); 

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;

이것은 나를 위해 일했습니다.
나는 내가 $ items를 반환하지 않는다는 것을 깨달을 때까지 실제로 약 30 분 동안 고투하고 있었다.… 나는 항상 그렇게하는 것처럼 보인다.


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);
}

1
OP가 왜 모듈에 관리자 페이지에 모듈이 나열되어 있지 않은지 알 수 없으므로 질문에 대답하지 않습니다. 또한 코드 전용 답변은별로 도움이되지 않습니다. (코드를 확인하십시오 : 오타가 있습니다.)
kiamlaluno
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.