web-dev-qa-db-fra.com

Comment convertir des caractères spéciaux en html dans twig

J'ai quelques éléments de liste dans drupal 8 qui a créé par item_list modèle. J'envoie <a> données balisées dans le item_list modèle. Mon idée était d'obtenir la sortie sous la forme <a href="/this-is-new.html">This is new page</a>.

Mais il renvoie la sortie sous la forme <li>&lt;a href="/this-is-new.html"&gt;This is new page&lt;/a&gt;</li>.

J'ai besoin d'imprimer ceci dans un modèle twig. Mais avec la sortie, je l'ai rendu sous forme de chaîne dans le modèle et non comme une balise d'ancrage html. Je devais afficher un lien vers une autre page dans Mais tout ce que je reçois est une chaîne avec le <a href="/this-is-new.html">This is new page</a>. Que devrais-je faire?

5
i am batman

REMARQUE: cela devrait être évité car il est considéré comme une mauvaise pratique comme mentionné dans les commentaires, laissant ici un pour être évité exemple

À l'intérieur de votre modèle twig

  {{ var|raw }}

var est la variable en cours d'impression.

Pour plus d'informations ici

3
GiorgosK

Essayez d'utiliser convert_encoding ('UTF-8', 'HTML-ENTITIES') twig filter. Par exemple {{item | convert_encoding ('UTF-8', 'HTML-ENTITIES')}} .

2
Aditya Joshi

Pour envoyer un balisage html à un modèle, utilisez un #markup élément de rendu

$variables['link'] = [
  '#markup' => '<a href="/this-is-new.html">This is new page</a>',
];

afin que les balises html ne soient pas échappées lorsque vous sortez la variable dans twig:

{{ link }}

Le lien ici n'est qu'un exemple. Il existe de meilleures façons de créer des liens, voir Comment créer un lien?

2
4k4

Mais il renvoie la sortie sous la forme <li>&lt;a href="/this-is-new.html"&gt;This is new page&lt;/a&gt;</li>.

La raison en est que Twig échappe automatiquement votre HTML. La liste n'autorise que les balises HTML liées à la liste, comme <li>.

J'ai quelques éléments de liste dans drupal 8

Mon idée était d'obtenir la sortie sous la forme <a href="/this-is-new.html">This is new page</a>

N'utilisez pas List comme type de champ, utilisez plutôt Link et définissez-le sur illimité .

enter image description here


Maintenant, lorsque vous ajoutez un nouveau nœud:

enter image description here

1
No Sssweat

Vous pouvez utiliser Markup class qui définit un objet qui passe des chaînes sécurisées à travers le système de rendu.

1.) Vous devez d'abord créer une classe TwigExtension.php à l'intérieur d'un module et définir une fonction qui retournera réellement une chaîne formatée.

2.) Utilisez cette fonction dans l'un de vos fichiers twig pour rendre les chaînes formatées.

3.) Reconstruisez le cache en utilisant Drush cr.

-> Créez un fichier module_name.services.yml sous modules/module_name:

services:
  module_name.twig.TwigExtension:
    class: Drupal\module_name\TwigExtension
    tags:
      - {name: twig.extension}

-> Créez un TwigExtension.php sous modules/module_name/src/TwigExtension.php:

<?php

namespace Drupal\module_name;

use Drupal\Core\Render\Markup;

/**
 * Class DefaultService.
 *
 * @package Drupal\module_name
 */
class TwigExtension extends \Twig_Extension {

  /**
   * {@inheritdoc}
   * This function must return the name of the extension. It must be unique.
   */
  public function getName() {
    return 'block_display';
  }

  /**
   * In this function we can declare the extension function
   */
  public function getFunctions() {
    return array(
      new \Twig_SimpleFunction('render_string', array($this, 'render_string'), array('is_safe' => array('html'))),
    );
  }

  /**
   * Function to decode html special chars
   */
  public function render_string($string) {
    $render_string = Markup::create($string);
    return $render_string;
  }

-> ** Insérez la fonction twig dans votre fichier twig: **

{% set str = render_string('<a href="/this-is-new.html">This is new page</a>') %}
....
....
{{ str }}

J'espère que cela vous aidera.

1
Ashish Deynap