2011-07-14 50 views
0

在我的模型觀察器類,我有:Magento的:散步配置屬性的集合在一個模塊中Observer.php文件

$products = Mage::getResourceModel('catalog/product_collection') 
       ->addAttributeToSelect('sku') 
       ->addAttributeToSelect(array('name', 'short_description', 'description', 'price', 'image', 'status', 'manufacturer', 'url_path'), 'inner'); 

然後我嘗試迭代:

Mage::getSingleton('core/resource_iterator')->walk($products->getSelect(), array('productCallback'), array('arg1' => '====')); 

這是從那兒剽竊Fontis教程:

http://www.fontis.com.au/blog/magento/loading-large-collections

現在,我想我的功能添加到我的CLAS s:

private function xproductCallback($args) 
{ 
$product = Mage::getModel('catalog/product'); 
$product->setData($args['row']); 

    if ($product->getTypeId()=="configurable") { 
    echo $args['arg1'] . "\n"; 
    echo $product->getSku() . ': ' . $product->getName() . "TYPE ". $product->getTypeId() ."\n"; 
    } 
} 

現在能行嗎?不這麼認爲:

Warning: call_user_func() expects parameter 1 to be a valid callback, function 'productCallback' not found or invalid function name app/code/core/Mage/Core/Model/Resource/Iterator.php on line 50

所以我應該在哪裏把我的回調函數?

奇怪的是集合是如何工作的。我只想要產品類型可配置,但當我添加

->addAttributeToFilter('type_id', array('eq' => Mage_Catalog_Model_Product_Type::CONFIGURABLE))(或其任何變體)它不會給我一個可配置的集合散步的集合。這是爲什麼?

回答

4

回調productCallback意味着一個全局函數,而你的函數實際上是一個實例方法。您需要提供一個對象太:

Mage::getSingleton('core/resource_iterator') 
    ->walk($products->getSelect(), 
      array(array($this, 'productCallback')), 
      array('arg1' => '====')); 

(的原因,它是一個雙嵌套數組是因爲walk()需要一個列表回調

而且似乎你的實際函數名稱拼寫錯誤,但這可能是問題中的錯字,而不是程序中的錯字。

PS
閱讀中,我發現它的教程說:

我用一個簡單的回調函數的例子[...]如果您使用的是類中的代碼,並希望要使用類方法的回調,而不是功能,您需要更改代碼

+0

感謝您的提示。奇怪的是,如果我將它放在前端.phtml文件中,它會啓動該功能。但是我們知道這在道德上是錯誤的。我最終將一個事件觀察者添加到了config.xml中,以便我可以包含這個方法 - 這讓我可以將我的回調代碼保存在同一個Observer.php代碼中 - 沒有「私有」功能,因此這將是全局的嗎? –