私の質問は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;
}
}
これには 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()のドキュメントを参照してください。このクラスを誤って使用すると、セキュリティが脆弱になる可能性があります。
リンクフィールドの場合、次のようにタイトル変数にマークアップ配列を挿入できます。
$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']);
これを処理する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;
}
}