4

私は、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']); ?>

「テスト」の代わりに元のコンテンツを引き続きレンダリングします

モジュールから記事の内容を変更する適切な方法は何ですか?

4

2 に答える 2

5

body フィールド データの変更に成功しました。次のようにモジュール ファイルにコードを配置する必要があります。ところで、私は 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 に答える