2012-10-13 35 views
1

我創建了一個模塊來突出基於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

回答

0

我終於在前面的一個計算器問題(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

1

我已經成功改變了車身現場數據,你必須在你的模塊文件中放置代碼,如下圖所示。順便說一句我正在使用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'; 
} 
相關問題