web-dev-qa-db-ja.com

現在のノードのコンテンツを取得するブロックを作成するにはどうすればよいですか?

わかりました、Drupal 8のブロックにはこれらの「コンテキスト」と呼ばれるものがあり、コアがきめ細かくキャッシュをクリアできるようにします。それらがどのように機能するかについての適切な説明は見つかりません。 、またはそれらからページ変数を取得する方法など。

私の目標は、現在のノードのフィールドまたは表示モードをブロックコンテンツにレンダリングするブロックタイプを用意することです。現在のノードを取得する方法を他の場所で確認しましたが、キャッシュコンテキストにフィードバックする方法を完全には理解していません。私はレンダー配列の#cacheが存在することを知っていますが、ContextAwarePluginInterfaceからの多くのメソッドがあり、それらが何をするのかわかりません。不足しているドキュメントはありますか?

7
Libertardian

完全に異なる2種類のコンテキストがあります。

これとは何の関係もないキャッシュコンテキスト。それらは何かを無効にするためには使用されませんが、何かによって異なります(たとえば、ユーザー権限ごとに異なるキャッシュ)。キャッシュタグは無効化のためのものです。

つまり、プラグインコンテキストです。そして、はい、ブロックはしばらくの間それらを使用できます(それらは常に使用できましたが、block.moduleはそれを適切にサポートしていませんでした)。 @larowlanが言ったように、コアはそれらを主に可視条件に使用しますが、ブロックに対しても同じように機能します。

あなたが見ることができるそのような1つの例は、 NodeType条件 です。あなたがする必要があるのは、コンテキストアノテーションを追加することです、そしてそれを$this->getContextValue('node')として使うことができます。これの利点は、ブロックがより柔軟になり、ノードがどこから来ているかを正確に知る必要がないことです。それは、ユーザーがノードを構成すること次第です。

選択するノードが実際に複数ない限り、これは現在UIに表示されないことに注意してください。

9
Berdir

ノードをブロックで使用するには、コンテキストを使用します。たとえば、次のブロックは、現在のノードを編集および削除するためのリンクを表示します。

/**
 * @file
 * Contains \Drupal\my_module\Plugin\Block\NodeMenuBlock.
 */

namespace Drupal\my_module\Plugin\Block;

use Drupal\Core\Block\BlockBase;
use Drupal\Core\Link;
use Drupal\Core\Url;

/**
 * @Block(
 *   id = "node_menu_block",
 *   admin_label = @Translation("Node Menu Block"),
 *   category = @Translation("My Group"),
 *   context = {
 *     "node" = @ContextDefinition(
 *       "entity:node",
 *       label = @Translation("Current Node")
 *     )
 *   }
 * )
 */
class NodeMenuBlock extends BlockBase {
  /**
   * {@inheritdoc}
   */
  public function build() {
    $node = $this->getContextValue('node');
    $nid_fld = $node->nid->getValue();
    $nid = $nid_fld[0]['value'];

    $markup = '';
    $links = ['entity.node.edit_form' => 'Edit', 'entity.node.delete_form' => 'Delete', ];
    foreach($links as $rout=>$text) {
      $url = Url::fromRoute($rout, array('node' => $nid));
      $link = Link::fromTextAndUrl(t($text), $url)->toRenderable();
      $link['#attributes'] = array('class' => array('button', 'button-action'));
      $markup .= render($link).' ';
    }

    $block = [
      '#type' => 'markup',
      '#markup' => $markup,
    ];
    return $block;
  }

}
8
Verter

コンテキスト認識プラグインは主にブロックの可視性条件で使用されます。たとえば、現在のノードをとるノードの状態を確認します。ブロック自体がこれにフックできるかどうかはわかりません。確かに、ルート一致サービスを使用して、存在する場合は、そこから現在のノードを取得できると言えます。

1
larowlan

Blockノードのcontribモジュールをチェックしてください: https://www.drupal.org/project/block_node

前書き

このモジュールは、現在のノードまたは指定されたノードを特定のビューモードで表示できるブロックを提供します。

可能な用途

ティーザービューモードを使用してサイドバー領域に特定のノードを表示したい。現在のノードのエンティティ参照フィールドで参照されているティーザーノードのリストを表示したい。

Installation

通常どおり、理想的にはcomposerを使用してインストールします。モジュールを有効にします。

構成

通常のブロックの配置と同じように、ブロックレイアウトページを使用してブロックを配置します。

構成オプション:

現在のノードを使用

  • チェックすると、ブロックがノードページに配置されている場合、現在のノードがブロックに表示されます。

表示するノード

  • 表示するノードを検索します。選択すると、このノードがブロックに表示されます。

表示モード

  • 利用可能なオプションから表示モードを選択します。ブロックに表示されるノードは、このビューモードで表示されます。
  • その他の設定は標準ブロック設定です。
0
tekNorah