Ändern Sie den Feldwert vor dem Rendern

8

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

Cawet
quelle

Antworten:

6

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, z. B. in #markup, und ihn dort ändern. 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)

In den Drupal-Dokumenten erfahren Sie, wie Sie einen benutzerdefinierten Feldformatierer erstellen:

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

4k4
quelle
1
wooookay, also war es in $ variables ['content'] ['field_bar] [0] [' # text '] ... In jedem Haken ist es eine Naht, anders zu sein ... gibt es eine Logik oder wir haben sie einfach in die $ -Variable schauen, um dies zu tun? Oder ist es vielleicht keine gute Idee, das Rendering hier zu ändern?
Cawet
Es ist völlig in Ordnung, das Render-Array im Vorprozess zu ändern. Dafür soll der Haken verwendet werden. Sie müssen sich jedoch mit verschiedenen Arten von Renderelementen befassen und Ihren Code entsprechend anpassen. Sie ändern sich für jeden Feldtyp und den Feldformatierer, den Sie im Ansichtsmodus auswählen und konfigurieren.
4k4
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.
Berdir
Ich würde nicht so weit gehen, um diese Frage zum Thema zu beantworten. Wenn Sie jedoch bereit sind, ein benutzerdefiniertes Modul zu einem Feldformatierer oder Textfilter-Plugin zu machen, ist dies das Richtige. Nicht nur der Grund, warum @Berdir erwähnt wurde, sondern auch, weil Ihr Code unabhängig vom Thema wird und jede Site problemlos erweitern kann.
4k4
Kannst du es als Beispielcode hinzufügen? Antwort pls
KTM
2

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.';
}
Jakub Mroz
quelle