function template_preprocess_views_view hat Probleme mit views cache, wie löst ihr das???
Eingetragen von maen (547)
am 15.12.2014 - 12:37 Uhr in
am 15.12.2014 - 12:37 Uhr in
Also, wie Ihr sicherlich schon erraten habt nutze ich zu theming Zwecken obige Funktion. Sinn ist es die meta tags für views ordentlich zu generieren.
Klappt auch soweit, bis ich in views den cache aktiviere.
Laut folgendem thread: https://www.drupal.org/node/939462 scheint das zwar für d8 gelöst worden zu sein, für d7 sieht es aber mau aus.
Demnach folgende Frage:
Statt den preprocess für views in der template.php zu generieren, was würdet Ihr nutzen?
Danke vorab,
Marc
- Anmelden oder Registrieren um Kommentare zu schreiben
Erstens ist das Erstellen der
am 15.12.2014 - 16:19 Uhr
Erstens ist das Erstellen der Metatags kein Templating, sondern Logik, Logik gehört eigentlich immer in ein Modul und nicht in eine Template (Preprocess-) Funktion...
Und zweites verstehe ich nicht, was genau das Problem beim Caching ist. Also wenn in dem View kein Caching aktiviert ist,werden die Metatags wie in der Preprocess-Funktion beschrieben richtig erstellt, wenn Caching aktiviert ist, werden die in der Preprocess-Funktion vorgenommenen Änderungen nicht übernommen??? oder wie genau zeigt sich das Problem????
Mein Tipp: einen der Views-Hooks, die früher als erst beim Template ansetzen, in einem eigenen Modul verwenden: https://api.drupal.org/api/views/views.api.php/group/views_hooks/7
Z.B. hook_views_pre_render
Zitat: Und zweites verstehe
am 15.12.2014 - 16:33 Uhr
Und zweites verstehe ich nicht, was genau das Problem beim Caching ist. Also wenn in dem View kein Caching aktiviert ist,werden die Metatags wie in der Preprocess-Funktion beschrieben richtig erstellt, wenn Caching aktiviert ist, werden die in der Preprocess-Funktion vorgenommenen Änderungen nicht übernommen??? oder wie genau zeigt sich das Problem????
-> genau!
Also, wenn man Deiner Meinung nach keine Logik innerhalb einer tpl.php ausdrûcken oder nutzen sollte, muss ich echt mal fragen für was die sonst da ist?
Ich klatsche ständig irgendwelche if Abfragen (meiner Meinung nach Logik) in irgndwelche tpl.php Dateien.
Oben angegebene Funktion hat für mich den Vorteil, dass ich die durch views schon geladenen Felder nutzen kann.
Im pre_render_hook kannst Du
am 15.12.2014 - 16:45 Uhr
Im pre_render_hook kannst Du die Daten ja auch nutzen. Hast Du Dir mal das dabei übergebene Array angeschaut?
Also es ist nicht meine persönliche Meinung - es ist angewandter Standard in der Programmierung,dass Business Logic vom Output zu trennen ist. Template-Dateien sind dafür da, Daten ins HTML zu übertragen, nicht dafür, die Daten weiter mit if-Abfragen und anderem zu bearbeiten.In Drupal 7 ist das Template-System tatsächlich noch etwas Wischiwaschi und nicht wirklich konsequent - zumal gerade Anfänger (auch ich früher) dadurch verleitet werden, irgendwas in die Template-Dateien zufrickeln - weil es halt geht. Aber Du willst die Metatags ja auch noch haben, wenn ein anderes Template aktiviert wird, schon deswegen macht es keinen Sinn, das in einer Template-Datei einzubauen... also zumindest die Erstellung der Metatags, also den Busines Logic teil...
Ist ja abgefahren, ist mir noch nie aufgefallen, dass die template_preprocess Funktionen bei aktiviertem Caching nicht aufgerufen werden...
Na ja, erst mal Danke für deinen Input!
am 15.12.2014 - 17:14 Uhr
Das mit dem abgefahren, ganz unten, finde ich nicht so witzig. Vor allem dass der von mir geteilte thread schon 4 Jahre alt ist.
Das mit dem Teilen zwischen business logic und Darstellung löst bei mir immer wieder gemischte Gefühle aus! Faulheit sei Dank bin ich eigentlich ganz froh dass ich mit views so bequem die Daten abgreifen kann.
Aber das hier ist nicht das erste Mal dass ich so kalt erwischt werde. Wäre der Aufwand nicht so abartig, würde ich die Daten manuell abgreifen, aber bei 300 Feldern ist das so eine Sache!!!
Es macht ja vom Aufwand her
am 16.12.2014 - 10:11 Uhr
Es macht ja vom Aufwand her eigentlich keinen großen Unterschied, wo Du die Daten änderst. Es ist nur am Anfang der Aufwand, sich mal mit den Hooks und dem Theme-Layer von Drupal etwas näher auseinderzusetzen, aber wenn diese Hürde einmal genommen ist, ist da kein höherer Aufwand, Business Logic in das Modul statt das Theme zu packen - im Gegenteil, nach hinten raus, also bei Optimierung, Wartung und Weiterentwicklung des Projekts spart es enorm viel Arbeit. Also kein Grund, jetzt gleich Views über den Haufen zu schmeißen, nur weil es vielleicht unglücklich ist, in den Theme-Dateien von Views Datenverarbeitung unterzubringen.
Wie dem auch sei, offensichtlich besteht dieses Problem mit den preprocess-Funktionen bei aktiviertem Cache und mein Tipp wäre, dann den hook_views_pre_render zu nehmen.
Außerdem frage ich mich eh gerade, wie Du das genau machst... mit dem Meta Tag Modul? Wird im Views-Theme tatsächlich eine Variable für das html.tpl.php verändert? Weil die Metatags werden ja da ausgegeben...
Guckscht Du hier ...
am 16.12.2014 - 13:59 Uhr
$og_description = array(
'#tag' => 'meta',
'#attributes' => array(
'property' => 'og:description',
'content' => $description
),
);
drupal_add_html_head($og_description, 'og_description');
Eigentlich brauche ich kein metatag mehr, wenn ich das insgesamt so machen würde. Ist aber bequemer...
Wird die View für die Ansicht
am 16.12.2014 - 14:25 Uhr
Wird die View für die Ansicht der Gruppe genutzt? Ist das der Quellcode aus der Views-Preprocess-Funktion oder nur Beispiel-Code von irgendwo her? Ist das eine Page-View oder welchen Display-Typen verwendest Du?
Na ja, im Prinzip kannst Du
am 16.12.2014 - 14:37 Uhr
Na ja, im Prinzip kannst Du das überall hinschreiben, bevor es gerendert wird. Ebenso für images, title etc. Ich hadere noch mit Deiner Definition von business Logik, da es sich ja im Prinzip auch um html handelt. Könnte es demnach auch in die tpl.php schreiben, oder als prerender in ein Modul.
Ich würfel mal ;)
Folgender test funktioniert nur ohne cache
am 16.12.2014 - 23:31 Uhr
Habe mal in einem Modul die Funktion reingeschrieben für die metatags. Funktioniert auch nur wenn der cache nicht gesetzt ist!
In eine tpl.php eine Funktion
mymodule_og_image_description($nid);
paltziert. Wie gesagt, genau das gleiche. Teste morgen abend mal mit prerender...Und die Lösung hier ...
am 17.12.2014 - 19:34 Uhr
Kurze Problembeschreibung:
Views cached alles was nicht niet- und nagelfest ist. Ergo wird so ziemlich alles, worauf sich views bezieht, im cache verwahhrt, so dass externe Funktionen nicht mehr berücksichtigt werden.
Es gibt auf drupal stackexchange einige Lösungsvorschläge, die meinem von oben nahe kommen (template.php, eine externe Funktion aus einer *.tpl.php aufrufen (custom_function oder module_load_inc), alles vertreten).
Nachdem ich das Internet halb auswendig gelernt habe (ja, das geht ;) ), stand ich vor der Entscheidung entweder ein menu_alter() zu gebrauchen oder ein theme_preprocess_xxx().
Da ich aber vorziehe, das theme selbst so wenig wie möglich zu verändern, so dass die Module so schnell wie möglich egal wo laufen, habe ich das folgendermaßen gelöst:
Anmerkung: ich schreibe grundsätzlich ein Modul beautify in das ich alles knalle was zwar projektspezifisch ist, aber keine Kernfunktion für das Projekt darstellt. So weiß ich automatisch wo ich in meinem Kram gucken muss.
<?php
/*
* @hook_preprocess()
*/
function beautify_preprocess(&$variables, $hook){
beautify_load_additional_metatags();
}
/**
* Alter views to make facebook friendly open graph meta tags
*/
function beautify_load_additional_metatags(){
//dpm("meta");
$nid = arg(1);
if(ctype_digit($nid)){
$node = node_load($nid);
...
?>
Also: jetzt lööfts.
Conclusion: Auch den Cracks auf stackexchange ist nicht immer zu trauen!!!!
Ach so:
Warum ich das überhaupt benötige:
Mein Auftraggeber ist scharf auf die Integration miitles share für seine fanpage (für die ich nichts kann btw).
Man ist jetzt sowohl auf der Übersichtsseite des Katalogs als auch in der Einzelansicht in der Lage den Inhalt mit dem korrekten Bild, Anzahl der Zimmer etc. zu teilen.
Habe ich schon erwähnt dass ich fb nicht mag???
Result: https://www.facebook.com/miacasaimmobilien
Immobilien kommen von: http://mia-casa-immobilien.de/katalog/101/immobilie
Ergebnis im Header, nicht durch metatags alleine zu schaffen:
<meta content="http://mia-casa-immobilien.de/sites/default/files/styles/fb/public/g75%20%282%29.jpg?itok=5hGLf7ug" property="og:image">
<meta content="Anzahl Zimmer: 21.00, Anzahl Küchen: 1, Anzahl Badezimmer: 5, Wohnfläche: 300.00 m², Gesamtfläche: 711.00 m² in Saarlouis." property="og:description">
Hui
am 17.04.2018 - 17:10 Uhr
hoppala, falscher beitrag :)
Danke maen für die
am 18.04.2018 - 06:25 Uhr
Danke maen für die ausführliche Beschreibung.
Das erinnert mich daran, dass ich auch schon lange mal die Metatags für Views dynamisieren wollte...
Ja, Facebook ist hassenswert, aber in manchen Bereichen für Marketing wirlich toll.
Ich ereiche auf meiner Gartenstauden-Webseite ungefähr 3x so viel Zugriffe und damit Affiliate-Umsatz, wenn ich gute Inhalte auf meine FB-Seite bringe.
Und Dein Kunde wird den Einsatz sicher danken. Immobilien gehen auch gut über Facebook.
Unser dröges Thema hier habe ich bei Facebook noch nicht erfolgreich vermarktet. ;-)