web-dev-qa-db-fra.com

Passer des variables contenant du HTML via la fonction t() -! Placeholder a été supprimée

Dans Drupal 8, il semble que l'utilisation de l'espace réservé! (Point d'exclamation) avec la fonction t() a été supprimée).

J'ai une variable qui contient du HTML:

<span class="fullname_wrapper"><span class="first_name">John</span> <span class="last_name">Hancock</span> <span class="account_name_wrapper">(@JohnH)</span></span>

Je souhaite conserver ce code HTML, car il sera stylisé spécifiquement partout où il apparaît sur le site.

Dans Drupal 7, j'ai pu faire ceci:

t('Your name is !name', array('!name' => $name));

Dans lequel $ name contient le code HTML indiqué ci-dessus. Cependant, dans Drupal 8, cela ne fonctionne pas car l'espace réservé de passage pour le point d'exclamation a été supprimé.

J'ai essayé ceci:

t('Your name is :name', array(':name' => $name));

Mais le HTML est toujours échappé.

La marque @ échappe également au HTML.

Est-ce que quelqu'un sait comment HTML peut être transmis via la fonction t() dans D8?

MISE À JOUR:

Selon le commentaire de No Sssweat, il semble que mon le! mark semble fonctionner dans t (). Voici donc mon code actuel:

drupal_set_message(
  $this->t(
    "@amount has been transferred to !account",
    array(
      '@amount' => '¥' . $form_state->getValue('amount'),
      '!account' => $this->accountService->formatAccountName($account)
    )
  )
);

Et je reçois cette pile d'erreur:

User error: Invalid placeholder (!account) in string: @amount has been transferred to !account in Drupal\Component\Render\FormattableMarkup::placeholderFormat() (line 235 of core/lib/Drupal/Component/Render/FormattableMarkup.php).

Drupal\Component\Render\FormattableMarkup::placeholderFormat('@amount has been transferred to !user', Array) (Line: 204)
Drupal\Core\StringTranslation\TranslatableMarkup->render() (Line: 15)
Drupal\Core\StringTranslation\TranslatableMarkup->__toString() (Line: 451)
drupal_set_message(Object) (Line: 128)

L'erreur utilisateur est ce qui m'a fait penser au! marque n'est pas autorisée, mais je dois avoir mal diagnostiqué. Quelqu'un sait-il ce qui se passe ici?

9
Jaypan

Il semble que tous les arguments passés à t() fonction sont échappés sauf s'ils implémentent MarkupInterface. De sorte que vous devez représenter le nom en tant qu'objet.

use Drupal\Component\Render\FormattableMarkup;

$formatted_name = new FormattableMarkup(
  '<span class="fullname-wrapper">
    <span class="first-name">@first_name</span>
    <span class="last-name">@second_name</span>
    <span class="account-name-wrapper">(@user_name)</span>
   </span>',
  [
    '@first_name' => 'John',
    '@second_name' => 'Hancock',
    '@user_name' => '@JohnH',
  ]
);

drupal_set_message(t('Your name is @name', ['@name' => $formatted_name]));
22
ya.teck

Oui, l'erreur utilisateur que vous voyez signifie que l'espace réservé que vous utilisez n'est pas reconnu à partir de t(). FormattableMarkup::placeholderFormat() , la méthode qui fait le travail derrière la scène, ne reconnaît que 3 types d'espace réservé: @ variable , % variable , et : variable . Si l'espace réservé commence par un caractère différent, il exécute le code suivant, ce qui provoque le comportement que vous voyez.

  default:
    // We do not trigger an error for placeholder that start with an
    // alphabetic character.
    // @todo https://www.drupal.org/node/2807743 Change to an exception
    //   and always throw regardless of the first character.
    if (!ctype_alpha($key[0])) {
      // We trigger an error as we may want to introduce new placeholders
      // in the future without breaking backward compatibility.
      trigger_error('Invalid placeholder (' . $key . ') in string: ' . $string, E_USER_ERROR);
    }
    elseif (strpos($string, $key) !== FALSE) {
      trigger_error('Invalid placeholder (' . $key . ') in string: ' . $string, E_USER_DEPRECATED);
    }
    // No replacement possible therefore we can discard the argument.
    unset($args[$key]);
    break;

La description de @ variable indique que la valeur de la variable pourrait être:

Dans votre cas, j'utiliserais simplement le code suivant.

use Drupal\Component\Render\FormattableMarkup;

drupal_set_message(
  $this->t(
    "@amount has been transferred to @account",
    [
      '@amount' => '¥' . $form_state->getValue('amount'),
      '@account' => new FormattableMarkup($this->accountService->formatAccountName($account), [])
    ]
  )
);
5
kiamlaluno