Ich versuche derzeit, auf meiner Drupal 7-Site ein knotenreferenziertes Bildfeld zu implementieren, das den Ansichtsmodus abhängig von der programmatischen Logik unmittelbar vor dem Rendern ändert. Das Feld wird derzeit für eine Reihe von Inhaltstypen über ihre Einstellungen für den Anzeigemodus gerendert, von denen jeder den Feldformatierer 'Gerenderter Knoten' verwendet.
erster Versuch
Meine erste Idee war, Folgendes zu implementieren, wenn man bedenkt, dass ein Haken ein Haken ist:
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;
}
}
Offensichtlich tausche HOOK gegen den Namen meines Moduls.
Es ist auch nicht wichtig , ob das oben vor oder nach der ursprünglichen Funktion feuern würde node_reference_field_formatter_view
in , node_reference.module
weil ich entweder Ausgang den es außer Kraft setzen würde ganz oder hoffentlich ändert ihre Werte vor dem Rendern. Das einzige Problem ist, dass der obige Hook nur auf Modulbasis zu funktionieren scheint - dh er ist nicht standortweit, sodass er für mein Modul im Grunde nicht ausgelöst wird.
Jetzt kann ich natürlich meinen eigenen Feldformatierer schreiben, um einen gerenderten Knoten auszugeben. Aber es scheint eine Verschwendung zu sein, wenn man bedenkt, dass es bereits eine gibt.
andere Ansätze
Meine anderen Ansätze waren HOOK_preprocess_node
und, HOOK_preprocess_field
aber die ersteren enthalten keine view_mode
Informationen, und die letzteren enthalten mindestens 5 verschiedene komplizierte Strukturen, die alle Verweise auf eine view_mode
Eigenschaft auf verschiedenen Ebenen haben - und es fühlt sich ziemlich hackig an, jede von ihnen modifizieren zu müssen Werte. Selbst wenn ich bestimmte view_mode
Eigenschaften geändert habe, ändert sich das resultierende Bild nicht.
Frage
Kennt jemand eine saubere Möglichkeit, vor dem Rendern eines Feldformatierers (eines Contrib-Moduls) einzugreifen und seine Einstellungen auf Seitenbasis zu ändern - dh indem die Einstellungen für den permanenten Ansichtsmodus des tatsächlichen Inhaltstyps nicht geändert werden müssen?
hook_field_formatter_view_alter()
wahrscheinlich seit über einem Jahr nach einem oder ähnlichem gesucht , es existiert leider nicht. Zu Ihrerhook_preprocess_node()
Information , esview_mode
steht definitiv zur Verfügung, es ist in$vars['view_mode']
, nicht$vars['node']->view_mode
das , was Sie versucht haben könnten, es zu versuchen.view_mode
aufhook_preprocess_node
, dumm ich! Ich frage mich, ob so etwashook_field_formatter_view_alter()
in D8 existiert ...Antworten:
In der Frage wird erwähnt, dass
hook_field_formatter_view()
nur das Ursprungsmodul aufgerufen wird, Sie jedoch den Besitz des Feldformatierers über übernehmen könnenhook_field_formatter_info_alter()
.Sie sollten in der Lage sein, den
module
Schlüssel des Formatierers auf MYMODULE zu setzen, wie:Anschließend können Sie
MYMODULE_field_formatter_view()
das vorhandene Modul implementieren , das es verarbeitet hat, um ein zu änderndes Element zu erhalten.quelle
field_formatter
Funktionen von node_reference verfügen, dhMYMODULE_field_formatter_settings_summary
undMYMODULE_field_formatter_settings_form
(auch wenn es sich nur um Proxy-Funktionen handelt, die zum ursprünglichen Modul zurückkehren), andernfalls über das Back- Die Benutzeroberfläche wird in allen Anzeigemodus-Panels unterbrochen, als versucht wurde, diese Methoden im falschen Modul zu finden.Ok, also wurde mir klar, warum meine Änderungen an
#view_mode
beiden vorgenommen wurdenhook_preprocess_node
undhook_preprocess_fields
nicht funktionierten. (Danke an Clive für den Hinweis, dass ich die Anwesenheit von#view_mode
in total vermisst habehook_preprocess_node
) .Mein Problem ergab sich aus der Tatsache, dass
#view_mode
es bereits verarbeitet und in die richtige#image_style
Eigenschaft umgewandelt worden war - etwas, nach dem ich nicht gesucht hatte.Trotzdem scheint das Ändern dieses Werts zu stark davon abhängig zu sein, in welchem Hook Sie ihn geändert haben. Endlich funktioniert jedoch Code, der das gerenderte Bild tatsächlich ändert:
Das obige fühlt sich immer noch nicht sehr eloquent an, aber es funktioniert zumindest. Ich nehme Clives Wort auf die Tatsache, dass es eine solche _alter-Methode für Feldformatierer nicht gibt - es ist eine Schande, dass Formatierer ein äußerst leistungsfähiges Merkmal von D7 sind. Es wäre schön, mehr Erweiterungsmöglichkeiten zu haben.
Wie auch immer, wenn zukünftige Leute bessere Ideen haben, antworte :)
quelle
Am einfachsten ist es, den Panelizer zu verwenden .
Wenn Sie nicht Panelizer, sondern die Standard-Drupal-Ansichtsmodi oder die Display Suite verwenden, versuchen Sie es mit hook_field_display_alter () oder hook_field_display_ENTITY_TYPE_alter () .
Sie haben Entität, Anzeigekontext sowie alle Formatierungseinstellungen dort. Und Sie können die Einstellungen für das Feldrendern einfach ändern. Sie können den Feldformatierer sogar in einen anderen ändern.
Der Ansatz funktioniert perfekt für mich. Der einzige Nachteil ist, dass Sie möglicherweise mit unterschiedlichen Einstellungen in der Benutzeroberfläche "Anzeige verwalten" verwechselt werden.
quelle
https://www.drupal.org/node/2130757 Es gibt ein gutes Beispiel. hook_field_formatter_third_party_settings_form () ist nützlich, um die Form des vorhandenen Feldformatierers zu ändern.
Dies funktioniert jedoch nicht mit Feldgruppen.
quelle