web-dev-qa-db-ja.com

前処理フィールドのリンク(レンダリング可能な配列内)内にマークアップを追加する

私の質問はD8です...

リンクとしてレンダリングされるフィールドがあります。簡単にするために、次のようにレンダリングされるとしましょう:<a href="url">My Title</a>

bootstrapアイコンをリンク内に追加して、次のような結果を取得します:<a href="url"><span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>My Title</a>

URLとタイトルをプリプロセス関数内から取得して、新しいリンク(#markup)を再構築できることはわかっています...しかし、配列のどこかにアイコンコードを追加するだけで同じ結果を得ることができますか?

私は明確にするためにいくつかの情報を追加しています:

1-リンクとしてレンダリングされるフィールドは、リンクされたラベルとしてレンダリングされる用語参照フィールドです

2-これを達成するためのpreprocess_field関数の私の試みはここにあります

function mymodule_preprocess_field(&$vars) {
  $fn = $vars['element']['#field_name'];
  switch ($fn) {
    case 'my_field':
      foreach ($vars['items'] as $key => $item) {
        $icon = '<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>';
        $vars['items'][0]['content']['#title']=$icon.$item['content']['#title'];
      }
      break;
  }
}
5
Baud

これには FormattableMarkup クラスを使用します。

$markup = new FormattableMarkup('<a href="@url"><span class="glyphicon glyphicon-info-sign" aria-hidden="true /></a>', [
          '@url' => $url->toString(), // If $url is an Drupal\Core\Url object.
        ]);

$renderArray['your_element'] = $markup;

編集後:

これには Markup クラスを使用してください。これは、マークアップを制御しているように見えるためです。安全でない場合、プレースホルダで FormattableMarkup を使用しない場合:

  function mymodule_preprocess_field(&$vars) {
    $fn = $vars['element']['#field_name'];
    switch ($fn) {
      case 'my_field':
        foreach ($vars['items'] as $key => $item) {
          $icon = '<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>';
          $uri = $item['content']['#title'];

          $formattedIcon = \Drupal\Core\Render\Markup::create($icon . $uri);

          $vars['items'][0]['content']['#title'] = $formattedIcon;
        }
        break;
    }
  }

FormattableMarkup ドキュメントから:

文字列にキャストすると、このオブジェクトは文字列内の変数プレースホルダーを構築中に渡された引数に置き換え、値をエスケープしてHTMLとして安全に表示できるようにします。サポートされるプレースホルダーの詳細とそれらを安全に使用する方法については、\ Drupal\Component\Render\FormattableMarkup :: placeholderFormat()のドキュメントを参照してください。このクラスを誤って使用すると、セキュリティが脆弱になる可能性があります。

7
mvdgun

リンクフィールドの場合、次のようにタイトル変数にマークアップ配列を挿入できます。

$icon = '<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>';
$variables['link_field_name']['title'] = [
  '#markup' => $icon . $variables['link_field_name']['title'],
];

編集:参照タイトルという用語の場合:

$vars['items'][0]['content']['#title'] = [
  '#markup' => $icon . $vars['items'][0]['content']['#title'],
];

または、@ Gun5m0k3から提案されたように、新しいdrupal 8上品な方法:

$vars['items'][0]['content']['#title'] = \Drupal\Core\Render\Markup::create($icon . $vars['items'][0]['content']['#title']);
2
rémy

これを処理する1つの方法は、inline_templateレンダーアイテムを作成することです。

  function mymodule_preprocess_field(&$vars) {
    $fn = $vars['element']['#field_name'];
    switch ($fn) {
      case 'my_field':
        foreach ($vars['items'] as $key => $item) {
          $vars['items'][0]['content']['#title'] = [
            '#type' => 'inline_template',
            '#template' => '{{ icon }} {{ title }}',
            '#context' => [
              'icon' => '<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>',
              'title' => $item['content']['#title'],
              ],
          ];
        }
        break;
    }
  }
1
oknate