Wie kann ich document.php updatesicher ändern?

Hallo,

ich möchte gerne die document.php (engine/Shopware/Components) ändern. Wie mache ich das updatesicher? Wahrscheinlich komme ich nicht umhin ein Plugin zu schreiben. Kann mir jemand kurz erklären oder mir ein Beispiel geben für ein Backend Plugin? Ich habe schon ein einfaches Plugin für das Frontend geschrieben, aber ich denke das hier wird komplizierter. Eigentlich muss ich nur eine Codezeile in der document.php ändern (Zeile 751):

// Update numberrange, except for cancellations
if ($typID != 4) {

soll geändert werden zu

// Update numberrange, except for cancellations
if ($typID != 4 && $typID != 1) {

aber irgendwie stehe ich auf den Schlauch und weiß einfach nicht weiter bzw. ich weiß erst gar nicht wie ich anfangen soll. 

Kann mir da jemand helfen?

 

Hi das ganze kann man über einen Hook lösen.

Der passende Hook wäre dann Shopware_Components_Document::saveDocument:: (replace/after/) - leider bin ich mit dem “hooken” nicht so vertraut und krieg zwar die Funktion hin aber nicht die Werte die erwartet werden. Vielleicht kann sich ja hier noch jemand einklinken und dir helfen. Würde auch mich interessieren(rein technisch).

 

Gruß

Alex

1 „Gefällt mir“

Hallo Alex,

vielen Dank für deinen Kommentar. Das hat mir schon weitergeholfen. Ich komme jedoch nicht weiter. Meine Vorgensweise wäre, dass ich Shopware_Components_Document::saveDocument::after verwenden würde. Also das heißt doch, dass ich mich nach dem Beenden von saveDocument im Originalen einklinken würde, oder? Dann würde ich einfach den Code mit der If-Abfrage einbauen

 

   if (!$this->_allowMultipleDocuments && !empty($checkForExistingDocument['id'])) {

        } else {
            // Update numberrange, except for cancellations
            if ($typID != 1) {
                if (!empty($this->_document['numbers'])) {
                    $numberrange = $this->_document['numbers'];
                } else {
                    // The typID is indexed with base 0, so we need increase the typID
                    if (!in_array($typID, ['1', '2', '3'])) {
                        $typID = $typID + 1;
                    }
                    $numberrange = 'doc_' . $typID;
                }
            
                /** @var NumberRangeIncrementerInterface $incrementer */
                $incrementer = Shopware()->Container()->get('shopware.number_range_incrementer');
            
                // Get the next number and save it in the document
                $nextNumber = $incrementer->increment($numberrange);
            
                Shopware()->Db()->query('
                    UPDATE `s_order_documents` SET `docID` = ? WHERE `id` = ? LIMIT 1 ;
                    ', [$nextNumber, $rowID]);
            
                $bid = $nextNumber;
            }
        }

 

Bin ich da auf dem richtigen Weg oder liege ich da total falsch. Kann mir da jemand noch weiterhelfen und mir ein paar Tipps geben? Wie gesagt, mit der Plugin-Entwicklung stehe ich noch am Anfang.

Grüße 

Jasmin

 

 

 

 

Hi Jasmin,

 

genau das war auch mein Ansatz, jedoch dürfte dann die typID leer sein bzw null sein. Ich bin leider mehr im Frontend unterwegs. Weswegen ich da nicht mehr machen kann. Ich hoffe dir kann trotzdem noch jemand helfen.

 

Viel Glück

Alex

Leider bin ich immer noch nicht weiter gekommen. Ich versuche als Test gerade die document id in meiner Funktion zu ändern, damit ich im Dokument sehen kann, ob der Hook greift. Leider finde ich dazu recht wenig…

public function subscribeEvents()
{
   $this->subscribeEvent(
       'Shopware\Components\Document::saveDocument::after',
       'onAfterGetBidAction'
   );
}

public function onAfterGetBidAction(\Enlight_Hook_HookArgs $args)
{
   /** @var \Shopware\Components\Document $document */
   $document = $args->getSubject();

   $view = $document->_view;

   $view->assign('_documentID', 333);
}

Kann mir jemand helfen? Ist der Ansatz überhaupt richtig? Für jede Zeile Code oder Tipps wäre ich schon dankbar.

 

Grüße

Jasmin

 

$this->container->get(‚pluginlogger‘);
$logger->addError(„test“);

 

Über $context = array(„test“, $hierVariableEinfügen) und ein

$logger->addError(„test“, $context)

Kannst du auch dann Variablen ausgeben

Damit siehst du dann in den Logfiles ob du soweit kommst - bin aber nicht sicher obs mit „“ geht - war der Meinung das muss ein „_“ sein bei Shopware_Components…

Endlich funktioniert mein Plugin. Hier mein Backend-Plugin:

subscribeEvents();
        return true;
    }

    /**
     * getInfo plugin method
     *
     * @return array
     */
    public function getInfo()
    {
        return [
            'label' => $this->getLabel(),
            'version' => $this->getVersion(),
            'autor' => 'xyz',
            'copyright' => 'Copyright © 2020',
            'license' => 'MIT',
            'description' => ' Die Dokumenten Bid erscheint in der Rechnung als Rechnungsnummer. 
                            In den Bestellungs-Details wird der Dokumentennamen angepasst. In der Bestellübersicht erscheint die Dokumenten Bid als Rechnungsnummer.'
        ];
    }

    /**
     * getLabel plugin method
     *
     * @return string
     */
    public function getLabel()
    {
        return 'Zeige Dokumenten Bid als Rechnungsnummer';
    }

    /**
     * getVersion plugin method
     *
     * @return string
     */
    public function getVersion()
    {
        return '1.0.0';
    }

    /**
     * subscribe Events
     *
     * @return void
     */
    public function subscribeEvents()
    {
        $this->subscribeEvent(
            'Shopware_Components_Document::saveDocument::after','onAfterSaveDocumentBidToDocIdAction'
        );
    }

    public function onAfterSaveDocumentBidToDocIdAction(Enlight_Hook_HookArgs $args)
    {
        $typID = $args->getSubject()->_typID;

        if ($typID == 1) {

            $bid = $args->getSubject()->_documentBid;
            $docID = $args->getSubject()->_documentID;
         
            if (($bid != NULL || $bid != '') && ($docID != NULL || $docID != ''))
            {
                $dbalConnection = Shopware()->Container()->get('dbal_connection');
                $dbalConnection->executeQuery(
                    'UPDATE s_order_documents SET docID=:bid WHERE docID=:docid',
                    ['bid' => $bid, 'docid' => $docID]
                );
            }
        }
    }
}