我创建了一个模块,用于根据突出显示.js库中的文章中的代码示例。此库要求将代码示例嵌入到
...
标记。我不想在写文章时添加标签,因为其他荧光笔库不需要它,我希望能够在不修改文章的情况下切换库。所以我需要用动态包装<代码>标签。我试图实现_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>
我可以确认所有值都正确替换为"测试",但调用
<?php print render($content['body']); ?>
仍然呈现原始内容而不是"测试"
从模块更改文章内容的正确方法是什么?
代码>
我已经成功更改了主体字段数据,您必须像波纹管一样将代码放在模块文件中。顺便说一句,我正在使用drupal 8.2
use DrupalCoreEntityEntityInterface;
use DrupalCoreEntityDisplayEntityViewDisplayInterface;
/**
* 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';
}
我终于在之前的堆栈溢出问题中找到了一个解决方案(修改 drupal 中的节点在查看时的外观),以下代码工作正常。
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
);
}
但我仍然不确定是否完全理解渲染系统。因此,如果有人有更好的解决方案或更详细的解释,我将不胜感激。