コードでレンダリングしたブロックのコンテキストリンクをレンダリングするにはどうすればよいですか?


11

ブロックサブジェクトとコンテンツを読み込んで、それらをレンダリングするためにmodule_invoke()使用render()しました。このブロックにコンテキストリンクを使用したい。どうすればレンダリングできますか?

これは、page--front.tpl.phpテンプレートと一緒に使用しているコードです。

$block = module_invoke('block', 'block_view', '4);
print render($block);

代わりにどのコードを使用する必要がありますか?

回答:


16
$block = block_load('module', 'delta');
print drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));

これを実現するには、ブロックモジュール(_ *())のプライベート関数を使用する必要があります。


したがって、OPの例では次のようになります。$ block = block_load( 'block'、 '4');
キャメロン

12

バートの答えは厳格な標準の警告を出します(PHP 5.4ではデフォルトで有効になっています)。これを修正するには、レンダリング可能な配列の中間変数を使用します。

$block = block_load('module', 'delta');
$renderable_array = _block_get_renderable_array(_block_render_blocks(array($block)));
print drupal_render($renderable_array);

警告が発生する理由は、drupal_render関数がそのパラメーターが参照であると想定しているためです。署名ありdrupal_render(&$elements)ます。詳細については、この同様の質問への回答を参照してください。


2

コンテキストリンクは役に立ち、実装が非常に簡単です。ユースケースでは、hook_block_view_alter()#contextual_linksアイテムをニーズに合わせて変更するように実装する必要があります。これらの参照はあなたを助けるでしょう:

GL :)


1
OPの意味は、プログラムでブロックを表示しますが、コンテキストリンクは追加されないということです。
バート
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.