Ergebnis 1 bis 12 von 12

Thema: Eigene Operation in MetaModels

  1. #1
    Contao-Nutzer
    Registriert seit
    03.06.2016.
    Beiträge
    10

    Standard Eigene Operation in MetaModels

    Hallo liebes contao-Forum,
    für ein etwas größeres Projekt habe ich mich für den Einsatz von MetaModels entschieden.
    Ich bin soweit mit der Einrichtung von MetaModels dank der diversen Tutorials auch sehr gut vorangekommen.

    Jetzt stehe ich vor folgendem Problem:
    Ich würde eines der MetaModels gern um eine eigene Operation erweitern, die dazu dient die Daten für das MetaModel über eine SOAP-Schnittstelle zu synchronisieren - soweit so gut
    Das Problem ist, dass ich es nicht schaffe, dass "nach Klick auf das Icon meiner Operation" die zugewiesene Funktion ausgeführt wird. Bei allen anderen Tabellen (keine MetaModels) funktioniert dies.

    Folgendes habe ich probiert: Eigenes Modul geschrieben, welches das Icon hinzufügt:
    Code:
    $GLOBALS['TL_DCA'][$metamodelTable]['list']['operations']['syncdata'] = array
    (
        'label'               => &$GLOBALS['TL_LANG'][$metamodelTable]['syncdata'],
        'href'                => 'key=syncdata',
        'icon'                => 'system/modules/moduleName/assets/img/modulename.png'
    );
    Jetzt wird das Icon auch mit korrektem Link angezeigt (key=syncdata).
    Im nächsten Schritt wollte ich das Backend-Modul erweitern (config.php):

    Code:
    $GLOBALS['BE_MOD']['metamodels']['metamodel_$metamodelTable']['syncdata'] = array('Sync', 'syncData');
    Zusätzlich habe ich die Klasse und Funktion natürlich erstellt und über den autoloader geladen. Nun passiert leider nach dem Klick auf das neue Icon nichts - kann mir hier vielleicht jemand auf die Sprünge helfen?

    (Die $GLOBALS sieht soweit auch korrekt aus -> habe ich mir beim Debuggen mal angeschaut..)


    Vielen Dank

  2. #2
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.746
    User beschenken
    Wunschliste

    Standard

    kannst Du das nicht beim Speichern eines Items "ankleben" - mit save_callback sollte das gehen...

  3. #3
    Maintainer Avatar von xtra
    Registriert seit
    02.07.2009.
    Ort
    Tuebingen
    Beiträge
    2.007
    User beschenken
    Wunschliste

    Standard

    Du musst einen Action Event handler bauen, in MM wird der DcGeneral verwendet, welcher events verwendet.

    PHP-Code:
    class Foo {
      public function 
    handleCreateVariantAction(\ContaoCommunityAlliance\DcGeneral\Event\ActionEvent $event)
      {
            if (
    $event->getAction()->getName() != 'syncdata') {
                return;
            }
            
    // Perform the work now.
      
    }

    Bedenke stets: Wenn Du ungenaue oder unzureichende Angaben machst, so koennte dies die Bearbeitung deiner Frage endlos verzoegern (oder sogar dazu fyhren, dass ich zu viel nachdenken muss und die Antwort vergesse!). Kein Support per PN.

  4. #4

  5. #5
    Contao-Nutzer
    Registriert seit
    03.06.2016.
    Beiträge
    10

    Standard

    Hallo Zusammen,

    vielen Dank für die schnellen Antworten. Das mit dem save_callback müsste eigentlich funktionieren, nur will ich es gern über eine eigene Aktion auslösen (damit es über ein Icon ausgelöst werden kann).

    @xtra:
    Danke, aber wie binde ich die Klasse dann korrekt ein? Meine classes.php wird nicht eingebunden trotz autoloader

    @zonky:
    Vielen Dank, damit müsste ich es doch über die event_listeners.php machen, wenn ich es richtig verstehe. Wenn ich es dort mit folgendem Code versuche, erhalte ich jedoch nur einen Fehler:
    Code:
    use ContaoCommunityAlliance\DcGeneral\Event\ActionEvent;
    return array(
        ActionEvent::NAME => array(
            function (ActionEvent $event) {
                
            },
            -1
        )
    );
    Vielleicht kann mir hier nochmal jemand auf die Sprünge helfen? An sich müsste ich über den Event Listener doch die Action abfragen können und dann entsprechend reagieren?


    Vielen vielen Dank!

  6. #6
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.746
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von busybee Beitrag anzeigen
    erhalte ich jedoch nur einen Fehler:
    wie sollen "wir" sehen, was Du siehst!?!?

  7. #7
    Contao-Nutzer
    Registriert seit
    03.06.2016.
    Beiträge
    10

    Standard

    Ah sorry, ja. Also ich kriege folgenden Fehler:
    Code:
    Undefined class constant 'NAME'
    Was ja Sinn macht, da die ActionEvent Klasse nicht über diese Konstante verfügt :/
    Nur wie klemme ich mich dann korrekt da dran?

    Vielen lieben Dank!

  8. #8
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.746
    User beschenken
    Wunschliste

    Standard

    uff...? guck mal bei der allgemeinen Beschreibung: https://github.com/contao-community-...ent-dispatcher

    ob man ohne den "unique event name" auskommt bzw. die der für die Klasse heißt ...
    http://symfony.com/doc/current/compo...on.html#events

  9. #9
    Maintainer Avatar von xtra
    Registriert seit
    02.07.2009.
    Ort
    Tuebingen
    Beiträge
    2.007
    User beschenken
    Wunschliste

    Standard

    PHP-Code:
    use ContaoCommunityAlliance\DcGeneral\DcGeneralEvents;
    use 
    ContaoCommunityAlliance\DcGeneral\Event\ActionEvent;

    return array(
        
    DcGeneralEvents::ACTION => array(
            function (
    ActionEvent $event) {
                
            },
            -
    1
        
    )
    ); 
    Bedenke stets: Wenn Du ungenaue oder unzureichende Angaben machst, so koennte dies die Bearbeitung deiner Frage endlos verzoegern (oder sogar dazu fyhren, dass ich zu viel nachdenken muss und die Antwort vergesse!). Kein Support per PN.

  10. #10
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.746
    User beschenken
    Wunschliste

    Standard

    @busybee: wenn alles läuft, wäre eine kleine Anleitung/Beschreibung für das "Kochbuch" prima...

  11. #11
    Contao-Nutzer
    Registriert seit
    03.06.2016.
    Beiträge
    10

    Standard

    Hi,

    ja klar, ich habe es mit Eurer Hilfe jetzt hinbekommen - vielen Dank!

    In der event_listeners.php:

    Code:
    use ContaoCommunityAlliance\DcGeneral\DcGeneralEvents;
    use ContaoCommunityAlliance\DcGeneral\Event\ActionEvent;
    
    return array(
        ContaoCommunityAlliance\DcGeneral\DcGeneralEvents::ACTION => array(
            function (ActionEvent $event) {
                SyncHandler::syncData($event);
            },
            -1
        )
    );
    Dann eine entsprechende Klasse SyncHandler mit der Methode syncData:
    Code:
    use ContaoCommunityAlliance\DcGeneral\DcGeneralEvents;
    use ContaoCommunityAlliance\DcGeneral\Event\ActionEvent;
    class SyncHandler {
            public static function syncData(ActionEvent $event) {
                if ($event->getAction()->getName() != 'syncdata') {
                    return;
                }
              // Hier Code ausführen
    }
    Und natürlich die Anpassung des DCA
    Code:
    $GLOBALS['TL_DCA'][TABELLENNAME]['list']['operations']['syncdata'] = array
    (
        'label'               => &$GLOBALS['TL_LANG'][TABELLENNAME]['syncdata'],
        'href'                => 'act=syncdata',
        'icon'                => 'system/modules/modulname/assets/img/syncdata.png',
    );
    Dann muss die Klasse noch über den autoloader geladen werden, läuft wunderbar

  12. #12
    Maintainer Avatar von xtra
    Registriert seit
    02.07.2009.
    Ort
    Tuebingen
    Beiträge
    2.007
    User beschenken
    Wunschliste

    Standard

    Wenn du wirklich nicht die Funktion in der event_listeners.php haben willst sondern in einer eigenen Klasse, dann kannst du die lambda auch weg lassen:
    Code:
    use ContaoCommunityAlliance\DcGeneral\DcGeneralEvents;
    use ContaoCommunityAlliance\DcGeneral\Event\ActionEvent;
    
    return array(
        ContaoCommunityAlliance\DcGeneral\DcGeneralEvents::ACTION => array('SyncHandler::syncData', -1)
    );
    Bedenke stets: Wenn Du ungenaue oder unzureichende Angaben machst, so koennte dies die Bearbeitung deiner Frage endlos verzoegern (oder sogar dazu fyhren, dass ich zu viel nachdenken muss und die Antwort vergesse!). Kein Support per PN.

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
  •