Why do I get an exception when trying to append a block to a container in a parent theme?
-
06-02-2021 - |
Frage
I'm following an exercise in the ebook 'No-Frills-Magento-2-Layout' by Alan Storm (excellent book so far btw) and am coming across a slight issue for which I am not sure what I am doing wrong.
I am trying to create a new theme with the intention of adding a new block to the catalog_category_view
layout template.
I have the following code structure:
/design
/frontend
/Pulsestorm
/dram
/Magento_Catalog
registration.php
theme.xml
/layout
catalog_category_view.xml
/templates
hello.phtml
The files contents are as follows:
registration.php:
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::THEME,
'frontend/Pulsestorm/dram',
__DIR__
);
theme.xml:
<?xml version="1.0"?>
<theme xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Config/etc/theme.xsd">
<title>Pulsestorm Dram</title>
<parent>Magento/luma</parent>
<media>
<preview_image/>
</media>
</theme>
catalog_category_view.xml:
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceContainer name="content">
<block name="pulsestorm_magento_catalog_category_view_example" class="Magento\Framework\View\Element\Template" template="hello.phtml"/>
</referenceContainer>
</body>
</page>
hello.phtml:
<h2>Hello Category Listing Page</h2>
I then registered the theme in admin in Content -> Design -> Themes
for each website listed (the default websites that ship with Magento 2).
I then cleared the cache: magento cache:clean
and then navigated to: [development-web-address]/gear/fitness-equipment.html
but I then get the following exception:
1 exception(s):
Exception #0 (Magento\Framework\Exception\ValidatorException): Invalid template file: 'hello.phtml' in module: '' block's name: 'pulsestorm_magento_catalog_category_view_example'
Exception #0 (Magento\Framework\Exception\ValidatorException): Invalid template file: 'hello.phtml' in module: '' block's name: 'pulsestorm_magento_catalog_category_view_example'
#0 /srv/magento/vendor/magento/framework/View/Element/Template.php(300): Magento\Framework\View\Element\Template->fetchView(false)
#1 /srv/magento/vendor/magento/framework/View/Element/AbstractBlock.php(667): Magento\Framework\View\Element\Template->_toHtml()
#2 /srv/magento/vendor/magento/framework/View/Layout.php(557): Magento\Framework\View\Element\AbstractBlock->toHtml()
#3 /srv/magento/vendor/magento/framework/View/Layout.php(533): Magento\Framework\View\Layout->_renderBlock('pulsestorm_mage...')
...
I am expecting <h2>Hello Category Listing Page</h2>
to be displayed after the product listings. Why am I getting this exception? From the exception message, I'm guessing that it may have something to do with the blank module name but I'm not sure why it is blank.
Lösung
1- Your theme architecture should be like this:
--app/design/frontend/Pulsestorm/dram/
|__ Magento_Catalog/
|__ layout
|__ templates
|__ registration.php
|__ theme.xml
2- So the registration.php
theme.xml
must be inside : app/design/frontend/Pulsestorm/dram/
and not inside Magento_Catalog
.
3- app/design/frontend/Pulsestorm/dram/Magento_Catalog/layout/catalog_category_view.xml
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceContainer name="content">
<block class="Magento\Framework\View\Element\Template" name="pulsestorm_magento_catalog_category_view_example" template="Magento_Catalog::hello.phtml"/>
</referenceContainer>
</body>
</page>
3- app/design/frontend/Pulsestorm/dram/Magento_Catalog/templates/hello.phtml
<h2>Yehoo, it works !<h2>
If you didn't notice it , I add Magento_Catalog::
in xml part template="Magento_Catalog::hello.phtml"/>
and why ?
Explanation:
When you declared you phtml in xml, you tel to Magento, please Magento render my hello.phtml
, ok so Magento go to get it from your theme Magento_Theme
=> app/design/frontend/Pulsestorm/dram/Magento_Theme
and it didn't find it ! but now by adding Magento_Catalog
, Magento know now that you want to get your file from Magento_Catalog
, so it goes to get it from there.
Good luck.