Drupal 8では、それは簡単な仕事だと思っていましたが、そうではありません:
function hmytheme_preprocess_field(&$variables, $hook) {
$element = $variables['element'];
if (isset($element['#field_name'])) {
if($element['#field_name'] == "bar"){
element['#items']->value ="foo";
//or
element['#items']->set(0,"foo");
}
}
}
これはレンダリングには影響しません。方法 ?変更された値を保存したくない
フィールドは既にレンダリング用に準備されているため、フィールドオブジェクトを変更するには遅すぎます。あなたはレンダー配列の内部でフィールド値を見つける必要があります、例えば#markup
、それを変更します。値がどこにあるかは、表示モードでのフィールド表示の構成方法によって異なります。
可能な場合でも、より良い方法がしばしばあります。必要な構造を返す独自のフォーマッターを作成できます。 #textはフォーマットされたテキストフィールドです。テキストを好きなように変換するフィルターを作成できます。正確に何をしたいかによります。
(@Berdirからのコメント)
drupal docsカスタムフィールドフォーマッタの作成方法をご覧ください。
https://www.drupal.org/docs/8/creating-custom-modules/create-a-custom-field-formatter
上記のように、以下のフィールド「field_block_iframe」の例である#markupを変更する必要があります。
/**
* Implements hook_preprocess_field().
*
* @param $variables
* @param $hook
*/
function THEME_preprocess_field__field_block_iframe(&$variables, $hook) {
$variables['items'][0]['content']['#markup'] = 'Going down, to the core.';
}