Ergebnis 1 bis 14 von 14

Thema: Hook prepareFormData auf ein Formular beschränken

  1. #1
    Contao-Nutzer Avatar von Schmidty
    Registriert seit
    06.06.2011.
    Ort
    Pforzheim
    Beiträge
    203

    Frage Hook prepareFormData auf ein Formular beschränken

    Hallo,
    ich habe unter Contao 4.4.29 (PHP 7.2) zwei Formulare, beim einen werden Werte nach der Eingabe addiert, beim anderen subtrahiert. Die Berechnung wird mit dem Hook prepareFormData ausgeführt.
    Wenn ich nur einen Hook (Add.php oder Sub.php) aktiviert habe funktioniert dieser problemlos. Wenn ich aber beide Hooks aktiv habe, gibt es Probleme. Jetzt möchte ich die einzelnen Hooks für das jeweilige Formular beschränken. Ich habe es mit folgenden Varianten probiert, aber beides funktioniert nicht:

    Variante 1:
    PHP-Code:
    if ($arrSubmitted['formSubmit'] == 'auto_form_1')
    // bzw.
    if ($arrSubmitted['formSubmit'] == 'auto_form_2'
    Variante 2 (siehe hier):

    PHP-Code:
    if ($arrForm['id'] == '1')
    // bzw.
    if ($arrForm['id'] == '2'
    Ich bekomme folgende Fehlermeldung in var/logs:
    Code:
    [2018-11-27 21:29:29] app.CRITICAL: An exception occurred. {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalThrowableError(code: 0): Cannot use object of type Contao\\Form as array at /www/htdocs/xxxxxxxxxx/src/AppBundle/Add.php:14)"} []
    Die Caches wurden jedes Mal gelöscht, aber das änderte nichts am Ergebnis.
    Wie muss ich unter Contao 4 die Einschränkung auf das Formular vornehmen?
    Danke für die Hilfe.

    Hier noch die kompletten Inhalte von Add.php, Sub.php und der config.php.

    PHP-Code:
    <?php

    namespace AppBundle;

    use 
    Contao\Input;
    use 
    Symfony\Component\HttpKernel\Bundle\Bundle;

    class 
    Add extends AppBundle
    {
        public function 
    Plus(&$arrSubmitted$arrLabels$objForm$arrForm)
        {
            
    // Einschränkung auf das Formular
            // if ($arrSubmitted['formSubmit'] == 'auto_form_1') ===> funktioniert nicht
            
    if ($arrForm['id'] == '1'// funktioniert auch nicht
            
    {
            
                
    // Addieren von Werten aus dem Formular
            
            
    }
        }
    }

    PHP-Code:
    <?php

    namespace AppBundle;

    use 
    Contao\Input;
    use 
    Symfony\Component\HttpKernel\Bundle\Bundle;

    class 
    Sub extends AppBundle
    {
        public function 
    Minus(&$arrSubmitted$arrLabels$objForm$arrForm)
        {
            
    // Einschränkung auf das Formular
            // if ($arrSubmitted['formSubmit'] == 'auto_form_2') ===> funktioniert nicht
            
    if ($arrForm['id'] == '2'// funktioniert auch nicht
            
    {
            
                
    // Subtrahieren von Werten aus dem Formular

            
    }
        }
    }
    PHP-Code:
    <?php
        $GLOBALS
    ['TL_HOOKS']['prepareFormData'][] = array('AppBundle\Add''Plus');
        
    $GLOBALS['TL_HOOKS']['prepareFormData'][] = array('AppBundle\Sub''Minus');
    ?>

  2. #2
    Contao-Urgestein Avatar von cliffparnitzky
    Registriert seit
    08.10.2010.
    Ort
    Lüneburg
    Beiträge
    2.451
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Wenn du das wie folgt abfragst, sollte es gehen:

    PHP-Code:
    if ($arrSubmitted['FORM_SUBMIT'] == 'auto_form_1'
    // bzw. 
    if ($arrSubmitted['FORM_SUBMIT'] == 'auto_form_2'

  3. #3
    Contao-Nutzer Avatar von Schmidty
    Registriert seit
    06.06.2011.
    Ort
    Pforzheim
    Beiträge
    203

    Standard

    Zitat Zitat von cliffen Beitrag anzeigen
    Wenn du das wie folgt abfragst, sollte es gehen:

    PHP-Code:
    if ($arrSubmitted['FORM_SUBMIT'] == 'auto_form_1'
    // bzw. 
    if ($arrSubmitted['FORM_SUBMIT'] == 'auto_form_2'
    Hallo,
    wenn ich es so mache, wird keine Fehlermeldung mehr erzeugt aber die durchzuführende Berechnung wird nicht ausgeführt.

    PHP-Code:
    if ($arrSubmitted['FORM_SUBMIT'] == 'auto_form_1'
    {
         
    // Alles was hier steht wird nicht ausgeführt, auch nicht wenn das Formular ID=1 versendet wird
         // Addieren von Werten aus dem Formular

    Hat noch jemand eine Idee?
    Geändert von Schmidty (28.11.2018 um 10:22 Uhr)

  4. #4
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.112
    Partner-ID
    10107

    Standard

    An den Hook werden folgende Daten übergeben: https://github.com/contao/contao/blo.../Form.php#L316
    Der letzte Parameter is also das \Contao\Form Objekt. Da kannst du bspw. entweder auf die interne ID des Formulars überprüfen, oder auf die formID, die du selbst vergeben hast. Oder auch auf CSS IDs oder Klassen, die du dem Formular gegeben hast.

  5. #5
    Contao-Nutzer Avatar von Schmidty
    Registriert seit
    06.06.2011.
    Ort
    Pforzheim
    Beiträge
    203

    Standard

    Wenn ich dann auf die interne ID 2 prüfen möchte muss das doch dann so aussehen:

    PHP-Code:
    if ($objForm['id'] == '2') { . . . } 
    Es gibt zwar keine Fehlermeldung, aber die Anweisungen werden nicht ausgeführt, so wie in #3 beschrieben.
    Wie muss die Prüfung für die Formular-ID 2 richtig aussehen?
    Danke für die Hilfe.

  6. #6
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.112
    Partner-ID
    10107

    Standard

    Zeige bitte deinen gesamten Code. So sieht man nicht, was $objForm nun überhaupt sein soll.

  7. #7
    Contao-Nutzer Avatar von Schmidty
    Registriert seit
    06.06.2011.
    Ort
    Pforzheim
    Beiträge
    203

    Standard

    Hallo,
    der Code und der Aufbau stehen im ersten Post - hier noch einmal die gesamte Add.php (die Sub.php ist gleich bis auch die eigentliche Subtraktion. Die Feldnahmen sind unterschiedlich (zahl1, zahl2 und ergebnisadd bei der Add.php, zahl3, zahl4 und ergebnissub bei der Sub.php).
    Add.php soll mit der Formular ID 1 und Sub.php mit der Formular ID 2 ausgeführt werden.
    Die Hooks Add.php und Sub.php funktionieren einzeln wie sie sollen, nur bei der Einschränkung auf das entsprechende Formular gibt es Probleme. Ich habe nach dieser Anleitung gearbeitet.

    Und hier die Add.php:

    PHP-Code:
    <?php

    namespace AppBundle;

    use 
    Contao\Input;
    use 
    Symfony\Component\HttpKernel\Bundle\Bundle;

    class 
    Add extends AppBundle
    {

        public function 
    Plus(&$arrSubmitted$arrLabels$objForm)
        {

            
    // Einschränkung auf das Formular
            
    if ($objForm['id'] == '1')
            {
                
    // Addieren von Werten aus dem Formular und formatieren der Zahlen
                
    $arrSubmitted['ergebnisadd'] = $arrSubmitted['zahl1'] + $arrSubmitted['zahl2'];

                
    $arrSubmitted['zahl1'] = number_format ($arrSubmitted['zahl1']  , ,  ',' '.');
                
    $arrSubmitted['zahl2'] = number_format ($arrSubmitted['zahl2']  , ,  ',' '.');
                
    $arrSubmitted['ergebnisadd'] = number_format ($arrSubmitted['ergebnisadd']  , ,  ',' '.');
            
                \
    Input::setPost('zahl1'$arrSubmitted['zahl1']);
                \
    Input::setPost('zahl2'$arrSubmitted['zahl2']);
                \
    Input::setPost('ergebnisadd'$arrSubmitted['ergebnisadd']);

                return 
    $arrSubmitted;
            }
        }
    }

  8. #8
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.112
    Partner-ID
    10107

    Standard

    Mehrere Anmerkungen dazu:

    • Warum leitet deine Add Klasse vom AppBundle ab? Das brauchst du nicht.
    • Deine Klasse befindet sich im Root Namespace deines AppBundle, normalerweise würde man das zB. eher in den Namespace AppBundle/EventListener geben.
    • Dein Funktionsname "Plus" ist nicht sehr sprechend. Gemäß der Symfony Konvention sollte es onPrepareFormData sein.
    • Du hast den vierten Parameter für das \Contao\Form Objekt vergessen, mit dem du an die Daten kommen könntest, die du brauchst.

  9. #9
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.112
    Partner-ID
    10107

    Standard

    Zitat Zitat von Schmidty Beitrag anzeigen
    Hallo,
    der Code und der Aufbau stehen im ersten Post - hier noch einmal die gesamte Add.php
    Das stimmt auf jeden Fall nicht. Dieser Code sieht ganz anders aus. Daher auch die Nachfrage nach deinem tatsächlichen Code.

  10. #10
    Contao-Urgestein Avatar von cliffparnitzky
    Registriert seit
    08.10.2010.
    Ort
    Lüneburg
    Beiträge
    2.451
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    ... und: gib dir via print_f doch mal den Inhalt des $arrSubmitted aus ... dann weißt du u.U. auch schon wieder mehr

  11. #11
    Contao-Nutzer Avatar von Schmidty
    Registriert seit
    06.06.2011.
    Ort
    Pforzheim
    Beiträge
    203

    Standard

    Danke für die Antworten - die für Programmierer ja durchaus hilfreich sein können.
    Aber ich bin kein Programmierer und komme hier nicht weiter.
    Ich habe beim Contao-Camp in Jever gezeigt bekommen, wie man den Hook prepareFormData unter Contao 4 verwendet. Da haben wir in der Session einen "Rohling" gebaut, der immer wieder verwendet werden kann, es müssen nur die Inhalte der gewünschten Datenaufbereitung und die Dateinamen an die Bedürfnisse angepasst werden. Ob das, was dort gezeigt wurde richtig ist weiss ich nicht - aber es funktioniert bisher problemlos.
    Diese Vorlage hab eich jetzt auch verwendet. Nur ist es in diesem Fall so, dass ich zwei Formulare habe, die zwei unterschiedliche Hooks benötigen, deshalb benötige ich die Einschränkung der einzelnen Hooks auf das jeweilige Formular. Das scheint aber nicht so einfach zu sein - und mit den Tipps kann ich leider nichts anfangen weil ich kein Programmierer bin.
    Die Namen und die Klassen habe ich der Funktion entsprechend gewählt (Add.php für die Addition und Sub.php für die Subtraktion).

    Die Hooks funktionieren ja einzeln wie gewünwcht, nur die Einschränkung auf das jeweilige Formular bekomme ich nicht hin, deshalb wäre ich dankbar, wenn ich ein fertiges Beispiel bekommen könnte.

  12. #12
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.112
    Partner-ID
    10107

    Standard

    PHP-Code:
    <?php

    namespace AppBundle\EventListener;

    use 
    Contao\Form;

    class 
    FormHookListener
    {
        public function 
    onPrepareFormData(array &$submitted, array &$labels, array &$fieldsForm $form)
        {
            if (
    $form->formID == 'loremIpsum') {
                
    // …
            
    }

            if (
    $form->formID == 'dolorSit') {
                
    // …
            
    }
        }
    }
    Geändert von Spooky (28.11.2018 um 14:47 Uhr)

  13. #13
    Contao-Urgestein Avatar von cliffparnitzky
    Registriert seit
    08.10.2010.
    Ort
    Lüneburg
    Beiträge
    2.451
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat Zitat von Schmidty Beitrag anzeigen
    ...Aber ich bin kein Programmierer und komme hier nicht weiter....
    Hmm, da muss man sicher nicht von ausgehen, wenn man als ersten Post einen großen Klumpen Code zeigt.

    Für manche Dinge, wie z.B. der Implementierung von Hooks, muss man Kenntnisse zur Programmierung haben bzw. sich aneignen!

  14. #14
    Contao-Nutzer Avatar von Schmidty
    Registriert seit
    06.06.2011.
    Ort
    Pforzheim
    Beiträge
    203

    Daumen hoch

    So, jetzt bin ich wieder zuhause :-)

    Danke Spooky für die Hilfe. Ich habe es gerade ausprobiert, so funktioniert das Ganze.

    Zitat Zitat von cliffen Beitrag anzeigen
    Hmm, da muss man sicher nicht von ausgehen, wenn man als ersten Post einen großen Klumpen Code zeigt.

    Für manche Dinge, wie z.B. der Implementierung von Hooks, muss man Kenntnisse zur Programmierung haben bzw. sich aneignen!
    Ich bin ja gerade dabei, mich einigermaßen einzuarbeiten, bin aber Anfänger, vor allem mit Symfony. Ich möchte auch keine Erweiterungen erstellen, die beauftrage ich. Aber ein paar Anpassungen sind ab und zu notwendig und da gehört auch mal ein Hook dazu. Mit Contao 4 ist in diesem Bereich vieles anders geworden - nicht unbedingt leichter für normale Anwender. Gerade bei einigen Zusammenhängen habe ich noch Probleme wie z.B. bei obigem Problem. Das hat bisher immer mit
    PHP-Code:
    if ($arrSubmitted['FORM_SUBMIT'] == 'auto_form_1'
    funktioniert und da wurden mit folgender Zeile die notwendigen Parameter übergeben
    PHP-Code:
    public function xyzabc(&$arrSubmitted$arrLabels$objForm$arrForm
    Das funktioniert jetzt wohl nicht mehr, da hat es bei Contao 4 sicherlich Änderungen gegeben. Ich denke, für Fragen solcher Art gibt es das Forum und da ist es für andere schwer zu erkennen, ob jemand fertige Snippets postet (so wie ich) oder ob das ein Profi ist. Nachdem ich mich als normaler Anwender geoutet habe, wurde mir ja entsprechend geholfen. Ich denke, dass die Tipps aus diesem Beitrag vielen anderen Anwendern helfen werden, auch wenn die es nicht zugeben (wollen).
    Noch einmal Danke für die Hilfe :-)

Aktive Benutzer

Aktive Benutzer

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

Lesezeichen

Lesezeichen

Berechtigungen

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