Magento - 空白屏幕搜索结果。 很多事情都破了

Whenever a user searches, I get this error:

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

And instead of the user's results appearing, they get a blank white page- no error on their end, no UI, just white. This was the first issue I noticed, but on the same day the following issues started coming up:

  1. White Search Results
  2. Sub-category product count for all sub-categories in layered nav is showing 0.
  3. Some customers can not view orders from their front-end UI when logged in.
  4. Our order export script is returning blank fields (1.7mb instead of 4.3).
  5. Our "Made-in-the-usa" and "best sellers" pages are returning more products than they should.

Now, I know these are all incorrect because if I reindex the entire site, for some period while it is processing the index, all of the above works. However, when the index is complete, it all breaks again. The same day this happened we had an error page appear that stated one of the tables had broken and should be repaired. We ran PHPMyAdmin's repair and optimize functions on all tables and it fixed that error- but all of these are still broken.

Any ideas at all? Any ideas of what could be tried to fix this? I cant find this error anywhere- and the guys over at Nexcess haven't been able to find anything for this, either.

Thank you for your time.

As per the comments above, Magento's telling you that it's trying to call the method getEntityTablePrefix on an object whose classes don't have that method defined. Specifically in this method

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

Given this happens from the following class

Mage_Catalog_Model_Resource_Product_Flat

It says to me that you have an extension and/or customization done that assumes you're not using the flat catalog data tables and wasn't coded to work with the flat table.

Dropping in a debugging call like this

if(!is_callable(array($this->getEntity()),'getEntityTablePrefix'))
{
    mageDebugBacktrace();
    //debug_print_backtrace();
    exit;
}

right before the offending call (in a local code pool override, of course), will print out a call-stack that should point the offending code.

The seems that problem is in Mage_CatalogSearch_Model_Resource_Search_Collection::_getSearchEntityIdsSql that is not compatible with using the product flat index.

You can rewrite class Mage_CatalogSearch_Model_Resource_Search_Collection and do two little modifications.

1) Add new function _getSearchEntityIdsSqlUsingFlatIndex to rewrited class. This new function (I hope) does exactly the same thing as original _getSearchEntityIdsSql, but with using the product flat index.

2) Modify function _getSearchEntityIdsSql so that it calls new _getSearchEntityIdsSqlUsingFlatIndex if the catalog product flat index is enabled and built.

See source code:

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