我创建了一个模块,以突出显示基于highlight.js库的文章中的代码示例。该库需要将代码样本嵌入< pre>< code> ...< / code>< / pre>标签。我不想添加< pre>我写一篇文章时标记,因为其他荧光笔库不需要它,我希望能够在不修改文章的情况下切换库。所以我需要动态包装< code>标签包含< pre>。我试图实现_node_view(和_node_view_alter(钩子没有成功。
我的代码看起来像
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>
我可以确认所有值都被“test”正确替换,但是调用了
<?php print render($content['body']); ?>
仍然呈现原始内容而不是“test”
从模块中更改文章内容的正确方法是什么?
答案 0 :(得分:2)
我已成功更改了正文字段数据,您必须将代码放在模块文件中,如下所示。顺便说一句,我使用的是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';
}
答案 1 :(得分:0)
我终于在之前的stackoverflow问题(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
);
}
但我仍然不确定完全理解渲染系统。因此,如果有人有更好的解决方案或更详细的解释,我会很感激。