我试图从其中一个儿童简单产品中获取父级可配置产品SKU' SKU或ID。我的理解是,一个简单的可以属于多个配置,但我希望特定的可配置客户添加到他们的购物车。我读了一个related question但它得到了所有父配置。
我正在使用Magento EE 1.12
编辑:有关我正在做的事情的更多细节。当客户成功结账时,我试图获得SKU的简单和可配置的客户签出。
尝试将代码应用于:
app/design/frontend/enterprise/mytheme/template/checkout/success.phtml
答案 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&A和that 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) {
due to Jisse Reitsma of Yireo.com
所以你应该全力以赴。有一些零碎的内容可以串联到最终的代码中,但我认为您要么将代码放在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
中访问订单商品时,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);
}
?>