1

每当用户搜索时,我都会收到此错误:

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,只有白色。这是我注意到的第一个问题,但在同一天开始出现以下问题:

  1. 白色搜索结果
  2. 分层导航中所有子类别的子类别产品计数显示为 0。
  3. 一些客户在登录时无法从他们的前端 UI 中查看订单。
  4. 我们的订单导出脚本返回空白字段(1.7mb 而不是 4.3)。
  5. 我们的“美国制造”和“畅销书”页面返回的产品数量超过了应有的数量。

现在,我知道这些都是不正确的,因为如果我重新索引整个站点,在它处理索引的一段时间内,上述所有操作都有效。但是,当索引完成时,它会再次中断。发生这种情况的同一天,我们出现了一个错误页面,指出其中一张桌子坏了,应该修理。我们在所有表上运行了 PHPMyAdmin 的修复和优化功能,它修复了该错误——但所有这些仍然被破坏。

有什么想法吗?关于可以尝试解决此问题的任何想法?我在任何地方都找不到这个错误——而且 Nexcess 的人也找不到任何东西。

感谢您的时间。

4

2 回答 2

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;
}

在有问题的调用之前(当然是在本地代码池覆盖中),将打印出一个应该指向有问题的代码的调用堆栈。

于 2012-06-27T20:32:21.707 回答
0

似乎问题在于Mage_CatalogSearch_Model_Resource_Search_Collection::_getSearchEntityIdsSql与使用产品平面索引不兼容。

您可以重写类Mage_CatalogSearch_Model_Resource_Search_Collection并进行两次小修改。

_getSearchEntityIdsSqlUsingFlatIndex1)向重写的类添加新功能。这个新功能(我希望)与 original 的功能完全相同_getSearchEntityIdsSql,但使用的是产品平面索引。

2) 修改函数_getSearchEntityIdsSql,以便_getSearchEntityIdsSqlUsingFlatIndex在启用和构建目录产品平面索引时调用 new。

见源代码:

    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);
    }
}
于 2018-03-02T13:34:45.767 回答