2012-10-13 6 views
1

J'ai créé un module pour mettre en évidence les exemples de code dans les articles basés sur la bibliothèque highlight.js. Cette bibliothèque nécessite des exemples de code à intégrer dans < pre> < code> ... </code> </pre> tags. Je ne veux pas ajouter la balise < pre> quand j'écris un article, parce que les autres bibliothèques de surlignage n'en ont pas besoin et je veux pouvoir changer de bibliothèque sans modifier les articles. J'ai donc besoin d'envelopper dynamiquement < code> tags avec < pre>. J'ai essayé de mettre en œuvre _node_view (et _node_view_alter (crochets sans succès.Comment modifier le corps d'un nœud via un module dans Drupal 8

Mon apparence de code comme

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"; 
} 

Si j'imprimer le contenu de mon modèle avec

<pre> 
    <?php  
     ob_start("minimal_htmlspecialchars_callback"); 
     print_r($content); 
     ob_end_flush(); 
    ?> 
</pre> 

Je peux confirmer que tous les les valeurs sont correctement remplacées par "test" mais un appel à

<?php print render($content['body']); ?> 

resta tente au lieu de "test"

Quelle est la bonne façon de modifier le contenu d'un article à partir d'un module?

+1

Drupal 8 n'a pas encore communiqué stable et ne doit pas être utilisé autrement que pour les tests ... Etes-vous sûr ne signifie pas Drupal 7? – Clive

+0

Je sais que Drupal 8 n'est pas encore prêt, mais j'aime expérimenter. Je développais mon propre système de bloc très basique avec Symfony2, donc quand j'ai découvert que Drupal 8 était basé sur ce framework, j'ai décidé de l'essayer (et jusqu'à présent je l'aime bien). – MathieuLescure

Répondre

0

J'ai finalement trouvé une solution dans une précédente question de stackoverflow (Modify how a node in drupal will look when viewed) et le code suivant fonctionne bien.

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 
    ); 
} 

Mais je ne suis toujours pas sûr de bien comprendre le système de rendu. Donc, si quelqu'un a une meilleure solution ou une explication plus détaillée, je l'apprécierai.

+1

Cette réponse n'est plus correcte, puisque Drupal 8 utilise ['hook_ENTITY_TYPE_view()'] (https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Entity!entity.api.php/ function/hook_ENTITY_TYPE_view/8) au lieu de 'hook_node_view()'. Les arguments sont différents, tout comme le code que ce hook doit implémenter. – kiamlaluno

1

J'ai modifié avec succès les données de corps du corps, vous devez placer le code dans votre fichier de module comme ci-dessous. BTW J'utilise

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'; 
} 
Questions connexes