3

私は、すべてがお互いを認識し、情報を渡す必要があるブロックの形で広告ユニットを管理するモジュールを構築しています。

したがって、ページで使用されるすべてのブロックのリストを取得するための単純なフックまたは他の関数を見つける必要があります。これにより、ページ上の広告ユニットのリスト全体を確実に知ることができます。

hook_block_list_alter()を試しましたが、これにより、Drupalインストールに存在するブロックのリスト全体が返され、このページで実際にレンダリングされるブロックとされないブロックが指定されていないようです。

だから、今私は何をしますか?

4

3 に答える 3

5

注文が呼ばれることと関係があると思いますが、hook_block_list_alter()完全にはわかりません。いずれにせよ、次のコードは、現在のページコンテキストのすべてのブロックのリストを取得します。これを関数に入れないように注意してください。そうしないとhook_block_list_alter()、無限のネストによって例外が発生します。

global $theme;
$all_regions = system_region_list($theme);
$blocks = array();
foreach (array_keys($all_regions) as $region) {
  $blocks += block_list($region);
}

特定の領域のブロックのみが必要な場合は、上記のコードのほとんどを捨てて、次のようにすることができます。

$blocks = block_list('region_name');
于 2011-12-30T01:32:22.747 に答える
3

を呼び出すときに同じ問題に遭遇しましたblock_list('content')。この関数のコードを見ると、他の 2 つの関数_block_load_blocks()_block_render_blocks(). この問題は_block_render_blocks()、表示テキストがコンテンツ オブジェクトに追加されていないために発生しているようです。これは、関数を通過する他のブロック オブジェクトとは異なります。

これを回避するために、 を呼び出す代わりに、block_list()直接_block_load_blocks()呼び出しました。_block_render_blocks()これは、呼び出しをバイパスして、地域ごとにグループ化されたブロックの配列を返します。これで、コンテンツ テキストが消えることなく、コンテンツ領域内のブロックをチェックできます。ハザール!

于 2012-11-17T19:02:35.310 に答える
1

アドサーバー (DFP) を実装する際にも同様の要件がありました。私の解決策は、配列をグローバル変数として定義し、配列に新しい要素を追加する各広告ユニット ブロックに PHP コードを含めることでした。

次に、ページ上のすべてのブロックが実行されたら、グローバル変数にアクセスして、どの広告ブロックが呼び出されたかを確認できます。呼び出されるブロックのリストを作成するコードは各ブロックの一部であるため、ブロックが領域、パネル、またはその他の場所に表示されるかどうかは問題ではありません。

私の場合、この情報を使用して、<head>配置されているブロックから追加ユニットのみを参照するスクリプトをセクションに追加したかったのです。私の完全な解決策は次のとおりです。

1) フック init を実装して、表示されているブロックに関する情報を格納するグローバル変数を作成します (このコードを含むカスタム モジュールを作成する必要があります)。

YOURMODULE_custom_init() {
  $GLOBALS['dfp-ads'] = array();
}

2) コア php モジュールを有効にします

3) 各広告ブロックの末尾に php コードを追加して、手順 1 で作成した配列に行を追加します。

<?php
   $GLOBALS['dfp-ads']['AD_OR_BLOCK_NAME_GOES_HERE']="AD SPECIFIC SCRIPT GOES HERE";
?>

<head>4) template.php ファイルに THEME_preprocess_html を実装して、グローバル変数にアクセスし、スクリプトを作成し、drupal_add_html_head を呼び出してセクションにスクリプトを追加します。

function YOURTHEME_preprocess_html(&$vars) {
   $inline_script = LOGIC TO ACCESS $GLOBALS['dfp-ads'] AND BUILD SCRIPT GOES HERE;
   $element = array(
      '#type' => 'markup',
      '#markup' => $inline_script,
   );

   drupal_add_html_head($element, 'google-dfp');
}

あなたの説明から、ヘッド セクションの JavaScript を作成するために広告ブロックのリストは必要なく、その情報を使用してブロック自体の内容を変更したいと思われます。

その場合、THEME_preprocess_html の代わりに、hook_page_alter(&page)を試すことができ ます。そのフックの API ページには、個々の「ブロックは、リージョン内のモジュール/デルタ ペアによって参照される可能性がある」と記載されています。

// The login block in the first sidebar region.
$page['sidebar_first']['user_login']['#block'];

それが誰かを助けることを願っています!

于 2014-12-27T12:08:08.293 に答える