Order Dokument "Angebot" erstellen

.

Hi,

Du brauchst noch den Eintrag in der services.xml mit dem entsprechenden Tag document.generator

    %kernel.root_dir%

und in der OfferGenerator Klasse die Funktion supports entsprechend Deines Dokumenten Typs anpassen

    public function supports(): string
    {
        return 'offer';
    }

 

2 Likes

Hallo Manuel,

zu der Datenbank, jede eigene und auch freme Entity liefert automatisch ein Repository mit ĂŒber welches Du die Daten auslesen, schreiben oder löschen kannst. WĂŒrde ich auch generell ggĂŒ. direkten Datenbankabfragen empfehlen.

Beispiel dafĂŒr findest Du hier https://docs.shopware.com/en/shopware-platform-dev-en/how-to/reading-entities-dal

Da es sich nun im Gegensatz zu Shopware5 um Symfony Controller handelt, kannst Du Services direkt mit $this->get(‘service.id’), statt $this->container abfragen. Oder noch besser die Services im Constructor Deiner Klasse injecten

/**
     * OfferController constructor.
     * @param OfferDocumentService $documentService
     * @param ProductLoader $productLoader
     * @param CartService $cartService
     * @param GenericPageLoader $genericPageLoader
     * @param NumberRangeValueGenerator $valueGenerator
     * @param EntityRepositoryInterface $countryRepository
     * @param EntityRepositoryInterface $salutationRepository
     * @param EntityRepositoryInterface $salesChannelRepository
     */
    public function __construct(
        OfferDocumentService $documentService,
        ProductLoader $productLoader,
        CartService $cartService,
        GenericPageLoader $genericPageLoader,
        NumberRangeValueGenerator $valueGenerator,
        EntityRepositoryInterface $countryRepository,
        EntityRepositoryInterface $salutationRepository,
        EntityRepositoryInterface $salesChannelRepository
    )

use Statements nicht vergessen :slight_smile: Falls Du mit PhpStorm arbeitest kannst diese auch direkt importieren lassen.

Variablen ans Template ĂŒbergeben tust Du beim Rendern wie folgt in der Controller Action selbst

return $this->renderStorefront('@Storefront/storefront/page/offer/index.html.twig', [
            'productId' => $productId,
            'quantity' => $quantity,
            'cartToken' => $cartToken,
            'countries' => $countries,
            'salutations' => $salutations,
            'page' => $page
        ]);

Zu Deinem Fehler mit der DocumentNumber, hast Du denn eine eigene NumberRange fĂŒr das offer Dokument angelegt? Oder nutzt Du eine bestehende?

Hallo Manuel,

NumberRanges werden in den gleichnamigen Tabellen und deren Entities gepflegt. 

@devkayba schrieb:

Dein gezeigter Service: Ist in dem Fall dann “dein\Controller” einfach mein Pluginname?

“dein\Controller” ist der Namespace + der Klassenname Deines Controllers

HowTo: https://docs.shopware.com/en/shopware-platform-dev-en/how-to/custom-storefront-controller

$this->get(‘product_reservation’); mĂŒsste $this->get(‘product_reservation.repository’); sein, dann bekommst Du das Repository nicht die Connection. Mit dem Repository kannst Du dann die Daten abfragen. Nochmal hier das Beispiel https://docs.shopware.com/en/shopware-platform-dev-en/how-to/reading-entities-dal

Bzgl. Deinem Fehler im Subscriber:

Nur in einem Symfony Controller steht der DependencyInjection Container direkt bereit. In einem Subscriber musst Du Services immer ĂŒber den Constructor und die services.xml Definition einbinden.

Ich wĂŒrde Dir empfehlen die kostenlose Videoschulung von Shopware und die HowTos anzuschauen, hier gibt es viele detailierte Beispiele und es wird auch Symfony ein wenig erklĂ€rt.

https://academy.shopware.com/courses/shopware-6-developer-training-english

 

2 Likes

Hallo Manuel,

ich habe auch einen neuen Dokumenttyp angelegt und erhalte ebenfalls den folgenden Fehler, da meine DocumentConfiguration quasi leer ist bzw. alle Felder auf null/0 stehen und daher getDocumentNumber() natĂŒrlich kein korrektes Ergebnis zurĂŒckliefert.

Return value of Shopware\\Core\\Checkout\\Document\\DocumentConfiguration::getDocumentNumber() must be of the type string or null, int returned

Bist du hierbei noch weitergekommen? Falls ja, wÀre es super wenn du noch einmal kurz deine Vorgehensweise erklÀren könntest. 

Ich habe also bisher eine OfferGenerator.php erstellt und die Funktionen supports(), getFileName() und generate() implementiert und schließlich, wie oben beschrieben, alles in der services.xml eingetragen. Ein neues HTML-Template habe ich ebenfalls bereits erstellt. Es funktioniert also eigentlich alles, bis auf das meine DocumentConfiguration leer ist. 

Gruß

Julian

Hat sich erledigt. Ich bin mir nicht ganz sicher, aber es lag wahrscheinlich an einer fehlenden number range. Nun wird die DocumentConfiguration erfolgreich erstellt und es lÀuft alles.

Danke trotzdem an euch fĂŒr die vielen Informationen in diesem Beitrag!