从简单的SKU或ID获取可配置的sku

时间:2014-03-18 22:29:54

标签: magento configurable-product skus

我试图从其中一个儿童简单产品中获取父级可配置产品SKU' SKU或ID。我的理解是,一个简单的可以属于多个配置,但我希望特定的可配置客户添加到他们的购物车。我读了一个related question但它得到了所有父配置。

我正在使用Magento EE 1.12

编辑:有关我正在做的事情的更多细节。当客户成功结账时,我试图获得SKU的简单和可配置的客户签出。

尝试将代码应用于:

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

3 个答案:

答案 0 :(得分:3)

如果可配置在购物车中,我认为您可以查询购物车以找到可配置及其简单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);

代码改编自this Q&Athat Q&A 且尚未经过测试,请让我知道这次炸弹是否可怕,你无法弄清楚所有的更正。

****编辑在下面的评论后再解释一下代码***

总的来说,有人了解当有人向购物车添加可配置产品时,Magento主要存储可配置的产品ID,而不是底层简单产品的产品ID。但Magento Magento是购物车中配置的产品,是一个复杂的对象,其中一部分是对底层简单产品的引用。

所以:

$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.

现在,如果您在成功页面上,则挑战是如何访问订单商品。 Stack Overflow上有很多答案,这里有一个示例:

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

due to this Q&A。或

$_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) {

或来自观察员功能:

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

both due to this Q&A

但我认为你可能从Magento精明的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

所以你应该全力以赴。有一些零碎的内容可以串联到最终的代码中,但我认为您要么将代码放在template/checkout/success.phtml中,要么放在checkout_type_onepage_save_order_after的观察者中,上面的代码片段将指导您。

****进一步编辑***

如果您的$productproduct_type = 'configurable',那么要获得其SKU,如果您只打电话$product->getData('sku');,那么您应该致电$product->getSku();,这将始终返回简单的SKU

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

如果你按照代码,你会发现

//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;
    }

我想补充一点,我一直在运行大量的代码测试。当我在事件checkout_type_onepage_save_order_after上设置观察者时

$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');
   }
}

运作一种享受,但当我从success.phtml中访问订单商品时,getSku()getData('sku')都会返回可配置的SKU。这让我认为我没有正确加载sales/order或者没有理解如何从可配置的$item中确定'可配置选项'。但我无法弄清楚为什么观察者中的'$ item'与success.phtml之间存在差异。

你可能已经知道了这一点,但我想我会补充一下:如果你抓住了这个事件,那么你可以访问销售/报价和销售/订单对象,但是当你获得success.phtml销售/报价对象时已被重置,您只能访问销售/订单(如果您需要的是可配置的sku,我认为这对您是好的。)

以下是我在success.phtml中运行的代码,对我而言返回配置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));

我希望这里有适合你的东西。过去一次我写了一个主题将简单的产品放在购物车中,即使它起源于可配置的选项,所以也许值得检查你的主题是不是这样做(通过开发这个代码)默认主题,直到它工作)

答案 1 :(得分:2)

我只需要用于AJAX购物车功能的SKU。这对我有用:

$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
  }
}

答案主要来自马拉奇的论文......

答案 2 :(得分:1)

有任何直接功能来获取父产品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);
    }
    ?>