I have a customer who requires the correct set of responsive classes for his block in a given theme depending on its position and count. In my theme_preprocess_page(&$vars) I can identify the blocks in this region and build up an array for each block using its plugin_id and save it to $variables['highlighted'].

In my page.html.twig I use {{ highlighted }} and the array shows up wonderfully. Because block.html.twig by default is set up to be looking for {{ plugin_id }} I expected that I can test if plugin_id is in_array() and add these classes to that instance of the block.

But {{ highlighted }} in block.html.twig returns null in this theme, suggesting that $variables['page'] works for the page, but not block? Twig has a way to pass off variables to an arbitrary twig file but I do not know how to do this in Drupal. For instance, my page.html.twig is using {{ highlighted }} to pull in these blocks from $variables.

So my question is how does Drupal 8's adaptation the Twig source determine which variables are passed (plugin_id, content, attributes, id, etc) and how I can add mine? I've looked through the twig.engine and searched the Twig source, but it's not clear to me which class controls what variables are passed to blocks? My other avenue is to find a way to pass this array of classes to theme_preprocess_block but every attempt I made to try this ends up with theme_preprocess_block returning NULL for this array, suggesting that preprocess_page() and preprocess_block() are working separtely.


You will need to preprocess the block instead of the page. Preprocessing pages will not pass a variable to the block. See hook_preprocess_block. If you are needing to determine values based on how many times a block is rendered you can look into using drupal_static to store variables that can be reused during the rendering process.

Drupal static example:

$first_row = &drupal_static('first_row');

if ($first_row == 2) {
  // I equal 2

// Since I am passed by reference I can alter and will keep my value.
  • OK, reading drupal_static() sounds best because it survives render. It's not clear how to recall the static array in theme_preprocess_block. theme_preprocess_page invokes drupal_static_reset('processor_func'). Then gathers blocks in a region in a page and hands off to processor_func($blocks) which instantiates &drupal_static() and then builds up array of classes after verifying !isset('processor_func'). I don't see what variable I put in theme_preprocess_block() to get this array. – sam452 Aug 6 '18 at 20:44
  • Your preprocess $variables parameter should be able to be edited and added to a value that you can use in the template $variables['my_new_value'] should be available for use in tht template. – chadpeppers Aug 7 '18 at 19:12

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.