Ergebnis 1 bis 15 von 15

Thema: "Hook" im Backend?

  1. #1
    Contao-Nutzer
    Registriert seit
    13.08.2010.
    Beiträge
    9

    Standard "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?

  2. #2
    Contao-Fan Avatar von tom
    Registriert seit
    16.06.2009.
    Ort
    Ludwigsburg
    Beiträge
    385

    Standard

    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

  3. #3
    Contao-Nutzer
    Registriert seit
    29.01.2013.
    Beiträge
    157

    Standard

    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

  4. #4
    Contao-Urgestein Avatar von Tim G
    Registriert seit
    13.02.2010.
    Ort
    Lübeck
    Beiträge
    2.210
    User beschenken
    Wunschliste

    Standard

    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).
    http://www.tim-gatzky.de ˙ auch schon wieder 2 Jahre alt - wie die Zeit vergeht... muss mal umbauen.

  5. #5
    Contao-Nutzer
    Registriert seit
    29.01.2013.
    Beiträge
    157

    Standard

    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.

  6. #6
    Contao-Urgestein Avatar von Tim G
    Registriert seit
    13.02.2010.
    Ort
    Lübeck
    Beiträge
    2.210
    User beschenken
    Wunschliste

    Standard

    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
    http://www.tim-gatzky.de ˙ auch schon wieder 2 Jahre alt - wie die Zeit vergeht... muss mal umbauen.

  7. #7
    Contao-Nutzer
    Registriert seit
    29.01.2013.
    Beiträge
    157

    Standard

    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.

  8. #8
    Contao-Urgestein Avatar von Tim G
    Registriert seit
    13.02.2010.
    Ort
    Lübeck
    Beiträge
    2.210
    User beschenken
    Wunschliste

    Standard

    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.
    Geändert von Tim G (30.09.2013 um 16:56 Uhr)
    http://www.tim-gatzky.de ˙ auch schon wieder 2 Jahre alt - wie die Zeit vergeht... muss mal umbauen.

  9. #9
    Contao-Nutzer
    Registriert seit
    29.01.2013.
    Beiträge
    157

    Standard

    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.
    Geändert von The_Unknown (30.09.2013 um 16:29 Uhr)

  10. #10
    Contao-Urgestein Avatar von Tim G
    Registriert seit
    13.02.2010.
    Ort
    Lübeck
    Beiträge
    2.210
    User beschenken
    Wunschliste

    Standard

    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')
    ),
    Geändert von Tim G (30.09.2013 um 16:46 Uhr)
    http://www.tim-gatzky.de ˙ auch schon wieder 2 Jahre alt - wie die Zeit vergeht... muss mal umbauen.

  11. #11
    Contao-Nutzer
    Registriert seit
    29.01.2013.
    Beiträge
    157

    Standard

    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
    Geändert von The_Unknown (30.09.2013 um 16:52 Uhr)

  12. #12
    Contao-Urgestein Avatar von Tim G
    Registriert seit
    13.02.2010.
    Ort
    Lübeck
    Beiträge
    2.210
    User beschenken
    Wunschliste

    Standard

    ähh, ja klar. im dca. Hab ich oben falsch geschrieben, sorry. Ich änders gleich
    http://www.tim-gatzky.de ˙ auch schon wieder 2 Jahre alt - wie die Zeit vergeht... muss mal umbauen.

  13. #13
    Contao-Nutzer
    Registriert seit
    29.01.2013.
    Beiträge
    157

    Standard

    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);
    	}
    }
    Geändert von The_Unknown (30.09.2013 um 17:21 Uhr)

  14. #14
    Contao-Nutzer
    Registriert seit
    29.01.2013.
    Beiträge
    157

    Standard

    Keine Idee ?

  15. #15
    Contao-Nutzer
    Registriert seit
    29.01.2013.
    Beiträge
    157

    Standard

    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 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')
    );
    Geändert von The_Unknown (02.10.2013 um 11:16 Uhr)

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Ähnliche Themen

  1. Antworten: 10
    Letzter Beitrag: 28.08.2012, 15:05
  2. HOOK bei Formular option "Eingaben Speichern"
    Von lightman im Forum Formulare
    Antworten: 0
    Letzter Beitrag: 10.02.2011, 09:59
  3. "parallele" Navigation mit "active" bzw. "trail" Klasse?
    Von Reimi im Forum Layout / Templates / Holy Grail
    Antworten: 6
    Letzter Beitrag: 22.12.2009, 08:57
  4. Typolight Backend: Ansicht "Inhalte - Artikel", "Neue Aufgaben"
    Von althoffc im Forum Sonstiges zu Contao
    Antworten: 3
    Letzter Beitrag: 26.11.2009, 22:00

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •