J'essaie actuellement d'implémenter un champ d'image référencé par nœud sur mon site Drupal 7 qui changera son «mode d'affichage» en fonction de la logique de programmation juste avant le rendu. Le champ est en cours de rendu sur un certain nombre de types de contenu via leurs paramètres de mode d'affichage, chacun utilisant le formateur de champ «Noeud rendu».
premier essai
Ma première idée a été d'implémenter ce qui suit, considérant qu'un crochet est un crochet est un crochet:
function HOOK_field_formatter_view( $entity_type, $entity, $field ... ){
switch ($display['type']) {
case 'node_reference_node':
/* Programatical logic here to modfy field render settings */
break;
}
}
Échange évident de HOOK pour le nom de mon module.
Il n'a pas vraiment d' importance si le serait au- dessus de feu avant ou après la fonction d' origine node_reference_field_formatter_view
en node_reference.module
parce que je soit remplacer entièrement sa sortie ou, je l' espère, modifier ses valeurs avant de rendre. Le seul problème est que le crochet ci-dessus semble fonctionner uniquement par module - c'est-à-dire qu'il n'est pas à l'échelle du site, donc en gros il ne se déclenche pas pour mon module.
Maintenant, je peux évidemment écrire mon propre formateur de champ pour sortir un nœud rendu. Mais cela semble un peu un gaspillage étant donné qu'il y en a déjà un qui existe.
d'autres approches
Mes autres approches ont été HOOK_preprocess_node
et HOOK_preprocess_field
mais la première ne contient aucune view_mode
information, et la seconde contient au moins 5 structures compliquées différentes qui ont toutes des références à une view_mode
propriété à différents niveaux - et il semble plutôt hacky de devoir modifier chacune de leurs valeurs. Même lorsque j'ai modifié certaines view_mode
propriétés, l'image résultante ne change pas.
question
Quelqu'un connaît-il un moyen propre d'intervenir avant le rendu d'un formateur de champ (d'un module contrib) et de modifier ses paramètres sur une base de demande par page - c'est-à-dire en n'ayant pas à modifier les paramètres du mode d'affichage permanent du type de contenu réel?
hook_field_formatter_view_alter()
ou similaire depuis probablement plus d'un an maintenant, il n'existe tout simplement pas malheureusement. Pour votre information , sanshook_preprocess_node()
aucun doute n'avoir à sa disposition, il est dans , pas que vous auriez pu être tentés d'essayer.view_mode
$vars['view_mode']
$vars['node']->view_mode
view_mode
lehook_preprocess_node
, stupide moi! Je me demande si quelque chose commehook_field_formatter_view_alter()
ça existe dans D8 ...Réponses:
La question mentionne qu'il
hook_field_formatter_view()
est uniquement appelé sur le module d'origine, mais vous pouvez vous approprier le formateur de champ viahook_field_formatter_info_alter()
.Vous devriez pouvoir définir la
module
clé du formateur sur MYMODULE comme:Ensuite, vous pouvez l'implémenter
MYMODULE_field_formatter_view()
, en passant éventuellement par le module existant qui l'a géré pour obtenir un élément à modifier.la source
field_formatter
fonctionnalités de node_reference, c'estMYMODULE_field_formatter_settings_summary
-à- dire etMYMODULE_field_formatter_settings_form
(même si ce ne sont que des fonctions proxy vers le module d'origine) sinon le back- fin d'interruption de l'interface utilisateur sur tous les panneaux du mode d'affichage, lorsqu'il a tenté de trouver ces méthodes dans le mauvais module.D'accord, je me suis rendu compte pourquoi mes changements
#view_mode
dans l'unhook_preprocess_node
et l' autrehook_preprocess_fields
ne fonctionnaient pas. (Merci à Clive d'avoir souligné que j'avais totalement raté la présence de#view_mode
inhook_preprocess_node
) .Mon problème
#view_mode
venait du fait qu'il avait déjà été traité et converti en la#image_style
propriété correcte - quelque chose que j'avais négligé de rechercher.Même ainsi, la modification de cette valeur semble trop dépendante du hook dans lequel vous l'avez modifiée. J'ai finalement réussi à faire fonctionner du code, qui change en fait l'image rendue:
Ce qui précède ne semble toujours pas très éloquent, mais au moins cela fonctionne. Je vais prendre la parole de Clive sur le fait qu'une telle méthode _alter n'existe pas pour les formateurs de champ - c'est dommage, les formateurs sont une fonctionnalité extrêmement puissante de D7, il serait bien d'avoir plus de capacité d'augmentation.
Quoi qu'il en soit, si des personnes futures ont de meilleures idées, répondez loin :)
la source
L'approche la plus simple sera d'utiliser le Panelizer .
Si vous n'utilisez pas Panelizer mais les modes d'affichage Drupal par défaut ou Display Suite, essayez hook_field_display_alter () ou hook_field_display_ENTITY_TYPE_alter () .
Vous avez l'entité, le contexte d'affichage ainsi que tous les paramètres du formateur. Et vous pouvez facilement modifier les paramètres de rendu des champs. Vous pouvez même changer le formateur de champs en un autre.
L'approche fonctionne parfaitement pour moi. Le seul inconvénient est que vous pouvez être confondu avec différents paramètres dans l'interface utilisateur "Gérer l'affichage".
la source
https://www.drupal.org/node/2130757 Il donne un bon exemple. hook_field_formatter_third_party_settings_form () est utile pour modifier la forme du formateur de champ existant.
Mais cela ne fonctionne pas avec les groupes de terrain.
la source