-
Lagerverwaltung
Hallo,
ich versuche gerade eine Art Lagerverwaltung in Isotope selbst einzubauen.
Das Modul wf_isotpe_stockManagement funktioniert bei mir leider nicht, sondern legt das ganze System lahm.
Aktuell soll sobald ein Kaufvorgang abgeschlossen wird die Anzahl der jeweiligen Produkte in der DB entsprechend ihrer Häufigkeit im Warenkorb abgezogen.
Ich habe bisher die Stelle herausgefunden die ich bearbeiten muss.
-> isotope/library/Isotope/Module/Checkout.php bei Zeile 225
Wenn ich mir dort Isotope::getCart()->getItems() ausgeben lasse erhalte ich alle Produktinfos zu den Artikeln im Warenkorb, allerdings sind da viele Informationen dabei die ich nicht brauche.
Was ich brauche ist genau dieser Teil:
[arrData: protected] => Array
(
[id] => 31
[pid] => 1
[tstamp] => 1421828159
[product_id] => 2
[type] => standard
[sku] => 0001
[name] => Adidas Sneaker
[configuration] => a:0:{}
[quantity] => 2
[price] => 25.00
[tax_free_price] => 25.00
[tax_id] =>
[jumpTo] => 3
)
Hat jemand eine Idee wie ich ohne große Umstände daran komme? Ich will nicht tausend foreachschleifen lostreten um das abgreifen zu können.
Ein Problem dabei ist auch dass es dieses [arrData: protected]... in mehrfacher ausführung in dem array gibt.
Um an die Iteminfos zu kommen genügt ja zB Isotope::getCart()->getItems(), gibt es da vllt auch etwas womit ich noch weiter in das array hineingreifen kann?
Auf der Isotope-Seite habe ich dazu nichts gefunden.
vielen Dank schonmal für eure Hilfe :)
-
Hallo Rigobert,
welche Version von Isotope nutzt du denn?:eek:
-
Hallo,
ich nutze die Version 2.1.9.
Habe das Problem aber mittlerweile gelöst über drei zusätzliche Funktionen in der Checkout.php
ich liste hier mal den Code auf:
PHP-Code:
public function getStockUpdateInfo($arrItem){
$arrStock = array();
foreach($arrItem as $a){
$arrHelp = array(
'id' => $a->product_id,
'quantity' => $a->quantity
);
array_push($arrStock, $arrHelp);
}
return $arrStock;
}
public function updateProductStock($arrItem){
$arrItem = $this->getStockUpdateInfo($arrItem);
foreach($arrItem as $a){
$this->Database->prepare("UPDATE tl_iso_product
SET stock = stock - ?
WHERE id = ?")->execute($a['quantity'], $a['id']);
$this->checkStock($a['id']);
}
}
public function checkStock($id){
$stock = $this->Database->prepare("SELECT sku, name, stock FROM tl_iso_product WHERE id = ?")->execute($id)->fetchAllAssoc();
if($stock[0]['stock'] == 0){
$to = "email@mail.com";
$subject = 'blub!';
$from = 'From: blubblub';
$message = "Achtung! \nDas Produkt ".$stock[0]['name']." (Sku: ".$stock[0]['sku'].") ist ausverkauft. Bitte füllen Sie das Lager wieder auf.";
mail($to, $subject, uft8_decode($message), $from);
}
}
Die letzte Funktion gibt noch eine Warnmail an den Shopinhaber heraus falls das Produkt ausverkauft ist.
der Funktionsaufruf erfolgt folgendermaßen ab Zeile 138 in der Checkout.php
PHP-Code:
if ($objOrder->checkout() && $objOrder->complete()) {
$this->updateProductStock($objOrder->getItems());
\Controller::redirect(\Haste\Util\Url::addQueryString('uid=' . $objOrder->uniqid, $this->orderCompleteJumpTo));
}
-
das einzige Problem ist, dass es nicht updatesicher ist.
Ich weis leider nicht wie ich von außen an diesem Schritt eingreifen kann. Der Funktionsaufruf erfolgt ja immer sobald man auf den Button "jetzt bezahlen" klickt.
-
Hallo Rigobert,
wenn du es updatesicher möchtest musst du eine kleine Erweiterung schreiben.
Für deinen Zweck bietet das ProductCollectionModel mehrere Hooks.
https://github.com/isotope/core/blob...Collection.php
https://github.com/isotope/core/blob...tion/Order.php
Wenn der Bestellvorgang abgeschlossen ist wird das CollectionModel gelockt. Das heißt der Besteller kann nichts mehr verändern und hat die Bestellung abgesendet.
Hier wäre deine Funktion sicher am besten aufgehoben:
PHP-Code:
$GLOBALS['ISO_HOOKS']['collectionLocked']
Vielleicht solltest du noch optional mit eine Funktion einbauen, falls eine Bestellung storniert wird oder gelöscht.
Für die Löschen-Aktion hast du diesen Hook:
PHP-Code:
$GLOBALS['ISO_HOOKS']['deleteCollection']
Für die Storno-Aktion sollte dieser Hook nützlich sein:
PHP-Code:
$GLOBALS['ISO_HOOKS']['postOrderStatusUpdate']
Viel Erfolg :)