$content
のみを表示するページを表示したかった。私のテーマ内のtemplate.phpでこのコードを使用すると、出力が正常に取得されました。
function THEMENAME_preprocess_page(&$vars) {
if (isset($_GET['ajax']) && $_GET['ajax'] == '1') {
$vars['template_file'] = 'page-ajax';
}
}
Page-ajax.tpl.phpでは、次のコードを使用しました。
<?php
echo $content
?>
とにかくカスタムモジュールを使用して同じことを達成することはありますか?
私はあなたがすべて私の質問を誤解していると思います、私は$ contentだけでpage.tplをオーバーライドしたいのですが、hook_themeを使用してtplを作成する方法ではありません!現在、モジュールで同じコードを使用していますが、問題は、page-ajax.tplをアクティブなテーマディレクトリに手動でコピーする必要があることです。私が作成したモジュールを参照できます http://drupal.org/project/ajax_links_api
最後に見つかった解決策
/**
* Implements hook_theme_registry_alter().
*/
function MODULE_theme_registry_alter(&$theme_registry) {
// get tpl path in my custom module.
$mod_path = drupal_get_path('module', 'MODULE') . '/tpl';
$theme_registry_copy = $theme_registry; // Munge on a copy.
_theme_process_registry($theme_registry_copy, 'phptemplate', 'theme_engine', 'pow', $mod_path);
$theme_registry += array_diff_key($theme_registry_copy, $theme_registry);
$hooks = array('page');
foreach ($hooks as $h) {
if (is_array($theme_registry[$h]['theme path'])) {
$first_element = array_shift($theme_registry[$h]['theme path']);
array_unshift($theme_registry[$h]['theme path'], $first_element, $mod_path);
}
}
}
Drupalは、他の場所で定義されたフックを見つけて使用するために、関数呼び出しスタックをたどります。したがって、THEMENAME_preprocess_page()が機能するのとほぼ同じように、MODULENAME_preprocess_pageも機能します。これらのプリプロセス関数が呼び出される特定の順序については、 http://drupal.org/node/2234 を参照してください。
さて、テンプレートの設定については。 http://api.drupal.org/api/function/hook_theme を使用して定義します-ブロックモジュールの例として:
function block_theme() {
return array(
'block' => array(
'render element' => 'elements',
'template' => 'block',
), // Omitted remainder.
'template'属性に注目してください。これはblock.tpl.phpにマッピングされます。したがって、以下を想定します。
function myModuleName_theme() {
return array(
'my_themehook_special' => array(
//notice I am setting this up to look for the file in a subdirectory of the module
'template' => 'moduleSubdirectory/filenameOfTemplate',
'arguments' => array('yourArgumentObject' => null),
)
);
}
これでテンプレートが登録されます。詳細については、このブログ投稿を確認してください: http://www.trevorsimonton.com/blog/tplphp-hooktheme-drupal-variable-template-module
Colorbox Node を使用すると、Drupal ajaxフレームワークを介してカラーボックスモーダルにメニューコールバックのコンテンツのみをロードでき、ケースでうまく機能します。
リンクを手動で作成する場合、リンクに「colorbox-node」クラスを追加する必要があります。これが唯一必要なクラスであり、モジュールはカラーボックスのロードを内部的に処理します。リンクは次のようになります:
<a class="colorbox-node" href="blogs/my-example?width=600&height=600">My Example</a>
質問の更新に従って、アクティブなテーマにコピーするのではなく、モジュールを使用してpage-ajax.tpl.phpを含めたい場合は、以下を実行できます。
.module内の関数がパスを追加するので、Drupalはテンプレートの検索場所を認識しています。
/**
* Implements hook_theme()
*/
function MODULE_theme() {
return array(
'popup' => array(
'arguments' => array('content' => null), //Array of variables in page-ajax.tpl.php
'template' => 'ajax',
'path' => drupal_get_path('module', 'MODULE') .'/theme',
),
);
}
MODULE/theme/popup.tpl.phpファイルのコンテンツ
<?php echo $content; ?>
これは長い答えになるでしょうが、私はあなたのモジュールを読み、あなたが何をしようとしているのか理解しました。ここに行く(FYI、私は以前にこれをやったことがある):
あなたがしようとしていることは、テーマ関数やhook_preprocess_page()で行われるべきではありません。注目すべきは、いわゆる「配信コールバック」の実装です。 AJAXを介してリンクを返したい場合は、リンクがクエリ文字列に基づいているかどうかは関係ありません。
あなたは本当に次のようなことをするべきです:
/**
* Implements hook_page_delivery_callback_alter().
*/
function hook_page_delivery_callback_alter(&$callback) {
// jQuery sets a HTTP_X_REQUESTED_WITH header of 'XMLHttpRequest'.
// If a page would normally be delivered as an html page, and it is called
// from an ?ajax Javascript lets render it as ajax_deliver.
if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' &&
$callback == 'drupal_deliver_html_page'
&& $_GET['ajax'] == '1') {
// Here we change the callback. Now In my example I'm using ajax_deliver
// but if needed can create your own. That being said ajax_deliver should
// be more than enough.
$callback = 'ajax_deliver';
}
}
なんらかの理由で、返されるコンテンツを変更する必要がある場合は、次のようにhook_ajax_render_alter()を使用して実際にそれを実現できます。
function ugc_ajax_render_alter(&$commands) {
if ($_GET['ajax'] == '1') {
// Add my special ajax commands to render the data how I want.
}
}
ただし、コンテンツを置き換えるだけの場合は、「ajax_command_html」という単純なajaxコマンドが機能するはずです。これは、JavaScriptで実行しているためです。
また、JavaScriptファイルに関するコメントもあります。 $ .ajaxリクエストを自分で行う必要はありません。
代わりに、リンクにクラスを追加するだけで、全体を簡単に簡略化できます。 use-ajaxクラスが機能するのと同じ方法。したがって、あなたの場合は http://drupalcode.org/project/drupal.git/blob/refs/heads/7.x:/misc/ajax.js#l4 の例を見ることができますAJAXリクエストを生成する方法の例です。JavaScriptをそのように動作するように変更した場合、Drupal Ajaxなので、実際にはコールバックを記述する必要はありません。フレームワークは、返されるajax_commandsを処理し、要求に応じてセレクターがコンテンツに置き換えられます。
これがお役に立てば幸いです。たくさんあることは承知していますが、ドキュメント Drupal 7 AJAX Framework を読んで、AJAXリクエストとDrupal。Drupal 6を読むと、 Ctools モジュールを使用して同じ概念を実現できます。
ご質問はお気軽にどうぞ。これらは実装するのが簡単な答えではないことを知っています。笑しかし、質問は簡単な質問ではありませんでした;-)
答えに追加するだけです。 Drupalテンプレートエンジンを経由せずにノードコンテンツ(または任意のコンテンツ)を出力することだけが必要な場合は、はるかに簡単な方法があります。
function <MODULE_NAME>_menu() {
$items = array();
$items['some_path/%node'] = array(
'page callback' => '_output_content', // Name of the function to call
'page arguments' => array(1),
'access callback' => 'node_access',
'access arguments' => array('view', 1)
);
return $items;
}
function _output_content($node) {
$node_view = node_view($node);
print drupal_render($node_view);
exit;
}
注:「<MODULE_NAME>」をモジュール名に置き換え、「some_path」をサービスで使用するパスに置き換えます(これは http:// <YOUR_DRUPAL_SITE>/some_path/1234で確認できます )、コールバック関数の適切な名前を選択します。「_ output_content」よりも優れた名前で、他のモジュールと競合する可能性が低くなります。モジュール名を接頭辞として使用することをお勧めします。
任意のテキストコンテンツを出力することもできます。
function _output_content($node) {
print('Hello');
exit;
}
または出力JSON:
function _output_content($node) {
drupal_json_output(array(
'key' => 'value'
));
exit;
}