Nouveau module de bloc personnalisé Magento


12

J'utilise la version 1.8.1.0 de Magento .

J'essaie de créer un nouveau module de bloc personnalisé, que j'utiliserai pour créer une nouvelle page d'accueil.

  • Espace de noms: Crusader
  • Module: CLHomePage
  • Type de bloc: maison de croisade
  • Classe: Qwerty (juste pour l'instant pendant les tests)
  • Package de conception: croisé
  • Thème: par défaut

Voici ce que j'ai jusqu'à présent:

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

Maintenant, avec ce qui précède en place, ma page d'accueil affiche juste "Home Wrapper", donc le contenu de home.phtmls'affiche, mais pas le contenu de homeads.phtml.

Si je change le type de bloc pour homeadsen core/template, cela fonctionne, et je vois à la fois "Home Wrapper" et "Adverts". Je sais donc que le problème est lié à la référence à mon nouveau type de bloc (appelé maison de croisade).

Qu'est-ce que je fais mal ici ..?

ÉDITER

Après des suggestions dans les réponses, j'ai mis à jour certains fichiers comme suit, mais cela ne fonctionne toujours pas:

\ 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 (simplifié pour n'utiliser qu'un seul bloc au lieu des blocs imbriqués que j'essayais auparavant)

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

Je suis donc toujours dans une position où rien ne se voit.

Après avoir été invité par @FabianBlechschmidt, j'ai activé les journaux, et cela apparaît dans 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}

Toutes les idées ce qui se passe .. ??

EDIT No 2

@Malachy a trouvé la réponse ... C'était le compilateur. J'ai désactivé le compilateur et il semble fonctionner maintenant.


Je suppose que vous avez une faute de frappe quelque part, vérifiez les majuscules / minuscules des noms de fichiers. Les fichiers sont beaux. Avez-vous nettoyé le cache de configuration?
Fabian Blechschmidt

@FabianBlechschmidt J'ai vérifié mes majuscules / minuscules dans les noms de code et de fichier - ça me va. Tout ce qui précède est collé à partir de mes fichiers. J'ai tout le cache désactivé pour le moment, et je viens de vider tout le cache et j'ai réessayé - ne fonctionne toujours pas.
Stephen le

Avez-vous vérifié system.log et exception.log? S'il n'y a rien dedans, je commencerais le débogage dans MAge_Core_Model_Config-> getGroupedClassName (). À côté de cela: jetez un œil au grand tutoriel de débogage et faites un rapport.
Fabian Blechschmidt

Je n'ai jamais utilisé les journaux auparavant. Je les ai activés maintenant, et exception.log montre:exception 'Mage_Core_Exception' with message 'Invalid block type: Crusader_Home_Block_Qwerty'
Stephen Last

J'ai mis à jour le nom du module en ligne avec l'autre réponse ici, d'où le nom du type de bloc (CLHomePage -> Home).
Stephen le

Réponses:


11

Je trouve que tout le XML est difficile, donc je sympathise avec votre cause ici.

Il me semble qu'il y a une différence avec le nom de votre classe et votre bloc XML

c'est à dire

class Crusader_CLHomePage_Block_Qwerty extends Mage_Core_Block_Template

et

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

Commençons par le type de bloc et travaillons en arrière. Je pense qu'ici je m'attendrais à voir quelque chose comme

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

et ce type renvoie Magento à la classe

Crusader_Home_Block_Qwerty extends Mage_Core_Block_Template

En continuant à travailler en arrière sur ce point, le fichier app \ code \ local \ Crusader \ CLHomePage \ etc \ config.xml devrait être modifié en quelque chose comme

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

Il pointe Magento vers toutes les classes commençant par 'Crusader_Home_Block_ *'. Et maintenant, je pense que vous devez renommer votre module Crusader_Home au lieu de Crusader_CLHomePage et changer les noms de dossier en conséquence ...

ET / MAIS je vous recommande fortement de changer le nom de votre module. N'utilisez qu'une seule majuscule au début du nom du module et non trois et ne mettez pas non plus de majuscules au milieu du nom.

Vous voudrez peut-être examiner certains des outils disponibles pour générer des modules. Je les trouve très utiles pour éviter les erreurs de frappe. J'utilise celui-ci par les gens très intelligents de MGT Commerce (il a de la simplicité de son côté) et celui-ci est universel et un étonnant morceau de codage par Silk Software .

*** MODIFIER suite aux commentaires ci-dessous

En outre, sur la base du journal des erreurs, je pense que le problème est que Magento ne peut pas trouver votre fichier de classe. Vérifiez donc que les caches sont actualisés ou désactivés, en particulier le cache XML, et que le compilateur est désactivé ou réactivé .


merci, j'ai essayé vos suggestions. J'ai renommé mon module en «Accueil» et mis à jour toutes les références et dossiers. Ça ne marche toujours pas. Je vais modifier ma question pour montrer les changements.
Stephen le

1
Ça a l'air mieux certainement. Je me demande s'il y a encore une erreur de frappe sournoise quelque part. Sur la base du journal des erreurs, je pense que le problème est que Magento ne peut pas trouver votre fichier de classe. Vérifiez donc que les caches sont rafraîchis ou désactivés. Cache XML et le compilateur est désactivé ou réactivé. Ce ne serait pas un problème d'autorisation de fichier, n'est-ce pas?
Malachy

1
Vous avez mentionné le mot magique - Complier ... J'ai désactivé le complicateur et il semble fonctionner maintenant. Je vous remercie! Si vous ajoutez ceci comme réponse, je l'accepterai pour vous! :-)
Stephen Dernier

En fait, ce n'était pas seulement le compilateur. Votre XML d'origine <block type="crusaderhome/qwerty"est incorrect. La solution est à la fois a) de corriger le XML et b) de recompiler
Malachy

-1

répondez à votre question en premier lieu

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

devrait être remplacé par

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

car homeads n'est pas l'enfant de la page d'accueil. Je pense que cela fonctionnerait.


Merci! J'avais déjà essayé ça sans succès. La chose parent / enfant fonctionnait bien lorsque le type de bloc était core / template (plutôt que mon type de bloc personnalisé), donc mon problème n'est pas le placement de bloc.
Stephen le

-1

J'ai eu le même problème et l'ai résolu en remplaçant le code suivant dans config.xml

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

pour ça

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

Cela devrait résoudre le problème.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.