Измените значение поля перед визуализацией
В 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");
}
}
}
Это не влияет на рендеринг. Как это сделать? Я не хочу сохранять измененное значение
2 answers
Слишком поздно менять объект поля, потому что поле уже подготовлено для рендеринга. Вам нужно найти значение поля внутри массива визуализации, например в #markup
, и изменить его там. То, где вы найдете значение, зависит от того, как настроено отображение вашего поля в режиме просмотра.
Хотя это возможно, часто есть лучший способ. Вы можете создать свой собственный форматировщик, который возвращает нужную вам структуру. #текст - это форматированное текстовое поле, вы можете создать фильтр это преобразует текст так, как вы хотите. Зависит от того, что именно вы хотите сделать.
(Комментарий от @Berdir)
Смотрите документы drupal о том, как создать пользовательский формататор полей:
Https://www.drupal.org/docs/8/creating-custom-modules/create-a-custom-field-formatter
Как упоминалось выше, вам необходимо изменить разметку #, например, для поля "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.';
}