Измените значение поля перед визуализацией


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

Это не влияет на рендеринг. Как это сделать? Я не хочу сохранять измененное значение

Author: Neograph734, 2016-04-25

2 answers

Слишком поздно менять объект поля, потому что поле уже подготовлено для рендеринга. Вам нужно найти значение поля внутри массива визуализации, например в #markup, и изменить его там. То, где вы найдете значение, зависит от того, как настроено отображение вашего поля в режиме просмотра.

Хотя это возможно, часто есть лучший способ. Вы можете создать свой собственный форматировщик, который возвращает нужную вам структуру. #текст - это форматированное текстовое поле, вы можете создать фильтр это преобразует текст так, как вы хотите. Зависит от того, что именно вы хотите сделать.

(Комментарий от @Berdir)

Смотрите документы drupal о том, как создать пользовательский формататор полей:

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

 6
Author: 4k4, 2018-02-20 09:59:38

Как упоминалось выше, вам необходимо изменить разметку #, например, для поля "field_block_iframe" ниже:

/**
 * 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
Author: Jakub Mroz, 2018-03-11 10:18:01