web-dev-qa-db-fra.com

Modifier la valeur du champ avant le rendu

Dans Drupal 8, je pensais que c'était une tâche simple mais ce n'est pas:

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

cela n'affecte pas le rendu. Comment ? Je ne veux pas enregistrer la valeur modifiée

7
Cawet

Il est trop tard pour modifier l'objet de champ, car le champ est déjà préparé pour le rendu. Vous devez trouver la valeur du champ à l'intérieur du tableau de rendu, par exemple dans #markup, et changez-le ici. L'endroit où vous trouvez la valeur dépend de la façon dont votre affichage de champ est configuré en mode d'affichage.

Bien que cela soit possible, il existe souvent un meilleur moyen. Vous pouvez créer votre propre formateur qui renvoie la structure souhaitée. #text est un champ de texte formaté, vous pouvez créer un filtre qui transforme le texte comme vous le souhaitez. Cela dépend de ce que vous voulez faire exactement.

(Commentaire de @Berdir)

Voir les documents drupal comment créer un formateur de champs personnalisé:

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

5
4k4

Comme mentionné ci-dessus, vous devez modifier le #markup, exemple pour le champ "field_block_iframe" ci-dessous:

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