How to get the context node in a custom block inside a views list? I have a view which displays all pictures of the content type photo.
I've set some fields in this view for the display.

This is how iIrender the list of pictures: 

views-view-fields--photo.html

&lt;figure class="element-item {{ fields['name'].content|lower }}"&gt;
    &lt;a href="{{ fields['field_photo_1'].content|lower }}"&gt;
        &lt;img src="{{ fields['field_photo'].content }}"/&gt;
    &lt;/a&gt;
    &lt;figcaption&gt;
        &lt;div class="date"&gt;{{ fields['field_date'].content }}&lt;/div&gt;
        &lt;div class="lieu"&gt;{{ fields['field_lieu'].content }}&lt;/div&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
{{ drupal_block('comment_block') }}


I use the Twig tweak module to render a custom block in this template. This block should load all comments for the picture. For that, I need to pass the nid of the node to my block.

Here's the code of the block:

CommentBlock.php

/**
 * Provides a 'CommentBlock' block.
 *
 * @Block(
 *  id = "comment_block",
 *  admin_label = @Translation("Comment block"),
 *  context = {
 *    "node" = @ContextDefinition("entity:node", label = @Translation("Node"))
 *  }
 * )
 */
class CommentBlock extends BlockBase implements ContainerFactoryPluginInterface {

  /**
   * Drupal\Core\Entity\EntityTypeManagerInterface definition.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * Constructs a new CommentBlock object.
   *
   * @param array $configuration
   *   A configuration array containing information about the plugin instance.
   * @param string $plugin_id
   *   The plugin_id for the plugin instance.
   * @param string $plugin_definition
   *   The plugin implementation definition.
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    $this-&gt;entityTypeManager = $entity_type_manager;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container-&gt;get('entity_type.manager')
    );
  }

  /**
   * {@inheritdoc}
   */
  public function build() {

    $build = [];

    $node = $this-&gt;getContextValue('node');
    kint($node-&gt;id());

    $build['#theme'] = 'comment_ajax';

    return $build;
  }

}


What I try is to get the context of the views row into my block. But I get this error:


Drupal\Component\Plugin\Exception\ContextException : Required contexts without a value: node



What am I doing wrong?

I can load my block from template_preprocess_views_view_fields() to link with the nid but I try to understand the context annotation.



Update

Here's a picture of the view, my custom block returns just a link name "Comment".





I now load the block programmatically instead of using drupal_block in the preprocess.

$block             = \Drupal\block\Entity\Block::load('commentblock');
$variables['test'] = \Drupal::entityTypeManager()
  -&gt;getViewBuilder('block')
  -&gt;view($block);


Then I print this block in views-view-fields.html.twig:

{{ fields['title'].content }}
{{ test }}


If I kint the context in my block I still get an error except if I set the annotation required = FALSE.

 *   context = {
 *     "node" = @ContextDefinition(
 *       "entity:node",
 *       label = @Translation("Current Node"),
 *       required = FALSE,
 *     )
 *   }


But the context is still empty.
When placing the block you have to choose from where the block will get the node value.

Select a node value



Node from URL





Ah! I found my own issue on DO. You also might have to unrequire the context like following:

 *   context = {
 *     "node" = @ContextDefinition(
 *       "entity:node",
 *       label = @Translation("Current Node"),
 *       required = FALSE,
 *     )
 *   }