2012-06-27 31 views
1

每當用戶搜索,我得到這個錯誤:Magento - 空白屏幕搜索結果。許多事情打破

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 

,而不是出現在用戶的結果,他們得到一個空白頁面級沒有錯誤在他們的終點,沒有用戶界面,只是白色的。這是第一個問題,我注意到,但在同一天下列問題開始來了:

  1. 白搜索結果
  2. 所有子類別分層導航子類別的產品計數顯示爲0。
  3. 某些客戶在登錄時無法查看其前端UI的訂單。
  4. 我們的訂單導出腳本正在返回空白字段(1.7mb而不是4.3)。
  5. 我們的「美國製造」和「暢銷書」頁面正在返回比他們應該更多的產品。

現在,我知道這些都是不正確的,因爲如果我重新索引整個網站,在處理索引的某個時期,上述所有工作。但是,索引完成後,它會再次打破。同一天發生這種情況,我們出現了一個錯誤頁面,表明其中一個表已損壞,應該修復。我們在所有表格上運行PHPMyAdmin的修復和優化功能,並修復了錯誤 - 但所有這些仍然被破壞。

有什麼想法嗎?任何想法可以嘗試解決這個問題?我無法在任何地方發現這個錯誤 - 而Nexcess的傢伙也無法爲此找到任何東西。

謝謝你的時間。

+0

您收到此錯誤信息表明'方法getEntityTablePrefix'在類'Mage_Catalog_Model_Resource_Product_Flat'不存在。根據這個錯誤信息,它與MySQL無關。 PHP中的致命錯誤導致腳本結束而不輸出其緩衝區。您必須在腳本輸出任何內容之前修復該錯誤。該類文件是否包含在內?這個班是否存在?像505的代碼是什麼? – efesar

+0

感謝您的回覆!我有我們的PHP傢伙正在考慮驗證這一點,但我必須說 - 這是一個核心文件。我們從不接觸核心文件。如果我們需要修改某些內容,我們會將其放入本地文件夾以避免這樣的問題。此外,這並不能解釋爲什麼在重新索引過程中所有內容都可以正常工作。我只是再次測試一下,搜索工作,而它的重新編譯,當它完成時會中斷。具體來說,它似乎是平面指數的產品。另外,你知道,第505行:$ entityTable = array($ this-> getEntity() - > getEntityTablePrefix(),$ this-> getBackendType()); – user1486750

回答

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

違規調用前右(在本地代碼池覆蓋,當然),將打印出調用堆棧應該指出有問題的代碼。

+0

不知道有關mageDebugBacktrace()。非常方便,謝謝。 – pspahn

+1

我遇到同樣的問題。該擴展沒有假定我使用了平面目錄數據表。代碼只是'Mage :: helper('catalogsearch') - > getQuery() - > prepare() - > getResultCollection();'我認爲Magento核心代碼在這裏是越野車。 –

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