Seit Drupal 6.13 wird hook_nodeapi pro Node u.U. 2mal durchlaufen?!
am 06.07.2009 - 17:32 Uhr in
Hallo, seitdem ich das neueste Drupal 6.13 installiert habe wird hook_nodeapi (nur auf manchen Unterseiten) 2mal durchlaufen:
function myhook_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
global $user;
switch ($op) {
case 'prepare':
echo "!";
break;
case 'view':
echo "?";
break;
case 'alter':
echo "#";
break;
...
Die Echos dienen nur dazu um zu zeigen, dass die Prozesse 2mal durchlaufen werden, denn es erscheinen !?# und nochmal !?# (unter Nicht-Beachtung der Reihenfolge).
Das war zuvor (Drupal 6.12) nicht so. das tritt aber nicht bei allen Unterseiten auf, nur bei manchen. Ich habe Alias URLs und Globale Weiterleitung an (letzteres habe ich versuchsweise auch schon ausgeschaltet, hat aber nichts geholfen).
Hier scheint sich irgendwas geaendert zu haben bzgl. wie man damit umzugehen hat, oder es ist schlichtweg ein Bug.
Hat das Problem noch jemand? Bei mir kollabiert deshalb ein Modul, denn das wird eben auch 2mal ausgefuehrt und frueher nur 1mal.
Mir wird wohl erstmal nix uebrig bleiben als Drupal 6.12 wieder quasi ZURUECK zu installieren?
- Anmelden oder Registrieren um Kommentare zu schreiben

hook_nodeapi
am 06.07.2009 - 17:34 Uhr
Moin.
Wird denn bei jedem Durchlauf auch das gleiche Nodeobjekt behandelt?
Stefan
--
sei nett zu Deinem Themer
gute idee! jawohl, habs mir
am 06.07.2009 - 17:42 Uhr
Gute Idee! Die Frage muss ich bejahen, habs mir eben mit print_r($node) ausgeben lassen:
stdClass Object ( [nid] => 23 [type] => page [language] => de [uid] => 1 [status] => 1 [created] => 1237199541 [changed] => 1237410671 [comment] => 0 [promote] => 0 [moderate] => 0 [sticky] => 0 [tnid] => 0 [translate] => 0 [vid] => 23 [revision_uid] => 1 [title] => Stau Verkehr ...
stdClass Object ( [nid] => 23 [type] => page [language] => de [uid] => 1 [status] => 1 [created] => 1237199541 [changed] => 1237410671 [comment] => 0 [promote] => 0 [moderate] => 0 [sticky] => 0 [tnid] => 0 [translate] => 0 [vid] => 23 [revision_uid] => 1 [title] => Stau Verkehr ...
Wie gesagt, tritt dieser Effekt des 2mal hook_nodeapi Durchlaufens anscheinend nur auf bestimmten Seiten auf, die Umstaende WANN sowas auftritt sind mir leider selber noch nicht bekannt. Das Ganze passiert erst seit Drupal 6.13.
trace
am 06.07.2009 - 17:41 Uhr
Hm, dann mach mal ein debug_backtrace(). Dann siehst Du, woher der Aufruf kommt.
Vielleicht ist da ja ein Modul, dass das nochmal aufruft?
Oder der Beitrag wird wirklich nochmal auf der Seite angezeigt (als feed oder sonstwie). Du sagst ja auch, dass es nicht auf allen Seiten auftritt. Irgendein Unterschied muss da also sein.
Vielleicht Typ-spezifisch?
hth,
Stefan
--
sei nett zu Deinem Themer
debug_backtrace() eingebaut
am 06.07.2009 - 17:56 Uhr
debug_backtrace() eingebaut in myhook_nodeapi op 'alter' ergibt :
DEBUG: Array ( [0] => Array ( [file] => /var/www/drupal/modules/node/node.module [line] => 673 [function] => myhook_nodeapi [args] => Array ( [0] => stdClass Object ( [nid] => 23 [type] => page [language] => de [uid] => 1 [status] => 1 [created] => 1237199541 [changed] => 1237410671 [comment] => 0 [promote] => 0 [moderate] => 0 [sticky] => 0 [tnid] => 0 [translate] => 0 [vid] => 23 [revision_uid] => 1 ...
DEBUG: Array ( [0] => Array ( [file] => /var/www/drupal/modules/node/node.module [line] => 673 [function] => myhook_nodeapi [args] => Array ( [0] => stdClass Object ( [nid] => 23 [type] => page [language] => de [uid] => 1 [status] => 1 [created] => 1237199541 [changed] => 1237410671 [comment] => 0 [promote] => 0 [moderate] => 0 [sticky] => 0 [tnid] => 0 [translate] => 0 [vid] => 23 [revision_uid] => 1 ...
Das sagt mir also auch nur dass hier mein hook_nodeapi 2mal gecalled wird. Okay, jetzt koennte man wiederum in node/node.module line 673 schauen und dann das Ganze weiter rueckwaerts. Demnach ists aber wohl ein (neuer) Drupal Bug, oder? Vielleicht haengts auch u.U. mit einem anderen Modul zusammen (z.B. habe ich nodewords fuer die Meta Tags).
Bei den meisten Modulen die hook_nodeapi verwenden duerfte das 2mal Aufrufen nicht auffallen, aber manche Module lassen sich nicht 2mal callen ;-)
HM Schon abstruß Der Diff
am 06.07.2009 - 18:02 Uhr
HM Schon abstruß
Der Diff ändert auch nichts in dem Bereich, ruft irgendwie nodeapi auf oder ähnliches.
--------------
Blog www.freeblogger.org: Deutscher IRC-Channel: irc.freenode.net #drupal.de ... Jabber-me: dwehner@im.calug.de
SirFiChi ist auch dein Halbgott.
der typ ist uebrigens fuer
am 06.07.2009 - 19:30 Uhr
der typ ist uebrigens fuer alle seiten "page" - also sowohl bei den seiten wo das nicht, wie auch bei den seiten wo das auftritt.
und, noch mehr details: wenn 2mal durchgerannt wird, wird anscheinend wird nur das ergebnis des 2. durchlaufs auch angewendet. spricht wenn man in der op "alter" z.b. was vom node content ersetzt, wird es nur im 2. durchgang ersetzt. wirkt fast wie "schluckauf".
es ist natuerlich durchaus moeglich dass dieses szenario z.b. nur mit bestimmten modulen auftritt.
leider hab ich nix da womit man das jetzt ausfuehrlich "rueckwaerts debuggen" tracen koennte, falls das z.b. zend kann. ich nehm eigentlich immer nur notepad++ zum scripten ;)
habe das modul jetzt so abgeaendert dass es auch 2mal gecalled werden kann, aber dass manche nodes quasi 2mal gerendert werden ist damit nur umgangen, m.E. nicht geloest.
Debug mit $nodeapiCallCount
am 07.07.2009 - 11:14 Uhr
mich laesst das nicht los, ich wuerde das jetzt gerne wirklich verstehen ;-) darum lasse ich mir mal quasi mitzaehlen wie oft myhook_nodeapi gecalled wird:
$nodeapiCallCount = 0;
function myhook_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
global $nodeapiCallCount;
$nodeapiCallCount++;
echo "$op:$nodeapiCallCount ";
Das Ergebnis:
auf Seiten die NICHT 2mal gerendert werden erscheint:
load:1 view:2 alter:3 load:4
auf Seiten die 2mal gerendert werden erscheint:
load:1 view:2 alter:3 view:4 alter:5 load:6
Jemand Lust oder Ahnung das zu interpretieren?
hat das "problem" sonst echt
am 14.07.2009 - 10:19 Uhr
hat das "problem" sonst echt keiner? wahrscheinlich faellt es nur nicht jedem auf, weil viele module kein probleme damit haben 2mal pro node den rendering prozess zu durchlaufen ;)
macht es sinn das irgendwo und wenn ja wie zu reporten? wenns ein bug ist, halt ich ihn schon fuer nicht gerade "unelementar" ;)
Doch ich hab auch das
am 20.07.2009 - 22:28 Uhr
Doch ich hab auch das "Problem"... ich nutze unter case: "load" ->
$taxonomy = taxonomy_node_get_term($node, 'tid');und es wird mir zweimal was ausgespuckt...Nr.1:
Array
(
[94] => stdClass Object
(
[tid] => 94
[vid] => 8
[name] => Giving 2009
[description] =>
[weight] => 0
)
[87] => stdClass Object
(
[tid] => 87
[vid] => 6
[name] => Edelstahl
[description] =>
[weight] => 0
)
[133] => stdClass Object
(
[tid] => 133
[vid] => 6
[name] => Kreide
[description] =>
[weight] => 0
)
[80] => stdClass Object
(
[tid] => 80
[vid] => 3
[name] => Sonstiges
[description] =>
[weight] => 3
)
[16] => stdClass Object
(
[tid] => 16
[vid] => 3
[name] => Essen + Trinken
[description] =>
[weight] => 33
)
)
und Nr.2:
Array
(
[94] => stdClass Object
(
[tid] => 94
[vid] => 8
[name] => Giving 2009
[description] =>
[weight] => 0
)
[141] => stdClass Object
(
[tid] => 141
[vid] => 6
[name] => Nylon
[description] =>
[weight] => 0
)
[73] => stdClass Object
(
[tid] => 73
[vid] => 3
[name] => Schirme
[description] =>
[weight] => 2
)
[39] => stdClass Object
(
[tid] => 39
[vid] => 3
[name] => Outdoor + Werkzeuge
[description] =>
[weight] => 24
)
)
Also ich weis wirklich nicht, wo der 2te auswurf herkommt... Schirme und Nylon... muss mal den Zusammenhang ergründen...
hast du vlt. auf deiner
am 20.07.2009 - 23:23 Uhr
hast du vlt. auf deiner Seite neben dem eigentliche Node auch noch eine Block oder sonstiges wo du node_load aufrufst.
Aufrufe für verschiedene Nodes sind eigentlich normal.
--------------
Blog www.freeblogger.org: Deutscher IRC-Channel: irc.freenode.net #drupal.de ... Jabber-me: dwehner@im.calug.de
SirFiChi ist auch dein Halbgott.