2015-05-10 3 views
1

Я работаю над проектом, и все работает отлично на моей локальной машине (OS x - нечувствительная к регистру файловая система), но выдает исключение «Недопустимый тип блока» на рабочем сервере (Linux - чувствительный к регистру файловая система). Проблема в том, что я думаю, что я проверил все имена файлов для правильного верхнего/нижнего регистра.Исключение недопустимого типа блока только для производства

Вот трассировки стека:

exception 'Mage_Core_Exception' with message 'Invalid block type: Eqush_Eqush_Block_Footertop' in /www/eqush/app/Mage.php:595 
Stack trace: 
#0 /www/eqush/app/code/core/Mage/Core/Model/Layout.php(495): Mage::throwException('Invalid block t...') 
#1 /www/eqush/app/code/core/Mage/Core/Model/Layout.php(437): Mage_Core_Model_Layout->_getBlockInstance('eqush/footertop', Array) 
#2 /www/eqush/app/code/core/Mage/Core/Model/Layout.php(472): Mage_Core_Model_Layout->createBlock('eqush/footertop', 'eqush_footertop') 
#3 /www/eqush/app/code/core/Mage/Core/Model/Layout.php(239): Mage_Core_Model_Layout->addBlock('eqush/footertop', 'eqush_footertop') 
#4 /www/eqush/app/code/core/Mage/Core/Model/Layout.php(205): Mage_Core_Model_Layout->_generateBlock(Object(Mage_Core_Model_Layout_Element), Object(Mage_Core_Model_Layout_Element)) 
#5 /www/eqush/app/code/core/Mage/Core/Model/Layout.php(210): Mage_Core_Model_Layout->generateBlocks(Object(Mage_Core_Model_Layout_Element)) 
#6 /www/eqush/app/code/core/Mage/Core/Controller/Varien/Action.php(344): Mage_Core_Model_Layout->generateBlocks() 
#7 /www/eqush/app/code/core/Mage/Catalog/controllers/CategoryController.php(148): Mage_Core_Controller_Varien_Action->generateLayoutBlocks() 
#8 /www/eqush/app/code/core/Mage/Core/Controller/Varien/Action.php(418): Mage_Catalog_CategoryController->viewAction() 
#9 /www/eqush/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('view') 
#10 /www/eqush/app/code/core/Mage/Core/Controller/Varien/Front.php(172): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http)) 
#11 /www/eqush/app/code/core/Mage/Core/Model/App.php(354): Mage_Core_Controller_Varien_Front->dispatch() 
#12 /www/eqush/app/Mage.php(684): Mage_Core_Model_App->run(Array) 
#13 /www/eqush/index.php(87): Mage::run('', 'store') 
#14 {main} 

Вот конфигурация модуля с планировкой и блоком: (и пользовательские модель оплаты правильно работает)

<?xml version="1.0"?> 
<config> 
    <modules> 
     <Eqush_Eqush> 
      <version>0.0.1</version> 
     </Eqush_Eqush> 
    </modules> 
    <global> 
     <blocks> 
      <eqush> 
       <class>Eqush_Eqush_Block</class> 
      </eqush> 
     </blocks> 
     <models> 
      <eqush> 
       <class>Eqush_Eqush_Model</class> 
      </eqush> 
     </models> 
    </global> 

    <default> 
     <payment> 
      <eqush_paypal> 
       <model>eqush/paypal</model> 
       <active>1</active> 
       <order_status>pending</order_status> 
       <title>PayPal</title> 
       <sort_order>1</sort_order> 
      </eqush_paypal> 
     </payment> 
    </default> 

    <frontend> 
     <layout> 
      <updates> 
       <eqush> 
        <file>eqush_page.xml</file> 
       </eqush> 
      </updates> 
     </layout> 
    </frontend> 
</config> 

Вот блок кода (приложение/код/местный/Eqush/Eqush/Block/Footertop.php)

class Eqush_Eqush_Block_Footertop extends Mage_Core_Block_Template 
{} 

И часть макета вызывающему для этого блока: (eqush_ page.xml)

<reference name="footerTop"> 
    <block type="eqush/footertop" name="eqush_footertop" template="eqush/footer-top.phtml" before="-"></block> 
</reference> 

У меня нет идей. Я много искал, но ничего не помогло. Все выглядит хорошо для меня.

ответ

1

Давайте посмотрим на Mage_Core_Model_Layout (код/​​/// Модель/приложение/ядро ​​Mage сердечника layout.php) линии 482:

protected function _getBlockInstance($block, array $attributes=array()) 
{ 
    if (is_string($block)) { 
     if (strpos($block, '/')!==false) { 
      if (!$block = Mage::getConfig()->getBlockClassName($block)) { 
       Mage::throwException(Mage::helper('core')->__('Invalid block type: %s', $block)); 
      } 
     } 
     if (class_exists($block, false) || mageFindClassFile($block)) { 
      $block = new $block($attributes); 
     } 
    } 
    if (!$block instanceof Mage_Core_Block_Abstract) { 
     Mage::throwException(Mage::helper('core')->__('Invalid block type: %s', $block)); 
    } 
    return $block; 
} 

В вашем трассировки стека, то исключение в строке 495, второе throwException в методе. Если вы посмотрите на линии 486:

if (!$block = Mage::getConfig()->getBlockClassName($block)) { 

если $ блок имеет нулевое значение, то первое throwException будет отброшено. Но так как выбрано второе throwException, $ block НЕ должен быть экземпляром Mage_Core_Block_Abstract, может быть, это строка. Чтобы отладить это, добавьте точку останова в строке 486 или блок dump $ и посмотрите, что это такое.

+1

Вы правы. Я сбросил $ block до строки 494 и это строка (27) «Eqush_Eqush_Block_Footertop». Теперь я пытаюсь понять, почему. Если посмотреть на код до этого, то должно быть, что class_exists возвращает false, а mageFindClassFile также возвращает false. Почему это не делается в моей локальной среде? – Lai

+2

Глядя на это сейчас, ваш ответ заставил меня понять, что все правильно настроено, и я проверил единственное, о чем не думал раньше. Файл имел неправильные разрешения. Теперь я чувствую себя немой. Спасибо, что открыл глаза и научил копаться в коде. – Lai

0

При взгляде frist это абсолютно правильный код. Вы пытались очистить папку magento_root/var/cache и проверить?

+0

К сожалению, я пробовал, и это не помогло. Я удалил файлы кеша через командную строку. – Lai

Смежные вопросы