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 „Gefällt mir“

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 „Gefällt mir“

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!