7

我正在尝试从其中一个子简单产品的 SKU 或 ID 中获取父可配置产品 SKU。我的理解是一个简单的可以属于多个可配置项,但我希望客户添加到他们的购物车中的特定可配置项。我读了一个相关的问题,但它得到了所有父配置。

我正在使用 Magento EE 1.12

编辑:关于我在做什么的更多细节。当客户成功结帐时,我试图获取简单的 SKU 和客户签出的可配置项。

尝试将代码应用于:

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

3 回答 3

4

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

代码改编自此Q&A该 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) {

由于这个问答。或者

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

都是由于这个问答

但我认为您可能会从 Magento 精通 Yireo 的本教程中受益最多:

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

感谢 Yireo.com 的 Jisse Reitsma

所以你应该准备好了。有一些零碎的东西可以串成你的最终代码,但我认为你要么将代码放入观察者中,要么放入template/checkout/success.phtml观察者中checkout_type_onepage_save_order_after,上面的片段将指导你。

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

如果你有一个$product那是product_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都返回可配置的 SKU。这使我认为我没有正确加载或不了解如何从可配置的. 但我不明白为什么观察者中的“$item”与success.phtml 之间存在差异。getSku()getData('sku')sales/order$item

您可能已经知道这一点,但我想我会补充:如果您赶上该事件,那么您可以同时访问销售/报价和销售/订单对象,但是当您到达 success.phtml 时,销售/报价对象已被重置并且您只能访问销售/订单(如果您只需要可配置的 sku,我认为这对您来说没问题)。

这是我在success.phtml中运行的代码,对我来说它只返回配置SKU

<?php //TEST CODE to retrieve 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));

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

于 2014-03-19T09:38:44.930 回答
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
  }
}

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

于 2015-03-31T03:28:34.763 回答
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);
    }
    ?>
于 2014-03-19T04:47:25.947 回答