如何通过Drupal 8中的模块修改节点的主体

问题描述:

我创建了一个模块来突出基于highlight.js库的文章中的代码示例。该库需要将代码示例嵌入< pre> <代码> ... </code> </pre>标记中。我不想在写文章时添加< pre>标签,因为其他荧光笔库不需要它,我希望能够在不修改文章的情况下切换库。所以我需要动态地将<代码>标签与< pre>包装起来。我试图执行_node_view(和_node_view_alter(钩子都没有成功。如何通过Drupal 8中的模块修改节点的主体

我的代码看起来像

function highlight_node_view($node, $view_mode, $langcode) { 
    $node->content['body']['und'][0]['safe_value'] = "test"; 
    $node->body['und'][0]['safe_value'] = "test"; 
    $node->content['body']['und'][0]['value'] = "test"; 
    $node->body['und'][0]['value'] = "test"; 
} 

function highlight_node_view_alter($build, $node) { 
    $build["body"]["#items"]["0"]["value"] = "TEST"; 
    $build["body"]["#items"]["0"]["safe_value"] = "TEST"; 
    $build["body"]["#formater"]["0"]["#markup"] = "TEST"; 
} 

如果我打印带有

<pre> 
    <?php  
     ob_start("minimal_htmlspecialchars_callback"); 
     print_r($content); 
     ob_end_flush(); 
    ?> 
</pre> 

模板中的内容,我可以确认所有值被正确地替换为“测试”,但是调用

<?php print render($content['body']); ?> 

仍呈现原始的con帐篷而不是“测试”

什么是正确的方式来改变从一个模块的文章的内容?

+1

Drupal 8还没有一个稳定的版本,不应该用于测试......你确定你不是指Drupal 7吗? – Clive

+0

我知道Drupal 8尚未准备好,但我喜欢尝试。我正在用Symfony2开发我自己的非常基本的集团系统,所以当我发现Drupal 8基于这个框架时,我决定尝试一下(到目前为止我喜欢它)。 – MathieuLescure

我终于在前面的一个计算器问题(Modify how a node in drupal will look when viewed)中找到了解决方案,下面的代码工作正常。

function highlight_node_view($node, $view_mode, $langcode) { 
    $alteredBody = $node->body['und'][0]['safe_value']; 
    $alteredBody = str_replace("<code>", "<pre><code>", $alteredBody); 
    $alteredBody = str_replace("</code>", "</code></pre>", $alteredBody); 

    $node->content['body'] = array(
     '#markup' => $node->body['und'][0]['safe_value'] = $alteredBody 
    ); 
} 

但我仍然不确定完全理解渲染系统。所以如果有人有更好的解决方案或更详细的解释,我会感激。

+1

这个答案不正确了,因为Drupal 8使用['hook_ENTITY_TYPE_view()'](https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Entity!entity.api.php/函数/ hook_ENTITY_TYPE_view/8)而不是'hook_node_view()'。参数是不同的,这个钩子需要实现的代码也是不同的。 – kiamlaluno

我已经成功改变了车身现场数据,你必须在你的模块文件中放置代码,如下图所示。顺便说一句我正在使用drupal 8.2

use Drupal\Core\Entity\EntityInterface; 
use Drupal\Core\Entity\Display\EntityViewDisplayInterface; 
/** 
* Implements hook_ENTITY_TYPE_view() for node entities. 
*/ 

function module_name_node_view(array &$build, EntityInterface $node, EntityViewDisplayInterface $display, $view_mode) { 
    $build['body'][0]['#text'] = 'test by ajay'; 
}