[英]Cannot add configurable products to cart when Product View blocks rendered outside of Magento
我正在尝试在Magento外部显示“产品视图”页面的部分内容。 我能够正确显示所有内容以及要加载的所有Javascript - 但是,每当我单击“添加到购物车”按钮时,我都会收到一条消息“请指定产品的选项”。
如我的评论中所述,如果我改变了
$addtocartBlock->createBlock()
至
$addtocartBlock->getBlockSingleton()
整个顶部被Add To Cart块替换。
见编辑。
有什么想法吗?
我觉得添加到购物车按钮不能正常工作,因为它没有明确地连接到其他块,但我可能是错的。
或者,对于以编程方式呈现这些块的一些一般指导原则也是非常有用的 - 虽然我非常擅长PHP,Magento只是失去了我而且我经常只是从Magento论坛剪切和粘贴随机片段 。
谢谢!
经过多一点挖掘,还有几点:
根据这个“不会死的问题”,我发现@mouldovan-gheorghe-daniel关于“super_attribute”数组没有与POST的其余部分一起发送是正确的。 此外,如果我使用Firebug将可配置产品字段剪切并粘贴为提交<form>
元素的子元素,那么一切都很有效。 最终切入追逐:
噢!
这是我的代码:
<?php //Pretty standard loading Magento stuff. $bootstrap = $_SERVER['DOCUMENT_ROOT'] . '/magento/app/Mage.php'; require_once $bootstrap; session_name ( 'frontend' ); Mage::getSingleton ( 'core/session', array ('name' => 'frontend' ) ); $app = Mage::app('default'); $app->getTranslator()->init('frontend'); umask(0); session_name('frontend'); Mage::getSingleton('customer/session'); //I'm not sure I need this. $_product = Mage::getModel('catalog/product'); $_product->load($product_id); Mage::unregister('product'); Mage::register('product', $_product); //The following loads the main Mage_Catalog_Block_Product_View block. $linksBlock = $app->getLayout()->getBlockSingleton("catalog/product_view"); $linksBlock->setProduct($_product)->setTemplate('catalog/product/view.phtml'); //The following loads the configurable product attributes block. $checkoutLinksBlock = $app->getLayout() ->getBlockSingleton("catalog/product_view_type_configurable") ->setTemplate('catalog/product/view/type/options/configurable.phtml'); $checkoutLinksBlock->setParentBlock($linksBlock); /* The following loads the Add To Cart block. If I use getBlockSingleton() instead * of createBlock(), this replaces the entire top block. */ $addtocartBlock = $app->getLayout() ->createBlock("catalog/product_view") ->setTemplate('catalog/product/view/addtocart.phtml'); $addtocartBlock->setParentBlock($linksBlock); $blocks['info'] = $linksBlock->renderView(); $blocks['addtocart'] = $addtocartBlock->renderview(); if ($_product->getTypeId() == 'configurable') $blocks['config'] = $checkoutLinksBlock->renderView(); else $blocks['config'] = ''; Mage::unregister('product'); // ...And output everything here. echo $blocks['info'] . $blocks['config'] . $blocks['addtocart'];
所有可配置产品都需要通过特定选项添加到购物车中,对于简单的产品,您只需要数量和ID。 这是在将可配置产品添加到购物车时应该查看请求数组的方式。
Array(
[uenc] => aHR0cdsfsdfdsfdssssssssssssss
[product] => 4816
[qty] => 2
[related_product] =>
[super_attribute] => Array(
[352] => 1093
)
)
“super_attribute”包含用户选择的选项。 所以我建议检查这些数据是否在浏览器请求中。 也许您在没有正确验证js验证的情况下发布数据,并且用户不从可用的可配置选项中选择任何内容,或者根本不呈现可配置选项下拉列表。
也许你可以找到一种更适合你需求的方法,但这就是我要做的:
在Magento中创建自定义控制器
艾伦风暴有一些伟大的Magento的教程,看看这其中的控制器。 扩展默认产品控制器。 这是您将从Drupal安装访问的控制器(可能在iframe中调用?)。
创建自定义布局
从这里开始 - 您将能够了解布局的工作原理。 看一下产品页面的呈现方式(检查布局XML文件以及.phtml模板)。 我想一想将物品添加到购物车时会发生什么。
有了上述两个,您应该拥有一个具有工作功能的产品页面,并能够自定义页面布局和样式以与当前站点一起使用。 它本身并不是真正的桥梁。 如果这就是您所追求的,请查看Magento的API。
如果您仍想使用现有解决方案,请查看Magento的布局文档。 在产品视图页面的.phtml中,您将看到生成的HTML - 以及您需要生成的HTML - 以模拟添加到购物车表单。
编辑不知道为什么没有评论的downvotes(如果我的答案不符合你的喜好,让我知道为什么,我会改进它)。 Magento是一个框架,虽然接受的解决方案可能有效,但它不是“Magento”方式:未来的开发人员(包括自己)可能很难维护提供的解决方案。 学习Magento如何工作(以及合并它)的额外努力是值得的 - 毕竟,您的客户正在付钱给您解决他们的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.