web-dev-qa-db-ja.com

t()関数を介してHTMLを含む変数を渡す-プレースホルダーは削除されました

Drupal 8では、!(感嘆符)プレースホルダーをt()関数で使用することが削除されているようです。

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>

このHTMLは、サイト上で表示される場所に合わせて特別にスタイルが設定されるため、保持しておきます。

Drupal 7では、これを行うことができました:

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

$ nameには、上記のHTMLが含まれています。ただし、Drupal 8では、感嘆符のパススループレースホルダーが削除されているため、これは機能しません。

私はこれを試しました:

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

しかし、HTMLはまだエスケープされています。

@マークもHTMLをエスケープします。

HTMLがD8のt()関数を介してどのように渡されるかを知っていますか?

更新:

No Sssweatのコメントによると、私の! markはt()で機能するようです。だからここに私の実際のコードがあります:

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

そして、私はこのエラースタックを取得します:

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)

ユーザーエラーは私に考えさせられたものです!マークは許可されていませんが、誤診したに違いありません。ここで何が起こっているのか誰か知っていますか?

9
Jaypan

t() function エスケープされている が実装されていない限り、引数はMarkupInterfaceしたがって、名前をオブジェクトとして表す必要があります。

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

はい、表示されているユーザーエラーは、使用しているプレースホルダーがt()から認識されないことを意味します。 FormattableMarkup::placeholderFormat() は、背後でジョブを実行するメソッドであり、3つのプレースホルダータイプのみを認識します:@ variable%variable、および:variable。プレースホルダーが別の文字で始まる場合、次のコードが実行され、表示されている動作が発生します。

  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;

@ variableの説明では、変数の値は次のようになります。

あなたの場合、私は次のコードを使用します。

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