当前位置: 首页 > 面试题库 >

Magento-基于用户输入的报价/订购产品项属性

喻元龙
2023-03-14
问题内容

摘要

我想创建一个产品属性,该属性不保存到产品中,也不像普通产品属性一样显示在产品编辑页面上。相反,我希望将其保存到订单/报价项目中并显示在订单,发票等上。在将产品添加到购物车之前,客户还应该可以在前端对它进行配置

细节

  • 就像“ 自定义选项”一样 ,应将表单元素添加到前端产品页面。
    • 自定义选项 不同 ,这不是 实际的 产品属性。它不应显示在管理产品页面或属性集上。
    • 要求客户提供有效值。我需要能够进行服务器端验证。
    • 我想要一个.phtml模板生成其html。目前,我能够以令人满意的(设计)结果覆盖 app / design / frontend / base / default / catalog / product / view / type / default.phtml 。但是,我不知道如何捕获,验证并最终保存其价值。
  • 此表单元素的值应与报价/订购产品项一起保存。
    • 该值应显示在所有发票,订单,销售电子邮件中。
    • 我想使用模板控制输出,或者至少能够返回用于显示值的字符串

我的问题

  1. <input>将产品添加到购物车时,如何验证并最终将值从前端产品页面上的值保存到报价项目,然后在结帐过程中保存到订单项目?
  2. 如何在订单,发票,销售电子邮件和此类页面上显示此值?
  3. 如何过滤订单集合以获取包含我的值设置为特定值的商品的订单?

更新1

我发现我可以在以下事件期间在catalog/product模型上运行该代码(可能sales/quote_item也可以)sales_quote_item_qty_set_after

$infoBuyRequest = $product->getCustomOption('info_buyRequest');
$buyRequest = new Varien_Object(unserialize($infoBuyRequest->getValue()));
$myData = $buyRequest->getMyData();

这样,我就可以<input>在产品页面上从我的客户提供的自定义数据中检索数据。

我怀疑这info_buyRequest与报价和订单项一起保存。如果是这样,这 部分
解决了我的问题1和2。但是,我仍然不知道在哪里运行此代码,并且我也不知道如何在后端订单/报价/报告页面上显示它。我也相信,因为这是作为序列化值存储在数据库中的,所以基于我的自定义数据来获取报价/订单项集合将是最困难的。


问题答案:

Magento提供了添加非产品属性或产品自定义选项的选项的功能。它们设置在产品上,并使用选项代码报价项目additional_options

您需要执行两个步骤,每个步骤都可以通过事件观察器进行处理。如果您希望其他选项能够进行重新排序,则还需要注意第三件事。

添加报价项目选项

第一步是添加事件观察器,以便在将已加载产品添加到购物车之前在其上设置其他选项。一种选择是使用catalog_product_load_after事件。

<catalog_product_load_after>
    <observers>
        <extra_options>
            <type>model</type>
            <class>extra_options/observer</class>
            <method>catalogProductLoadAfter</method>
        </extra_options>
    </observers>
</catalog_product_load_after>

在事件观察器中,您可以添加其他检查,所请求的页面的确是“添加到购物车”操作。该观察器方法的重点是将特殊选项的选择添加到additional_options产品模型上的选项。

public function catalogProductLoadAfter(Varien_Event_Observer $observer)
{
    // set the additional options on the product
    $action = Mage::app()->getFrontController()->getAction();
    if ($action->getFullActionName() == 'checkout_cart_add')
    {
        // assuming you are posting your custom form values in an array called extra_options...
        if ($options = $action->getRequest()->getParam('extra_options'))
        {
            $product = $observer->getProduct();

            // add to the additional options array
            $additionalOptions = array();
            if ($additionalOption = $product->getCustomOption('additional_options'))
            {
                $additionalOptions = (array) unserialize($additionalOption->getValue());
            }
            foreach ($options as $key => $value)
            {
                $additionalOptions[] = array(
                    'label' => $key,
                    'value' => $value,
                );
            }
            // add the additional options array with the option code additional_options
            $observer->getProduct()
                ->addCustomOption('additional_options', serialize($additionalOptions));
        }
    }
}

其他选项将自动从产品移至报价项目。有了这个观察者,您的选择就会出现在购物车和结帐评论中。

为订单项添加选项

为了使它们持久存在,需要一个额外的观察者(仅从Magento 1.5开始)。

<sales_convert_quote_item_to_order_item>
    <observers>
        <extra_options>
            <type>model</type>
            <class>extra_options/observer</class>
            <method>salesConvertQuoteItemToOrderItem</method>
        </extra_options>
    </observers>
</sales_convert_quote_item_to_order_item>

在这里,我们将选项从报价项目移动到订单项目。

public function salesConvertQuoteItemToOrderItem(Varien_Event_Observer $observer)
{
    $quoteItem = $observer->getItem();
    if ($additionalOptions = $quoteItem->getOptionByCode('additional_options')) {
        $orderItem = $observer->getOrderItem();
        $options = $orderItem->getProductOptions();
        $options['additional_options'] = unserialize($additionalOptions->getValue());
        $orderItem->setProductOptions($options);
    }
}

从这一点开始,其他选项将在前端和订单电子邮件的客户订单历史记录以及管理界面订单视图,发票,货件,贷项凭证和PDF中可见。

添加对重新订购的支持

为了在重新订购期间将Oprion转移到新订单,您需要注意将其复制。这是使用该checkout_cart_product_add_after事件的一种可能性。

<checkout_cart_product_add_after>
    <observers>
        <extra_options>
            <type>singleton</type>
            <class>extra_options/observer</class>
            <method>checkoutCartProductAddAfter</method>
        </extra_options>
    </observers>
</checkout_cart_product_add_after>

应该将附加选项的解析和构建附加选项数组移到一个单独的函数中,以避免代码重复,但是对于本示例,为了清楚起见,我将每种方法所需的逻辑保留在原处。

public function checkoutCartProductAddAfter(Varien_Event_Observer $observer)
{
    $action = Mage::app()->getFrontController()->getAction();
    if ($action->getFullActionName() == 'sales_order_reorder')
    {
        $item = $observer->getQuoteItem();
        $buyInfo = $item->getBuyRequest();
        if ($options = $buyInfo->getExtraOptions())
        {
            $additionalOptions = array();
            if ($additionalOption = $item->getOptionByCode('additional_options'))
            {
                $additionalOptions = (array) unserialize($additionalOption->getValue());
            }
            foreach ($options as $key => $value)
            {
                $additionalOptions[] = array(
                    'label' => $key,
                    'value' => $value,
                );
            }
            $item->addOption(array(
                'code' => 'additional_options',
                'value' => serialize($additionalOptions)
            ));
        }
    }
}

翻译:

没有转换这些选项标签或值的机制。这里有一些想法可能在这方面有用。

在quote_item_load_after事件观察器中,获取其他选项数组并设置$option['print_value'] = $helper->__($option['value']);。如果print_value设置了,Magento将使用它来渲染显示。
订单项也可以这样做。

没有a之类的东西print_label,但是您可以设置一个自定义索引(label_source也许),并使用该索引作为源即时设置标签,例如$option['label'] = $helper->__($option['label_source']);

除此之外,您可能还不得不诉诸于修改模板(grep为getItemOptions()),或覆盖块类(grep additional_options)。



 类似资料:
  • 我正试图按价格对产品集合进行排序,但当我添加(粗体)时,这些产品消失了 我想把它们分类,虽然没有存货,但有人知道我能做到吗?

  • 我使用Woocommerce插件在wordpress中开发了购物车。我需要按产品价格在购物车订单中显示产品,请帮助我做到这一点 谢啦

  • 问题内容: 我正在为Magento(1.6)商店开发类别汇总报告。 为此,我想获得一部分产品的“订单项”集合-这些产品的唯一类别ID(这是我创建的Magento产品属性)与特定值匹配。 我可以通过基于目录/产品的集合来获得相关的结果集。 Magento不喜欢它,因为有相同商品ID的重复条目。 如何根据订单项构建代码以获取此结果集?加入按属性过滤的产品集合使我难以理解。这段代码并不能解决问题,因为它

  • 已解决 请看下面我的答案。 PHP致命错误:1054:“ORDER子句”中的未知列“final_price”::在/var/www/includes/classes/db/mysql中选择p.products_id,p.products_id,p.master_categories_id,p.master_categories_id,p.master_categories_id FROM prod

  • 我有一个脚本,可以动态检索我编写的可配置产品的价格,现在我要返回并确保它考虑到可能存在的任何可配置属性。下面是通过ajax调用的,我已经将其调试到循环的最核心部分(因此所有magento方法都可以工作)。它应该删除与属性不匹配的子级。最终目标是只剩下一个孩子,并与价格相呼应。每个孩子确实包含一个独特的价格(这一点我知道)。你能明白为什么这现在不起作用吗?

  • 我用各种各样的产品建立了Woocommerce。 这些产品在一个属性上都有可能值为1kg、2kg和5kg的变化。 我还创建了一个“Aziende”用户组。我想一些产品的变化,只显示“阿齐恩德”的客户。我不想让其他客户看到这些变化。 例如:Aziende客户可以看到选项“1kg、2kg、5kg”,而其他客户角色只能看到1kg选项。 这在WooCommerce中可能吗?