当产品视图块在Magento之外呈现时,无法将可配置产品添加到购物车

时间:2012-12-13 12:33:27

标签: php magento

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

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

$addtocartBlock->createBlock()

$addtocartBlock->getBlockSingleton()

整个顶部被Add To Cart块替换。见编辑。

有什么想法吗?

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

或者,对于以编程方式呈现这些块的一些一般指导原则也是非常有用的 - 虽然我非常擅长PHP,Magento只是失去了我而且我经常只是剪切和粘贴random snippets from the Magento forum

谢谢!


编辑:

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

  1. 在每个块下方移动renderView()调用(而不是将它们聚集在一起)修复了“添加到购物车替换主信息块”问题。
  2. 简单的产品可以毫无问题地添加。我遇到的唯一问题是让Magento认可为可配置产品提交的产品选项。
  3. MOAR EDITZ !!!!! 1111!

    根据这个“不会死的问题”,我发现@molovan-gheorghe-daniel关于“super_attribute”数组没有与POST的其余部分一起发送是正确的。此外,如果我使用Firebug将可配置产品字段剪切并粘贴为提交<form>元素的子元素,那么一切都可以正常工作。最终切入追逐:

    tl; dr - 我如何加载可配置的产品属性作为添加到CART BLOCK的孩子?

    呼!

    这是我的代码:

    <?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'];
    

2 个答案:

答案 0 :(得分:1)

所有可配置产品都需要添加到具有特定选项的购物车中,对于简单的产品,您只需要数量和ID。这是在将可配置产品添加到购物车时应该查看请求数组的方式。

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

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

答案 1 :(得分:0)

也许你可以找到一种更适合你需求的方法,但这就是我要做的事情:

在Magento中创建自定义控制器

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

创建自定义布局

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

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

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

修改 不确定为什么没有评论的downvotes(如果我的答案不符合你的喜好,让我知道为什么,我会改进它)。 Magento是一个框架,虽然接受的解决方案可能有效,但它不是“Magento”方式:未来的开发人员(包括自己)可能很难维护提供的解决方案。学习Magento如何工作(以及合并它)的额外努力是值得的 - 毕竟,您的客户正在付钱给您解决他们的问题。