Nuevo módulo de bloque personalizado Magento

12

Estoy usando Magento versión 1.8.1.0.

Estoy tratando de crear un nuevo módulo de bloque personalizado, que usaré para crear una nueva página de inicio.

  • Espacio de nombres: cruzado
  • Módulo: CLHomePage
  • Tipo de bloque: cruzada a casa
  • Clase: Qwerty (solo por ahora durante las pruebas)
  • Paquete de diseño: cruzado
  • Tema: predeterminado

Esto es lo que tengo hasta ahora:

\ app \ etc \ modules \ Crusader_All.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Crusader_CLHomePage>
            <active>true</active>
            <codePool>local</codePool>
        </Crusader_CLHomePage>
    </modules>
</config>

\ app \ code \ local \ Crusader \ CLHomePage \ etc \ config.xml

<?xml version="1.0"?>
<config> 
    <modules>
        <Crusader_CLHomePage>
            <version>0.0.1</version>
        </Crusader_CLHomePage>
    </modules>
    <global>
        <blocks>
            <crusaderhome>
                <class>Crusader_CLHomePage_Block</class>
            </crusaderhome>
        </blocks>
    </global>
</config>

\ app \ code \ local \ Crusader \ CLHomePage \ Block \ Qwerty.php

<?php
class Crusader_CLHomePage_Block_Qwerty extends Mage_Core_Block_Template
{
    // Methods (optional)
}
?>

\ app \ design \ frontend \ crusader \ default \ layout \ local.xml

<?xml version="1.0" ?>
<layout>
    <cms_index_index>
        <reference name="content">
            <block type="core/template" name="homepage" template="crusader/home.phtml">
                <block type="crusaderhome/qwerty" name="homeads" as="homeads" template="crusader/homeads.phtml" />
            </block>
        </reference>
    </cms_index_index>
</layout>

\ app \ design \ frontend \ crusader \ default \ template \ crusader \ home.phtml

<div id="home">
<p>Home Wrapper</p>
<?php echo $this->getChildHtml('homeads'); ?>
</div>

\ app \ design \ frontend \ crusader \ default \ template \ crusader \ homeads.phtml

<p>Adverts</p>

Ahora, con lo anterior en su lugar, mi página de inicio muestra solo "Home Wrapper", por lo que home.phtmlse muestra el contenido de , pero no el contenido de homeads.phtml.

Si cambio el tipo de bloque para homeadsa core/template, funciona, y veo tanto "Home Wrapper" como "Adverts". Así que sé que el problema tiene algo que ver con la referencia a mi nuevo tipo de bloque (llamado hogar de cruzada).

Qué estoy haciendo mal aquí..?

EDITAR

Después de las sugerencias en las respuestas, he actualizado algunos archivos de la siguiente manera, pero aún no funciona:

\ app \ etc \ modules \ Crusader_Home.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Crusader_Home>
            <active>true</active>
            <codePool>local</codePool>
        </Crusader_Home>
    </modules>
</config>

\ app \ code \ local \ Crusader \ Home \ etc \ config.xml

<?xml version="1.0"?>
<config> 
    <modules>
        <Crusader_Home>
            <version>1.0.0</version>
        </Crusader_Home>
    </modules>
    <global>
        <blocks>
            <crusader_home>
                <class>Crusader_Home_Block</class>
            </crusader_home>
        </blocks>
    </global>
</config>

\ app \ code \ local \ Crusader \ Home \ Block \ Qwerty.php

<?php
class Crusader_Home_Block_Qwerty extends Mage_Core_Block_Template
{
    // Methods (optional)
}
?>

\ app \ design \ frontend \ crusader \ default \ layout \ local.xml (simplificado para usar solo un bloque en lugar de los bloques anidados que estaba intentando antes)

<?xml version="1.0" ?>
<layout>
    <cms_index_index>
        <reference name="content">
            <block type="crusader_home/qwerty" name="homepage" template="crusader/home.phtml" />
        </reference>
    </cms_index_index>
</layout>

\ app \ design \ frontend \ crusader \ default \ template \ crusader \ home.phtml

<p>Home</p>

Así que todavía estoy en una posición donde nada se muestra.

Después de que @FabianBlechschmidt me lo solicite, encendí los registros y esto se muestra en exception.log:

2014-04-09T14:04:54+00:00 ERR (3): 
exception 'Mage_Core_Exception' with message 'Invalid block type: Crusader_Home_Block_Qwerty' in W:\stores\magento-dev\app\Mage.php:595
Stack trace:
#0 W:\stores\magento-dev\includes\src\__default.php(27744): Mage::throwException('Invalid block t...')
#1 W:\stores\magento-dev\includes\src\__default.php(27686): Mage_Core_Model_Layout->_getBlockInstance('crusader_home/q...', Array)
#2 W:\stores\magento-dev\includes\src\__default.php(27721): Mage_Core_Model_Layout->createBlock('crusader_home/q...', 'homepage')
#3 W:\stores\magento-dev\includes\src\__default.php(27488): Mage_Core_Model_Layout->addBlock('crusader_home/q...', 'homepage')
#4 W:\stores\magento-dev\includes\src\__default.php(27454): Mage_Core_Model_Layout->_generateBlock(Object(Mage_Core_Model_Layout_Element), Object(Mage_Core_Model_Layout_Element))
#5 W:\stores\magento-dev\includes\src\__default.php(27459): Mage_Core_Model_Layout->generateBlocks(Object(Mage_Core_Model_Layout_Element))
#6 W:\stores\magento-dev\includes\src\__default.php(13895): Mage_Core_Model_Layout->generateBlocks()
#7 W:\stores\magento-dev\includes\src\__default.php(11274): Mage_Core_Controller_Varien_Action->generateLayoutBlocks()
#8 W:\stores\magento-dev\includes\src\__default.php(11213): Mage_Cms_Helper_Page->_renderPage(Object(Mage_Cms_IndexController), 'home')
#9 W:\stores\magento-dev\app\code\core\Mage\Cms\controllers\IndexController.php(45): Mage_Cms_Helper_Page->renderPage(Object(Mage_Cms_IndexController), 'home')
#10 W:\stores\magento-dev\includes\src\__default.php(13969): Mage_Cms_IndexController->indexAction()
#11 W:\stores\magento-dev\includes\src\__default.php(18331): Mage_Core_Controller_Varien_Action->dispatch('index')
#12 W:\stores\magento-dev\includes\src\__default.php(17865): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#13 W:\stores\magento-dev\includes\src\__default.php(20465): Mage_Core_Controller_Varien_Front->dispatch()
#14 W:\stores\magento-dev\app\Mage.php(684): Mage_Core_Model_App->run(Array)
#15 W:\stores\magento-dev\index.php(176): Mage::run('crusadergifts', 'store')
#16 {main}

Alguna idea de lo que está pasando ... ??

EDITAR No 2

@Malachy encontró la respuesta ... Fue el compilador. Inhabilité el compilador y parece funcionar ahora.

Stephen Last
fuente
Supongo que tiene un error tipográfico en alguna parte, verifique mayúsculas / minúsculas de los nombres de archivo. Los archivos se ven bien. ¿Limpió el caché de configuración?
Fabian Blechschmidt
@FabianBlechschmidt He revisado mi mayúscula / minúscula en el código y en los nombres de los archivos, me parece bien. Todo lo anterior está pegado de mis archivos. Tengo todo el caché apagado en este momento, y acabo de borrar todo el caché e intenté nuevamente, todavía no funciona.
Stephen Último
¿Comprobó system.log y exception.log? Si no hay nada en él, comenzaría a depurar en MAge_Core_Model_Config-> getGroupedClassName (). Además de esto: Eche un vistazo al gran tutorial de depuración e informe.
Fabian Blechschmidt
No he usado los registros antes. Los he habilitado ahora, y excepción.log muestra:exception 'Mage_Core_Exception' with message 'Invalid block type: Crusader_Home_Block_Qwerty'
Stephen Último
He actualizado el nombre del módulo en línea con la otra respuesta aquí, de ahí el nombre del tipo de bloque (CLHomePage -> Inicio).
Stephen Último

Respuestas:

11

Encuentro todo el asunto XML difícil, así que simpatizo con su causa aquí.

Me parece que hay una discrepancia con su nombre de clase y su bloque XML

es decir

class Crusader_CLHomePage_Block_Qwerty extends Mage_Core_Block_Template

y

    <block type="core/template" name="homepage" template="crusader/home.phtml">
        <block type="crusaderhome/qwerty" name="homeads" as="homeads" template="crusader/homeads.phtml" />
    </block>

Comencemos con el tipo de bloque y trabajemos hacia atrás. Creo que aquí esperaría ver algo como

<block type="crusader_home/qwerty" ...

y ese tipo referiría a Magento a la clase

Crusader_Home_Block_Qwerty extends Mage_Core_Block_Template

Continuando trabajando hacia atrás en esta táctica, el archivo app \ code \ local \ Crusader \ CLHomePage \ etc \ config.xml necesitaría ser modificado para algo como

<global>
    <blocks>
        <crusader_home>
            <class>Crusader_Home_Block</class>
        </crusader_home>
    </blocks>
</global>

Apunta a Magento a todas las clases que comienzan con 'Crusader_Home_Block_ *'. Y ahora creo que debe cambiar el nombre de su módulo Crusader_Home en lugar de Crusader_CLHomePage y cambiar los nombres de las carpetas en consecuencia ...

Y / PERO Le recomiendo que cambie el nombre de su módulo. Solo use una letra mayúscula al comienzo del nombre del módulo, no tres y tampoco ponga letras mayúsculas en el medio del nombre.

Es posible que desee ver algunas de las herramientas disponibles para generar módulos. Los encuentro muy útiles para evitar errores de escritura. Lo uso por personas muy inteligentes en MGT Commerce (tiene la simplicidad de su lado) y este es una codificación que abarca todo y es sorprendente por Silk Software .

*** EDITE los siguientes comentarios a continuación

Además, según el registro de errores, creo que el problema es que Magento no puede encontrar su archivo de clase. Por lo tanto, verifique que las memorias caché estén actualizadas o desactivadas, en particular la memoria caché XML, y que el compilador esté desactivado o reactivado .

Malachy
fuente
gracias, he probado tus sugerencias. Cambié el nombre de mi módulo a 'Inicio' y actualicé todas las referencias y carpetas. Aún no funciona. Editaré mi pregunta para mostrar los cambios.
Stephen Último
1
Se ve mejor ciertamente. Me pregunto si todavía hay un error de tipeo furtivo en alguna parte. Según el registro de errores, creo que el problema es que Magento no puede encontrar su archivo de clase. Por lo tanto, verifique que las cachés estén actualizadas o no. Caché XML y el compilador está apagado o re-habilitado. No sería un problema de permiso de archivo, ¿verdad?
Malachy
1
Usted mencionó la palabra mágica: Cumplidor ... Deshabilité el cumplidor y parece funcionar ahora. ¡Gracias! Si agrega esto como respuesta, ¡lo aceptaré por usted! :-)
Stephen Último
En realidad, no fue solo el compilador. Su XML original <block type="crusaderhome/qwerty"es incorrecto. La solución es tanto a) corregir el XML como b) volver a compilar
Malachy
-1

responde tu pregunta en primer lugar

    <block type="core/template" name="homepage" template="crusader/home.phtml">
       <block type="crusaderhome/qwerty" name="homeads" as="homeads" template="crusader/homeads.phtml" />
    </block>

debe ser reemplazado por

<block type="core/template" name="homepage" template="crusader/home.phtml"></block>
<block type="crusaderhome/qwerty" name="homeads" as="homeads" 
template="crusader/homeads.phtml" />

porque homeads no es hijo de la página de inicio. Creo que esto funcionaría.

Tai
fuente
¡Gracias! Lo había intentado antes sin suerte. Lo principal / secundario funcionaba bien cuando el tipo de bloque era núcleo / plantilla (en lugar de mi tipo de bloque personalizado), por lo que mi problema no es la colocación de bloques.
Stephen Último
-1

Obtuve el mismo problema y lo resolví reemplazando el siguiente código en config.xml

<global>
    <blocks>
        <crusaderhome>
            <class>Crusader_CLHomePage_Block</class>
        </crusaderhome>
    </blocks>
</global>

a esto

<global>
    <blocks>
        <crusader_clhomepage>
            <class>Crusader_CLHomePage_Block</class>
        </crusader_clhomepage>
    </blocks>
</global>

Debería resolver el problema.

Siddharth
fuente