我想覆盖目录/图层模型的函数prepareProductCollection($ collection)。
因为,我只想展示简单的产品,所以我想这样做:
public function prepareProductCollection($collection)
{
$collection
->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
->addMinimalPrice()
->addFinalPrice()
->addTaxPercents()
->addUrlRewrite($this->getCurrentCategory()->getId());
Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);
Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);
$collection
->addAttributeToSelect('type_id')
->addAttributeToFilter('type_id','simple');
echo $collection->getSelect()->__toString();
}
但是当我这样做时,我有这个错误:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'e.type_id' in 'where clause'
Trace:
#0 /Users/Ditchou/Documents/ProjetsWeb/lolote/lib/Varien/Db/Statement/Pdo/Mysql.php(110): Zend_Db_Statement_Pdo->_execute(Array)
#1 /Users/Ditchou/Documents/ProjetsWeb/lolote/lib/Zend/Db/Statement.php(300): Varien_Db_Statement_Pdo_Mysql->_execute(Array)
#2 /Users/Ditchou/Documents/ProjetsWeb/lolote/lib/Zend/Db/Adapter/Abstract.php(479): Zend_Db_Statement->execute(Array)
#3 /Users/Ditchou/Documents/ProjetsWeb/lolote/lib/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('SELECT FLOOR((R...', Array)
#4 /Users/Ditchou/Documents/ProjetsWeb/lolote/lib/Varien/Db/Adapter/Pdo/Mysql.php(419): Zend_Db_Adapter_Pdo_Abstract->query('SELECT FLOOR((R...', Array)
#5 /Users/Ditchou/Documents/ProjetsWeb/lolote/lib/Zend/Db/Adapter/Abstract.php(808): Varien_Db_Adapter_Pdo_Mysql->query(Object(Varien_Db_Select), Array)
#6 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Catalog/Model/Resource/Layer/Filter/Price.php(274): Zend_Db_Adapter_Abstract->fetchPairs(Object(Varien_Db_Select))
#7 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Catalog/Model/Layer/Filter/Price.php(158): Mage_Catalog_Model_Resource_Layer_Filter_Price->getCount(Object(Mage_Catalog_Model_Layer_Filter_Price), 10)
#8 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Catalog/Model/Layer/Filter/Price.php(115): Mage_Catalog_Model_Layer_Filter_Price->getRangeItemCounts(10)
#9 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Catalog/Model/Layer/Filter/Price.php(314): Mage_Catalog_Model_Layer_Filter_Price->getPriceRange()
#10 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Catalog/Model/Layer/Filter/Abstract.php(151): Mage_Catalog_Model_Layer_Filter_Price->_getItemsData()
#11 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Catalog/Model/Layer/Filter/Abstract.php(120): Mage_Catalog_Model_Layer_Filter_Abstract->_initItems()
#12 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Catalog/Model/Layer/Filter/Abstract.php(109): Mage_Catalog_Model_Layer_Filter_Abstract->getItems()
#13 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Catalog/Block/Layer/Filter/Abstract.php(132): Mage_Catalog_Model_Layer_Filter_Abstract->getItemsCount()
#14 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/design/frontend/decostore/default/template/catalog/layer/view.phtml(49): Mage_Catalog_Block_Layer_Filter_Abstract->getItemsCount()
#15 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Core/Block/Template.php(241): include('/Users/Ditchou/...')
#16 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('frontend/decost...')
#17 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView()
#18 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Core_Block_Template->_toHtml()
#19 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Core/Block/Text/List.php(43): Mage_Core_Block_Abstract->toHtml()
#20 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Core_Block_Text_List->_toHtml()
#21 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Core/Block/Abstract.php(582): Mage_Core_Block_Abstract->toHtml()
#22 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Core/Block/Abstract.php(526): Mage_Core_Block_Abstract->_getChildHtml('left', true)
#23 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/design/frontend/decostore/default/template/page/2columns-left.phtml(19): Mage_Core_Block_Abstract->getChildHtml('left')
#24 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Core/Block/Template.php(241): include('/Users/Ditchou/...')
#25 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('frontend/decost...')
#26 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView()
#27 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Core_Block_Template->_toHtml()
#28 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Core/Model/Layout.php(555): Mage_Core_Block_Abstract->toHtml()
#29 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Core/Controller/Varien/Action.php(390): Mage_Core_Model_Layout->getOutput()
#30 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Catalog/controllers/CategoryController.php(159): Mage_Core_Controller_Varien_Action->renderLayout()
#31 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Core/Controller/Varien/Action.php(419): Mage_Catalog_CategoryController->viewAction()
#32 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('view')
#33 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Core/Controller/Varien/Front.php(176): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#34 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Core/Model/App.php(354): Mage_Core_Controller_Varien_Front->dispatch()
#35 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/Mage.php(683): Mage_Core_Model_App->run(Array)
#36 /Users/Ditchou/Documents/ProjetsWeb/lolote/index.php(87): Mage::run('', 'store')
#37 {main}
这里似乎发生了错误: #6 /Users/Ditchou/Documents/ProjetsWeb/lolote/app/code/core/Mage/Catalog/Model/Resource/Layer/Filter/Price.php(274):Zend_Db_Adapter_Abstract-> fetchPairs(Object(Varien_Db_Select))< / p>
我不明白因为我只是做了
$collectionSimple = Mage::getResourceModel('catalog/product_collection')
->addAttributeToFilter('type_id', array('eq' => 'simple'));
sql请求的回显给了我:
SELECT `e`.*, `cat_index`.`position` AS `cat_index_position`, `price_index`.`price`, `price_index`.`tax_class_id`, `price_index`.`final_price`, IF(price_index.tier_price IS NOT NULL, LEAST(price_index.min_price, price_index.tier_price), price_index.min_price) AS `minimal_price`, `price_index`.`min_price`, `price_index`.`max_price`, `price_index`.`tier_price` FROM `catalog_product_entity` AS `e` INNER JOIN `catalog_category_product_index` AS `cat_index` ON cat_index.product_id=e.entity_id AND cat_index.store_id=1 AND cat_index.visibility IN(2, 4) AND cat_index.category_id='3' INNER JOIN `catalog_product_index_price` AS `price_index` ON price_index.entity_id = e.entity_id AND price_index.website_id = '1' AND price_index.customer_group_id = 0 WHERE (`e`.`type_id` = 'simple')
它有效。
为什么图层模型的集合不同?
答案 0 :(得分:8)
你确定这是你得到的错误吗?在Magento 1.7.x中,当我用上面提供的方法替换prepareProductCollection
方法体时,我得到这个错误
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'e.min_price' in 'where clause'
那是因为我的prepareProductCollection
未设置与原始属性相同的属性。对于初学者,请确保你的。如果您使用基于配置的重写执行此操作,请调用
parent::prepareProductCollection($collection);
在您的方法开始时。如果您使用local
或community
代码池覆盖,则需要复制/粘贴core
文件中的代码。在1.7.1中,这将是这样的
$collection
->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
->addMinimalPrice()
->addFinalPrice()
->addTaxPercents()
->addUrlRewrite($this->getCurrentCategory()->getId());
Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);
Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);
$collection
->addAttributeToSelect('type_id')
->addAttributeToFilter('type_id','simple');
如果这对您没有帮助,请跟踪您的调用堆栈 - 如果您的错误确实是1054 Unknown column 'e.type_id' in 'where clause'
,那么我的猜测是您有一些自定义代码运行,将集合的过滤器复制到不同收藏。
此外,您可以使用
获取集合的主SQL查询echo $collection->getSelect()->__toString();
这应该可以为您提供足够的调试信息。
更新:好的,根据上面的新信息,这似乎仅在有价格过滤器和/或索引处于特定状态的情况下启动。
这是你的问题。看一下这个调用堆栈行
#7 app/code/core/Mage/Catalog/Model/Layer/Filter/Price.php(158): Mage_Catalog_Model_Resource_Layer_Filter_Price->getCount(Object(Mage_Catalog_Model_Layer_Filter_Price), 10)
如果您跳转到getCount
方法,则会看到对_getSelect
的调用
#File: app/code/core/Mage/Catalog/Model/Resource/Layer/Filter/Price.php
public function getCount($filter, $range)
{
$select = $this->_getSelect($filter);
如果你看一下_getSelect
的定义,
#partial method reproduction
#File: app/code/core/Mage/Catalog/Model/Resource/Layer/Filter/Price.php
protected function _getSelect($filter)
{
$collection = $filter->getLayer()->getProductCollection();
$collection->addPriceData($filter->getCustomerGroupId(), $filter->getWebsiteId());
if (!is_null($collection->getCatalogPreparedSelect())) {
$select = clone $collection->getCatalogPreparedSelect();
} else {
$select = clone $collection->getSelect();
}
你会看到Magento 克隆来自集合的select,然后将其修改为从索引表中选择
// processing FROM part
$priceIndexJoinPart = $fromPart[Mage_Catalog_Model_Resource_Product_Collection::INDEX_TABLE_ALIAS];
$priceIndexJoinConditions = explode('AND', $priceIndexJoinPart['joinCondition']);
$priceIndexJoinPart['joinType'] = Zend_Db_Select::FROM;
$priceIndexJoinPart['joinCondition'] = null;
$fromPart[Mage_Catalog_Model_Resource_Product_Collection::MAIN_TABLE_ALIAS] = $priceIndexJoinPart;
unset($fromPart[Mage_Catalog_Model_Resource_Product_Collection::INDEX_TABLE_ALIAS]);
$select->setPart(Zend_Db_Select::FROM, $fromPart);
foreach ($fromPart as $key => $fromJoinItem) {
$fromPart[$key]['joinCondition'] = $this->_replaceTableAlias($fromJoinItem['joinCondition']);
}
$select->setPart(Zend_Db_Select::FROM, $fromPart);
由于索引表没有type_id
列,因此上述库存Magento代码与您的更改不兼容。如果我要继续这样做,我会
转向基于重写的方法
创建重写,添加type_id
过滤器代替您的覆盖
在上面_getSelect
方法上创建第二次重写,检查type_id
过滤器的选择,如果找到,则将其删除
或者,您可以尝试使用其他方法来重写更接近其使用位置的集合对象。
祝你好运!答案 1 :(得分:1)
我在2-3周前遇到了同样的问题,当时我试图将图层导航添加到自定义集合(而不是依赖于类别或搜索集合的集合)。我遇到的问题与分层导航中使用的价格过滤处理有关。 像Alan建议的那样,在Magento 1.7中,他们对用于价格过滤选项的select sql进行了优化。它们删除FROM sql部分(它是产品实体 - 包含type_id属性)并使price_index相关表成为主要表 - 在查询的FROM部分中使用的表。因此,基本上选择数据的表不再是产品实体表(您丢失了所有产品基本属性)主表成为产品索引。这是Magento团队在1.7版本中添加的核心更新。
我也有一个可行的解决方案,明天我将与你分享,我现在无法访问代码。
答案 2 :(得分:0)
当我从select栏中删除导致错误的字段时,我遇到了扩展_getSelect函数而没有为侧边栏中的价格过滤器返回正确集的问题。
因此,为了解决现有字段的问题,我使用了一个确实存在的字段entity_id。我扩展了Mage_Catalog_Model_Category,改变了函数getProductCollection:
$collection = Mage::getResourceModel('catalog/product_collection')
->setStoreId($this->getStoreId())
->addAttributeToFilter('type_id', array('eq' => 'simple'));
// Get the product ids of the filtered collection
$entityIds = $collection->getAllIds();
$collection = Mage::getResourceModel('catalog/product_collection')
->setStoreId($this->getStoreId())
->addCategoryFilter($this)
// Apply the product ids as a filter
->addIdFilter($entityIds,false);
return $collection;