-
"Hook" im Backend?
Hallo,
ich suche eine Möglichkeit die gespeicherten Formulardaten im Backend zu verarbeiten.
Im Ablauf:
- Benutzer gibt im Frontend die Daten ein
- Admin prüft die Daten im Backend
- Bei Freigabe (Selectfeld) soll eine E-Mail an den Benutzer gesendet werden - Aber eben erst wenn die Freigabe durch den Admin erfolgt ist
Ich habe schon mit "processEfgFormData" experimentiert. Der wird aber offenbar (?) nur bei Eingabe im Frontend ausgelöst.
Ich stehe das nun ein wenig auf dem Schlauch. Gibt es für das Backend so einen Hook? Oder gibt es sogar schon etwas fertiges für diese Geschichte?
-
Hallo sysrun,
korrekt, der "processEfgFormData" wird nur bei Eingabe aus Frontend ausgelöst.
Im Backend stehen die callbacks "onsubmit_callback" und "save_callback" zur Verfügung.
Die einfachste Lösung wäre aber, der Admin gibt frei/veröffentlicht und nutzt anschließend die Mail-Funktion im Backend.
Schöne Grüße
Thomas
-
Hallo,
ich muss diesen Thread mal wieder ausgraben, da ich genau das gleiche Problem habe. EFG scheint im Backend keine Hooks aufzurufen. Konkret benötige ich die Möglichkeit, z.B. beim Verändern eines gespeicherten Datensatzes (der DCA wäre dann die generierte fd_blabla.php-Datei) bestimmte Operationen durchzuführen. Sowohl in der act=edit-Ansicht wie auch in der Listenansicht.
Schreibe ich das ganze zur Entwurfszeit in die generierte fd_...-Datei, klappt es. Diese wird aber, wie schon erwähnt, immer wieder neu erzeugt. Daher kann ich direkt dort nicht hineinschreiben. Ich habe das ganze auch schon mit einer eigenen fd_...-Datei im Modulverzeichnis versucht. Diese wird aber, scheinbar, weil sie nicht mit tl_... beginnt, von Contao nicht eingelesen. Auch in tl_formdata funktioniert das ganze nicht.
Kann mir da jemand weiterhelfen? Danke im Voraus!
Ciao The_Unknown
-
Da gibts ne Menge Möglichkeiten. loadDataContainer Hook, eigner onload_callback beim laden der dca/meineTabelle.php Datei (muss man mal gucken wie die vom efg hier heisst).
-
Mhm, das sind aber die Standardmöglichkeiten, oder? Die habe ich alle durch. Das Problem ist, dass ich sie in den generierten fd_...-Dateien definieren müsste, was nicht geht, weil sie eben generiert werden. Dann müsste ich zur Laufzeit die PHP-Dateien verändern oO
Das Problem ist an dieser Stelle efg-spezifisch, denke ich.
-
Die Tabelle bleibt doch aber immer gleich: $GLOBALS['TL_DCA']['tl_formdata']
Die Datei kannst du doch beliebig in einer Erweiterung nutzen. tl_formdata.php da einen ['config']['onload_callback'][] rein.
Da kommt dann der gesamte DataContainer rein und über ein paar Datenbank-Abfragen etc. kannst Du da beliebig manipulieren.
Man kann natürlich auch direkt die dynamischen Dateien ansprechen. Die setzen sich anscheinend aus fd_FORMID.php zusammen. So oft ändert sich die Formularid ja auch nicht :)
-
Naja, aber ich weiß ja nicht, welche Forms der Benutzer anlegt ;) Hardcoded ist dann also nicht.
Und tl_formdata habe ich natürlich schon ausprobiert, klappt leider nicht. Die Callbacks, die ich in einer eigenen tl_formdata-Datei definiere werden hartnäckig ignoriert ;) Es greift wirklich nur, wenn es in der generierten Datei steht. Wenn du Zeit und Lust hast, könntest du es dir evtl. mal anschauen. Ich baue daher gerade an einer Lösung, die generell einen Hook für die erzeugten Dateien bereitstellt und trotzdem den efg-Core unangetastet lässt. Wenn es fertig ist und funktioniert, kann ich es ja hier bereitstellen.
-
Tu dir keinen Zwang an, :) aber es klappt ohne Probleme alles zu manipulieren über den genannten Weg:
meinEfgManipulation/dca/tl_formdata.php
tl_formdata.php:
PHP-Code:
$GLOBALS['TL_DCA']['tl_formdata']['config']['onload_callback'][] = array('tl_formdata_efgFormDataManipulation', 'modifyDCA');
class tl_formdata_efgFormDataManipulation extends \Backend
{
/**
* DCA
*/
public function modifyDCA(\DataContainer $objDC)
{
$objInput = \Input::getInstance();
// name of the dyn. dca file
$strEfgTableFile = $objInput->get('do').'.php';
print_r($objDC);
}
}
Da kommt alles rein. Die Globalen kann man ja noch zusätzlich manipulieren.
-
Und das klappt auch mit onsubmit? Würde mich schwer wundern, weil ich genau das schon mal probiert habe und es nicht klappte??
Und OnSave-Callbacks für die generierten Felder würde ich damit wohl auch nicht bekommen. Ich kann ja meine Lösung dann mal posten, vielleicht hilft sie jemandem.
-
Klar:
PHP-Code:
$GLOBALS['TL_DCA']['tl_formdata']['config']['onsubmit_callback'][] = array('tl_formdata_efgFormDataManipulation', 'onSubmit');
class tl_formdata_efgFormDataManipulation extends \Backend
{
public function onSubmit(\DataContainer $objDc)
{
echo 'Hallo';
}
}
Einzelne Felder kannst Du natürlich auch überwachen. Musst dann den Feldnamen mal raussuchen und dann die callback Funktionen definieren.
$GLOBALS['TL_DCA']['tl_formdata']['fields']['FELDNAME']['load_callback'] = array
(
array('meineKlasse','meineFunktion')
),
-
Das ist echt schräg, dann habe ich damals wohl irgendeinen Fehler drin. Ich probiere das gleich aus :)
Edit: Ich habe den Fehler evtl. gefunden. Ich hatte den Kram im DCA-Ordner, nicht im config-Ordner.
Edit2: Mhm, komisch, jetzt geht's auch im dca-Ordner ;)
-
ähh, ja klar. im dca. Hab ich oben falsch geschrieben, sorry. Ich änders gleich
-
Mhm, es scheint doch nicht zu gehen. Ich hatte noch meine Lösung drin. Ich habe es jetzt genau umgesetzt wie du, und es funktioniert aber leider nicht.
Kann es sein, dass wir von verschiedenen Fällen reden? Es geht um ein dynamisch mit efg erzeugtes Formular und es geht um das Formular zum Bearbeiten eines Datensatzes ebendieser Formulardaten (Link z.B. http://fs.local/contao/main.php?act=...fd_test&id=208)
Hier die Datei, sie liegt in
Code:
<?php
// myclass/dca/tl_formdata.php
$dc = &$GLOBALS['TL_DCA']['tl_formdata'];
/**
* Callbacks
*/
$dc['config']['onsubmit_callback'][] = array('tl_myclass_formdata', 'createLogEntryFormDataDetails');
class tl_myclass_formdata extends \Backend
{
public function createLogEntryFormDataDetails(\DataContainer $objDc)
{
ob_start();
var_dump('KKK');
file_put_contents('C:\Users\testuser\debug.log', ob_get_clean() . "\n", FILE_APPEND);
}
}
-
-
OK, ich habe mich jetzt ein paar Stunden damit herumgeschlagen und so wie du es hinbekommen hast, dass die Field Callbacks gehen, ist mir etwas rätselhaft, denn die werden alle sauber in der efg_internal_dca_formdata.html5 überschrieben :)
Daher habe ich dieses Template zur DCA-Erstellung etwas abgewandelt, sodass man nun auch globale und Feld-Callbacks registrieren kann :D Leider kann man dafür die normalen 'fields'- und 'config'-Arrays nicht nehmen, da in der generierten DCA-Datei (fd_...) das ganze globale Array $GLOBALS['TL_DCA']['tl_formdata'] überschrieben werden muss. Dieses Array ist aber vor dem Überschreiben nicht leer, sondern mit allerlei anderen Werten gefüllt. Wenn ich nun die Callbacks einfach mit $GLOBALS['TL_DCA']['tl_formdata']['fields']... setzen würde, könnte ich im Template nicht mehr unterscheiden, was vom Programmierer und was vom Framework kommt. Daher die eigene Struktur.
Hier die Änderungen an efg_internal_dca_formdata.html5:
Code:
...
/**
* Table tl_formdata defined by form "<?php echo $this->arrForm['title']; ?>"
*/
// store global callbacks
$globalCallbacks = $GLOBALS['TL_DCA']['tl_formdata']['globalcallbacks'];
// store field callbacks
$fieldCallbacks = $GLOBALS['TL_DCA']['tl_formdata']['fieldcallbacks'];
$GLOBALS['TL_DCA']['tl_formdata'] = array
(
// Config
'config' => array
...
<?php if ($this->arrForm['key'] != 'feedback'): ?>
'formFilterKey' => 'form',
'formFilterValue' => '<?php echo $this->arrForm['title']; ?>'
<?php endif; ?>
)
);
// get global callbacks
if ($globalCallbacks)
$GLOBALS['TL_DCA']['tl_formdata']['config'] = array_merge($GLOBALS['TL_DCA']['tl_formdata']['config'], $globalCallbacks);
// get field callbacks
if ($fieldCallbacks)
$GLOBALS['TL_DCA']['tl_formdata']['fields'] = array_merge($GLOBALS['TL_DCA']['tl_formdata']['fields'], $fieldCallbacks);
// Detail fields in table tl_formdata_details
<?php foreach ($this->arrFields as $varKey => $varVals): ?>
...
Dann in einer eigenen tl_formdata.php:
Code:
$GLOBALS['TL_DCA']['tl_formdata']['fieldcallbacks']['companion']['save_callback'] = array
(
array('myClass', 'myFunction1')
);
$GLOBALS['TL_DCA']['tl_formdata']['globalcallbacks']['onsubmit_callback'] = array
(
array('myClass', 'myFunction2')
);