web-dev-qa-db-ja.com

レンダリング前にフィールド値を変更

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");
        }
    }
}

これはレンダリングには影響しません。方法 ?変更された値を保存したくない

7
Cawet

フィールドは既にレンダリング用に準備されているため、フィールドオブジェクトを変更するには遅すぎます。あなたはレンダー配列の内部でフィールド値を見つける必要があります、例えば#markup、それを変更します。値がどこにあるかは、表示モードでのフィールド表示の構成方法によって異なります。

可能な場合でも、より良い方法がしばしばあります。必要な構造を返す独自のフォーマッターを作成できます。 #textはフォーマットされたテキストフィールドです。テキストを好きなように変換するフィルターを作成できます。正確に何をしたいかによります。

(@Berdirからのコメント)

drupal docsカスタムフィールドフォーマッタの作成方法をご覧ください。

https://www.drupal.org/docs/8/creating-custom-modules/create-a-custom-field-formatter

5
4k4

上記のように、以下のフィールド「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.';
}
2
Jakub Mroz