Nuovo modulo di blocco personalizzato Magento


12

Sto usando Magento versione 1.8.1.0.

Sto cercando di creare un nuovo modulo di blocco personalizzato, che userò per creare una nuova home page.

  • Namespace: Crusader
  • Modulo: CLHomePage
  • Tipo di blocco: crociata a casa
  • Classe: Qwerty (solo per ora durante il test)
  • Pacchetto design: crociato
  • Tema: impostazione predefinita

Questo è quello che ho finora:

\ App \ etc \ moduli \ Crusader_All.xml

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

\ App \ code \ locale \ crociato \ 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 \ locale \ crociato \ CLHomePage \ Blocco \ Qwerty.php

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

\ App \ progettazione \ frontend \ crociato \ 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 \ progettazione \ frontend \ crociato \ Default \ template \ crociato \ home.phtml

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

\ App \ progettazione \ frontend \ crociato \ Default \ template \ crociato \ homeads.phtml

<p>Adverts</p>

Ora, con quanto sopra in atto, la mia home page mostra solo "Home Wrapper", quindi il contenuto di home.phtmlviene visualizzato, ma non il contenuto di homeads.phtml.

Se cambio il tipo di blocco per homeadsin core/template, funziona, e vedo sia "Home Wrapper" che "Annunci". Quindi so che il problema ha a che fare con il riferimento al mio nuovo tipo di blocco (chiamato crusade home).

Cosa sto facendo di sbagliato qui ..?

MODIFICARE

Dopo aver suggerito le risposte, ho aggiornato alcuni file come segue, ma non funziona ancora:

\ App \ etc \ moduli \ Crusader_Home.xml

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

\ App \ code \ locale \ crociato \ 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 \ locale \ crociato \ Home \ Blocco \ Qwerty.php

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

\ app \ design \ frontend \ crusader \ default \ layout \ local.xml (semplificato per usare solo un blocco invece dei blocchi nidificati che stavo provando prima)

<?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 \ progettazione \ frontend \ crociato \ Default \ template \ crociato \ home.phtml

<p>Home</p>

Quindi sono ancora in una posizione in cui nulla mostra.

Dopo essere stato richiesto da @FabianBlechschmidt, ho attivato i log e questo viene mostrato in 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}

Qualche idea su cosa sta succedendo .. ??

MODIFICA N. 2

@Malachy Trovato la risposta ... Era il compilatore. Ho disabilitato il compilatore e sembra funzionare ora.


Suppongo che tu abbia un refuso da qualche parte, controlla maiuscole / minuscole di nomi di file. I file sembrano a posto. Hai pulito la cache di configurazione?
Fabian Blechschmidt,

@FabianBlechschmidt Ho controllato le lettere maiuscole / minuscole nel nome del codice e del file - mi sembra ok. Tutto quanto sopra è incollato dai miei file. Al momento ho disattivato tutta la cache e ho appena cancellato tutta la cache e riprovato, ma non funziona ancora.
Stephen Ultimo

Hai controllato system.log ed exception.log? Se non contiene nulla, inizierei a eseguire il debug in MAge_Core_Model_Config-> getGroupedClassName (). Inoltre: dai un'occhiata al fantastico tutorial di debug e riporta indietro.
Fabian Blechschmidt,

Non ho usato i registri prima. Li ho abilitati ora, e exception.log sta mostrando:exception 'Mage_Core_Exception' with message 'Invalid block type: Crusader_Home_Block_Qwerty'
Stephen Ultimo

Ho aggiornato il nome del modulo in linea con l'altra risposta qui, quindi il nome del tipo di blocco (CLHomePage -> Home).
Stephen Ultimo

Risposte:


11

Trovo che l'intera cosa XML sia difficile, quindi sono comprensivo della tua causa qui.

Mi sembra che ci sia una discrepanza con il nome della tua classe e il tuo blocco XML

vale a dire

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>

Cominciamo con il tipo di blocco e lavoriamo all'indietro. Penso che qui mi aspetterei di vedere qualcosa del genere

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

e quel tipo farebbe riferimento Magento alla classe

Crusader_Home_Block_Qwerty extends Mage_Core_Block_Template

Continuando a lavorare all'indietro su questa virata, il file app \ code \ local \ Crusader \ CLHomePage \ etc \ config.xml dovrebbe essere modificato in qualcosa di simile

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

Punta Magento a tutte le classi a partire da "Crusader_Home_Block_ *". E ora penso che devi rinominare il tuo modulo Crusader_Home invece di Crusader_CLHomePage e cambiare i nomi delle cartelle di conseguenza ...

E / MA ti consiglio vivamente di cambiare il nome del tuo modulo. Usa sempre una lettera maiuscola all'inizio del nome del modulo e non tre e non mettere nemmeno le lettere maiuscole nel mezzo del nome.

Potresti voler esaminare alcuni degli strumenti disponibili per la generazione di moduli. Li trovo molto utili per evitare errori di battitura. Lo uso da parte delle persone molto intelligenti di MGT Commerce (ha la semplicità dalla sua parte) e questo è onnicomprensivo e un pezzo di codice sorprendente di Silk Software .

*** MODIFICA dopo i commenti qui sotto

Inoltre, in base al registro degli errori, penso che il problema sia che Magento non riesce a trovare il tuo file di classe. Quindi ricontrollare che le cache siano aggiornate o disattivate, in particolare cache XML, e che il compilatore sia spento o riattivato .


grazie, ho provato i tuoi suggerimenti. Ho rinominato il mio modulo in "Home" e ho aggiornato tutti i riferimenti e le cartelle. Non funziona ancora. Modificherò la mia domanda per mostrare le modifiche.
Stephen Ultimo

1
Sembra sicuramente migliore. Mi chiedo se c'è ancora un errore di battitura subdolo da qualche parte. Sulla base del registro degli errori, penso che il problema sia che Magento non riesce a trovare il tuo file di classe. Quindi ricontrolla che le cache siano aggiornate o disattivate esp. Cache XML e il compilatore è disattivato o riattivato. Non sarebbe un problema di autorizzazione dei file, vero?
Malachy,

1
Hai citato la parola magica - Complier ... Ho disabilitato il complier e sembra funzionare ora. Grazie! Se aggiungi questo come risposta, lo accetterò per te! :-)
Stephen Ultimo

In realtà, non era solo il compilatore. Il tuo XML originale <block type="crusaderhome/qwerty"non è corretto. La soluzione è sia a) correggere l'XML che b) ricompilare
Malachy l'

-1

rispondi alla tua domanda in primo luogo

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

dovrebbe essere sostituito da

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

perché non è figlio della home page. Penso che funzionerebbe.


Grazie! Ci avevo provato prima senza fortuna. La cosa genitore / figlio funzionava bene quando il tipo di blocco era core / template (piuttosto che il mio tipo di blocco personalizzato), quindi il mio problema non è il posizionamento dei blocchi.
Stephen Ultimo

-1

Ho avuto lo stesso problema e l'ho risolto sostituendo il seguente codice in config.xml

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

a questo

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

Dovrebbe risolvere il problema.

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.