Hi Burn,
so ich hatte jetzt ausgiebig Zeit mich auf deiner Spielwiese umzusehen und habe auch herausgefunden wo es klemmt und wie du das Problem lösen kannst. Hierbei gibt es gute und schlechte Nachrichten.
Als erstes ist einmal zu sagen, dass Formulare sich natürlich nicht gut zum Cachen eignen und Visforms auch so geschrieben ist, dass es das Cachen von Formularen unterbindet. Allerdings gibt es bei der Kofiguration des Joomla! Caches eine Einstellung, die das einfach überschreibt.
Der Joomla! Cache arbeitet in mehreren Stufen und meines Erachtens ist die Dokumentation dafür nur mittelmäßig.
Auf der einen Seite gibt es ein System Plugin Cache. Dieses Plugin legt, wenn es aktiviert ist, von jeder Seite, wenn Sie einmal aufgerufen wird, einen Cache an, der die Seite eins zu eins enthält. Die gecachten Seiten werden im Verzeichnis cache/page gespeichert und wenn du die Seite das nächste Mal aufrufst wird einfach nur das gecachte Dokument genommen und angezeigt. Die eigentliche Componente (Visforms), wird überhaupt nicht mehr angefasst und die im Code verankerte Einstellung, dass nicht gecacht werden soll, deshalb nicht gesehen.
Visforms hat einen Schutzmechanismus, der verhindern soll, das ein Formular aus versehen mehr als einmal abgeschickt wird. Hierzu wird, wenn das Formular über den Visformscode zur Anzeige gebracht wird, eine Variable gesetzt. Wird das Formular abgeschickt, schaut der Code, ob die Variable gesetzt ist. Ist das nicht der Fall wird das Abschicken abgebrochen und er Fehler "Das Formular kann nur einmal abgeschickt werden" angezeigt. Ist die Variable gesetzt wird das Formular verschickt und die Variable gelöscht. Wenn nun über den System Cache direkt die gecachte Seite angezeigt wird, dann wird die Variable also nicht gesetzt und das Formular kann letztlich nicht verschickt werden. Auf deiner Seite ist nun noch erschwerend hinzukommen, dass dein Template die Messages nicht anzeigt, so dass die Fehlermeldung nicht angezeigt wurde. Du musst in dein Template das
Code:
<jdoc:include type="message" />
einbauen.
Auf der anderen Seite gibt es die Cache Einstellungen in der System Configuration. Dieses Caching hat erst einmal nichts mit dem Plugin zu tun und funktioniert auch dann, wenn das Plugin abgestellt ist. (Das ist explizit anders als z.B. bei den SEF Einstellungen, die nur funktionieren, wenn auch das SEF Pluguin aktiviert ist.) Gecacht werden dann die Standard Joomla! Komponenten, aber nicht einfach jede Seite. Visforms wird dann nicht gecachte wegen der Einstellungen im Visformscode.
Der erste Schritt zur Lösung deines Problem ist also, das Plugin System Cache zu deaktivieren.
Allerdings gibt es dann immernoch ein Problem mit dem Formular, dass du mit Hilfe des Moduls und des Plugin Loadposition in einen Artikel eingebaut hast. Denn der Artikel wird auch dann gecacht, wenn nur der Cache in der System Konfiguration aktiviert ist.
Ich habe ein bisschen gegooglet und eine Joomla! Erweiterung mit dem Namen CacheControl gefunden.
extensions.joomla.org/extensions/core-en...formance/cache/17783
Wenn du diese Plugin installiert, aktivierst und den Link auf den Artikel, der das Formular enthälst dort in den "Rules" einfügst, dann wird der Artikel mit dem Formular nicht mehr gecachte und das Formular im Artikel funktioniert.
Eine andere Möglichkeit wäre den oben erwähnten Mechanismus in Visforms abzustellen. Hierzu musst du allerdings den Code anfassen und die Änderung würde beim nächsten Update überschrieben. Vielleicht überlege ich mir allerdings, ob ich einen Parameter einbaue, mit dem man den Mechanismus abschalten kann, aber da bin ich mir noch nicht sicher.
Die entsprechenden Codezeilen sind in der Datei components/com_visforms/controller.php
Zeile 59
Code:
$_SESSION['vis_send_once'.JFactory::getApplication()->input->getInt('id')] = "1";
auskommentieren (oder löschen)
Code:
//$_SESSION['vis_send_once'.JFactory::getApplication()->input->getInt('id')] = "1";
und Zeile 144 - 150
Code:
if (isset( $_SESSION['vis_send_once'.$visform->id])) {
unset($_SESSION['vis_send_once'.$visform->id]);
} else {
JError::raiseWarning( 0, JText::_( "COM_VISFORMS_CAN_SENT_ONLY_ONCE" ));
return false;
}
auskommentieren (oder löschen)
Code:
/*if (isset( $_SESSION['vis_send_once'.$visform->id])) {
unset($_SESSION['vis_send_once'.$visform->id]);
} else {
JError::raiseWarning( 0, JText::_( "COM_VISFORMS_CAN_SENT_ONLY_ONCE" ));
return false;
}*/
Ich hatte immer mal wieder Leute die mit dem "Das Formular kann nur einmal verschickt werden" Probleme hatten, ohne dass wir rausfinden konnten woran es lag. Insofern ist dein Fehler für mich sehr hilfreich gewesen!
Herzliche Grüße und viel Erfolg,
Aicha