每当用户搜索时,我都会收到此错误:
2012-06-26 11:05:21.671 [NOTICE] [208.69.120.120:48175-0#hostname] [STDERR] PHP Fatal error: Call to undefined method Mage_Catalog_Model_Resource_Product_Flat::getEntityTablePrefix() in /chroot/home/SITENAME/DOMAIN.COM/html/app/code/core/Mage/Eav/Model/Entity/Attribute/Abstract.php on line 505
而不是用户的结果出现,他们得到一个空白的白页 - 他们的结尾没有错误,没有UI,只有白色。这是我注意到的第一个问题,但是在同一天出现了以下问题:
现在,我知道这些都是不正确的,因为如果我重新索引整个网站,在处理索引的一段时间内,所有上述工作。但是,当索引完成时,它会再次中断。在发生这一天的同一天,我们出现了一个错误页面,其中一个表已经破坏并应该修复。我们在所有表上运行了PHPMyAdmin的修复和优化功能,它修复了错误 - 但所有这些仍然被破坏。
有什么想法吗?有什么想法可以尝试解决这个问题?我无法在任何地方找到这个错误 - 而Nexcess的那些人也无法为此找到任何东西。
感谢您的时间。
答案 0 :(得分:4)
根据上面的评论,Magento告诉你它正在尝试在类没有定义该方法的对象上调用方法getEntityTablePrefix
。特别是在这种方法中
#File: app/code/core/Mage/Eav/Model/Entity/Attribute/Abstract.php
public function getBackendTable()
{
if ($this->_dataTable === null) {
if ($this->isStatic()) {
$this->_dataTable = $this->getEntityType()->getValueTablePrefix();
} else {
$backendTable = trim($this->_getData('backend_table'));
if (empty($backendTable)) {
$entityTable = array($this->getEntity()->getEntityTablePrefix(), $this->getBackendType());
$backendTable = $this->getResource()->getTable($entityTable);
}
$this->_dataTable = $backendTable;
}
}
return $this->_dataTable;
}
鉴于这种情况发生在以下课程
Mage_Catalog_Model_Resource_Product_Flat
它告诉我,您已完成扩展和/或自定义,假设您不使用平面目录数据表,并且未编码为使用平面表。
放弃像这样的调试调用
if(!is_callable(array($this->getEntity()),'getEntityTablePrefix'))
{
mageDebugBacktrace();
//debug_print_backtrace();
exit;
}
在违规调用之前(当然是在本地代码池覆盖中),将打印出一个应该指出有问题的代码的调用堆栈。
答案 1 :(得分:0)
似乎Mage_CatalogSearch_Model_Resource_Search_Collection::_getSearchEntityIdsSql
中的问题与使用产品平面索引不兼容。
您可以重写课程Mage_CatalogSearch_Model_Resource_Search_Collection
并进行两处修改。
1)将新函数_getSearchEntityIdsSqlUsingFlatIndex
添加到重写的类中。这个新功能(我希望)与原始_getSearchEntityIdsSql
完全相同,但使用产品平面索引。
2)修改函数_getSearchEntityIdsSql
,以便在启用并构建目录产品平面索引时调用新的_getSearchEntityIdsSqlUsingFlatIndex
。
参见源代码:
class VENDOR_MODULE_Model_PATHTOREWRITECLASS extends Mage_CatalogSearch_Model_Resource_Search_Collection {
/**
* Retrieve SQL for search entities using product flat index.
*
* @param $query
* @return Varien_Db_Select
*/
protected function _getSearchEntityIdsSqlUsingFlatIndex($query)
{
/* @var $coreHelper Mage_Core_Model_Resource_Helper_Abstract */
$coreHelper = Mage::getResourceHelper('core');
$likeOptions = array('position' => 'any');
$flatTableName = $this->getTable('catalog/product_flat').'_'.$this->getStoreId();
/** @var Varien_Db_Select $select */
$select = $this->getConnection()
->select()
->from($flatTableName, array('entity_id'));
foreach ($this->_getAttributesCollection() as $attribute) {
/** @var Mage_Catalog_Model_Entity_Attribute $attribute */
if ($this->_isAttributeTextAndSearchable($attribute)) {
$attributeCode = $attribute->getAttributeCode();
$dbFieldName = in_array($attribute->getFrontendInput(), array('select', 'multiselect'))
? $attributeCode.'_value'
: $attributeCode;
if ($this->getConnection()->tableColumnExists($flatTableName, $dbFieldName)) {
$select->where($coreHelper->getCILike($dbFieldName, $this->_searchQuery, $likeOptions));
} else {
Mage::log(__METHOD__.": Attribute '$attributeCode' is missing in flat index.", Zend_Log::NOTICE);
}
}
}
return $select;
}
/**
* Retrieve SQL for search entities
*
* @param unknown_type $query
* @return string
*/
protected function _getSearchEntityIdsSql($query)
{
// HACK - make compatibility with flat index
/** @var Mage_Catalog_Helper_Product_Flat $flatHelper */
$flatHelper = Mage::helper('catalog/product_flat');
if ($this->getStoreId() > 0
&& $flatHelper->isEnabled($this->getStoreId())
&& $flatHelper->isBuilt($this->getStoreId())
) {
return $this->_getSearchEntityIdsSqlUsingFlatIndex($query);
}
// END HACK
return parent::_getSearchEntityIdsSql($query);
}
}