如何从观察者事件访问magento中产品的自定义选项

时间:2012-12-11 11:04:11

标签: php magento

我有2个自定义选项文本字段与名为Location To和Location From的产品相关联,

我已经设置了一个具有checkout_cart_add_product_complete观察者的模块,其中有一个名为getLocationCoords的方法,我如何从传递给我方法的事件对象中访问这两个字段。

我需要这两个字段,所以我可以反向对它们进行地理编码,我认为我可以自己做。

一旦我获得了2套坐标,我将如何将它们与产品一起存储,以便在订单节奏时我能够看到它们与产品相关联?

======================= 编辑添加============================

到目前为止我尝试了什么

 public function getLocationCoords(Varien_Event_Observer $observer)
{
    // Retrieve the product being updated from the event observer
    $product = $observer->getEvent()->getProduct();

    // Write a new line to var/log/product-updates.log
    $name = $product->getName();
    $sku = $product->getSku();
    Mage::log(
        "{$name} ({$sku}) updated",
        null, 
        'product-updates.log'
    );
    foreach ($product->getOptions() as $o) {
        $type = "Custom Option TYPE: " . $o->getType();
        $title = "Custom Option TITLE: " . $o->getTitle();
         Mage::log(
            "{$type} ({$title}) custom option {$o}",
            null, 
            'product-updates.log'
        );
    }
}

这一切都有效,除了获取自定义选项的值,我将尝试下面的答案,看看我在哪里

当我打印出选项对象的var转储时,这就是我得到的

2012-12-11T15:19:45+00:00 DEBUG (7): array (
  'option_id' => '1',
  'product_id' => '1',
  'type' => 'field',
  'is_require' => '1',
  'max_characters' => '0',
  'sort_order' => '0',
  'default_title' => 'Location To',
  'title' => 'Location To',
  'default_price' => '0.0000',
  'default_price_type' => 'fixed',
  'price' => '0.0000',
  'price_type' => 'fixed',
)

对象没有价值

3 个答案:

答案 0 :(得分:3)

还有这个事件

 $eventName = sprintf('catalog_product_type_prepare_%s_options', $processMode);
    Mage::dispatchEvent($eventName, array(
        'transport'   => $transport,
        'buy_request' => $buyRequest,
        'product' => $product
    ));

使用processMode为full或lite。 buy_request应该包含您的详细信息,然后您可以在产品上添加新选项

$product->addCustomOption('my_option','my_value');

未经测试,但请告知我们您的情况。

答案 1 :(得分:2)

我相信,在调度事件时,您需要从购物车会话中访问销售报价对象,这对我来说很难闻。尝试checkout_cart_product_add_after [link]事件并访问引用项,如下所示:

public function geoConversion ($obs)
{
    $item = $obs->getQuoteItem();
    /* @var $item Mage_Sales_Model_Quote_Item */

    //I believe the custom options will be in here, not sure
    $buyRequest = $item->getBuyRequest();

    // your logic 
}

我没有检查过这个,但使用它的事件要好一些。但是,在自定义添加到购物车过程(例如,管理员创建的订单和现有购物车项目的更新)时需要考虑很多因素,因此需要进行测试,测试,测试。此外,还有另一个可能有用/更合适的事件:sales_quote_product_add_after [link]

此外,这种行为也可以通过为这些产品提供基于的自定义类型模型或通过观察在Mage_Catalog_Model_Product_Type_Abstract中调度的事件来实现。

令人目不暇接。

答案 2 :(得分:0)

我能够获得对引用项的访问权限,并且从中我能够访问自定义属性的值。我有两个选项,经过一些调试后,我意识到我的选项被称为option_1和option_2,从中我可以得到值并将它们设置为我的变量。

public function getLocationCoords(Varien_Event_Observer $observer)
{
    $item = $observer->getQuoteItem();

    $locationFrom = '';
    $locationTo = '';

    foreach ($item->getOptions() as $o) {   
        if($o['code'] == 'option_2'){
            $locationFrom = $o['value'];
        }
        if($o['code'] == 'option_1'){
            $locationTo = $o['value'];
        }

    }
     Mage::log("the location from = ".$locationFrom);
     Mage::log("the location to = ".$locationTo);

 }