it-swarm.com.de

Ändern Sie den Feldwert vor dem Rendern

In Drupal 8) dachte ich, dass dies eine einfache Aufgabe ist, aber es ist nicht:

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

dies wirkt sich nicht auf den Render aus. Wie man ? Ich möchte den geänderten Wert nicht speichern

7
Cawet

Es ist zu spät, um das Feldobjekt zu ändern, da das Feld bereits für das Rendern vorbereitet ist. Sie müssen den Feldwert innerhalb des Render-Arrays finden, zum Beispiel in #markup und ändere es dort. Wo Sie den Wert finden, hängt davon ab, wie Ihre Feldanzeige im Ansichtsmodus konfiguriert ist.

Während möglich, gibt es oft einen besseren Weg. Sie können einen eigenen Formatierer erstellen, der die gewünschte Struktur zurückgibt. #text ist ein formatiertes Textfeld. Sie können einen Filter erstellen, der den Text nach Ihren Wünschen transformiert. Kommt darauf an, was du genau machen willst.

(Kommentar von @Berdir)

Weitere Informationen zum Erstellen eines benutzerdefinierten Feldformatierers finden Sie in den Dokumenten drupal $):

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

5
4k4

Wie oben erwähnt, müssen Sie das #markup ändern, Beispiel für das Feld "field_block_iframe" unten:

/**
 * 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