Come diagnosticare l'errore "Tipo di blocco non valido ..."?


19

Non sono sicuro di come capire questo errore, ho cercato su Google per una settimana e non riesco a trovare una soluzione. Qualche idea?

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}

Risposte:


20

Sulla base della traccia dello stack che hai pubblicato, sembra che ciò accada quando Magento sta caricando i file xml di aggiornamento del layout e li utilizza per creare i blocchi che renderizzeranno l'HTML per la pagina.

Queste righe sembrano essere il 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')

I addBlock, createBlocke _getBlockInstancemetodi di tutti si aspettano che il primo parametro da una stringa di classe alias per il blocco. Qualcosa del genere checkout/cart. Tuttavia, nel tuo sistema, questa stringa non è presente.

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

Poiché Magento è così estensibile, ci sono una miriade di ragioni per cui ciò potrebbe accadere. Il motivo più comune è in qualche modo che il tuo catalog.xmlfile è stato modificato in modo tale

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

Manca l' typeattributo. Potrebbe sembrare così

<block name="checkout.cart">

O potrebbe essere un errore di battitura

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

Spero possa aiutare. Se il problema finisce per essere qualcos'altro, assicurati di tornare e pubblicare la risposta corretta.


5
molto probabilmente è qualcosa di simile <block name="checkout.cart">invece di <reference name="checkout.cart">. L'ho visto in alcuni temi che sono su Internet (gratuiti o a pagamento). Una semplice ricerca nella layoutcartella del tema dovrebbe confermare (o respingere) questa teoria.
Marius

2
Bene, un referencetag non causerebbe lo stack di chiamate - createBlockviene chiamato, il che significa che è un blocktag.
Alan Storm,

3

Con l'aiuto dei commenti del mio post originale, sono stato in grado di rintracciare il codice offensivo!

Ecco lo snippet che stava causando l'eccezione:

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

Il codice rivisto non causa più eccezioni:

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

0

Sono riuscito a risolvere i miei problemi semplicemente rimuovendo i blocchi. L'ho fatto per:

Aggiunta della riga Mage::log($className . ' - ' $blockName, null, 'logfile.log');alla funzione '_generateBlock' in /app/code/core/Mage/Core/Model/Layout.php

Così:

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

Ho quindi rimosso i blocchi aggiungendo la seguente riga al mio file local.xml nel mio tema / layout

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

Spero che questo aiuti qualcuno. Non sopportavo tutte le schifezze scritte nel mio file exceptions.log.

AGGIORNARE:

Ho scoperto che usando questo codice poco prima di 'return $ this' nella funzione _generateBlock in /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');
}

ovviamente cambia 'HTTP_X_FORWARDED_FOR' in 'REMOTE_ADDR' se ne hai bisogno.

AGGIORNAMENTO 2

Ho finito per trovare il problema sbagliato con il mio sito aggiungendo:

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

appena sopra "Mage :: throwException (Mage :: helper ('core') -> __ ('Tipo di blocco non valido:% s', $ block)); ' nella funzione '_getBlockInstance' nel file '/app/code/core/Mage/Core/Model/Layout.php'

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.