web-dev-qa-db-ja.com

$ contentのみを表示するページ(ヘッダー、フッター、サイドバーなし)

$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

2
Serjas

最後に見つかった解決策

/**
 * 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);
    }
  }
}
0
Serjas

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

4
webkenny

Colorbox Node を使用すると、Drupal ajaxフレームワークを介してカラーボックスモーダルにメニューコールバックのコンテンツのみをロードでき、ケースでうまく機能します。

リンクを手動で作成する場合、リンクに「colorbox-node」クラスを追加する必要があります。これが唯一必要なクラスであり、モジュールはカラーボックスのロードを内部的に処理します。リンクは次のようになります:<a class="colorbox-node" href="blogs/my-example?width=600&height=600">My Example</a>

4

質問の更新に従って、アクティブなテーマにコピーするのではなく、モジュールを使用して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; ?>
3
Citricguy

これは長い答えになるでしょうが、私はあなたのモジュールを読み、あなたが何をしようとしているのか理解しました。ここに行く(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 モジュールを使用して同じ概念を実現できます。

ご質問はお気軽にどうぞ。これらは実装するのが簡単な答えではないことを知っています。笑しかし、質問は簡単な質問ではありませんでした;-)

3
ericduran

同じフックMODULENAME_preprocess_pageを使用できると思いますが、hook_themeを使用してテンプレートファイルを登録する必要があります 詳細はこちら

私は前にそれをしていませんが、それはそのように機能すると思います。クイック検索で this が返され、役立つ場合があります。

1
Jonathan Hindi

答えに追加するだけです。 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;
}
0
Gael Lafond