[Plugin Development] Rechnung via E-Mail-Anhang versenden | Send invoice via mail attachment

DE: Hier ein paar hilfreiche Code-Snippets für custom plugin development. Soll zeigen, wie man eine Rechnung via E-Mail-Anhang aus seinen Plugins versendet.

EN: Here’s additional documentation on how to create and send Shopware emails + attachments.

// How to send an already generated pdf invoice

try {
    $emailTemplete = 'sORDERDISPATCH';
    $mail = Shopware()->TemplateMail()->createMail($emailTemplete, $dataEmail);
    $mail->addTo($dataEmail['email']);

    if ($needsInvoice) {
        $path = $this->getInvoicePath($order['id']);
        $content = file_get_contents($path);

        $attachment = new \Zend_Mime_Part($content);
        $attachment->type = 'application/pdf';
        $attachment->disposition = \Zend_Mime::DISPOSITION_ATTACHMENT;
        $attachment->encoding = \Zend_Mime::ENCODING_BASE64;
        $attachment->filename = 'Rechnung_' . $order['ordernumber'] . '.pdf';

        $mail->addAttachment($attachment);
    }

    return $mail->send();
} catch (\Exception $e) {
    return false;
}

 

// how to get the file path of an invoice via orderId
// orderId = s_order_documents.orderID

public function getInvoicePath($orderId)
{
    $sql = 'SELECT hash FROM `s_order_documents` WHERE `orderID` = ?';
    $stmt = Shopware()->Db()->executeQuery($sql, [$orderId])->fetchAll();
    if ($stmt[0]['hash']) {
        // only use this when using Shopware version < 5.4.
        // check the comments for additional informations 
        return Shopware()->DocPath() . 'files/documents' . '/' . $stmt[0]['hash'] . '.pdf';
    }
    throw new \Exception('Could not find hash for invoice pdf file.');
}

// How to generate a pdf invoice for a specific order


/**
 * Generate the invoice document for an order
 *
 * @param int $orderId
 * @return void
 */
public function generateInvoice($orderId)
{
    // Document Generator Settings
    $renderer = "pdf";
    $documentType = 1;
    $displayDate = date("d.m.Y");

    // PDF Document setup
    $document = \Shopware_Components_Document::initDocument(
        $orderId,
        $documentType,
        [
            'netto' => false,
            'bid' => null,
            'voucher' => null,
            'date' => $displayDate,
            'delivery_date' => null,
            'shippingCostsAsPosition' => true,
            '_renderer' => $renderer,
            '_preview' => false,
            '_previewForcePagebreak' => null,
            '_previewSample' => null,
            'docComment' => null,
            'forceTaxCheck' => false,
        ]
    );

    // Create the document
    $document->render();
    return $document;
}

 

DE: Wünsche und Anregungen/Änderungen etc. gerne in die Kommentare.

EN: Feel free to comment when you have important notes/changes.

 

PS: @shopware PLEASE update your docs, its so bad and nobody wants to work with shopware because you need to figure out everything yourself. Furthermore, make your forum more userfriendly. I cant even get proper Syntax-Highlighting when in preview mode!

 

„return Shopware()->DocPath() . ‚files/documents‘ . ‚/‘ . $stmt[0][‚hash‘] . ‚.pdf‘;“ sollte schon ab Shopware 5.4 nicht mehr verwendet werden.

von 5.4.0 - 5.4.6 shopware.app.documentsdir aus dem DI nehmen, ab 5.5 dann private filesystem

1 „Gefällt mir“

Hallo Shyim, 

vielen Dank, arbeite noch auf der Shopware Version 5.2.2.

Ich werd mal oben die Versionen kennzeichnen!

Danke dir Profihorst, genau was ich gebraucht habe!

Und ich bin ganz bei dir, die Shopware Dokumentation ist wirklich schlecht. Es ist extrem mühsam irgendwas herauszufinden und der Support hier ist auch dürftig! Hält sicher einige Entwickler davon ab mit Shopware zu arbeiten - bin selbst auch am Überlegen ob ichs nicht bald bleiben lasse.

1 „Gefällt mir“

Ist es möglich, dies in Shopware 6 zu tun?

Vielleicht ist etwas spät, aber falls jemand damit auch kämpft, eine möglichkeit in 6.4, wenn man ein Event auslöst, der MailActionInterface implementiert, ist sowas

            $self = $this;
           
            $listenerClosureBefore = function (MailBeforeValidateEvent $event) use ($order, $self): void {
                $xmlString = $self->createEmailXml($order);
                $attachments[] = [
                    'content' => $xmlString,
                    'fileName' => 'order.xml',
                    'mimeType' => 'application/xml',
                ];
                $event->addData('binAttachments', $attachments);
            };

           $this->eventDispatcher->addListener(MailBeforeValidateEvent::class, $listenerClosureBefore);

           $this->eventDispatcher->dispatch($orderPlacedEvent);

           $this->eventDispatcher->removeListener(MailBeforeValidateEvent::class, $listenerClosureBefore);

So muss man zumindest die sendMail Funktion nicht überschreiben, und man kann ein Attachment schicken ohne eine Datei zu speichern.
Und ich stimme mit den anderen zu, die Shopware Doku ist leider oft schlecht. Ich muss oft durch den Code von Shopware schauen, um solche Sachen herauszufinden.