Nowy niestandardowy moduł blokowy Magento

12

Używam Magento w wersji 1.8.1.0.

Próbuję utworzyć nowy niestandardowy moduł blokowy, którego użyję do utworzenia nowej strony głównej.

  • Przestrzeń nazw: Krzyżowiec
  • Moduł: CLHomePage
  • Typ bloku: krucjata główna
  • Klasa: Qwerty (na razie podczas testowania)
  • Pakiet projektowy: krzyżowiec
  • Motyw: domyślny

Oto co mam do tej pory:

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

Teraz, gdy powyższe jest na swoim miejscu, moja strona główna pokazuje po prostu „Home Wrapper”, więc home.phtmlwyświetlana jest zawartość , ale nie treść homeads.phtml.

Jeśli zmienić typ bloku do homeadscelu core/template, to działa, i widzę zarówno „Home Wrapper” i „Ogłoszenia”. Wiem, że problem ma związek z odniesieniem do mojego nowego typu bloku (zwanego domem krucjaty).

Co ja tu robię źle?

EDYTOWAĆ

Po sugestiach w odpowiedziach zaktualizowałem niektóre pliki w następujący sposób, ale nadal nie działa:

\ 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 (uproszczone, aby używać tylko jednego bloku zamiast zagnieżdżonych bloków, które próbowałem wcześniej)

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

Więc wciąż jestem w pozycji, w której nic się nie pokazuje.

Po wyświetleniu monitu przez @FabianBlechschmidt włączyłem logi, co pokazuje wyjątek.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}

Wszelkie pomysły, co się dzieje .. ??

EDYCJA nr 2

@Malachy Znaleziono odpowiedź ... To był kompilator. Wyłączyłem kompilator i wydaje się, że teraz działa.

Stephen Last
źródło
Zakładam, że masz gdzieś literówkę, zaznacz wielkie / małe litery nazw plików. Pliki wyglądają dobrze. Czy wyczyściłeś pamięć podręczną konfiguracji?
Fabian Blechschmidt
@FabianBlechschmidt Sprawdziłem wielkie / małe litery w nazwach kodów i plików - dla mnie wygląda to dobrze. Wszystko powyżej zostało wklejone z moich plików. W tej chwili mam wyłączoną pamięć podręczną, właśnie wyczyściłem pamięć podręczną i spróbowałem ponownie - nadal nie działa.
Stephen Last
Czy sprawdziłeś system.log i wyjatek.log? Jeśli nie ma w tym nic, zacznę debugowanie w MAge_Core_Model_Config-> getGroupedClassName (). Oprócz tego: zapoznaj się z doskonałym samouczkiem dotyczącym debugowania i zgłoś się.
Fabian Blechschmidt
Nie korzystałem wcześniej z dzienników. Włączyłem je teraz, a wyjątek.log pokazuje:exception 'Mage_Core_Exception' with message 'Invalid block type: Crusader_Home_Block_Qwerty'
Stephen Last
Zaktualizowałem nazwę modułu zgodnie z inną odpowiedzią tutaj, stąd nazwa typu bloku (CLHomePage -> Home).
Stephen Last

Odpowiedzi:

11

Uważam, że cała ta sprawa z XML jest trudna, więc popieram twoją sprawę tutaj.

Wydaje mi się, że istnieje rozbieżność między nazwą klasy a blokowym kodem XML

to znaczy

class Crusader_CLHomePage_Block_Qwerty extends Mage_Core_Block_Template

i

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

Zacznijmy od typu bloku i pracujmy wstecz. Myślę, że tutaj oczekiwałbym czegoś takiego

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

i ten typ odsyłałby Magento do klasy

Crusader_Home_Block_Qwerty extends Mage_Core_Block_Template

Kontynuując pracę wstecz nad tym taktem, plik app \ code \ local \ Crusader \ CLHomePage \ etc \ config.xml musiałby zostać zmodyfikowany do czegoś w rodzaju

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

Wskazuje Magento na wszystkie klasy zaczynające się od „Crusader_Home_Block_ *”. A teraz myślę, że musisz zmienić nazwę modułu Crusader_Home zamiast Crusader_CLHomePage i odpowiednio zmienić nazwy folderów ...

I / ALE zdecydowanie zalecamy zmianę nazwy modułu. Zawsze używaj tylko jednej dużej litery na początku nazwy modułu, a nie trzech, i nie umieszczaj wielkich liter na środku nazwy.

Możesz zajrzeć do niektórych narzędzi dostępnych do generowania modułów. Uważam je za bardzo przydatne w celu uniknięcia błędów pisowni. Używam tego przez bardzo sprytnych ludzi z MGT Commerce (ma prostotę po swojej stronie), a ten jest wszechstronny i zadziwiający .

*** EDYTUJ zgodnie z poniższymi komentarzami

Dodatkowo na podstawie dziennika błędów myślę, że problem polega na tym, że Magento nie może znaleźć pliku klasy. Dlatego dokładnie sprawdź, czy pamięci podręczne są odświeżone lub wyłączone, szczególnie pamięć podręczna XML oraz czy kompilator jest wyłączony lub ponownie włączony .

Malachy
źródło
dzięki, próbowałem twoich sugestii. Zmieniłem nazwę modułu na „Strona główna” i zaktualizowałem wszystkie odwołania i foldery. Nadal nie działa. Zmodyfikuję moje pytanie, aby pokazać zmiany.
Stephen Last
1
Z pewnością wygląda lepiej. Zastanawiam się, czy gdzieś nadal jest podstępny błąd w pisaniu. Na podstawie dziennika błędów myślę, że problem polega na tym, że Magento nie może znaleźć pliku klasy. Więc dokładnie sprawdź, czy pamięci podręczne są odświeżone lub wyłączone esp. Pamięć podręczna XML, a kompilator jest wyłączony lub ponownie włączony. Czy to nie byłby problem z uprawnieniami do plików?
Malachy
1
Wspomniałeś o magicznym słowie - Complier ... Wyłączyłem kompilatora i wydaje się, że teraz działa. Dziękuję Ci! Jeśli dodasz to jako odpowiedź, zaakceptuję to dla ciebie! :-)
Stephen Last
W rzeczywistości nie był to tylko kompilator. Twój oryginalny kod XML <block type="crusaderhome/qwerty"jest niepoprawny. Rozwiązaniem jest zarówno a) poprawienie XML, jak i b) ponowna kompilacja
Malachy
-1

odpowiedz na swoje pytanie w pierwszej kolejności

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

powinien zostać zastąpiony przez

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

ponieważ homeady nie są dzieckiem strony głównej. Myślę, że to zadziała.

Tai
źródło
Dzięki! Próbowałem już tego wcześniej bez powodzenia. Element nadrzędny / podrzędny działał dobrze, gdy typem bloku był rdzeń / szablon (zamiast mojego niestandardowego typu bloku), więc moim problemem nie jest umieszczenie bloku.
Stephen Last
-1

Mam ten sam problem i rozwiązałem go, zastępując następujący kod w pliku config.xml

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

do tego

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

To powinno rozwiązać problem.

Siddharth
źródło