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


8

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

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

回答:


6

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

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

(@Berdirからのコメント)

カスタムフィールドフォーマッターを作成する方法についてはdrupal docsを参照してください。

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


1
wooookay、それで$ variables ['content'] ['field_bar] [0] ['#text ']にありました...各フックで異なる方法になるように継ぎ合わせています...ロジックがあるのか​​、それともこれを行うために$ variable内を調べますか?または、ここでレンダリングを変更するのは良い考えではないでしょうか?
Cawet

前処理でレンダー配列を変更しても問題ありません。それがフックが使用されることになっているものです。ただし、いくつかのタイプのレンダリング要素を処理し、それに応じてコードを調整する必要があります。これらは、表示モードで選択して構成するすべてのフィールドタイプとフィールドフォーマッターごとに変わります。
4k4

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

テーマについてのこの質問に答えるのは、ここまではしません。ただし、カスタムモジュールを作成する場合は、フィールドフォーマッタまたはテキストフィルタプラグインが適切です。@Berdirが言及した理由だけでなく、コードがテーマから独立し、どのサイトも簡単に拡張できるためです。
4k4 2016

これをサンプルコードの回答として追加できますか
KTM

2

上記のように、以下のフィールド「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.';
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.