Dummyartikel addToBasket Preisänderung


#1

Hallo zusammen,

habe jetzt mehr mal das Forum durchgesucht und versucht die vorhandenen Beiträge zu verstehen.

        $sProductId = "53119ce4b05d542f21511566d2787fa9";//Dummyartikel
        // Artikelinformationen
        $aSel = null;
        $blOverride = true;
        
        //Artikel hinzufügen
        $oBasket = $this->getSession()->getBasket();
        $oBasketItem = $oBasket->addToBasket($sProductId, $dAmount, $aSel, $aPersParam, $blOverride);
        
        
        //Erstellen des Preisobjekts 
        $oPrice = oxNew('oxprice');
        $oPrice->setPrice($dPrice,0.19);
        
        //Setzen des Preises
        $oBasketItem->setRegularUnitPrice(clone $oPrice);
        $oBasketItem->setPrice($oPrice);

Allerdings bekomme ich nicht das gewünschte Ergebnis im Warenkorb. Was mache ich falsch?

Vielen Dank im Voraus!


#2

Habe vergessen zu schreiben was ich vorhabe…

Ich habe vor mehreren Jahren schon einmal mit OXID gearbeitet und versuche mich nun nochmal in die Materie reinzuarbeiten und mich mit der neuen Version auseinander zusetzen.

Zum Thema:
Mein Projekt wird eine Artikelkonfiguration, ja, es gibt schon eine leider bietet mir diese nicht genau das was ich suche.

Ich habe eine Sammlung von X Artikel die ich unter einem Artikel verkaufen möchte. Der Preis setzt sich also aus allen Artikeln zusammen. Ich arbeite in einem eigenen Controller und füge in diesem den “Dummy”-Artikel in den Warenkorb. Diesen Artikel möchte ich sobald er als BasketItem zur Verfügung steht anpassen.

  • Titel
  • Preis
  • etc.

Die Daten stehen auch im Warenkorb im Datenobjekt, allerdings scheinbar nicht an der Stelle wo Sie stehen sollen, also müssen die Werte wohl danach nochmal überschrieben werden. Was muss ich also ändern das der Warenkorb nicht wieder den genauen Artikel aus dem Artikelstamm lädt und überschreibt.

Wäre sehr Dankbar für Unterstützung!


#3

Was bei Dir oben fehlt ist: $this->_calculatePrice( $oPrice ); nach setprice…$this = oxarticles


#4

Erstmal vielen Dank für deine Rückmeldung.

Habe das nun hinter jeweils mal hinter das oxPrice->setPrice und hinter das oBasketItem->setPrice gehangen, aber hat nicht den gewünschten Effekt gegeben.

Rein die Funktion zunutzen aus dem Model, hat für mich keinen Sinn ergeben, weil wir sind ja in der Objektorientierung, deshalb habe ich es folgendermaßen aufgerufen:

$oArticle = $oBasketItem->getArticle(true)->_calculatePrice( $oPrice,0.19 );

Meinstest du das so?

Für die Erreichbarkeit habe ich natürlich die Funktion auch Public gestellt. “Exception abgefangen: Function ‘_calculatePrice’ does not exist or is not accessible! (oxArticle)”


#5

Ach da bist Du: Schreibe den Wert in oxbasketitem z.B. in getArticle():
$this->_oArticle->oxarticles__oxprice = new oxField($deinneuerpreis);


#6

VIELEN DANK!
Komischer Weise hatte ich das schon einmal ausprobiert, so hatte dies aber nicht wirklich funktioniert, muss wohl an einer falschen Kombination gelegen haben.

Das funktioniert Grundsätzlich, allerdings steht nun im letzten Checkoutstep 4 wieder 0 €. Artikeltitle oder Artikelnummer lassen sich auf diesem Weg leider nicht überschreiben.


#7

Ist der Artikel $sProductId = "53119ce4b05d542f21511566d2787fa9"; denn in der Datenbank, also Tab. oxarticles verfügbar? Wenn ja, dann überschreibst es vielleicht irgendwo.


#8

Ja ist er, aber ich benötige den Artikel eigentlich nicht wenn ich einen komplett eigenen Temp-Artikel erstellen könnte, der nur für die eine Bestellung existiert!?

Durch die Funktion addToBasket benötige ich eine ProductId oder gibt es einen anderen Weg, der besser wäre als einen bestehenden Artikel zu verändern?


#9

Geht theoretisch auch ohne, musst Dir halt Dein eigenes Objekt anlegen.
Zu obigem Problem: Bei mir bleibt der Preis im Checkout bis zum Ende.


#10

Hallo @kreidev, bei dem was du da vor hast, muss ich an zusammengezogene Artikel denken, eine Art Bundle.
Ich würde hier folgenden Ansatz versuchen:

  1. Die Tabelle “oxarticles” erweitern um eine weitere Spalte - so etwas wie “virtual_parent”. Diese Spalte enthält dann bei den “Unterartikeln” (ich nenne die mal so) die OXID des Hauptartikels, der kaufbar ist.
  2. Die einzelnen Unterartikel kann man dann natürlich auch als nicht kaufbar markieren, wenn man das möchte.
  3. Nun musst du noch die entsprechenden Stellen für den (ox)Article erweitern, die den Preis des Hauptartikels zurückliefern, dabei lädst du dir die Unterartikel und summierst einfach deren Einzelpreis*Menge.

So in etwa sollte es sehr einfach lösbar sein, was du da vorhast.

Nicht zu vergessen sind selbstverständlich die nachgelagerten Prozesse und Datenbankeinträge beim Kauf (oxorder usw.).


#11

Hi Zar,

verstehe dich, aber das klingt etwas komplizierter.

Ich habe nun mal den Weg gewählt einen eigenen Artikel zu gestalten, dies funktioniert soweit, leider schon zu gut, denn jetzt legt er mir natürlich einen neuen Artikel an, der auf Dauer mein Backend überflutet. Das dieser nicht Suchbar ist, würde ja einstellbar sein, aber das mit dem Backend ist schlecht.

Gibt es eine andere Methode, als das Backend beim Laden dieser Artikel zu hindern? Würde einfach ein neues Feld hingeben und den Query versuchen einzuschränken.

Anbei mein Code für den Versuch 2:

//Neuer Artikel
        $oArticle = oxNew('oxArticle'); 
        
        //Artikel ID
        $oArticle->setId(oxUtilsObject::getInstance()->generateUID()); //OXID generieren
        
        //Preis
        $oPrice = oxNew('oxprice');
        $oPrice->setPrice($dPrice,0.19);   
        $oArticle->setPrice($oPrice);
        
        //Artikelname
        $oArticle->oxarticles__oxtitle = new oxField("Testtitle");
        $oArticle->oxarticles__oxprice = new oxField($dPrice);
        $oArticle->oxarticles__oxshortdesc = new oxField("Inhalt: "+$sInhalt);
        $oArticle->oxarticles__oxartnum = new oxField("666666");
        $oArticle->oxarticles__oxvat = new oxField(0.19);
        
        // Artikelinformationen
        $aSel = null;
        $blOverride = true;
        $aPersParam = array();
         
        $oArticle->save();
        
        //Artikel hinzufügen
        $oBasket = $this->getSession()->getBasket();
        $oBasketItem = $oBasket->addToBasket($oArticle->oxarticles__oxnid->value, 1, $aSel, $aPersParam, $blOverride);

Vielen Dank an alle die mir so weitergeholfen haben! Ihr seit Klasse!

LG!


#12

Einen Artikel zum Konfigurieren anlegen, in dessen Persparams (konfigurierbarer Artikel) eine ID schreiben und die Daten des konfigurierten Artikels woanders speichern.