View previous topic :: View next topic |
Author |
Message |
Paykoman Smarty Rookie
Joined: 07 May 2011 Posts: 34
|
Posted: Wed Sep 11, 2013 11:49 am Post subject: Doppeltes tempalte fetchen verhindern... |
|
|
Hallo,
nun habe ich hier gerade schon ne Stunde lang mein Hook-System unter die Lupe genommen um herauszufinden warum mein Objekt zwei mal untereinander angezeigt wird nur weil der Hook eben zwei mal ausgeführt wird also einmal an zwei verschiedene Stellen des templates...
Also das Objekt wird dann 4 mal insgesamt angezeigt, eben doppelt je Position, anstell von nur eine Ausgabe je Position.
Nun bin ich zu dem Ergebnis gekommen, das es nicht am Hook liegt sondern an Smarty, das Objekt wird so geladen:
Code: | $return = $smarty->fetch('modules/gfw/captcha/captcha'.tpl_ext);
return $return; |
Dies befindet sich innerhalb eine Funktion die beim Laden der Seite eben zwei mal aufgerufen wird, um es mal Bildlich zu verbessern ein und der Selbe Block der einmal im Header und einmal im Footer geladen wird, blos das die Blöcke zwei mal erscheinen je Header/Footer.
Getestet habe ich in dem ich das return "test"; geändert habe und an beiden Positionen jeweils nur ein "Test" erschienen ist und nicht "TestTest" wie es hätte sein müssen wenn es am Hook liegen würde.
Jetzt interessiere ich mich natürlich für eine Möglichkeit wie ich smarty daran hindern kann das er ein bereits ge-fetchtes Template erneut fetcht bzw. bei jedem fetchen es an den Positionen noch mal mit ausgibt
Ich hoffe Ihr habt ein paar tipps für mich.
MFG: Pay |
|
Back to top |
|
Paykoman Smarty Rookie
Joined: 07 May 2011 Posts: 34
|
Posted: Wed Sep 11, 2013 12:03 pm Post subject: |
|
|
Habe schon ein Ansatz gefunden allerdings sagt mein smarty V3 das es die Funktion nicht gibt
http://www.smarty.net/docsv2/de/api.is.cached.tpl
Wäre allerdings auch keien Optimale Lösung da man zum programmieren den Cache ja nciht ausschalten kann da sonst der Fehler ja wieder auftretten würde
Aber sowas in der Art könnte die Lösung sein, scheinbar gibt es da aber nciht viele mit dem selben Problem |
|
Back to top |
|
U.Tews Administrator
Joined: 22 Nov 2006 Posts: 5068 Location: Hamburg / Germany
|
Posted: Wed Sep 11, 2013 2:28 pm Post subject: |
|
|
$smarty->fetch() selbst macht ja keine Ausgabe.
Ohne zu wissen wie Dein Hook-System funktioniert kann man Dir schwer helfen.
Was machst Du denn mit dem $return Wert?
Caching hat meiner Meinung nach damit gar nichts zu tun.
PS: In Smarty3 heißt die Funktion isCached() |
|
Back to top |
|
Paykoman Smarty Rookie
Joined: 07 May 2011 Posts: 34
|
Posted: Wed Sep 11, 2013 5:55 pm Post subject: |
|
|
Hi Tews,
danke für deine Antwort.
das mit den Hook hätte ich besser erst ganicht erwähnen soll, war klar das sich darauf versteift wird
Es liegt definitiv nicht am Hook-System, wie oben schon erwähnt habe ich es ja getestet, das return enthält nichts außer das gefetchte Template.
Wenn das return auf Grund vom Hook-System zwei mal ausgegeben würde weil es an an zwei Stellen eingebunden ist dann hätte das return "test"; auch zwei mal ausgegeben werden müssen.
Aber ich habe das System auch funktionstechnisch noch überprüft und in den Zwischenschritten Ausgaben machen lassen bevor ich auf die Idee kam im return nur ein Wort zu packen damit es von Smarty getrennt ist.
Ansehen kannst du dir trotzdem unter:
Doppelte Ausgabe : hier
Keine doppelte Ausgabe : hier
Du musst dann rechts oben bei "Sign in" klicken um das versteckte Formular zu sehen.
Wenn man die activation Seite aufhat tritt eben der Fall ein das mein Captcha zweimal gefetcht wird, eben im Content und in dem verstecktem Formular.
Und noch mal aufs Hook-System ein zu gehen, hier wird nichts anderes gemacht als die jeweiligefunktion zwischen zu speichern wenn diese dann an der reihe ist wird sie mittels call_user_func() ausgeführt...
Im Falle des Captchas sieht es eben so aus:
Code: | public function getGC()
{
global $smarty, $wwm;
return $smarty->fetch('modules/gfw/captcha/captcha'.tpl_ext);
} |
Dies wird einmal im Content und rechts oben ausgeführt und die funktion wird eben nciht verdoppelt so das zwei mal call_user_func() aufgerufen würde wodurch der replikationsfehler erklärbar wäre.
Bei dem Link den ich oben gepostet habe wird von smarty ja eben genau das problem auch beschrieben das wenn zwei gleiche Objecte via Fetch geladen werden es dupliziert wird.
MFG: Pay
:: EDIT ::
Hiermit http://www.smarty.net/docs/zh_CN/api.is.cached.tpl
Wird es eben leider nur Ansatzweise gelöst
Es wird dann nur noch dort ausgegeben welche Stelle zu erst geparst wird, also im content und rechts oben wird es dann eben nicht mehr ausgegeben |
|
Back to top |
|
U.Tews Administrator
Joined: 22 Nov 2006 Posts: 5068 Location: Hamburg / Germany
|
Posted: Wed Sep 11, 2013 6:57 pm Post subject: |
|
|
Wie ich es vorher schon gesagt habe $smarty->fetch() macht ja selbst keine Ausgabe.
Also muss irgendwo das Ergebnis von getGC() doppelt in Dein Output kommen. Was machst Du denn mit dem Ergebnis von getGC(). Wie gelangt in den Content bzw. dem Formular?
btw ich finde auf deinen Links kein "Sign in" |
|
Back to top |
|
Paykoman Smarty Rookie
Joined: 07 May 2011 Posts: 34
|
Posted: Wed Sep 11, 2013 7:11 pm Post subject: |
|
|
Habe auch nie behaupt das es eine Ausgabe macht, nur das es eben den dopplungsfehler verursacht da es doppelt gemoppelt fetcht sobald man zwei mal das gleiche fetchen möchte...
Wenn es tatsächlich am hook liegen würde, dann würde die oben genannte if Abfrage das Problem nicht beseitig da die funktion immer noch in jedemfall zwei mal aufgerufen würde und in jedemfall eine Ausgabe erfolgen würde...
Da dies aber nicht passiert liegt es schlicht weg an Smarty, zumal Smarty ja selber sagt das fetchen von 2 gleichen Objekten führt ggf. zu Fehlern...
Quote: | public function getGC()
{
global $smarty, $wwm;
if( !$smarty->isCached('modules/gfw/captcha/captcha'.tpl_ext) )
{
$ret = $smarty->fetch('modules/gfw/captcha/captcha'.tpl_ext);
}
else
{
$ret = "Ausgabe";
}
return $ret;
} |
Naja ganz rechts oben in dem Balken sollte "Sign in" sein. |
|
Back to top |
|
U.Tews Administrator
Joined: 22 Nov 2006 Posts: 5068 Location: Hamburg / Germany
|
Posted: Wed Sep 11, 2013 7:32 pm Post subject: |
|
|
Also baue doch mal in getGC() mit echo eine Debug Ausgabe ein um zu kontrollieren wie oft getGC() aufgerufen wird.
Im Grunde belegst Du ja mit Deiner if !isCached Abfrage selbst das getGC() zu oft gerufen wird und Du den $ret Wert unterdrücken musst.
Das ist aber kein Problem von Smarty.
Jeder Aufruf von fetch() liefert immer den Template Content zurück. |
|
Back to top |
|
Paykoman Smarty Rookie
Joined: 07 May 2011 Posts: 34
|
Posted: Wed Sep 11, 2013 8:01 pm Post subject: |
|
|
Naja warum es beweisen soll das es zu oft aufgerufen wird verstehe ich nicht!
Denn die funktion gibt bei jedem Aufruf etwas aus egal ob es das tpl von smarty ist oder zum debuggen mein "test" wenn die Funktion Tatsächlich öfters aufgerufen würde als sie sollte, hätte ich an beiden Stellen die toppelte Ausgabe was ja aber nicht ist!
Trotzdem hier noch mal der Beweis das es nicht am Hook liegt:
Code: | public function getGC()
{
global $smarty, $wwm;
if( !isset($_SESSION['test']) ) {$_SESSION['test'] = 0;}
$_SESSION['test']++;
if( !$smarty->isCached('modules/gfw/captcha/captcha'.tpl_ext) )
{
$ret = $smarty->fetch('modules/gfw/captcha/captcha'.tpl_ext);
}
else
{
$ret = "Ausgabe";
}
return $ret;
} |
Am ende meines Scripts im __destruct lasse ich die test-session löschen und im Footer wird die aktuelle Zahl ausgegeben.
Und ja auf auth.php?authpage=activation also da wo die Funktion 2 mal aufgerufen werden soll, wird diese exakt zwei mal aufgerufen und nicht 4 mal...
Das problem ist nun mal Smarty.. Denn wie schon 3 mal gesagt, es verdoppelte die fetches sofern man die gleichen Template-Dateien fetchen tut |
|
Back to top |
|
U.Tews Administrator
Joined: 22 Nov 2006 Posts: 5068 Location: Hamburg / Germany
|
Posted: Wed Sep 11, 2013 8:15 pm Post subject: |
|
|
Sag mal wie hast du zur Zeit
$smarty->force_compile true oder false?
welchen wert hat $smarty->caching? |
|
Back to top |
|
Paykoman Smarty Rookie
Joined: 07 May 2011 Posts: 34
|
Posted: Wed Sep 11, 2013 8:19 pm Post subject: |
|
|
HuHu,
Ich habe bei mir ne eigene Config angelegt wo die sachen per define festgelegt werden und dann in smarty eingebunden sind =)
define('force_compile', true);
ein echo $smarty->caching; gibt 1 also true aus... |
|
Back to top |
|
U.Tews Administrator
Joined: 22 Nov 2006 Posts: 5068 Location: Hamburg / Germany
|
Posted: Wed Sep 11, 2013 8:26 pm Post subject: |
|
|
Mach bitte mal
Code: | public function getGC()
{
global $smarty, $wwm;
$ret = $smarty->fetch('modules/gfw/captcha/captcha'.tpl_ext);
var_dump($ret);
return $ret;
}
|
Wie oft siehst du den var_dump() und sind darin die Inhalte doppelt.
Ich kann deine Effekt jedenfalls nicht reproduzieren und es wäre bestimmt auch schon an anderer Stelle aufgefallen. Aber nichts ist unmöglich..... |
|
Back to top |
|
Paykoman Smarty Rookie
Joined: 07 May 2011 Posts: 34
|
Posted: Wed Sep 11, 2013 8:29 pm Post subject: |
|
|
naja debug erscheint zwei mal da die Funktion ja auch nur zwei mal aufgerufen wird, die Inhalte sind jeweils wieder doppelt... |
|
Back to top |
|
U.Tews Administrator
Joined: 22 Nov 2006 Posts: 5068 Location: Hamburg / Germany
|
Posted: Wed Sep 11, 2013 8:31 pm Post subject: |
|
|
Also der Inhalt ist doppelt im var_dump(); oder nur deine Anzeige? |
|
Back to top |
|
Paykoman Smarty Rookie
Joined: 07 May 2011 Posts: 34
|
Posted: Wed Sep 11, 2013 8:37 pm Post subject: |
|
|
hmm so wie ich das sehe nur die Anzeige, der string in var enthält immer genau 464 zeichen also auch auf der Seite wo die Ausgabe nur einmal erfolgt...
Sprich einaml ausführen sind 464 zeicehn,auf der Seite wo das element zwei mal gefetcht wird, enthalten bei vars eben auch 464 aber es wird zwei mal angezeigt... |
|
Back to top |
|
U.Tews Administrator
Joined: 22 Nov 2006 Posts: 5068 Location: Hamburg / Germany
|
Posted: Wed Sep 11, 2013 8:42 pm Post subject: |
|
|
Also liegt es nicht am fetch().....
was passiert wenn du jetzt force_compile auf false setzt? |
|
Back to top |
|
|