¿Cómo diagnosticar el error "Tipo de bloque no válido ..."?

19

No estoy seguro de cómo resolver este error, he estado buscando en Google durante una semana y parece que no puedo encontrar una solución. ¿Algunas ideas?

2013-06-10T04:04:28+00:00 ERR (3): 
exception 'Mage_Core_Exception' with message 'Invalid block type: ' in /home/xxxxxxx/public_html/app/Mage.php:594
Stack trace:
#0 /home/xxxxxxx/public_html/app/code/core/Mage/Core/Model/Layout.php(495): Mage::throwException('Invalid block t...')
#1 /home/xxxxxxx/public_html/app/code/core/Mage/Core/Model/Layout.php(437): Mage_Core_Model_Layout->_getBlockInstance('', Array)
#2 /home/xxxxxxx/public_html/app/code/core/Mage/Core/Model/Layout.php(472): Mage_Core_Model_Layout->createBlock('', 'checkout.cart')
#3 /home/xxxxxxx/public_html/app/code/core/Mage/Core/Model/Layout.php(239): Mage_Core_Model_Layout->addBlock('', 'checkout.cart')
#4 /home/xxxxxxx/public_html/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 /home/xxxxxxx/public_html/app/code/core/Mage/Core/Model/Layout.php(210): Mage_Core_Model_Layout->generateBlocks(Object(Mage_Core_Model_Layout_Element))
#6 /home/xxxxxxx/public_html/app/code/core/Mage/Core/Controller/Varien/Action.php(344): Mage_Core_Model_Layout->generateBlocks()
#7 /home/xxxxxxx/public_html/app/code/core/Mage/Core/Controller/Varien/Action.php(269): Mage_Core_Controller_Varien_Action->generateLayoutBlocks()
#8 /home/xxxxxxx/public_html/app/code/core/Mage/Checkout/controllers/CartController.php(159): Mage_Core_Controller_Varien_Action->loadLayout()
#9 /home/xxxxxxx/public_html/app/code/core/Mage/Core/Controller/Varien/Action.php(419): Mage_Checkout_CartController->indexAction()
#10 /home/xxxxxxx/public_html/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('index')
#11 /home/xxxxxxx/public_html/app/code/core/Mage/Core/Controller/Varien/Front.php(176): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#12 /home/xxxxxxx/public_html/app/code/core/Mage/Core/Model/App.php(354): Mage_Core_Controller_Varien_Front->dispatch()
#13 /home/xxxxxxx/public_html/app/Mage.php(683): Mage_Core_Model_App->run(Array)
#14 /home/xxxxxxx/public_html/index.php(89): Mage::run('', 'store')
#15 {main}
maestro de riesgo
fuente

Respuestas:

20

Según el seguimiento de la pila que publicó, parece que esto está sucediendo cuando Magento carga los archivos xml de actualización de diseño y los usa para crear los bloques que representarán el HTML para la página.

Estas líneas parecen ser el problema

#1 /home/xxxxxxx/public_html/app/code/core/Mage/Core/Model/Layout.php(437): Mage_Core_Model_Layout->_getBlockInstance('', Array)
#2 /home/xxxxxxx/public_html/app/code/core/Mage/Core/Model/Layout.php(472): Mage_Core_Model_Layout->createBlock('', 'checkout.cart')
#3 /home/xxxxxxx/public_html/app/code/core/Mage/Core/Model/Layout.php(239): Mage_Core_Model_Layout->addBlock('', 'checkout.cart')

Los addBlock, createBlocky _getBlockInstancemétodos, todos ellos esperan que el primer parámetro sea una cadena de alias de clase para el bloque. Algo así como checkout/cart. Sin embargo, en su sistema, falta esta cadena.

->addBlock('', 'checkout.cart')

Debido a que Magento es tan extensible, hay miles de razones por las que esto podría suceder. La razón más común es que, de alguna manera, su catalog.xmlarchivo ha cambiado de modo que

<block type="checkout/cart" name="checkout.cart">

Falta su typeatributo. Eso podría verse así

<block name="checkout.cart">

O podría ser un error tipográfico

<block typeX="checkout/cart" name="checkout.cart">

Espero que ayude. Si el problema termina siendo otra cosa, asegúrese de regresar y publicar la respuesta correcta.

Alan Storm
fuente
55
lo más probable es algo así en <block name="checkout.cart">lugar de <reference name="checkout.cart">. He visto esto en algunos temas que están en Internet (gratuitos o de pago). Una simple búsqueda en la layoutcarpeta del tema debería confirmar (o descartar) esta teoría.
Marius
2
Correcto, una referenceetiqueta no provocaría esa pila de createBlockllamadas, se llama, lo que significa que es una blocketiqueta.
Alan Storm
3

Con la ayuda de los comentarios de mi publicación original, pude localizar el código ofensivo.

Aquí está el fragmento que estaba causando la excepción:

<checkout_cart_index>
    <reference name="content">
        <block name="checkout.cart">            
            <!-- Add CMS Static Block -->
            <block type="cms/block" name="snippet.cart.bottom" as="snippet_cart_bottom">
                <action method="setBlockId"><block_id>snippet_cart_bottom</block_id></action>
            </block>

            <!-- Add CMS Static Block -->
            <block type="cms/block" name="snippet.cart.coupon.below" as="snippet_cart_coupon_below">
                <action method="setBlockId"><block_id>snippet_cart_coupon_below</block_id></action>
            </block>

            <!-- Add CMS Static Block -->
            <block type="cms/block" name="snippet.cart.empty.bottom" as="snippet_cart_empty_bottom">
                <action method="setBlockId"><block_id>snippet_cart_empty_bottom</block_id></action>
            </block>

            <!-- Add CMS Static Block -->
            <block type="cms/block" name="snippet.cart.list.below" as="snippet_cart_list_below">
                <action method="setBlockId"><block_id>snippet_cart_list_below</block_id></action>
            </block>
        </block>
    </reference>
</checkout_cart_index>

El código revisado ya no causa excepciones:

<checkout_cart_index>
    <reference name="checkout.cart">        
            <!-- Add CMS Static Block -->
            <block type="cms/block" name="snippet.cart.bottom" as="snippet_cart_bottom">
                <action method="setBlockId"><block_id>snippet_cart_bottom</block_id></action>
            </block>

            <!-- Add CMS Static Block -->
            <block type="cms/block" name="snippet.cart.coupon.below" as="snippet_cart_coupon_below">
                <action method="setBlockId"><block_id>snippet_cart_coupon_below</block_id></action>
            </block>

            <!-- Add CMS Static Block -->
            <block type="cms/block" name="snippet.cart.empty.bottom" as="snippet_cart_empty_bottom">
                <action method="setBlockId"><block_id>snippet_cart_empty_bottom</block_id></action>
            </block>

            <!-- Add CMS Static Block -->
            <block type="cms/block" name="snippet.cart.list.below" as="snippet_cart_list_below">
                <action method="setBlockId"><block_id>snippet_cart_list_below</block_id></action>
            </block>            
    </reference>
</checkout_cart_index>
maestro de riesgo
fuente
0

Logré resolver mis problemas simplemente eliminando los bloques. Hice esto por:

Agregar la línea Mage::log($className . ' - ' $blockName, null, 'logfile.log');a la función '_generateBlock' en /app/code/core/Mage/Core/Model/Layout.php

Al igual que:

$block = $this->addBlock($className, $blockName);
if (!$block) {
    Mage::log($className . ' - ' $blockName, null, 'logfile.log');
    return $this;
}

Luego eliminé los bloques agregando la siguiente línea a mi archivo local.xml en mi tema / diseño

<remove name="fb8cd356f514800e782dfca09d40465d"/>
<remove name="1f0592cf88e12e898c194d5d18250c51"/>
<remove name="downloads.product"/>

Espero que esto ayude a alguien. No podía soportar toda la basura que se está escribiendo en mi archivo de excepciones.log.

ACTUALIZAR:

Descubrí que usar este código justo antes de 'return $ this' en la función _generateBlock en /app/code/core/Mage/Core/Model/Layout.php

if ($_SERVER['HTTP_X_FORWARDED_FOR'] == '00.00.00.00') {
    Mage::log(Zend_Debug::dump($parentBlock, null, false), null, 'export_all_xml.log');
}

obviamente cambie 'HTTP_X_FORWARDED_FOR' a 'REMOTE_ADDR' si usted también lo necesita.

ACTUALIZACIÓN 2

Terminé encontrando el problema incorrecto en mi sitio agregando:

if ($_SERVER['HTTP_X_FORWARDED_FOR'] == '00.00.00.00') {
    Mage::setIsDeveloperMode(true);
}

justo encima de 'Mage :: throwException (Mage :: helper (' core ') -> __ (' Tipo de bloque inválido:% s ', $ block));' en la función '_getBlockInstance' en el archivo '/app/code/core/Mage/Core/Model/Layout.php'

rupi
fuente