it-swarm-ko.tech

MENU_CALLBACK에서 사용자 정의 템플릿로드

현재 상황은 다음과 같습니다. iframe을 통해 Drupal에로드되는 외부 인증 플랫폼이 있습니다. 사용자가 인증되면 외부 응용 프로그램은 다음을 사용하여 설정 한 Drupal 끝점으로 사용자를 리디렉션합니다.

function mymodule_menu() {

    $items['mymodule/oauth'] = array(
        'title' => 'My Module Receiver',
        'page callback' => 'mymodule_oauth',
        'access callback' => TRUE,
        'type' => MENU_CALLBACK,
        'file' => 'mymodule.pages.inc'
    );

    return $items;
}

그리고 내 콜백 :

function myapp_oauth() {

    // Does some stuff, authenticates the user, etc

    echo '
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<body>
<p>Please wait...</p>
<script type="text/javascript">
  // Check if we are in an iframe or not
  if (window.location.href != window.parent.location.href) {
    // Reload the parent page
    window.parent.location.reload();
  } else {
    // Not in an iframe, so go to the home page
    window.location.href = "' . base_path() . '";
  }
</script>
</body>
</html>
';
    exit;

}

이것은 이것을 처리하는 엄청나게 느슨한 방법처럼 보입니다. 응용 프로그램을 종료하지 않는 것이 좋으며 이상적 으로이 페이지의 테마 파일 대신로드 할 tpl 템플릿 파일을 정의하고 싶습니다. 누군가가 이것을 처리하는 더 좋은 방법을 추천 할 수 있습니까?

3
bhamrick

템플릿 파일을 사용하는 테마 함수를 정의한 다음 테마 함수를 사용하여 메뉴 콜백 출력에 사용할 수 있습니다.
다음은 Drupal 7)에 대한 코드 예입니다. Drupal 6에 비슷한 코드를 사용할 수 있습니다.

function mymodule_theme() {
  return array(
    'mymodule_oath' => array(
      'variables' => array('id' => NULL), // This is the list of the variables that will be passed to the template file. 
      'template' => 'mymodule_oath', // Change this to the template file name.
    ),
  );
}

function mymodule_oath() {
  // Does some stuff, authenticates the user, etc.

  print theme('mymodule_oath', array('id' => 10));
  return NULL;
}
3
kiamlaluno

메뉴 핸들러에서 false를 반환하면 Drupal은 page.tpl.php를 호출하지 않습니다.

그래서:

function myapp_oath() {
    // Echo your page here
    return false;
}

템플릿을 정의하는 방법은 사용중인 Drupal 버전이지만 약간 hook_theme()시작점으로 theme() .

1
Matthew Scharley