Ergebnis 1 bis 22 von 22

Thema: Einsteigerfrage - Funktionen aus mehreren Klassen/DCAs heraus aufrufen

  1. #1
    Contao-Nutzer
    Registriert seit
    19.10.2023.
    Beiträge
    13

    Standard Einsteigerfrage - Funktionen aus mehreren Klassen/DCAs heraus aufrufen

    Hallo,
    ich möchte eine oft verwendete Funktion (exemplarisch einen API-Aufruf) aus mehreren DCA-Klassen heraus ansprechen. Derzeit kann ich diese Funktion in jedem DCA in einer Klasse am Ende der Datei definieren und sie wird z.B. über ein onload, submit oder options Callback ausgeführt. Das sieht dann abstrakt so aus:

    PHP-Code:
    use Contao\Backend;

    class 
    tl_orders extends Backend{
        public function 
    macheEtwas($irgendeineVariable)
        {    
            
    // ... irgendetwas machen
            
                
    return $modifizierteVariable;
        }

    Nun würde ich gerne diesem Beispiel folgen, das ich 1:1 nachgebaut habe, bekomme jedoch stets die Meldung "Attempted to call an undefined method named "convertUmlauts" of class "tl_diverse".

    https://community.contao.org/de/show...-in-Contao-4-9

    Also mache ich etwas falsch.

    Kann mir vielleicht jemand ein einfaches Beispiel geben, wie ich aus einem Container, der in "contao/dca" abgelegt ist, nicht nur mit "'tl_orders', 'macheEtwas'" (s.u.) ...

    PHP-Code:
        'fields' => [
            
    'id' => [
                
    'sql' => ['type' => 'integer''unsigned' => true'autoincrement' => true],
            ],
            
    'tstamp' => [
                
    'sql' => ['type' => 'integer''unsigned' => true'default' => 0]
            ],
            
    'articleNo' => array
            (
                 
    'inputType'               => 'select',
                 
    'filter'                  => true,
                 
    'search'                  => true,
                 
    'sorting'                  => true,
                 
    'options_callback'        => array('tl_orders''macheEtwas'),                      
                 
    'eval'                    => array('includeBlankOption'=>false,'tl_class'=>'w50 wizard'),
                 
    'sql' => ['type' => 'string''length' => 10'default' => '']
            ), 
    ... eine Funktion aus tl_orders.php aufrufe, sondern die Funktion an anderer Stelle (z.B. in "src/MyFunctions/FunctionMacheEtwas.php") definiere und aus allen möglichen DCA-Dateien (z.B. "tl_diverse, tl_vendors etc.) heraus aufrufe?

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

    Standard

    Die Funktion definierst du einfach in einem eigenen Service, den du dann überall injectest, wo du das brauchst. Falls die Funktion keinerlei Abhängigkeiten hat und keine Member Variablen braucht kann sie aber auch einfach public static sein und so von überall aus aufgerufen werden.
    » sponsor me via GitHub or PayPal or Revolut

  3. #3
    Contao-Nutzer
    Registriert seit
    19.10.2023.
    Beiträge
    13

    Standard

    Vielen Dank für die schnelle Antwort.

    Ich verstehe sie leider nicht, ich bin wirklich ein Anfänger, der sich vor vielen Jahren mit contao 3.x gut zu helfen wusste, nun ist mit 5.x vieles anders. Daher müsste ich jetzt etwas weiterfragen: Ein Service ist so etwas hier -richtig?

    PHP-Code:
    // src/EventListener/DataContainer/MemberDeleteCallbackListener.php
    namespace App\EventListener\DataContainer;

    use 
    Contao\CoreBundle\DependencyInjection\Attribute\AsCallback;
    use 
    Contao\DataContainer;
    use 
    Doctrine\DBAL\Connection;

    #[AsCallback(table: 'tl_orders', target: 'config.onsubmit')]
    class MemberDeleteCallbackListener
    {
        
    /** @var Connection */
        
    private $db;

        public function 
    __construct(Connection $db)
        {
            
    $this->db $db;
        }

        public function 
    __invoke(DataContainer $dc): void
        
    {
            if (!
    $dc->id) {
                return;}
            else{ 

    • Der funktioniert auch als Callback, aber was müsste oben statt #[AsCallback(table: 'tl_orders', target: 'config.onsubmit')] stehen?
    • Und wie würde ich die Funktion dann aufrufen?
    • Gibt es nicht vielleicht ein Beispiel, das ich als Vorlage verwenden kann?


    Tut mir leid - mir ist klar, dass ich mich damit auf einem Level oberhalb meines Verständnisses bewege und die Fragen für einen Experten dennoch zu trivial sind.

  4. #4
    Contao-Fan
    Registriert seit
    24.02.2021.
    Beiträge
    459

    Standard

    In deinem Beispiel nutzt du schon die Connection, also einen Service via Dependency Injection.

    Services verstehen sich als Objekte, welche du von überall instanziieren kannst, quasi Gelbe-Seiten / 11880 in der Objektorientierung.

    Ich versuchs mal an einem echt alten Beispiel von Contao für das OptIn (Hier auch eine statische Methode, die keine weiteren Parameter als das Kommentar braucht)
    PHP-Code:
    public static function addCommentsSubscription(CommentsModel $objComment)
    {
        
    $objNotify = \CommentsNotifyModel::findBySourceParentAndEmail($objComment->source$objComment->parent$objComment->email);

        
    // The subscription exists already
        
    if ($objNotify !== null)
        {
            return;
        }

        
    $time time();

        
    // Prepare the record
        
    $arrSet = array
        (
            
    'tstamp'       => $time,
            
    'source'       => $objComment->source,
            
    'parent'       => $objComment->parent,
            
    'name'         => $objComment->name,
            
    'email'        => $objComment->email,
            
    'url'          => \Environment::get('request'),
            
    'addedOn'      => $time,
            
    'ip'           => \System::anonymizeIp(\Environment::get('ip')),
            
    'tokenConfirm' => md5(uniqid(mt_rand(), true)),
            
    'tokenRemove'  => md5(uniqid(mt_rand(), true))
        );

        
    // Store the subscription
        
    $objNotify = new \CommentsNotifyModel();
        
    $objNotify->setRow($arrSet)->save();

        
    $strUrl = \Idna::decode(\Environment::get('base')) . \Environment::get('request');
        
    $strConnector = (strpos($strUrl'?') !== false) ? '&' '?';

        
    // Send the activation mail
        
    $objEmail = new \Email();
        
    $objEmail->from $GLOBALS['TL_ADMIN_EMAIL'];
        
    $objEmail->fromName $GLOBALS['TL_ADMIN_NAME'];
        
    $objEmail->subject sprintf($GLOBALS['TL_LANG']['MSC']['com_optInSubject'], \Idna::decode(\Environment::get('host')));
        
    $objEmail->text sprintf($GLOBALS['TL_LANG']['MSC']['com_optInMessage'], $objComment->name$strUrl$strUrl $strConnector 'token=' $objNotify->tokenConfirm$strUrl $strConnector 'token=' $objNotify->tokenRemove);
        
    $objEmail->sendTo($objComment->email);

    Das wurde in einen Service ausgelagert, sodass man die ganze OptIn-Logik nun auch überall verwenden kann (Das ist nur ein Teil des Codes, da kommt noch bisschen mehr dazu).
    Heutzutage sieht es so aus:
    PHP-Code:
    $optIn System::getContainer()->get('contao.opt_in');
    $optInToken $optIn->create('com'$objComment->email, ['tl_comments_notify'=>[$objNotify->id]]);
    $optInToken->send(...) 
    Wenn du es mehrfach verwenden möchtest und du mehr als nur ein bisschen Logik brauchst... also mit einer statischen Methode klar kommst (Ohne ein Objekt zu erstellen), dann versuche es darüber.
    Ansonsten musst du halt wie im oben genannten Beispiel:
    • Den passenden Kommentar finden
    • Ein OptIn-Notification-Objekt erstellen
    • Die Daten setzen
    • Es speichern
    • Ein E-Mail Objekt erstellen
    • Die Daten reinschreiben
    • Die E-Mail versenden

    Der Service übernimmt das für dich und macht dann nur noch:
    • Erstelle mir bitte das nötige Objekt mit den Daten
    • Sende es ab / Logik / Mach dies und jenes


    Alles jetzt ein bisschen einfach erklärt und ja... vorher lief das doch auch alles über die SuperGlobals und.. und.. und.
    Warum 50 Zeilen Code, wenn es auch mit einer bis 3 Zeilen geht? Warum nicht bestehenden Code wiederholen

  5. #5
    Contao-Nutzer
    Registriert seit
    19.10.2023.
    Beiträge
    13

    Standard

    Hallo zoglo, hallo spooky,

    ich bin mir sicher, dass einer von Euch es schaffen würde, mir in einer 15-30min Teamviewer Session zu zeigen, wie es geht. Ich baue hier etwas für meinen Arbeitgeber, der dafür gerne zahlen würde. Falls also einer von Euch Lust hat, sich etwas Geld zu verdienen und zudem noch eine Rechnung schreiben kann, würde mich das sehr freuen. Denn es liegt leider nicht an der Uhrzeit, dass ich auch die zweite Antwort nicht so verarbeiten kann, dass ich es hinbekommen würde, eine einfach Funktion an unterschiedlichen Stellen einzusetzen - ich brauche persönlichen Support und jemanden, an den ich mich gelegentlich in Contao-Fragen wenden kann.

    Seht ihr eine Möglichkeit, dass wir es remote angehen? Oder kennt ihr einen Experten, der das machen würde? Es muss nicht morgen sein, aber innerhalb einer Woche wäre prima.

    Erst einmal vielen Dank bis dahin,
    Andreas

  6. #6
    Contao-Fan
    Registriert seit
    24.02.2021.
    Beiträge
    459

    Standard

    Du bist aber kurz davor es zu verstehen , hier mal ein Beispiel:

    Das ist meine Klasse, von welcher ich alle "Funktionen"/Methoden nutze:
    https://github.com/oveleon/contao-re...stener.php#L28

    Hier wird sie importiert:
    https://github.com/oveleon/contao-re...dation.php#L11

    Hier werden diese aufgerufen:
    https://github.com/oveleon/contao-re...on.php#L20-L36

    In deinem Beispiel machst du es sogar über eine "Callback":
    PHP-Code:
    // src/EventListener/DataContainer/MemberDeleteCallbackListener.php
    #[AsCallback(table: 'tl_orders', target: 'config.onsubmit')] 
    Und kleinere Contao-Fragen im Slack oder im Forum wurden doch schon oft beantwortet und helfen auch, dass auch andere etwas in der Zukunft davon haben :P

  7. #7
    Contao-Nutzer
    Registriert seit
    19.10.2023.
    Beiträge
    13

    Standard

    Hallo Zoglo,
    jetzt ist es bei mir angekommen und auch nachvollziehbar - herzlichen Dank! Nur mache ich bei der Umsetzung noch einen kleinen Fehler. Ich habe es ganz simpel nachgebaut, hier die "tl_diverse.php" mit einer einfachen Testfunktion "function_1":

    PHP-Code:
    // contao\dca\tl_diverse.php
    use Contao\DC_Table;
    use 
    Contao\Backend;
    use 
    Contao\DataContainer;

    use 
    App\EventListener\DataContainer\MyFunctions;

    $GLOBALS['TL_DCA']['tl_diverse'] = [
        
    'config' => [
            
    'dataContainer' => DC_Table::class,
            
    'enableVersioning' => true,
            
    'onsubmit_callback' => [
                [
    MyFunctions::class, 'function_1']
            ],
    ... 
    Hier die Funktion in der Klasse "MyFunctions". Sie gibt mir das Array für eine einache Checkbox aus:

    PHP-Code:
    // App\EventListener\DataContainer\MyFunctions.php

    namespace App\EventListener\DataContainer;

    use 
    Contao\DataContainer;

    class 
    MyFunctions
    {
            public function 
    function_1(DataContainer $dc): void
        
    {
            if (!
    $dc->activeRecord)
            {
                return;
            }
            
    var_dump($dc->activeRecord->test);
            die();
        }

    Die Dateien habe ich meiner Meinung nach in den richtigen Pfaden abgelegt, aber womöglich mache ich hier einen Denkfehler:
    1 files.PNG

    Jedenfalls scheint die Klasse und somit die Funktion nicht gefunden zu werden, denn ich bekomme diese Meldung:
    4 error.PNG

    Ich denke, mir fehlt nur noch ein winziges Puzzleteil, dann habe ich es. Es wäre nett, wenn jemand noch einmal einen Blick darauf werfen könnte.

    Vielen Dank.
    Angehängte Grafiken Angehängte Grafiken

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

    Standard

    Zitat Zitat von ak_111 Beitrag anzeigen
    Die Dateien habe ich meiner Meinung nach in den richtigen Pfaden abgelegt, aber womöglich mache ich hier einen Denkfehler:
    1 files.PNG
    Nein, das sieht nicht richtig aus. "App" sollte nicht in deinem Pfad vorkommen (sofern du die Defaults von Contao nimmst für das PSR-4 Autoloading).
    » sponsor me via GitHub or PayPal or Revolut

  9. #9
    Contao-Nutzer
    Registriert seit
    19.10.2023.
    Beiträge
    13

    Standard

    An den Defaults habe ich nichts geändert und es jetzt ohne "App" probiert:

    PHP-Code:
    // contao\dca\tl_diverse.php

    use Contao\DC_Table;
    use 
    Contao\Backend;
    use 
    Contao\DataContainer;

    use 
    EventListener\DataContainer\MyFunctions;

    $GLOBALS['TL_DCA']['tl_diverse'] = [
        
    'config' => [
            
    'dataContainer' => DC_Table::class,
            
    'enableVersioning' => true,
            
    'onsubmit_callback' => [
                [
    MyFunctions::class, 'function_1']
            ],



    // App\EventListener\DataContainer\MyFunctions.php

    namespace EventListener\DataContainer;

    use 
    Contao\DataContainer;

    class 
    MyFunctions
    {
            public function 
    function_1(DataContainer $dc): void
        
    {
            if (!
    $dc->activeRecord)
            {
                return;
            }
            
    var_dump($dc->activeRecord->test);
            die();
        }

    Jetzt bekomme ich die Meldung: System::importStatic() failed because class "EventListener\DataContainer\MyFunctions" is not a valid class name or does not exist.

    Puhh, alles nicht so einfach...

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

    Standard

    Du hast jetzt alles in eine Datei geschrieben? Nein, so war das nicht gemeint, das wird auf jeden Fall nicht so funktionieren.

    Laut Screenshot (und laut deinem Kommentar im Code) hast du deine App\EventListener\DataContainer\MyFunctions Klasse in den Pfad App/EventListener/DataContainer/MyFunctions.php gegeben, anstatt src/EventListener/DataContainer/MyFunctions.php wie in der Dokumentation beschrieben.
    » sponsor me via GitHub or PayPal or Revolut

  11. #11
    Contao-Nutzer
    Registriert seit
    19.10.2023.
    Beiträge
    13

    Standard

    Entschuldige, ich hatte hier nur beide Dateien in einen Codeblock gesteckt, die Dateien waren - bis auf den Pfad - unverändert. Hier jetzt richtig:

    PHP-Code:
    // App\EventListener\DataContainer\MyFunctions.php

    namespace EventListener\DataContainer;

    use 
    Contao\DataContainer;

    class 
    MyFunctions
    {
            public function 
    function_1(DataContainer $dc): void
        
    {
            if (!
    $dc->activeRecord)
            {
                return;
            }
            
    var_dump($dc->activeRecord->test);
            die();
        }

    PHP-Code:
    // contao\dca\tl_diverse.php

    use Contao\DC_Table;
    use 
    Contao\Backend;
    use 
    Contao\DataContainer;

    use 
    EventListener\DataContainer\MyFunctions;

    $GLOBALS['TL_DCA']['tl_diverse'] = [
        
    'config' => [
            
    'dataContainer' => DC_Table::class,
            
    'enableVersioning' => true,
            
    'onsubmit_callback' => [
                [
    MyFunctions::class, 'function_1']
            ], 

    Hier der geänderte Dateibaum:
    Screen Shot 04-04-24 at 12.37 PM.PNG

    Leider ist es nach wie vor die gleiche Meldung: System::importStatic() failed because class "EventListener\DataContainer\MyFunctions" is not a valid class name or does not exist.

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

    Standard

    Du hast nun den falschen Namespace geschrieben. Alles was sich im src/ Ordner befindet ist (in der Standard-Konfiguration, also sofern du nichts geändert hast) im "App" Namespace.
    » sponsor me via GitHub or PayPal or Revolut

  13. #13
    Contao-Nutzer
    Registriert seit
    19.10.2023.
    Beiträge
    13

    Standard

    Perfekt - das war's - vielmals Danke!

    Ich verstehe zwar noch nicht, wie es genau gedacht ist mit App und src, (zumal ich in der IDE das App\ als Namespace declaration name doesn't correspond to current directory structure markiert bekommen habe) aber jetzt kann es losgehen. Ich schaue mir das Thema "Namespace" mal genauer an, das scheint wichtig zu sein.

    Erstklassig von Euch - ich bin wirklich sehr dankbar.

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

    Standard

    Zitat Zitat von ak_111 Beitrag anzeigen
    Ich verstehe zwar noch nicht, wie es genau gedacht ist mit App und src, (zumal ich in der IDE das App\ als Namespace declaration name doesn't correspond to current directory structure markiert bekommen habe) aber jetzt kann es losgehen. Ich schaue mir das Thema "Namespace" mal genauer an, das scheint wichtig zu sein.
    Contao setzt automatisch
    Code:
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }
    Auch wenn das nicht explizit in der composer.json so steht. Du kannst es aber auch explizit definieren.

    Weitere Informationen:

    » sponsor me via GitHub or PayPal or Revolut

  15. #15
    Contao-Nutzer
    Registriert seit
    19.10.2023.
    Beiträge
    13

    Standard

    Okay - das passt dann, Danke.

    Jetzt hat sich noch eine kleine Frage in diesem Zusammenhang ergeben: Wie kann ich die Funktionsaufrufe auch von anderer Stelle aus tätigen, als aus den Callbacks heraus?

    Ich hätte z.B. ein kleine Funktion mit drei Parametern, mit der ich mir meine eigenen Logeinträge in tl_myLogs generiere - ich möchte sie nicht mit den Contao-Logs in tl_log führen, das ist mir etwas zu unübersichtlich:

    PHP-Code:
    // App\EventListener\DataContainer\MyFunctions.php

    namespace App\EventListener\DataContainer;

    use 
    Contao\DataContainer;
    use 
    Contao\Database;
    use 
    Contao\DC_Table;

    class 
    MyFunctions
    {
            public function 
    newLog($text,$category,$function)
        {
            
    // insert new log entry
            
    $db Database::getInstance();
            
    $sql "INSERT INTO tl_myLogs (text, category,function) VALUES ('$text','$category','$function')";
            
    $db->prepare($sql)
                ->
    execute();
        }
    ... 
    Wenn ich jetzt einen Logeintrag beim Aufruf einer anderen Funktion einfügen möchte, wäre mein --- Erster Ansatz------ dieser gewesen:

    PHP-Code:
    // App\EventListener\DataContainer\SortlyFunctions.php
    namespace App\EventListener\DataContainer;

    use 
    Contao\DataContainer;
    use 
    Contao\Database;
    use 
    App\EventListener\DataContainer\MyFunctions;

    class 
    SortlyFunctions
    {
        
            public function 
    truncateTable($tableName){
            
    //Empty table 
            
    $db Database::getInstance();
            
            
    $sql "Truncate table $tableName";
            
    $db->prepare($sql)->execute();
     


           
            
    // --- Erster Ansatz------
            
    MyFunctions::newLog($sql"DATA""truncateTable");



        }
    ..... 
    Das funktioniert leider nicht, ich bekomme die Exception "Non-static method App\EventListener\DataContainer\MyFunctions::newLo g() cannot be called statically" ausgeworfen.

    Wie bekomme ich also z.B. aus dem Funktionsaufruf von zoglo, der mit einem Callback mittlerweile funktioniert,
    PHP-Code:
            'ondelete_callback' => [
                [
    RecommendationListener::class, 'scheduleUpdate'
    einen Funktionsaufruf außerhalb des Callbacks hin? Mir fehlt der --- zweite/korrekte Ansatz------

    Danke für die Geduld.

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

    Standard

    Wie Eingangs schon erwähnt lagerst du die Funktion in einen eigenen Service aus (zB App\MyService). Diesen Service injectest du dir dann überall wo du ihn brauchst (bspw. in deinem Callback und sonst wo).
    » sponsor me via GitHub or PayPal or Revolut

  17. #17
    Contao-Nutzer
    Registriert seit
    19.10.2023.
    Beiträge
    13

    Standard

    Mir fehlt nur der Syntax des Funktionsaufrufes außerhalb des Callback-Arrays. Das mit den Services funktioniert ja Dank der Unterstützung.

  18. #18
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.943

    Standard

    Mit
    PHP-Code:
            MyFunctions::newLog($sql"DATA""truncateTable"); 
    Rufst Du die Funktion newLog als statische Funktion auf — die Funktion ist aber nicht static.

    Wenn Du

    PHP-Code:
            public function newLog($text,$category,$function
    in

    PHP-Code:
            public static function newLog($text,$category,$function
    änderst, sollte es gehen.

    Das ist genau das, was Dir in der Fehlermeldung
    "Non-static method App\EventListener\DataContainer\MyFunctions::newLo g() cannot be called statically"
    gesagt bekommst. das ist ein reines PHP Thema und hat erst mal nichts mit Contao zu tun.

    Edit: das, was @spooky schreibt wäre der saubere Weg.
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  19. #19
    Contao-Nutzer
    Registriert seit
    19.10.2023.
    Beiträge
    13

    Standard

    Ich hatte mich zwischenzeitlich an das Instanziieren von Klassen erinnert und hiermit funktioniert es :

    PHP-Code:
            $log = New MyFunctions();                
            
    $log->newLog($text,$category,$method); 
    Mit public static function newLog($text,$category,$method); bekomme ich es nicht hin, damit gibt es schon einen Syntax-Error in der IDE (Netbeans). Aber auch dafür Danke.

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

    Standard

    Ist aber nicht der Vorschlag
    » sponsor me via GitHub or PayPal or Revolut

  21. #21
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.513
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von ak_111 Beitrag anzeigen
    Mit public static function newLog($text,$category,$method); bekomme ich es nicht hin, damit gibt es schon einen Syntax-Error in der IDE (Netbeans). Aber auch dafür Danke.
    Wenn du dort, wie hier gezeigt, wirklich ein Semikolon hast, dann ist das auch falsch. Das wäre ja eine Definition einer statischen Funktion ohne Inhalt.
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  22. #22
    Contao-Nutzer
    Registriert seit
    19.10.2023.
    Beiträge
    13

    Standard

    Es war viel Contao-Input die letzten Tage, den letzten Ansatz hatte ich komplett falsch umgesetzt. Mit der geänderten Definition der Funktion als statische Methode funktioniert es nun, der Code ist dadurch sofgar etwas einfacher. Nun sieht die Definition so aus:
    PHP-Code:
    // App\EventListener\DataContainer\MyFunctions.php

        
    public static function log($text,$category,$method)
        {
            
    // insert new log entry
            
    $db Database::getInstance();
            
    $sql "INSERT INTO tl_myLogs (text,category,method) VALUES ('$text','$category','$method')";
            
    $db->prepare($sql)
                ->
    execute();
        } 
    Ausgeführt wird so:
    PHP-Code:
    MyFunctions::log($sql"DATA""truncateTable"); 
    Letztendlich ganz einfach und für Euch sicherlich trivial. Aber für einen Anfänger ohne nennenswerte Kenntnisse in PHP und Contao ist es nicht ganz so leicht. Daher war mir dieses Forum bislang eine enorme Hilfe und ich hoffe, ich habe hier niemanden überstrapaziert. Vielen Dank.

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
  •