【问题标题】:How to use the Mage_Catalog_Model_Resource_Product_Collection object when Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection is expected?当需要 Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection 时,如何使用 Mage_Catalog_Model_Resource_Product_Collection 对象?
【发布时间】:2022-02-04 06:56:12
【问题描述】:

我正在尝试在一个类别页面上列出产品,该类别页面由一个扩展程序过滤,该扩展程序对客户隐藏给定类别中的产品,但已批准的客户组中的产品除外。

过滤器要求传递产品集合以进行处理。 Helper 类用于通过覆盖prepareProductCollection 函数in Mage_Catalog_Model_Layer 来执行此操作。

此时集合应该是Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection 类型,但是传递给扩展Mage_Catalog_Model_Layer 的类的集合是Mage_Catalog_Model_Resource_Product_Collection 类型,这会导致Helper 类失败。如果您查看下面的堆栈跟踪,则在函数之前使用的所有 Magento 类都期望返回 Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection

Recoverable Error: Argument 1 passed to Netzarbeiter_GroupsCatalog_Helper_Data::addGroupsFilterToProductCollection() must be an instance of Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection, instance of Mage_Catalog_Model_Resource_Product_Collection given, called in /home/namespace/public_html/b2b/app/code/community/Netzarbeiter/GroupsCatalog/Model/Catalog/Layer.php on line 37 and defined  in /home/namespace/public_html/b2b/app/code/community/Netzarbeiter/GroupsCatalog/Helper/Data.php on line 475

#0 /home/namespace/public_html/b2b/app/code/community/Netzarbeiter/GroupsCatalog/Helper/Data.php(475): mageCoreErrorHandler(4096, 'Argument 1 pass...', '/home/namespace/...', 475, Array)
#1 /home/namespace/public_html/b2b/app/code/community/Netzarbeiter/GroupsCatalog/Model/Catalog/Layer.php(37): Netzarbeiter_GroupsCatalog_Helper_Data->addGroupsFilterToProductCollection(Object(Mage_Catalog_Model_Resource_Product_Collection))
#2 /home/namespace/public_html/b2b/app/code/core/Mage/Catalog/Model/Layer.php(103): Netzarbeiter_GroupsCatalog_Model_Catalog_Layer->prepareProductCollection(Object(Mage_Catalog_Model_Resource_Product_Collection))
#3 /home/namespace/public_html/b2b/app/code/core/Mage/Catalog/Block/Product/List.php(87): Mage_Catalog_Model_Layer->getProductCollection()
#4 /home/namespace/public_html/b2b/app/code/core/Mage/Catalog/Block/Product/List.php(142): Mage_Catalog_Block_Product_List->_getProductCollection()
#5 /home/namespace/public_html/b2b/app/code/core/Mage/Core/Block/Abstract.php(918): Mage_Catalog_Block_Product_List->_beforeToHtml()
#6 /home/namespace/public_html/b2b/app/code/core/Mage/Core/Block/Abstract.php(637): Mage_Core_Block_Abstract->toHtml()
#7 /home/namespace/public_html/b2b/app/code/core/Mage/Core/Block/Abstract.php(581): Mage_Core_Block_Abstract->_getChildHtml('product_list', true)
#8 /home/namespace/public_html/b2b/app/code/core/Mage/Catalog/Block/Category/View.php(90): Mage_Core_Block_Abstract->getChildHtml('product_list')
#9 /home/namespace/public_html/b2b/app/design/frontend/safes/default/template/local/catalog/category/view.phtml(87): Mage_Catalog_Block_Category_View->getProductListHtml()
#10 /home/namespace/public_html/b2b/app/code/core/Mage/Core/Block/Template.php(241): include('/home/namespace/...')
#11 /home/namespace/public_html/b2b/app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('frontend/safes/...')
#12 /home/namespace/public_html/b2b/app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView()
#13 /home/namespace/public_html/b2b/app/code/core/Mage/Core/Block/Abstract.php(919): Mage_Core_Block_Template->_toHtml()
#14 /home/namespace/public_html/b2b/app/code/core/Mage/Core/Block/Text/List.php(43): Mage_Core_Block_Abstract->toHtml()
#15 /home/namespace/public_html/b2b/app/code/core/Mage/Core/Block/Abstract.php(919): Mage_Core_Block_Text_List->_toHtml()
#16 /home/namespace/public_html/b2b/app/code/core/Mage/Core/Block/Abstract.php(637): Mage_Core_Block_Abstract->toHtml()
#17 /home/namespace/public_html/b2b/app/code/core/Mage/Core/Block/Abstract.php(581): Mage_Core_Block_Abstract->_getChildHtml('content', true)
#18 /home/namespace/public_html/b2b/app/design/frontend/safes/default/template/page/1column.phtml(48): Mage_Core_Block_Abstract->getChildHtml('content')
#19 /home/namespace/public_html/b2b/app/code/core/Mage/Core/Block/Template.php(241): include('/home/namespace/...')
#20 /home/namespace/public_html/b2b/app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('frontend/safes/...')
#21 /home/namespace/public_html/b2b/app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView()
#22 /home/namespace/public_html/b2b/app/code/core/Mage/Core/Block/Abstract.php(919): Mage_Core_Block_Template->_toHtml()
#23 /home/namespace/public_html/b2b/app/code/core/Mage/Core/Model/Layout.php(555): Mage_Core_Block_Abstract->toHtml()
#24 /home/namespace/public_html/b2b/app/code/core/Mage/Core/Controller/Varien/Action.php(390): Mage_Core_Model_Layout->getOutput()
#25 /home/namespace/public_html/b2b/app/code/local/Aserty/Filter/controllers/CategoryController.php(34): Mage_Core_Controller_Varien_Action->renderLayout()
#26 /home/namespace/public_html/b2b/app/code/core/Mage/Core/Controller/Varien/Action.php(418): Aserty_Filter_CategoryController->viewAction()
#27 /home/namespace/public_html/b2b/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('view')
#28 /home/namespace/public_html/b2b/app/code/core/Mage/Core/Controller/Varien/Front.php(172): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#29 /home/namespace/public_html/b2b/app/code/core/Mage/Core/Model/App.php(354): Mage_Core_Controller_Varien_Front->dispatch()
#30 /home/namespace/public_html/b2b/app/Mage.php(684): Mage_Core_Model_App->run(Array)
#31 /home/namespace/public_html/b2b/index.php(90): Mage::run('', 'store')
#32 {main}

【问题讨论】:

  • 一点帮助它可以恢复!
  • 这是你的模块还是第三方扩展?
  • @RobbieAverill 这是第三方扩展。我能够通过更改方法签名以使用正在给出的 Mage_Catalog_Model_Resource_Product_Collection 对象来使其工作,但我想了解在预期 Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection 时 Magento 在什么情况下会给出这个对象。如果您注意到,覆盖从 Mage_Catalog_Model_Layer 开始,但 /app/code/core/Mage/Catalog/Block/Product/List.php 似乎传递了意外的 Object 类型。
  • @wickedskaman 我看不到这个扩展的任何代码,所以最好请它的作者解释一下
  • @RobbieAverill 就是这样......我认为扩展不会导致传递错误的对象类型。似乎 Magento 正在自己做这件事,我想知道在块级别调用产品列表(使用 Mage_Catalog_Block_Product_List 对象)是否会给我们一个意想不到的对象,因为它在这里。我在模板中调用了错误的块吗?类别中是否存在不使用 Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection 对象作为结果的设置?

标签: php magento magento-1.9


【解决方案1】:

Mysql4 类自 Magento 1.5 或 1.6 以来已被弃用,仅存在向后兼容。如果您查看他们的源代码,您会发现他们在没有任何自己的代码的情况下扩展了“新”资源模型:

class Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection extends Mage_Catalog_Model_Resource_Product_Collection
{
}

现在这可以正常工作,直到扩展类型提示旧类但 Magento 实际上实例化了新类。

尝试获取与当前 Magento 版本兼容的更新版本的扩展。如果这不可行,您可以通过替换所有 Mysql4 类型提示自行修补。

【讨论】:

    猜你喜欢
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    相关资源
    最近更新 更多