2014-03-18 13 views
6

Ich versuche, eine konfigurierbare Produkt-SKU für ein Elternteil aus einer SKU oder ID eines untergeordneten Produkts zu erhalten. Mein Verständnis ist, dass eine einfache kann zu mehreren konfigurierbaren gehören, aber ich möchte die spezifischen konfigurierbaren der Kunde in ihren Warenkorb hinzugefügt. Ich lese ein related question, aber es wird alle Eltern konfigurierbar.Erhalte konfigurierbares SKU mit einfacher SKU oder ID

Ich bin mit Magento EE 1.12

EDIT: Weitere Einzelheiten zu, was ich tue. Wenn ein Kunde erfolgreich auscheckt, versuche ich, SKU's von Simples zu erhalten und das konfigurierbare, das der Kunde ausgecheckt hat.

Code anwenden Versuch,:

app/design/frontend/enterprise/mytheme/template/checkout/success.phtml 

Antwort

3

Wenn das konfigurierbare in der Warenkorb gelegt zu holen ist schon ich glaube, Sie den Wagen verhören können finde die konfigurierbare und ihre einfache ID.

$myTargetSimpleProductId = $someIdThatYouKnow; 
$quote = Mage::getSingleton('checkout/session')->getQuote(); 
$cartItems = $quote->getAllVisibleItems(); 
foreach ($cartItems as $item){ 
    if ($option = $item->getOptionByCode('simple_product')) { 
    $productIdArray[] = $option->getProduct()->getId(); //for the record 
    if ($option->getProduct()->getId()==$myTargetSimpleProductId){ 
     $myMatchingConfigurableProductId = $item->getProductId(); //capture the ID of the configurable 
    } 
    } 
} 
//$productIdArray holds a list of all the IDs of simple products that are in the basket due to configurables. 
echo("The answer is ".$myMatchingConfigurableProductId); 

-Code von this Q&A angepasst und that Q&Aund nicht getestet so lassen Sie mich wissen, wenn diese Bomben schrecklich und man kann nicht alle Korrekturen herauszufinden.

**** EDIT den Code ein bisschen mehr nach dem Kommentar unten zu erklären ***

Insgesamt hilft es zu verstehen, dass, wenn jemand ein konfigurierbares Produkt in den Warenkorb gelegt fügt hauptsächlich Magento speichert die Produkt-ID von die konfigurierbare Produkt-ID des zugrunde liegenden einfachen Produkts. Aber Magento ist Magento das konfigurierte Produkt im Warenkorb ist ein komplexes Objekt, von dem ein Teil ein Verweis auf das zugrunde liegende einfache Produkt ist.

So:

$item->getProductId(); //Really means [pseudo code] $item->getConfiguredProductId() 
$item->getOptionByCode('simple-product') //Accesses the underlying simple product object, hence 
$item->getOptionByCode('simple-product')->getProduct()->getId() //gives accesse to the ID of the underlying simple product - ie the thing you want to test. 

Nun, wenn Sie auf der Erfolgsseite die Herausforderung ist, wie die Auftragspositionen zuzugreifen. Es gibt eine Prise von Antworten auf Stack-Überlauf für die und hier ist eine Auswahl:

$_order = Mage::getModel('sales/order')->loadByIncrementId($this->getOrderId()); 
foreach ($_order->getAllItems() as $item) { 

due to this Q&A. Oder

$_customerId = Mage::getSingleton('customer/session')->getCustomerId(); 
$lastOrderId = Mage::getSingleton('checkout/session')->getLastOrderId(); 
$order = Mage::getSingleton('sales/order'); 
$order->load($lastOrderId); 
foreach ($order->getItemsCollection() as $item) { 

oder von einem Beobachter-Funktion:

$order = $observer->getOrder(); 
/* @var $item Mage_Sales_Model_Order_Item */ 
foreach ($order->getItemsCollection() as $item) { 

both due to this Q&A.

Aber ich glaube, Sie könnten am meisten profitieren von diesem Tutorial aus dem Magento versierte Yireo:

$orderId = Mage::getSingleton('checkout/session')->getLastRealOrderId(); 
$order = Mage::getModel('sales/order')->loadByIncrementId($orderId); 
$cartItems = $order->getAllItems(); 
foreach($cartItems as $item) { 

due to Jisse Reitsma of Yireo.com

So sollten Sie alle eingestellt werden. Es gibt ein paar Kleinigkeiten, die Sie in Ihren endgültigen Code einfügen müssen, aber ich denke, Sie setzen Ihren Code entweder in template/checkout/success.phtml oder in einen Beobachter auf checkout_type_onepage_save_order_after und die obigen Schnipsel führen Sie.

**** weitere Änderungen ***

Wenn Sie ein $product die product_type = 'configurable' dann ist seine SKU erhalten Sie $product->getData('sku'); nennen sollten, wenn Sie nur $product->getSku(); nennen, die immer die einfache SKU Rückkehr aufgrund

//file: app/code/core/Mage/Core/Catalog/Model/Product.php 
//class: Mage_Catalog_Model_Product 
public function getSku() 
    { 
     return $this->getTypeInstance(true)->getSku($this); 
    } 

und wenn Sie den Code folgen, finden Sie

//file: app/code/core/Mage/Core/Catalog/Model/Product/Type/Configurable.php 
//class: Mage_Catalog_Model_Product_Type_Configurable 
public function getSku($product = null) 
    { 
     $sku = $this->getProduct($product)->getData('sku'); 
     if ($this->getProduct($product)->getCustomOption('option_ids')) { 
      $sku = $this->getOptionSku($product,$sku); 
     } 
     return $sku; 
    } 

ich möchte hinzufügen, dass ich Runnin wurden g viele Codetests. Wenn ich einen Beobachter auf der Veranstaltung einrichten checkout_type_onepage_save_order_after dann

$cartItems = $observer->getEvent()->getOrder()->getAllVisibileItems(); 
foreach ($cartItems as $item){ 
    if ($item->getProductType() == 'configurable') { 
    $skuConfigurable = $item->getProduct()->getData('sku'); 
    $skuMatchingSimple = $item->getProduct()->getSku(); 
    Mage::log("skuConfigurable ".$skuConfigurable." has skuMatchingSimple ".$skuMatchingSimple, null, 'mylogfile.log'); 
    }else{ 
    Mage::log("Configurable SKU"." (not configurable product)", null, 'mylogfile.log'); 
    } 
} 

Arbeitet ein Genuss, aber wenn ich die Auftragspositionen von innerhalb success.phtml dann beide getSku() und getData('sku') beide geben die Artikelnummer des konfigurierbaren. Das bringt mich zu der Annahme, dass ich die sales/order nicht richtig lade oder nicht verstehe, wie man die 'konfigurierbare Option' aus dem konfigurierbaren $item ermittelt. Aber ich kann nicht herausfinden, warum es diesen Unterschied zwischen $ item im Beobachter und success.phtml gibt.

Sie wissen das wahrscheinlich schon, aber ich dachte, ich würde hinzufügen: Wenn Sie das Ereignis dann fangen, können Sie sowohl auf den Verkauf/Angebot und den Verkauf/Bestellung Objekte zugreifen, aber bis Sie zu success.phtml die Verkäufe/Angebot erhalten Das Objekt wurde zurückgesetzt und Sie können nur auf Verkauf/Bestellung zugreifen (was meiner Meinung nach für Sie in Ordnung ist, wenn Sie nur das konfigurierbare SKU benötigen).

Hier ist der Code, den ich in success.phtml leite, für mich ist es nur kehrt die Config SKU

<?php //TEST CODE to retirvie SKUs from the order 

$_checkoutSession = Mage::getSingleton('checkout/session'); 
$_customerSession = Mage::getSingleton('customer/session'); 

$orderId = Mage::getSingleton('checkout/session')->getLastRealOrderId(); 
$order = Mage::getModel('sales/order')->loadByIncrementId($orderId); 

echo("<br>Order Id".$orderId); 

$myTargetSimpleProductId = 42;//$someIdThatYouKnow; 

//$cartItems = $order->getAllVisibleItems(); //returns the configurable items only 
$cartItems = $order->getAllItems(); 
Mage::log(':PHTML--PHTML--PHTML--PHTML--PHTML--PHTML--PHTML--PHTML--', null, 'mylogfile.log'); 
Mage::log(':', null, 'mylogfile.log'); 
Mage::log('cartItems (from order):', null, 'mylogfile.log'); 

foreach ($cartItems as $item){ 
    Mage::log("product_id".$item->getProductId(), null, 'mylogfile.log'); 
    Mage::log("product_type".$item->getProductType(), null, 'mylogfile.log'); 
    Mage::log("product_real_type".$item->getRealProductType(), null, 'mylogfile.log'); 
    if ($option = $item->getOptionByCode('simple_product')) { //NEVER RETURNS TRUE, why? 
     Mage::log("item_opByCode_getProd_getId".$item->getOptionByCode('simple_product')->getProduct()->getId(), null, 'mylogfile.log'); 
    }else{ 
    Mage::log("item_opByCode_getProd_getId"." (not simple_product option)", null, 'mylogfile.log'); 
    } 
    if ($item->getProductType() == 'configurable') { 
    $dummy = $item->getProduct()->getData('sku'); 
    Mage::log("Configurable SKU ".$dummy, null, 'mylogfile.log');    $myAnswers[]=array('simpleSku'=>$item->getProduct()->getSku(),'configurableSku'=>$item->getProduct()->getData('sku')); //in success.phtml these two are always the same (the configurable SKU) 
    }else{ 
    Mage::log("Configurable SKU"." (not configurable product)", null, 'mylogfile.log'); 
    } 

    Mage::log("item options".print_r($item->getOptions(),true), null, 'mylogfile.log'); 
    Mage::log("getProduct()->getId()".$item->getProduct()->getId(), null, 'mylogfile.log'); 
    Mage::log("getProduct()->getSku".$item->getProduct()->getSku(), null, 'mylogfile.log'); 
    Mage::log("getProduct()->getName()".$item->getProduct()->getName(), null, 'mylogfile.log'); 
    Mage::log("SKUs : ".print_r($myAnswers,true), null, 'mylogfile.log'); 
    Mage::log("<br>********************************", null, 'mylogfile.log'); 

    if($item->getOptions()){ //NEVER RUNS - how get the configurable product options? 
    echo("OPTIONS".print_r($item->getOptions(),true)); 
    } 

} 
echo("SKU's array".print_r($myAnswers,true)); 

Ich hoffe, hier etwas für Sie arbeitet. Einmal in der Vergangenheit schrieb ich ein Thema, das nur das einfache Produkt in den Warenkorb legt, auch wenn es als eine konfigurierbare Option stammt, so lohnt vielleicht Überprüfung Ihres Themas nicht tun (durch die Entwicklung dieses Codes im Standard-Thema, bis es funktioniert)

+0

Wie wird '$ item-> getProductId()' die konfigurierbare ID bekommen? Woher kommt '$ option'? Ich habe meine Frage aktualisiert, um weitere Informationen darüber zu geben, was ich zu tun versuche (d. H. Nach dem Kauf nach Erfolg). Danke für deine Antwort, ich denke, das ist knapp! – callmetwan

+0

Ich habe meiner Antwort mehr Code hinzugefügt, den Sie je nach Ihrer Situation ausprobieren können. Das Objekt '$ option' wird initialisiert und * innerhalb * der 'if ($ option = $ item-> getOptionByCode (' simple_product '))' Bedingung gesetzt. Ich schreibe nicht immer so, weil es entweder wie ein Tippfehler aussieht (meinten wir "==") oder es wirft Programmierer auf, die vielleicht mehr an JavaScript gewöhnt sind, wo solcher Code als wahr bewertet wird (Javascript kehrt wahr zurück, weil Die Zuweisung ist erfolgreich, aber PHP gibt den Wert der rechten Seite zurück, also nach der 'if()' -Klausel '$ option' * ist *' $ item-> getOptionByCode ('simple_product') '). – Malachy

+0

Das ist perfekt! Vielen Dank für die Bereitstellung dieser hervorragenden Erklärung. Ich schätze die externen Beispiele und Tutorials sehr. – callmetwan

1

Es hat keine direkte Funktion übergeordnetes Produkt sku

<?php 
    $parentIds = Mage::getModel('catalog/product_type_configurable')->getParentIdsByChild($childproid); 
    /* $parentIds is array of ids */ 
    foreach($parentIds as $eachProID) 
    $child=Mage::getModel('catalog/product')->load($eachProID); 
    } 
    ?> 
+0

Ich glaube, das Problem mit dieser Lösung ist, dass eine einfache mehr als ein Elternteil konfigurierbar haben kann, und es wird erhalten * alle * parent konfigurierbare IDs – callmetwan

2

Ich brauchte nur die SKUs für eine AJAX-Cart-Funktion. Dieser arbeitete für mich:

$cart = Mage::helper('checkout/cart')->getCart(); 
$items = $cart->getItems(); 
foreach ($items as $item) { 
    if ($item->getProductType() == 'configurable') { 
     $sku = $item->getProduct()->getData('sku'); 
    } else { 
     $sku = $item->getSku(); // simple product 
    } 
} 

Antwort zog meist aus Malachys Dissertation ...