Contao-Camp 2024
Ergebnis 1 bis 7 von 7

Thema: Klasse \Contao\Form in eigenem Namespace überlagern

  1. #1
    Contao-Fan Avatar von Arno
    Registriert seit
    11.12.2009.
    Ort
    Potsdam-Babelsberg
    Beiträge
    290

    Standard Klasse \Contao\Form in eigenem Namespace überlagern

    Hallo,

    ich versuche gerade in einer als Contao 4 Bundle angelegten Erweiterung die Funktion "processFormData" in der Formular-Klasse "\Contao\Form" zu überlagern.
    Das will aber nicht funktionieren, sprich meine Klasse wird beim Abschicken eines Formulars ignoriert.

    In der Variante für Contao 3 hat das immer ohne Probleme funktioniert. Da hatte ich meine Klasse über die autoload.php registriert.

    Ich habe geprüft:
    • in "vendor/composer/autoload_classmap.php" taucht ein Eintrag für meine Klasse in der erwarteten Notation auf:
      PHP-Code:
      'Fw2\\Form' => $vendorDir '/feldwaldwiese/fw2-form/src/Resources/contao/forms/Form.php'
    • ebenso in "vendor/composer/autoload_static.php":
      PHP-Code:
      'Fw2\\Form' => __DIR__ '/..' '/feldwaldwiese/fw2-form/src/Resources/contao/forms/Form.php'


    Kann mir da jemand auf die Sprünge helfen?
    Arno

    EDIT:
    Ich habe gerade mal zum Testen folgendes gemacht:
    Doch wieder eine autoload.php im "config" Verzeichnis meiner Erweiterung erstellt und dann im Contao-Root/system/modules manuell einen Symlink nach "vendor/feldwaldwiese/fw2-form/src/Resources/contao" angelegt. Siehe da: Das funktioniert!
    Aber das sollte doch so eigentlich nicht nötig sein, oder?
    Ich dachte, wenn ich mich korrekt in der Contao 4/Symfony Struktur bewege und meine Klasse auch vom Autoloader erkannt wird, dann braucht es die autoload.php und die Symlinks in "system/modules" nicht mehr.
    Geändert von Arno (27.11.2017 um 18:02 Uhr)

  2. #2
    Contao-Urgestein
    Registriert seit
    29.10.2009.
    Ort
    Magdeburg
    Beiträge
    2.020
    Partner-ID
    626
    User beschenken
    Wunschliste

    Standard

    Das Austauschen von core Klassen wird nicht mehr supported und war bin ja her eine unsaubere Angelegenheit.

    Reichen denn die hooks nicht aus?

    Da die Form Klasse ja als hybrid für Module und CEs genutzt wird, solltest du deine Formularklasse über die globals registrieren können und somit die Klasse ersetzen wenn wirklich benötigt.

  3. #3
    Contao-Fan Avatar von Arno
    Registriert seit
    11.12.2009.
    Ort
    Potsdam-Babelsberg
    Beiträge
    290

    Standard

    Hallo webstar,

    ok, danke für die Erläuterungen.
    Das die Überlagerung von Core-Klassen generell nicht mehr vorgesehen ist, ist natürlich ein ganz schöner Klopper.

    Reichen denn die hooks nicht aus?
    In diesem Fall leider nein, weil ich an "$this->recipient" ran muss und wenn ich das richtig sehe könnte ich in einer Hook Klasse auf diesen Wert nicht zugreifen. Oder habe ich was übersehen?

    Da die Form Klasse ja als hybrid für Module und CEs genutzt wird, solltest du deine Formularklasse über die globals registrieren können und somit die Klasse ersetzen wenn wirklich benötigt.
    Ich habe dann versucht über eine "config/config.php" und dort den Eintrag
    PHP-Code:
    $GLOBALS['FE_MOD']['application']['form'] = '\Fw2\Form'
    meine Klasse zu aktivieren. Das hat aber leider auch nicht funktioniert.

    Was aber - sehr zu meiner Überraschung - funktioniert hat:
    Ich habe doch wieder eine "config/autoload.php" angelegt und dort folgende Anweisung hinterlegt:
    PHP-Code:
    <?php

    /**
     * Register the namespace
     */
    ClassLoader::addNamespace('Fw2');

    /**
     * Register the classes
     */
    ClassLoader::addClasses(array
    (
        
    // Classes
        
    'Fw2\Form'          => 'vendor/feldwaldwiese/fw2-form/src/Resources/contao/forms/Form.php',
    ));
    Damit wird dann meine angepasste Klasse beim Verschicken eines Formulars berücksichtigt, auch ohne ein Symlink in "system/modules".
    Ich verstehe aber nicht so richtig warum: Mein Verständnis war, dass wenn eine Erweiterung als Bundle in einer Contao 4 Struktur vorliegt (also mit Pfaden wie "src/Resources/contao/", dass dann "autoload.php" Dateien gar nicht berücksichtigt werden.

    Viele Grüße
    Arno

  4. #4
    Contao-Urgestein
    Registriert seit
    29.10.2009.
    Ort
    Magdeburg
    Beiträge
    2.020
    Partner-ID
    626
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von Arno Beitrag anzeigen
    Hallo webstar,

    ok, danke für die Erläuterungen.
    Das die Überlagerung von Core-Klassen generell nicht mehr vorgesehen ist, ist natürlich ein ganz schöner Klopper.
    Das ist halt eine schlechte Anwendungsarchitektur. Eine Anwendung (hier Contao) sollte die Extensionpoints zur Verfügung stellen. Wenn jeder die Core-Klassen (in öffentlichen Erweiterungen) austauschen würde, ergäbe dies nur Chaos.

    Zitat Zitat von Arno Beitrag anzeigen
    In diesem Fall leider nein, weil ich an "$this->recipient" ran muss und wenn ich das richtig sehe könnte ich in einer Hook Klasse auf diesen Wert nicht zugreifen. Oder habe ich was übersehen?
    Ja, mit ein paar Tricks kommt man an recipient dran, z.B.

    PHP-Code:
    function onPrepareFormData($arrSubmitted$arrLabels$objForm$arrFields
    {
        
    $changeRecipient = function ($recipient) {
            
    $this->recipient $recipient;
        };

       \
    Closure::bind($changeRecipientnull$objForm);
       
    $changeRecipient('mail@example.com');

    Details z.B. erklärt hier: https://ocramius.github.io/blog/acce...ut-reflection/

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

    Standard

    Zitat Zitat von Arno Beitrag anzeigen
    In diesem Fall leider nein, weil ich an "$this->recipient" ran muss und wenn ich das richtig sehe könnte ich in einer Hook Klasse auf diesen Wert nicht zugreifen. Oder habe ich was übersehen?
    Doch, daran kommst du ran. Bei jedem Hook wird das Contao\Form Objekt auch übergeben.


    Zitat Zitat von webstar Beitrag anzeigen
    Ja, mit ein paar Tricks kommt man an recipient dran, z.B.

    PHP-Code:
    function onPrepareFormData($arrSubmitted$arrLabels$objForm$arrFields
    {
        
    $changeRecipient = function ($recipient) {
            
    $this->recipient $recipient;
        };

       \
    Closure::bind($changeRecipientnull$objForm);
       
    $changeRecipient('mail@example.com');

    Details z.B. erklärt hier: https://ocramius.github.io/blog/acce...ut-reflection/
    Wozu das alles? Einfach
    PHP-Code:
    $objForm->recipient 
    Geändert von Spooky (28.11.2017 um 13:43 Uhr)

  6. #6
    Contao-Urgestein
    Registriert seit
    29.10.2009.
    Ort
    Magdeburg
    Beiträge
    2.020
    Partner-ID
    626
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Doch, daran kommst du ran. Bei jedem Hook wird das Contao\Form Objekt auch übergeben.


    Wozu das alles? Einfach
    PHP-Code:
    $objForm->recpient 
    Tatsache, ist sogar öffentlich schreibbar. Die "guten" alten Contao Klassen.

  7. #7
    Contao-Fan Avatar von Arno
    Registriert seit
    11.12.2009.
    Ort
    Potsdam-Babelsberg
    Beiträge
    290

    Standard

    Hey ihr beiden,

    vielen Dank für eure Tipps, im Endeffekt hats natürlich mit Spookys Hinweis auf "$objForm" geklappt.
    Wäre ich vielleicht auch selber drauf gekommen, hätte ich mich nicht auf die Contao Doku verlassen:
    https://docs.contao.org/books/api/ex...sFormData.html
    Da ist nämlich $objForm nicht als Parameter dokumentiert, hätte ich halt etwas genauer in den Code schauen müssen.

    Jetzt funktioniert es aber, vielen Dank nochmal!

    Arno

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
  •