3

我正在尝试在 Magento 之外显示部分“产品视图”页面。我能够正确显示所有内容并加载所有 Javascript —— 但是,每当我单击“添加到购物车”按钮时,都会收到一条消息,提示“请指定产品的选项”。

如我的评论中所述,如果我改变

$addtocartBlock->createBlock()

$addtocartBlock->getBlockSingleton()

整个顶部被添加到购物车块替换。见编辑。

有什么想法吗?

我感觉“添加到购物车”按钮无法正常工作,因为它没有明确连接到其他块,尽管我可能错了。

或者,以编程方式呈现这些块的一些通用指南也非常有用——虽然我相当擅长 PHP,但 Magento 只是失去了我,我经常只是从 Magento 论坛剪切和粘贴随机片段

谢谢!


编辑:

经过一番挖掘,还有几点:

  1. 将 renderView() 调用移动到每个块下方(而不是将它们聚集在一起)修复了“添加到购物车替换主要信息块”问题。
  2. 可以毫无问题地添加简单的产品。我遇到的唯一问题是让 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'];
4

2 回答 2

1

所有可配置的产品都需要使用特定选项添加到购物车中,对于简单的产品,您只需要数量和 id。这是将可配置产品添加到购物车时请求数组的外观。

Array(
    [uenc] => aHR0cdsfsdfdsfdssssssssssssss
    [product] => 4816
    [qty] => 2
    [related_product] =>
    [super_attribute] => Array(
            [352] => 1093
        )
) 

“super_attribute”包含用户选择的选项。所以我建议检查该数据是否在浏览器请求中。也许您在没有正确进行 js 验证的情况下发布数据,并且用户没有从可用的可配置选项中选择任何内容,或者根本没有呈现可配置选项下拉菜单。

于 2012-12-20T14:20:33.253 回答
0

也许您可以找到更适合您需求的方法,但这是我要做的:

在 Magento 中创建一个自定义控制器

Alan Storm 有一些很棒的 Magento 教程,看看这个控制器。扩展默认产品控制器。这是您将在 Drupal 安装中访问的控制器(可能在 iframe 中调用?)。

创建自定义布局

从这里开始- 您将能够了解布局的工作原理。查看产品页面的呈现方式(检查布局 XML 文件以及 .phtml 模板)。我也会考虑将商品添加到购物车时会发生什么。

有了以上两个,您应该有一个具有工作功能的产品页面,并且能够自定义页面布局和样式以与您当前的站点一起使用。它本身并不是一座真正的桥梁。如果那是您所追求的,请查看 Magento 的 API。

如果您仍想使用现有解决方案,请查看 Magento 的布局文档。在产品视图页面的 .phtml 中,您将看到生成了哪些 HTML 以及您需要生成哪些 HTML 以模拟添加到购物车表单。

编辑 不知道为什么不加评论就投反对票(如果我的回答不符合您的喜好,请告诉我原因,我会改进它)。Magento 是一个框架,虽然公认的解决方案可能有效,但它不是“Magento”方式:未来的开发人员(包括自己)可能很难维护所提供的解决方案。在学习 Magento 的工作原理(和整合它)方面付出的额外努力是值得的——毕竟,你的客户付钱给你是为了解决他们的问题。

于 2012-12-23T12:25:23.020 回答