この回答によると、ページコンテンツを返すのではなく、メニューページコールバックでページコンテンツを印刷するだけで済みます。
Drupalのデータベースからデータを取得したり、PHPで生成したりするには、完全なレイアウトレンダリングなしでデータを出力するページコールバック(カスタムモジュール内)が必要です。これは、ページのコンテンツを返すのではなく、ページコールバックで直接印刷することで簡単に実行できます。
印刷モジュールはこのように印刷用ページを実装したと思います。以下は、モジュールのコードスニペットです。
function print_menu() {
$items = array();
$items[PRINT_PATH] = array(
'title' => 'Printer-friendly',
'page callback' => 'print_controller_html',
'access arguments' => array('access print'),
'type' => MENU_CALLBACK,
'file' => 'print.pages.inc',
);
........
}
/**
* Generate an HTML version of the printer-friendly page
*
* @see print_controller()
*/
function print_controller_html() {
$args = func_get_args();
$path = filter_xss(implode('/', $args));
$cid = isset($_GET['comment']) ? (int)$_GET['comment'] : NULL;
// Handle the query
$query = $_GET;
unset($query['q']);
$print = print_controller($path, $query, $cid, PRINT_HTML_FORMAT);
if ($print !== FALSE) {
$node = $print['node'];
$html = theme('print', array('print' => $print, 'type' => PRINT_HTML_FORMAT, 'node' => $node));
drupal_add_http_header('Content-Type', 'text/html; charset=utf-8');
drupal_send_headers();
print $html;
......
}
これによると、モジュールはカスタムHTMLテンプレートを使用しますprint.tpl.php
。HTMLレベルのテンプレートです。次に、モジュールはを使用してHTMLを取得し、theme('print',...)
を使用してブラウザに直接レンダリングしますprint $html;
。
ここにあなたの目的のための一般的なアイデアがあります:mymodule.module
/**
* Implements hook_menu().
*/
function mymodule_menu() {
$items = array();
$items['mylogin'] = array(
'title' => 'Custom Login Page',
'page callback' => 'mymodule_custom_login_page',
'type' => MENU_CALLBACK,
'access callback' => TRUE,
);
return $items;
}
/**
* Implements hook_theme().
*/
function mymodule_theme() {
return array(
'mylogin' => array(
'variables' => array('page' => array()),
'template' => 'mylogin', // mylogin.tpl.php in your module folder
),
);
}
/**
* Generate a custom login page
* @see more in print_controller_html() in print.pages.inc of the Print module
*/
function mymodule_custom_login_page(){
$page = _mymodule_login_page_prerequisite(); // get/prepare necessary variables, js, css for the page
$page['form'] = drupal_render(drupal_get_form('user_login')); // get login form
// prepare html in mylogin.tpl.php
// See more in print.tpl.php() in the Print module
$html = theme('mylogin', array('page' => $page));
drupal_add_http_header('Content-Type', 'text/html; charset=utf-8');
drupal_send_headers();
print $html; // cease Drupal page rendering and render directly to the browser
}
/**
* Prepare the array for the template with common details
* @see more _print_var_generator() in print.pages.inc of the Print module
*/
function _mymodule_login_page_prerequisite(){
global $base_url, $language;
$page = array();
$page['language'] = $language->language;
$page['head'] = drupal_get_html_head();
$page['title'] = '';
$page['scripts'] = drupal_get_js();
$page['favicon'] = '';
// if there is a custom css file for this page
// drupal_add_css(drupal_get_path('module', 'mymodule') . '/css/mylogin.css');
$page['css'] = drupal_get_css();
$page['message'] = drupal_get_messages();
$page['footer_scripts'] = drupal_get_js('footer');
return $page;
}
テンプレート:mylogin.tpl.php
<?php
/**
* @file
* Custom login page template
*
* @ingroup page
*/
?>
<!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" lang="<?php print $page['language']; ?>" xml:lang="<?php print $page['language']; ?>">
<head>
<?php print $page['head']; ?>
<title><?php print $page['title']; ?></title>
<?php print $page['scripts']; ?>
<?php print $page['favicon']; ?>
<?php print $page['css']; ?>
</head>
<body>
<h3>This is custom login page.</h3>
<?php
if (!empty($page['message'])):
foreach($page['message'] as $type => $message):
?>
<div class="messages <?php print $type; ?>">
<ul>
<?php foreach($message as $msg): ?>
<li><?php print $msg; ?></li>
<?php endforeach; ?>
</ul>
</div>
<?php
endforeach;
endif; ?>
<div><?php print $page['form']; ?></div>
<?php print $page['footer_scripts']; ?>
</body>
</html>
これにより、必要に応じてログインページがカスタマイズされます。
hook_menu_alter()
に変更するのに使用できると思います。画面に何をレンダリングするかを完全に制御できるはずですが、適切なヘッダーを自分で設定する必要がありますdelivery callback
drupal_deliver_html_page()