Novo módulo de bloco personalizado Magento

12

Estou usando o Magento versão 1.8.1.0.

Estou tentando criar um novo módulo de bloco personalizado, que utilizarei para criar uma nova página inicial.

  • Espaço para nome: Crusader
  • Módulo: CLHomePage
  • Tipo de bloco: cruzada em casa
  • Classe: Qwerty (apenas por enquanto durante o teste)
  • Pacote de design: cruzado
  • Tema: padrão

Isto é o que eu tenho até agora:

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

Agora, com o exposto acima, minha página inicial mostra apenas "Home Wrapper"; portanto, o conteúdo de home.phtmlé exibido, mas não o conteúdo de homeads.phtml.

Se eu alterar o tipo de bloco para homeadsa core/template, ele funciona, e eu vejo tanto "Home Wrapper" e "Anúncios". Então eu sei que o problema tem algo a ver com a referência ao meu novo tipo de bloco (chamado cruzada em casa).

O que eu estou fazendo errado aqui..?

EDITAR

Após sugestões nas respostas, atualizei alguns arquivos da seguinte forma, mas ainda não 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 apenas um bloco em vez dos blocos aninhados que eu estava tentando 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>

Então, eu ainda estou em uma posição onde nada mostra.

Depois de ser solicitado por @FabianBlechschmidt, ativei os logs, e isso é exibido em 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}

Alguma idéia do que está acontecendo .. ??

EDIT n.º 2

@ Malachy Encontrou a resposta ... Era o compilador. Desativei o compilador e ele parece funcionar agora.

Stephen Last
fonte
Presumo que você tenha um erro de digitação em algum lugar, verifique os nomes de arquivos em maiúsculas / minúsculas. Os arquivos estão bem. Você limpou o cache de configuração?
Fabian Blechschmidt
@FabianBlechschmidt Verifiquei minhas maiúsculas / minúsculas nos nomes de código e arquivo - parece-me bem. Tudo acima é colado nos meus arquivos. Eu tenho todo o cache desativado no momento e acabei de limpar todo o cache e tentei novamente - ainda não funciona.
Stephen Última
Você verificou system.log e exception.log? Se não houver nada, eu iniciaria a depuração em MAge_Core_Model_Config-> getGroupedClassName (). Além disso: dê uma olhada no ótimo tutorial de depuração e informe-o novamente.
Fabian Blechschmidt
Eu não usei os logs antes. Eu os habilitei agora, e o exception.log está sendo exibido:exception 'Mage_Core_Exception' with message 'Invalid block type: Crusader_Home_Block_Qwerty'
Stephen Última
Atualizei o nome do módulo de acordo com a outra resposta aqui, daí o nome do tipo de bloco (CLHomePage -> Home).
Stephen Última

Respostas:

11

Acho a coisa toda XML difícil, por isso sou solidário à sua causa aqui.

Parece-me que há uma discrepância com o nome da sua classe e o seu bloco XML

ie

class Crusader_CLHomePage_Block_Qwerty extends Mage_Core_Block_Template

e

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

Vamos começar com o tipo de bloco e trabalhar para trás. Eu acho que aqui eu esperaria ver algo como

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

e esse tipo referiria Magento à classe

Crusader_Home_Block_Qwerty extends Mage_Core_Block_Template

Continuando a trabalhar com retrocesso nessa questão, o arquivo app \ code \ local \ Crusader \ CLHomePage \ etc \ config.xml precisaria ser modificado para algo como

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

Aponta o Magento para todas as classes iniciando 'Crusader_Home_Block_ *'. E agora acho que você precisa renomear seu módulo Crusader_Home em vez de Crusader_CLHomePage e alterar os nomes das pastas de acordo ...

E / MAS eu recomendo fortemente que você altere o nome do módulo. Use sempre apenas uma letra maiúscula no início do nome do módulo e não três e também não coloque letras maiúsculas no meio do nome.

Você pode querer examinar algumas das ferramentas disponíveis para gerar módulos. Acho-os muito úteis para evitar erros de digitação. Eu uso esse aqui pelas pessoas muito inteligentes da MGT Commerce (ele tem simplicidade de lado) e este é abrangente e uma parte surpreendente de codificação da Silk Software .

*** EDITAR seguindo os comentários abaixo

Além disso, com base no log de erros, acho que o problema é que o Magento não consegue encontrar o arquivo de classe. Portanto, verifique novamente se os caches estão atualizados ou desativados, principalmente o cache XML, e se o compilador está desativado ou reativado .

Malachy
fonte
obrigado, eu tentei suas sugestões. Renomeei o módulo para 'Página inicial' e atualizei todas as referências e pastas. Ainda não funciona. Vou editar minha pergunta para mostrar as alterações.
Stephen Última
1
Parece melhor certamente. Gostaria de saber se ainda existe um erro de digitação sorrateira em algum lugar. Baseado no log de erros, acho que o problema é que o Magento não consegue encontrar seu arquivo de classe. Portanto, verifique se os caches são atualizados ou desativados esp. O cache XML e o compilador estão desativados ou reativados. Não seria um problema de permissão de arquivo, seria?
Malachy
1
Você mencionou a palavra mágica - Complier ... Desativei o complier e parece funcionar agora. Obrigado! Se você adicionar isso como resposta, eu aceito! :-)
Stephen Última
Na verdade, não era apenas o compilador. Seu XML original <block type="crusaderhome/qwerty"está incorreto. A solução é tanto um) corrigir o XML e b) re-compilação
Malachy
-1

responda sua pergunta em primeiro lugar

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

deve ser substituído 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 não é filho da página inicial. Eu acho que isso funcionaria.

Tai
fonte
Obrigado! Eu tinha tentado isso antes sem sorte. A coisa pai / filho estava funcionando bem quando o tipo de bloco era o núcleo / modelo (em vez do meu tipo de bloco personalizado), então meu problema não é o posicionamento do bloco.
Stephen Última
-1

Eu obtive o mesmo problema e o resolvi substituindo o código a seguir no config.xml

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

para isso

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

Deve resolver o problema.

Sidarta
fonte