4

我基于 highlight.js 库创建了一个模块来突出显示文章中的代码示例。该库要求将代码示例嵌入到 <pre><code> ... </code></pre> 标记中。我不想在写文章的时候添加 <pre> 标签,因为其他荧光笔库不需要它,我希望能够在不修改文章的情况下切换库。所以我需要用 <pre> 动态包装 <code> 标签。我试图实现 _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']); ?>

仍然呈现原始内容而不是“测试”

从模块更改文章内容的正确方法是什么?

4

2 回答 2

5

我已经成功更改了正文字段数据,您必须将代码放在模块文件中,如下所示。顺便说一句,我正在使用 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'; 
}
于 2017-02-28T15:10:25.423 回答
0

我终于在之前的stackoverflow问题中找到了解决方案(修改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
    );
}

但我仍然不确定是否完全理解渲染系统。因此,如果有人有更好的解决方案或更详细的解释,我将不胜感激。

于 2012-10-14T22:06:26.853 回答