Ergebnis 1 bis 32 von 32

Thema: Senden einer Nachricht aus Code geht nicht mehr nach Update von NC1.7 auf NC2?

  1. #1
    Contao-Nutzer
    Registriert seit
    03.12.2014.
    Beiträge
    77

    Standard Senden einer Nachricht aus Code geht nicht mehr nach Update von NC1.7 auf NC2?

    Moin zusammen,
    ich habe bisher unter NC 1.7 in einer (Frontend) Templatedatei auf diese Art Notifications senden lassen:

    PHP-Code:
    $intNotificationId '42'    
    $arrTokens = ['order' => $orderItems'tax' => $full_tax'sum' => $grandTotal'email' => $email'transaction_id' => $transaction_id];
    $objNotification = \NotificationCenter\Model\Notification::findByPK($intNotificationId);

        if (
    null !== $objNotification) {
            
    $objNotification->send($arrTokens);
        } 
    Wir aktualisieren die Site nun und bereiten auf einen Umzug auf C5.3 vor. Im Zuge dessen wurde NC auf die aktuelle 2.0.x angehoben... und nun funktioniert das hier leider nicht mehr. Ich wäre sehr dankbar, wenn mir jemand zeigen könnte, wie ich das nun für NC2 umschreiben müsste?

    Ich danke euch!

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

    Support Contao

  3. #3
    Contao-Nutzer
    Registriert seit
    03.12.2014.
    Beiträge
    77

    Standard

    Danke Cliff, das hatte ich gesehen und versucht aber ich weiß nicht wie ich es auf meinen (Frontend)-Template-Fall übertragen kann?

  4. #4
    Contao-Nutzer
    Registriert seit
    03.12.2014.
    Beiträge
    77

    Standard

    Hallo zusammen,

    ich habe mich jetzt noch mal damit beschäftigt und ich frage mich gerade, warum das eigentlich nicht mehr gehen soll... In dem Readme File, welches bei den Installationsdateien dabei ist, steht das ja noch genau so drin.

    Ich habe es jetzt mal in einer zweiten Installation versucht und da ist das gleiche Problem. Im Log steht:

    HTML-Code:
    [2024-05-16T11:25:41.531763+02:00] request.INFO: Matched route "tl_page.22". {"route":"tl_page.22","route_parameters":{"_token_check":true,"_controller":"Contao\\FrontendIndex::renderPage","_scope":"frontend","_locale":"de","_format":"html","_canonical_route":"tl_page.22","parameters":"","pageModel":{"Contao\\PageModel":[]},"_route":"tl_page.22","_route_object":{"Contao\\CoreBundle\\Routing\\Page\\PageRoute":[]}},"request_uri":"https://example.com/coaching-buchen","method":"GET"} {"request_uri":"https://example.com/coaching-buchen","request_method":"GET"}
    [2024-05-16T11:25:41.590394+02:00] request.CRITICAL: Uncaught PHP Exception Error: "Class "NotificationCenter\Model\Notification" not found" at ce_html_coaching_cart.html5 line 6 {"exception":"[object] (Error(code: 0): Class \"NotificationCenter\\Model\\Notification\" not found at /var/www/clients/client1/web312/web/templates/layout/ce_html_coaching_cart.html5:6)"} {"request_uri":"https://example.com/coaching-buchen","request_method":"GET"}
    [2024-05-16T11:25:41.600777+02:00] messenger.INFO: Sending message Contao\CoreBundle\Messenger\Message\SearchIndexMessage with contao_prio_low sender using Contao\CoreBundle\Messenger\Transport\AutoFallbackTransport {"class":"Contao\\CoreBundle\\Messenger\\Message\\SearchIndexMessage","alias":"contao_prio_low","sender":"Contao\\CoreBundle\\Messenger\\Transport\\AutoFallbackTransport"} {"request_uri":"https://example.com/coaching-buchen","request_method":"GET"}
    [2024-05-16T11:25:41.600871+02:00] messenger.INFO: Received message Contao\CoreBundle\Messenger\Message\SearchIndexMessage {"class":"Contao\\CoreBundle\\Messenger\\Message\\SearchIndexMessage"} {"request_uri":"https://example.com/coaching-buchen","request_method":"GET"}
    [2024-05-16T11:25:41.601233+02:00] messenger.INFO: Message Contao\CoreBundle\Messenger\Message\SearchIndexMessage handled by Contao\CoreBundle\Messenger\MessageHandler\SearchIndexMessageHandler::__invoke {"class":"Contao\\CoreBundle\\Messenger\\Message\\SearchIndexMessage","handler":"Contao\\CoreBundle\\Messenger\\MessageHandler\\SearchIndexMessageHandler::__invoke"} {"request_uri":"https://example.com/coaching-buchen","request_method":"GET"}
    Es scheint die angegebene Klasse nicht gefunden zu werden ... Aber warum? Sie ist da... Ich "sehe" sie... Ich stehe leider total auf dem Schlauch und wäre für ein paar helfende Kommentare sehr dankbar

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

    Standard

    Diese Klasse gibt es in NC 2.x nicht mehr.

    Wie du in NC 2.x eine Notification sendest ist hier ganz oben beschrieben: https://extensions.terminal42.ch/doc...en/developers/
    » sponsor me via GitHub or PayPal or Revolut

  6. #6
    Contao-Nutzer
    Registriert seit
    03.12.2014.
    Beiträge
    77

    Standard

    Ohje, ich bin echt zu doof ... ich habe nach dem Update des NCs, die lokale Sync-Version der IDE nicht aktualisiert und deshalb immer noch die Klasse angeboten bekommen

    Anyhow, die neue Doku hatte ich gesehen aber ich bin noch nicht so weit, daraus die notwendigen Schritte für ein Frontend-Template ableiten zu können.

    Das alleine reicht ja nicht ...

    PHP-Code:
    $intNotificationId '1';
    $arrTokens = ['order' => 'Bestellung''sum' => '100 EUR''email' => 'paul@paulsen.net''transaction_id' => '1234567890'];

    $receipts $this->notificationCenter->sendNotification($intNotificationId$arrTokens); 
    Wie müsste ich das denn verändern, damit ich die Nachricht so senden kann?
    Vielen Dank!

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

    Standard

    Zitat Zitat von Brubbel Beitrag anzeigen
    Anyhow, die neue Doku hatte ich gesehen aber ich bin noch nicht so weit, daraus die notwendigen Schritte für ein Frontend-Template ableiten zu können.
    Warum willst du aus einem Template heraus eine Notification senden?
    » sponsor me via GitHub or PayPal or Revolut

  8. #8
    Contao-Nutzer
    Registriert seit
    03.12.2014.
    Beiträge
    77

    Standard

    Also im konkreten Fall verwende ich es für ein kleines Zahlungsmodul von Paypal. Wenn der Kauf erfolgreich war, möchte ich eine Auftragsbestätigung mit ein paar Zusatzinfos an den Käufer senden... Transaktions-ID von Paypal, bissle mehr Beschreibung, ein paar Infos noch aus einer DB in der ich auch die Transkations-ID hinterlege und eben überhaupt eine Bestätigung, dass der Käufer was in der Hand hat. Nach dem Approve von Paypal mache ich also direkt einen Ajax-Request, stelle die benötigten Infos/Aktionen per PHP zusammen und dabei schicke ich auch auf die obige Art und Weise die Nachricht los... Mail an Kunde und an Verkäufer. Das klappte alles wunderbar bisher. Vor allem war mir wichtig, keine Reloads zu haben und ggf. einen Spinner einzusetzen.

    Ich fand das eigentlich super praktisch auf so eine Art ganz kurz und schnell so ein Mail mit den entsprechenden Werten zu füllen und abzuschicken.

    Also wenn Du mir zeigen könntest, wie ich das jetzt unter NC2.x anstellen kann, die Nachricht zu versenden, wäre das suuuper ;-) Danke!

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

    Standard

    Naja, aber hast du für deine PayPal Implementation keinen Service, der alles handhabt? Dort würdest du dir den NotificationCenter Service injecten und nutzen.

    Ansonsten könntest du in einem Template noch folgendes versuchen:
    PHP-Code:
    use Contao\System;
    use 
    Terminal42\NotificationCenterBundle\NotificationCenter;

    // …

    System::getContainer()->get(NotificationCenter::class)
        ->
    sendNotification($notificationId$tokens)

    Ich vermute aber, dass dieser Service nicht public ist und das daher nicht funktioniert.
    » sponsor me via GitHub or PayPal or Revolut

  10. #10
    Contao-Nutzer
    Registriert seit
    03.12.2014.
    Beiträge
    77

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Naja, aber hast du für deine PayPal Implementation keinen Service, der alles handhabt? Dort würdest du dir den NotificationCenter Service injecten und nutzen..
    Tja, wenn ich wüsste wie das alles geht, dann hätte es wohl diese Frage hier nicht geben müssen .

    Ich probiere das nachher mal aus - Danke Dir schon mal ganz herzlich!

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

    Standard

    Zitat Zitat von Brubbel Beitrag anzeigen
    Tja, wenn ich wüsste wie das alles geht, dann hätte es wohl diese Frage hier nicht geben müssen .
    Irgendwas hast du ja implementiert - wir wissen halt nicht wie deine Implementation aussieht
    » sponsor me via GitHub or PayPal or Revolut

  12. #12
    Contao-Nutzer
    Registriert seit
    03.12.2014.
    Beiträge
    77

    Standard

    Haha, ja, da hast Du natürlich Recht ;-)

    Ich benutze das PayPal JavaScript SDK. Ich habe ein eigenes Inhaltselement und in dessen Template sitzt die Logik für die Paypal-Anbindung.

    Deine Vermutung mit der fehlenden Öffentlichkeit scheint richtig zu sein ... Das hier kommt im LOG:

    HTML-Code:
    [2024-05-16T14:52:11.049490+02:00] request.CRITICAL: Uncaught PHP Exception Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException: "The "Terminal42\NotificationCenterBundle\NotificationCenter" service or alias has been removed or inlined when the container was compiled. You should either make it public, or stop using the container directly and use dependency injection instead." at Container.php line 249 {"exception":"[object] (Symfony\\Component\\DependencyInjection\\Exception\\ServiceNotFoundException(code: 0): The \"Terminal42\\NotificationCenterBundle\\NotificationCenter\" service or alias has been removed or inlined when the container was compiled. You should either make it public, or stop using the container directly and use dependency injection instead. at /var/www/clients/client1/web312/web/vendor/symfony/dependency-injection/Container.php:249)"} {"request_uri":"https://example.com/coaching-buchen","request_method":"GET"}
    Geändert von Brubbel (16.05.2024 um 15:00 Uhr) Grund: Rechtschreibung

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

    Standard

    Und wie hast du das Template überhaupt eingebunden?
    » sponsor me via GitHub or PayPal or Revolut

  14. #14
    Contao-Nutzer
    Registriert seit
    03.12.2014.
    Beiträge
    77

    Standard

    Ich habe ein eigenes Inhaltselement "Produktbox" erstellt (mit Hilfe der PCT CustomElements Erweiterung) und dort "ganz normal" ein .html5 Files als Template für die HTML Struktur verwendet. Dort ist auch das PayPal Gedöns für den einfachen Checkout drin. Es gibt dann eine extra Seite (soweit leer), die nur ein html Inhaltselement hat. Diese wird von jQuery.ajax angesprochen und in dem Template zum html Inhaltselement wird dann u.a. die besagte Nachricht über das NC gesendet.

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

    Standard

    Dieses Inhaltselement ersetzt du nun mit einem richtigen Inhaltselement, wo du dir den NotificationCenter Service injecten lassen kannst.
    » sponsor me via GitHub or PayPal or Revolut

  16. #16
    Contao-Nutzer
    Registriert seit
    03.12.2014.
    Beiträge
    77

    Standard

    Moin Spooky,
    ich bin nicht 100% sicher ob ich Dich richtig verstanden habe. Ich habe jetzt ein Frontend-Modul angelegt, so wie es in der offiziellen Doku beschrieben wird. Das Modul gibt den aktuellen Seitentitel aus und funktioniert soweit auf einer Testseite.

    PHP-Code:
    // src/Controller/FrontendModule/SendNotificationTest.php
    namespace App\Controller\FrontendModule;

    use 
    Contao\CoreBundle\Controller\FrontendModule\AbstractFrontendModuleController;
    use 
    Contao\CoreBundle\Exception\RedirectResponseException;
    use 
    Contao\CoreBundle\DependencyInjection\Attribute\AsFrontendModule;
    use 
    Contao\ModuleModel;
    use 
    Contao\PageModel;
    use 
    Contao\Template;
    use 
    Symfony\Component\HttpFoundation\Request;
    use 
    Symfony\Component\HttpFoundation\Response;
    use 
    Terminal42\NotificationCenterBundle\NotificationCenter;

    #[AsFrontendModule('example', category:'miscellaneous', template:'mod_example', renderer:'forward')]
    class SendNotificationTest extends AbstractFrontendModuleController
    {
        public function 
    __construct(private NotificationCenter $notificationCenter) {}
        protected function 
    getResponse(Template $templateModuleModel $modelRequest $request): Response
        
    {
            
    $page $this->getPageModel();

            
    // Get some information about the current page
            
    $template->tollerSeitenTitel $page->rootPageTitle ?: $page->rootTitle;
            return 
    $template->getResponse();
        }

    mod_example.html5 dann entsprechend:

    PHP-Code:
    <?php
    $intNotificationId 
    '1';
    $arrTokens = ['order' => 'Bestellung''sum' => '100 EUR''email' => 'paul@paulsen.net''transaction_id' => '1234567890'];
    //$receipts = $this->notificationCenter->sendNotification($intNotificationId, $arrTokens);
    ?>

    <!-- templates/mod_my_frontend_module.html5 -->
    <div class="my-frontend-module">
            <?= $this->tollerSeitenTitel?>
    </div>


    <pre>
    <?php //$this->dumpTemplateVars(); ?>
    </pre>
    Aber wie funktioniert das mit dem Notification Service? So, wie ich es gemacht habe, funktioniert es noch nicht. Im Log steht dann noch (Wenn ich die Zeile 3 des Templates aktiviere):

    HTML-Code:
    [2024-05-21T10:56:59.436160+02:00] request.CRITICAL: Uncaught PHP Exception Error: "Call to a member function sendNotification() on null" at mod_example.html5 line 5 {"exception":"[object] (Error(code: 0): Call to a member function sendNotification() on null at /var/www/clients/client1/web312/web/templates/layout/mod_example.html5:5)"} {"request_uri":"https://example.com/spielwiese","request_method":"GET"}

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

    Standard

    Zitat Zitat von Brubbel Beitrag anzeigen
    Ich habe jetzt ein Frontend-Modul angelegt, so wie es in der offiziellen Doku beschrieben wird.
    Ich dachte du hattest dein Template über ein Inhaltselement drin? Aber grundsätzlich ist es egal, weil das Modul kannst du ja auch wiederum als Inhaltselement einbinden natürlich. Kommt halt darauf an was für deinen Use-Case die beste Methode ist.



    Zitat Zitat von Brubbel Beitrag anzeigen
    Ich habe jetzt ein Frontend-Modul angelegt, so wie es in der offiziellen Doku beschrieben wird.

    PHP-Code:
    // src/Controller/FrontendModule/SendNotificationTest.php
    namespace App\Controller\FrontendModule;

    use 
    Contao\CoreBundle\Controller\FrontendModule\AbstractFrontendModuleController;
    use 
    Contao\CoreBundle\Exception\RedirectResponseException;
    use 
    Contao\CoreBundle\DependencyInjection\Attribute\AsFrontendModule;
    use 
    Contao\ModuleModel;
    use 
    Contao\PageModel;
    use 
    Contao\Template;
    use 
    Symfony\Component\HttpFoundation\Request;
    use 
    Symfony\Component\HttpFoundation\Response;
    use 
    Terminal42\NotificationCenterBundle\NotificationCenter;

    #[AsFrontendModule('example', category:'miscellaneous', template:'mod_example', renderer:'forward')]
    class SendNotificationTest extends AbstractFrontendModuleController
    {
        public function 
    __construct(private NotificationCenter $notificationCenter) {}
        protected function 
    getResponse(Template $templateModuleModel $modelRequest $request): Response
        
    {
            
    $page $this->getPageModel();

            
    // Get some information about the current page
            
    $template->tollerSeitenTitel $page->rootPageTitle ?: $page->rootTitle;
            return 
    $template->getResponse();
        }

    Die Angabe bzgl. renderer kannst du entfernen. Ich denke da hast du eher blindlings das falsche Beispiel aus der Dokumentation kopiert, ohne den Text zu lesen



    Zitat Zitat von Brubbel Beitrag anzeigen
    mod_example.html5 dann entsprechend:

    PHP-Code:
    <?php
    $intNotificationId 
    '1';
    $arrTokens = ['order' => 'Bestellung''sum' => '100 EUR''email' => 'paul@paulsen.net''transaction_id' => '1234567890'];
    //$receipts = $this->notificationCenter->sendNotification($intNotificationId, $arrTokens);
    ?>

    <!-- templates/mod_my_frontend_module.html5 -->
    <div class="my-frontend-module">
            <?= $this->tollerSeitenTitel?>
    </div>


    <pre>
    <?php //$this->dumpTemplateVars(); ?>
    </pre>
    Die Notification sendest du im Controller, nicht im Template.
    » sponsor me via GitHub or PayPal or Revolut

  18. #18
    Contao-Nutzer
    Registriert seit
    03.12.2014.
    Beiträge
    77

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Ich dachte du hattest dein Template über ein Inhaltselement drin? Aber grundsätzlich ist es egal, weil das Modul kannst du ja auch wiederum als Inhaltselement einbinden natürlich. Kommt halt darauf an was für deinen Use-Case die beste Methode ist.
    Ja, das ist klar. Modul ist passender für mich.


    Die Notification sendest du im Controller, nicht im Template.
    Aber wie bekomme ich denn dann die Werte in den Controller? Ich rufe die Seite per jQuery.ajax-Call auf und übergebe die Werte. Und in dem Template meines Inhhaltselementes/Moduls kann ich die dann verarbeiten. Falsch?

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

    Standard

    Zitat Zitat von Brubbel Beitrag anzeigen
    Aber wie bekomme ich denn dann die Werte in den Controller? Ich rufe die Seite per jQuery.ajax-Call auf und übergebe die Werte. Und in dem Template meines Inhhaltselementes/Moduls kann ich die dann verarbeiten. Falsch?
    Warum willst du das unbedingt im Template verarbeiten? Wie genau bist du denn bisher an die Daten gekommen?
    » sponsor me via GitHub or PayPal or Revolut

  20. #20
    Contao-Nutzer
    Registriert seit
    03.12.2014.
    Beiträge
    77

    Standard

    Ich möchte es nicht "unbedingt" im Template verarbeiten. Ich kenne nur keinen anderen einfachen Weg.

    Ich bekomme die Daten aus dem Ergebnis des (JS)Checkout-Vorgangs von PayPal. Da nutze ich den Event OnApprove und übergebe die relevanten Werte, vor allem die erst da bekannte Transaktionsnummer, per jQuery.ajax an eine php Seite. Ich möchte erreichen, dass ich ohne einen erneuten Seitenrefresh, eine Auftragsbestätigung per NotificationCenter schicken kann. Bisher konnte man im alten NC so wunderbar einfach mit 3 Zeilen Code so eine Notification eben aus einem Template heraus versenden. Das war wunderbar einfach und deshalb habe ich es gemacht.

    Wenn es einen anderen einfachen Weg gibt, dann würde ich auch den gehen. Welche Optionen gäbe es denn alternativ?

    Mein Plan B wäre es, "einfach" ein Formular soweit vorbereiten und dann die aktuellen Werte da per Javascript reintun und das Teil dann per JavaScript abschicken. Schön scheint mir das aber nicht, vor allem, weil es eben früher so einfach wie oben beschrieben ging ;-). Schade, dass das nicht mehr geht.

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

    Standard

    Ich verstehe leider nicht, wie dein ursprüngliches System funktioniert hat. Ich verstehe nicht, warum du aus einem Template heraus eine Notification schicken möchtest und wie du überhaupt an die Daten von PayPal kommst. Du musst dein Vorhaben genauer beschreiben.
    » sponsor me via GitHub or PayPal or Revolut

  22. #22
    Contao-Nutzer
    Registriert seit
    03.12.2014.
    Beiträge
    77

    Standard

    Es gibt im Frontend der Webseite eine Produktbeschreibung. Das Produkt hat ein paar Optionen, die sich auf den Endpreis auswirken.

    Dieses Produkt soll ggf. per PayPal/Kreditkarte bestellt werden können.

    Ich erweitere das Template der obigen Produktbeschreibung um die Möglichkeit, einen PayPal Checkout-Button hinzuzufügen. Ich verwende dazu dieses SDK https://developer.paypal.com/sdk/js/.

    Wenn jemand auf den fertigen Button klickt, kommt der bekannte PayPal Checkou-Prozess in Gang und die Bezahlung erfolgt. Der Paypal-Button hat verschiedene Events und ich benutze die, um den jeweiligen Status der Bestellung unterhalb der obigen Produktbeschreibung anzuzeigen. Wenn der Bezahlvorgang erfolgreich war, dann soll das nicht nur auf der Seite angezeigt werden, sondern Verkäufer und Besteller sollen sofort eine Info darüber per E-Mail erhalten. In der E-Mail steht u.a. die Zusammenfassung der Order und zur Referenz noch die (PayPal-)Transaktionsnummer, die ich im Rahmen des OnApprove-Events erhalten kann.

    Alles soll schnell ohne das Neuladen der Seite erfolgen. Über den Vorgang soll eine (lokale) DB-Tabelle als Log gefüllt werden.

    Ich verwende dazu einen jQuery-ajax Call auf eine andere Seite meiner Instanz. Dort habe ich einfach nur ein HTML-Inhaltselement und nehme mit dem zugehörigen Template, die Werte vom Ajax Call auf. Ich schreibe dann die entsprechenden Werte in die DB Tabelle und ich habe bisher mit der bei NC1.7 zur Verfügung stehenden Option auch gleich die Notification verschickt.

    Deswegen der Einsatz innerhalb eines Templates.

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

    Standard

    Zitat Zitat von Brubbel Beitrag anzeigen
    Dort habe ich einfach nur ein HTML-Inhaltselement und nehme mit dem zugehörigen Template, die Werte vom Ajax Call auf.
    Und wie?


    Zitat Zitat von Brubbel Beitrag anzeigen
    Deswegen der Einsatz innerhalb eines Templates.
    Das hat es leider nicht erklärt .
    » sponsor me via GitHub or PayPal or Revolut

  24. #24
    Contao-Nutzer
    Registriert seit
    03.12.2014.
    Beiträge
    77

    Standard

    Das Template für das HTML Element sah bisher so aus:

    PHP-Code:
    <?php
    $db 
    = \Contao\System::getContainer()->get('database_connection');
    use \
    NotificationCenter\Model\Notification;

    if(isset(
    $_POST['email']) && $_POST['orderItems']){
        
    $email $_POST['email'];
        
    $orderItems $_POST['orderItems'];
        
    $grandTotal $_POST['grandTotal'];
        
    $transaction_id $_POST['transaction_id'];

        
    $intNotificationId '5';
        
    $arrTokens = ['order' => $orderItems'sum' => $grandTotal'email' => $email'transaction_id' => $transaction_id];
        
    $objNotification Notification::findByPK($intNotificationId);

        if (
    null !== $objNotification) {
            
    $objNotification->send($arrTokens);
        }

        
    //Order in Tabelle sichern
        
    $db->prepare('INSERT INTO tbl_orders SET transaction_id = ?, order_details = ?, sum = ?')->execute([$transaction_id,$orderItems,$grandTotal]);
    }

    der Aufruf aus dem onApprove-Event:

    PHP-Code:
    jQuery.ajax({url'/ajax-order-confirmation',
       
    method'POST',
       
    data: {email:email,orderItems:orderItems,grandTotal:grandTotal,delCart:delCart,transaction_id:transaction.id},
       
    success: function(data){


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

    Standard

    Diesen Code setzt du nun in deinem Controller um. Nachdem das aber ohnehin ein komplett separater AJAX Request ist kannst du das auch als komplett eigene Route umsetzen und brauchst weder ein Modul noch ein Inhaltselement dafür.
    » sponsor me via GitHub or PayPal or Revolut

  26. #26
    Contao-Nutzer
    Registriert seit
    03.12.2014.
    Beiträge
    77

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Diesen Code setzt du nun in deinem Controller um.
    Em, Du meinst also einfach so den bisher verwendeten Code im mein "neues" Inhaltselement auf die Seite in den Controller-Code mit einfügen??


    Nachdem das aber ohnehin ein komplett separater AJAX Request ist kannst du das auch als komplett eigene Route umsetzen und brauchst weder ein Modul noch ein Inhaltselement dafür.
    Das können aber nur Zauberer ... oder? Sorry, aber da bin ich leider noch lange nicht ... Ich würde es erst mal mit der o.g. Art und Weise versuchen wollen

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

    Standard

    Zitat Zitat von Brubbel Beitrag anzeigen
    Em, Du meinst also einfach so den bisher verwendeten Code im mein "neues" Inhaltselement auf die Seite in den Controller-Code mit einfügen??
    Am besten modernisiert. Du solltest bspw. niemals direkt auf $_POST oder $_GET zugreifen (das hättest du auch in deinem Template niemals machen sollen).
    » sponsor me via GitHub or PayPal or Revolut

  28. #28
    Contao-Nutzer
    Registriert seit
    03.12.2014.
    Beiträge
    77

    Standard

    Oke, das möchte ich gerne versuchen. Wie würde man denn besser zugreifen? Bestimmt irgendwie mit dieser get() Methode oder?

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

    Standard

    Alles über das Request Object: https://symfony.com/doc/5.x/componen...g-request-data

    Allerdings: Contao nutzt Input Encoding. Symfony von Haus aus nur Output Encoding (via Twig). Wenn du solche Daten in der Datenbank speicherst, musst du die Daten auch entsprechend filtern. Alternativ kannst du auch noch Contao\Input::get() bzw. Contao\Input::post() nutzen (das filtert automatisch).
    Geändert von Spooky (21.05.2024 um 16:03 Uhr)
    » sponsor me via GitHub or PayPal or Revolut

  30. #30
    Contao-Nutzer
    Registriert seit
    03.12.2014.
    Beiträge
    77

    Standard

    Spooky, noch 1000 Dank für Deine Hilfestellungen. Ohne die hätte ich wohl noch ewig gebraucht. Hier unten der die Frage betreffende Teil der fertigen Lösung. Merci noch mal

    PHP-Code:
    // src/Controller/FrontendModule/orderConfirmation.php
    namespace App\Controller\FrontendModule;

    use 
    Contao\CoreBundle\Controller\FrontendModule\AbstractFrontendModuleController;
    use 
    Contao\CoreBundle\Exception\RedirectResponseException;
    use 
    Contao\CoreBundle\DependencyInjection\Attribute\AsFrontendModule;
    use 
    Contao\ModuleModel;
    use 
    Contao\Template;
    use 
    Symfony\Component\HttpFoundation\Request;
    use 
    Symfony\Component\HttpFoundation\Response;
    use 
    Terminal42\NotificationCenterBundle\NotificationCenter;

    #[AsFrontendModule('orderConfirmation', category:'miscellaneous', template:'mod_orderConfirmation')]
    class orderConfirmation extends AbstractFrontendModuleController
    {
        public function 
    __construct(private NotificationCenter $notificationCenter) {}

        protected function 
    getResponse(Template $templateModuleModel $modelRequest $request): Response
        
    {
            
    $db = \Contao\Database::getInstance();

            
    $transaction_id = \Contao\Input::post('transaction_id');
            
    $email = \Contao\Input::post('email');
            
    $orderItems = \Contao\Input::post('orderItems');
            
    $grandTotal = \Contao\Input::post('grandTotal');

            
    $notificationId 1;
            
    $tokens = ['order' => $orderItems'sum' => $grandTotal'email' => $email'transaction_id' => $transaction_id];
            
    $receipts $this->notificationCenter->sendNotification($notificationId$tokens);

            return 
    $template->getResponse();
        }


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

    Standard

    Zitat Zitat von Brubbel Beitrag anzeigen
    PHP-Code:
    $db = \Contao\Database::getInstance(); 
    Das solltest du nicht verwenden, injecte dir stattdessen die Datenbankverbindung. Dann kannst du einfach $this->connection->insert(…) nutzen.
    » sponsor me via GitHub or PayPal or Revolut

  32. #32
    Contao-Nutzer
    Registriert seit
    03.12.2014.
    Beiträge
    77

    Standard

    Oke, danke Dir, das berücksichtige ich noch!

Aktive Benutzer

Aktive Benutzer

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

Berechtigungen

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