Contao-Camp 2024
Ergebnis 1 bis 14 von 14

Thema: postCheckout Hook

  1. #1
    Contao-Nutzer Avatar von Dillinja
    Registriert seit
    13.07.2009.
    Ort
    Dresden
    Beiträge
    109

    Standard postCheckout Hook

    Liebes Forum,

    Ich versuche unter Conto 4.9 und Isotope 2.7 den postCheckout-Hook zum laufen zu bringen.

    Leider ohne Erfolg.

    Funktioniert das über Annotationen und invokable services? Oder ist das ein Holzweg?

    Kann mir vielleicht jemand einen Anstoß in die richtige Richtung geben?

    Danke im Voraus.
    Micha

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

    Standard

    Zitat Zitat von Dillinja Beitrag anzeigen
    Funktioniert das über Annotationen und invokable services? Oder ist das ein Holzweg?
    Du musst
    PHP-Code:
    // contao/config.php
    $GLOBALS['ISO_HOOKS']['postCheckout'][] = [YourClass::class, '__invoke']; 
    verwenden (statt __invoke geht auch jede andere Methode der Klasse).
    Geändert von Spooky (09.06.2022 um 16:03 Uhr) Grund: fixed missing []
    » sponsor me via GitHub or PayPal or Revolut

  3. #3
    Contao-Nutzer
    Registriert seit
    06.10.2011.
    Ort
    Wien
    Beiträge
    85

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Du musst
    PHP-Code:
    // contao/config.php
    $GLOBALS['ISO_HOOKS']['postCheckout'] = [YourClass::class, '__invoke']; 
    verwenden (statt __invoke geht auch jede andere Methode der Klasse).
    Hallo Spooky, ich möchte hier andocken, bei gleichen Systemvorraussetzungen. Ich verstehe Annodationen so, dass ich kleine Scripte ausführen kann, ohne gleich ein Modul zu erstellen. Ich möchte beim Checkout den Lagerbestand reduzieren. Ich habe diese zwei Dateien angelegt:

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

    use 
    Psr\Log\LogLevel// ... fuer Logging
    use Contao\CoreBundle\Monolog\ContaoContext// ... fuer Logging

    use Isotope\Interfaces\IsotopeProduct;
    use 
    Isotope\Isotope;
    use 
    Isotope\Model\Config;
    use 
    Isotope\Model\Product;
    use 
    Isotope\Model\ProductCollection\Order;
    use 
    Isotope\Model\ProductCollectionItem;
    use 
    Isotope\Model\ProductType;

    class 
    UpdateStock
    {
        
    /**
         * @Hook("postCheckout")
         */
        
    public function UpdateStockCheckout(Order $order): void
        
    {
            
    // Do something …
            
    $items $order->getItems();
            
    $orders = [];

            foreach (
    $items as $item) {
                
    $product $item->getProduct();

                
    $data = [
                    
    'stock' => $product->stock $item->quantity,
                ];

                if (
    $data['stock'] <= 0) {
                    
    $data['product_soldout'] = true;
                }

                \
    System::getContainer()
                    ->
    get('monolog.logger.contao')
                    ->
    log(LogLevel::INFO'Produkt-ID: '.$product->id', Lagerbestand neu: '.$data['stock'], array(
                    
    'contao' => new ContaoContext(__CLASS__.'::'.__FUNCTION__TL_GENERAL
                    
    )));

                
    // $this->databaseUtil->update('tl_iso_product', $data, 'tl_iso_product.id=?', [$product->id]);
            
    }
        }

    PHP-Code:
    // contao/config.php
    $GLOBALS['ISO_HOOKS']['postCheckout'] = [UpdateStock::class, 'UpdateStockCheckout']; 
    Zusätzlich habe ich den Application Cache gelöscht, die anderen muss ich wahrscheinlich nicht. Es sollte nun ein Log-Eintrag erfolgen (zum Testen), was aber nicht passiert. Es gibt aber auch keine Fehlermeldung, daher gehe ich davon aus, dass ich das ganze falsch eingebunden habe. Kannst Du mir helfen?

    Danke und liebe Grüße!

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

    Standard

    Evt. hast du das use statement in deiner config.php vergessen?
    » sponsor me via GitHub or PayPal or Revolut

  5. #5
    Contao-Nutzer
    Registriert seit
    06.10.2011.
    Ort
    Wien
    Beiträge
    85

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Evt. hast du das use statement in deiner config.php vergessen?
    Danke für Dein schnelles Feedback!

    Ich habe nichts vergessen, ich kenne mich nicht aus. ^^ Ich habe wirklich nur diese zwei Dateien mit dem gezeigten Code (das sind keine Auszüge) unter den entsprechenden Pfaden im Wurzelverzeichnis angelegt.

    Bin ich mal mit meinem Herangehen (wenn man kein ganzes Modul schreiben will), überhaupt richtig?
    Ich dachte meine Klasse wird auf diese Weise automatisch geladen. Müsste ich dann
    PHP-Code:
    use EventListener\UpdateStock
    in der contao/config.php ergänzen?

    Lieben Dank!

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

    Standard

    Wenn dann
    PHP-Code:
    use App\EventListener\UpdateStock
    Das ist der FQCN deiner Klasse.

    Aber heißt das auch, dass du <?php vergessen hast überall einzufügen?
    Geändert von Spooky (09.06.2022 um 14:16 Uhr)
    » sponsor me via GitHub or PayPal or Revolut

  7. #7
    Contao-Nutzer
    Registriert seit
    06.10.2011.
    Ort
    Wien
    Beiträge
    85

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Wenn dann
    PHP-Code:
    use App\EventListener\UpdateStock
    Das ist der FQCN deiner Klasse.

    Aber heißt das auch, dass du <?php vergessen hast überall einzufügen?
    Ich habe das use Statement in der contao/config.php ergänzt, zudem ein die() in der Methode zum Testen eingefügt. Aber es tut sich nichts. Die <?php ist überall drinnen, das habe ich nicht mit rein genommen, weil Ihr das auch nicht gemacht habt.

    Gibt es einen Guide, wenn man eben nur eine kleine Funktion mit einem Hook verbinden will? Braucht man immer ein Modul? Danke für Deine Zeit....

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

    Standard

    Zitat Zitat von Creasign Beitrag anzeigen
    Braucht man immer ein Modul?
    Nein, brauchst du nie. Alles kann mit Applikationsanpassungen gemacht werden.
    » sponsor me via GitHub or PayPal or Revolut

  9. #9
    Contao-Nutzer
    Registriert seit
    06.10.2011.
    Ort
    Wien
    Beiträge
    85

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Nein, brauchst du nie. Alles kann mit Applikationsanpassungen gemacht werden.
    Okay, die config.php muss im Ordner /contao/config/ liegen.

    Im Checkout wird nun wohl auch der Hook aufgerufen. Es endet aber mit einer Fehlermeldung, laut log:
    Code:
    [2022-06-09 15:11:01] request.INFO: Matched route "tl_page.162". {"route":"tl_page.162","route_parameters":{"_token_check":true,"_controller":"Contao\\FrontendIndex::renderPage","_scope":"frontend","_locale":"de","pageModel":"[object] (Contao\\PageModel: {})","parameters":"/complete","_route":"tl_page.162"},"request_uri":"https://XXXXXXX/preview.php/webshop/kasse/complete.html?uid=62a1f1612c7b33.61341060","method":"GET"} []
    [2022-06-09 15:11:01] security.INFO: Populated the TokenStorage with an anonymous Token. [] []
    [2022-06-09 15:11:02] request.CRITICAL: Uncaught PHP Exception RuntimeException: "System::importStatic() failed because class "A" is not a valid class name or does not exist." at /srv/www/XXXXXXX/public/XXXXXX/vendor/contao/core-bundle/src/Resources/contao/library/Contao/System.php line 270 {"exception":"[object] (RuntimeException(code: 0): System::importStatic() failed because class \"A\" is not a valid class name or does not exist. at /srv/www/XXXXXXX/public/XXXXXXXX/vendor/contao/core-bundle/src/Resources/contao/library/Contao/System.php:270)"} []

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

    Standard

    Poste deine contao/config.php
    » sponsor me via GitHub or PayPal or Revolut

  11. #11
    Contao-Nutzer
    Registriert seit
    06.10.2011.
    Ort
    Wien
    Beiträge
    85

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Poste deine contao/config.php
    PHP-Code:
    <?php
    // contao/config/config.php 
    use App\EventListener\UpdateStock;
    $GLOBALS['ISO_HOOKS']['postCheckout'] = [UpdateStock::class, 'UpdateStockCheckout'];

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

    Standard

    So wäre es richtig:
    PHP-Code:
    $GLOBALS['ISO_HOOKS']['postCheckout'][] = [UpdateStock::class, 'UpdateStockCheckout']; 
    » sponsor me via GitHub or PayPal or Revolut

  13. #13
    Contao-Nutzer
    Registriert seit
    06.10.2011.
    Ort
    Wien
    Beiträge
    85

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    So wäre es richtig:
    PHP-Code:
    $GLOBALS['ISO_HOOKS']['postCheckout'][] = [UpdateStock::class, 'UpdateStockCheckout']; 
    Herzlichen Dank! Leider habe ich heute keine Zeit mehr es auszuprobieren. Entschuldige bitte die Umstände. Lieben Gruß!

  14. #14
    Contao-Nutzer
    Registriert seit
    06.10.2011.
    Ort
    Wien
    Beiträge
    85

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    So wäre es richtig:
    PHP-Code:
    $GLOBALS['ISO_HOOKS']['postCheckout'][] = [UpdateStock::class, 'UpdateStockCheckout']; 
    Danke, das war das Problem! LG

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
  •