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 {
/**
* 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->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:
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()
->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.
context_definitions = {"node" = @ContextDefinition(...)}
instead of the oldcontext = {"node" = @ContextDefinition(...)}