我正在尝试在 Magento 之外显示部分“产品视图”页面。我能够正确显示所有内容并加载所有 Javascript —— 但是,每当我单击“添加到购物车”按钮时,都会收到一条消息,提示“请指定产品的选项”。
如我的评论中所述,如果我改变
$addtocartBlock->createBlock()
至
$addtocartBlock->getBlockSingleton()
整个顶部被添加到购物车块替换。见编辑。
有什么想法吗?
我感觉“添加到购物车”按钮无法正常工作,因为它没有明确连接到其他块,尽管我可能错了。
或者,以编程方式呈现这些块的一些通用指南也非常有用——虽然我相当擅长 PHP,但 Magento 只是失去了我,我经常只是从 Magento 论坛剪切和粘贴随机片段。
谢谢!
编辑:
经过一番挖掘,还有几点:
- 将 renderView() 调用移动到每个块下方(而不是将它们聚集在一起)修复了“添加到购物车替换主要信息块”问题。
- 可以毫无问题地添加简单的产品。我遇到的唯一问题是让 Magento 识别为可配置产品提交的产品选项。
MOAR EDITZ!!!!!!1111!
进一步根据这个不会死的问题,我发现@moldovan-gheorghe-daniel 关于“super_attribute”数组没有与 POST 的其余部分一起发送是正确的。此外,如果我使用 Firebug 将可配置的产品字段剪切并粘贴为提交<form>
元素的子项,那么一切都运行良好。最后切入正题:
tl;dr -- 我如何将可配置产品属性块加载为添加到购物车块的子项?
哇!
这是我的代码:
<?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'];