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
<figure class="element-item {{ fields['name'].content|lower }}"> <a href="{{ fields['field_photo_1'].content|lower }}"> <img src="{{ fields['field_photo'].content }}"/> </a> <figcaption> <div class="date">{{ fields['field_date'].content }}</div> <div class="lieu">{{ fields['field_lieu'].content }}</div> </figcaption> </figure> {{ 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 { /** * DrupalCoreEntityEntityTypeManagerInterface definition. * * @var DrupalCoreEntityEntityTypeManagerInterface */ 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->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->get('entity_type.manager') ); } /** * {@inheritdoc} */ public function build() { $build = []; $node = $this->getContextValue('node'); kint($node->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:
DrupalComponentPluginExceptionContextException : 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 = DrupalblockEntityBlock::load('commentblock'); $variables['test'] = Drupal::entityTypeManager() ->getViewBuilder('block') ->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.