How to Programmatically Replace the Content in the Custom Block in Drupal 8?

15 / Mar / 2017 by Aayushi Garg 2 comments

Replacing the content in the custom block is often challenging. In Drupal 8, the best way to replace the content in the custom block programmatically is to use module_preprocess_block alter.

We have created a custom block and now we want to replace the value of the placeholder programmatically. For eg. On http://example.com/, we have created a custom block named “Test Block” for the home page. The body of the custom block contains the following code:


<div>
<div class="“content”">
<h5><a href="“{{link}}”">Test Block</a></h5>  // {{link}} represents the placeholder
</div>
</div>

Now we want to replace the value of placeholder ({{link}}) with a node page URL link programmatically. Here’s how to go about it:

Create an alter module by following the below steps:

Step 1- Create a test folder in the modules folder
Step 2- Create “test.info.yml” file that will have entire information about module such as name, type, package, version.

name: Test Block
description: 'Module to replace the placeholder.'
package: Custom
type: module
core: 8.x

Step 3- Create “test.routing.yml” file and add routing for this module
Step 4- Create “test.module” file which will contain the preprocess alter of the custom block. The custom block contains the placeholder
Step 5- Open the test.module file and add preprocess alter code as shown below:

 use Drupal\Core\Block\BlockBase;
 use Drupal\node\Entity\Node;
 use Drupal\Core\Url;
 use Drupal\file\Entity\File;
 use Drupal\field\Entity\FieldConfig;

 /**
 * function preprocess block for Test block
 */
 function test_preprocess_block(&$variables)
 {

 if (isset($variables['content']['#block_content']))

 {
 $content = $variables['content']['#block_content'];
 if( method_exists($content,'id') && $content->id() == 'block_id')
/*
* Block Id represents id of coressponding block which contains the placeholder.
*/
 {
 $body = $variables['content']['body'][0]['#text'];
 /*
 * now you need to replace with placeholder by finding the dynamic link
 */
 $query = \Drupal::entityQuery('node');
 $query->range(0, 1);
 $result = $query->execute();
 $nids = array_values($result);
 if (isset($nids[0]))
 {
 $node_load = Node::load($nids[0]);
 $options = array('absolute'=>TRUE);
 $url = Url::fromRoute('entity.node.canonical', [ 'node'=>$nids[0] ], $options);
 $Url = $url->toString();
 $body=str_replace('{{link}}',$Url,$body);
 $variables['content']['body'][0]['#text'] = $body;
 }
 }
 }
 }

The Block Id and the placeholder are highlighted in the following image:

screenshot(3)

We hope you will able to now replace the content in your custom block easily following the above steps. In case if you have more queries about Drupal 8 custom blocks, feel free to share them in the comments below.

FOUND THIS USEFUL? SHARE IT

comments (2)

  1. Nehal Rupani

    Thanks for useful trickes, I was searching for quite time but finally I was able to change content base on my requirement on the fly. By the way my question is can’t we do same with how to identify particular block using hook_block_alter which i try to used before this but it didn’t work.

    Reply

Leave a comment -