it-swarm-ko.tech

hook_menu ()를 어떻게 구현해야합니까?

hook_menu() 구현의 기본 원리는 무엇입니까?

나는 똑같지 만 다른 질문에 반복해서 대답하지 않기 위해 단일 질문으로 기본 사항을 다루고 싶습니다.

102
Letharion

이 정보는 Drupal 6 및 7에 유효합니다. Drupal 8, hook_menu() 로 대체되었습니다. 신규 라우팅 시스템 아래에서 우리는 간단한 세 단계로 hook_menu()을 구현합니다.

1 단계

빈 모듈을 만드는 방법 의 지침에 따라 빈 모듈을 만듭니다. 여기에 표시된 코드에서는 모듈 이름이 helloworld 라고 가정합니다.

2 단계

다음 코드를 모듈 파일에 추가하십시오.

/**
 * Implements hook_menu().
 */
function helloworld_menu() {
  $items['hello'] = array(
    'title' => 'Hello world!',
    'page callback' => 'helloworld_page',
    'access callback' => TRUE,
  );

  return $items;
}

/**
 * Page callback for /hello.
 */
function helloworld_page() {
  return 'Hello world!';
}

3 단계

모듈을 활성화하고 http://example.com/hello 를 방문하십시오. (example.com을 서버의 도메인 이름으로 바꾸십시오.)
"Hello world!"메시지가 표시되어야합니다. 그게 다야! 완전히 작동하는 hook_menu() 구현이 있습니다. 다음은 hook_menu()에 관한 다양한 고급 주제입니다. 특히, 위의 페이지는 누구나 볼 수 있으므로 권한에 대해 읽으려고 할 수 있습니다.

인수

더 많은 데이터를 페이지 콜백에 전달하려는 경우 페이지 인수를 사용하여이를 달성 할 수 있습니다. 페이지 인수는 페이지 콜백에 전달할 인수 배열이어야합니다. 정수가 인수로 사용되면 0부터 시작하여 슬래시 (/)마다 한 번씩 증가하는 URL의 일부를 나타냅니다. 다음 예에서 이는 0이 'hello'로 바뀐다는 의미입니다.

function helloworld_menu() {
  $items['hello'] = array(
    'page callback' => 'helloworld_page',
    'page arguments' => array(0),
  );

  return $items;
}

function helloworld_page($argument1) {
  return $argument1;
}

문자열은 그대로 전송되므로 array(0, 'world')을 (를) 다시 사용하여 hello world를 다시 가져올 수 있습니다.

function helloworld_page($argument1, $argument2) {
  return $argument1 . ' ' . $argument2;
}

"와일드 카드"를 사용하여 URL에서 임의의 데이터를 승인 할 수 있습니다.

function helloworld_menu() {
  $items['hello/%'] = array(
    'page callback' => 'helloworld_page',
    'page arguments' => array(1),
  );

  return $items;
}

function helloworld_page($argument1) {
  return $argument1;
}

Hello/world를 방문하면 $argument1world와 같습니다.

인수 자동 로딩

종종 URL 인수는 예를 들어 엔티티를 식별하는 숫자입니다. 이 ID를 해당 객체로 변환하는 코드 복제를 피하기 위해 Drupal "명명 된"와일드 카드에 대한 자동로드를 지원합니다. 명명 된 와일드 카드를 사용하는 경우 Drupal 와일드 카드와 이름이 같은 함수의 경우 _load로 접미사가 붙습니다. 이러한 함수를 찾으면 URL의 값으로 호출되며 로더 함수가 반환하는 것은 Drupal에는 이미 노드를로드하는 기능인 node_load() 이 있기 때문에 다음과 같이 할 수 있습니다. 노드가 자동로드되어 페이지 콜백으로 전달됩니다.

function helloworld_menu() {
  $items['hello/%node'] = array(
    'page callback' => 'helloworld_page',
    'page arguments' => array(1),
  );

  return $items;
}

function helloworld_page($node) {
  return t('Hello node (ID = !nid)', array('!nid' => $node->nid));
}

고급 자동 로딩

때로는 둘 이상의 인수를 기반으로 더 많은 것을 자동으로로드해야 할 수도 있습니다. 명명 된 인수 만 기본적으로 로더에 전달되므로, 명시 적으로 Drupal 어떤 추가로드 인수가 로더에 전달되어야하는지 알려야합니다. 노드의 경우 node_load()에 노드 ID와 개정 ID를 전달해야하며, 다음 코드를 통해 수행 할 수 있습니다.

function helloworld_menu() {
  $items['hello/%node/revision/%'] = array(
    'page callback' => 'helloworld_page',
    'page arguments' => array(1),
    'load arguments' => array(3),
  );

  return $items;
}

function helloworld_page($node) {
  return t('Hello node (ID = !nid, revision ID = !rid)', array('!nid' => $node->nid, '!rid' => $node->vid));
}

권한

'access callback' => TRUE,는 위의 간단한 예제를 전혀 볼 수 없게 만드는 데 필요하지만 제어 할 수 없으므로 이상적이지 않습니다./hello를 방문하려는 사람에게는 액세스 권한이 부여됩니다. 제어 수단을 제공하는 가장 쉬운 방법은 위의 페이지 콜백과 마찬가지로 액세스 콜백을 제공하는 것입니다. 다음 코드는 여전히 모든 사람에게 액세스를 허용하지만 액세스 시간에 호출 된 함수로 로직을 이동하여 더 복잡한 로직을 허용하는 방법을 보여줍니다.

/**
 * Implements hook_menu().
 */
function helloworld_menu() {
  $items['hello'] = array(
    'page callback' => 'helloworld_page',
    'access callback' => 'helloworld_access',
  );

  return $items;
}

/**
 * Access callback for /hello.
 */
function helloworld_access() {
  return TRUE;
}

사용자 정의 함수를 사용하면 코드가 불필요하게 복제되기 때문에 이것이 반드시 최선의 방법은 아닙니다. 더 좋은 방법은 대부분 user_access() 을 사용하는 것입니다. 액세스 콜백과 함께 액세스 인수를 설정할 수 있습니다. 다음 코드를 사용하여 액세스 사용자 프로필 권한이있는 사용자가 페이지를 볼 수 있도록 요구할 수 있습니다.

/**
 * Implements hook_menu().
 */
function helloworld_menu() {
  $items['hello'] = array(
    'page callback' => 'helloworld_page',
    'access callback' => 'user_access',
    'access arguments' => array('access user profiles'),
  );

  return $items;
}

액세스 콜백은 기본적으로 user_access이므로 위 코드와 같이 생략 할 수 있습니다.

더 고급 주제

공식 hook_menu() 설명서는 가장 복잡한 사용 사례에 대한 자세한 정보를 제공합니다.

147
Letharion