Magento Custom Block zeigt einen tödlichen Fehler an: Rufen Sie eine Mitgliedsfunktionssiegel () auf einem Nicht-Objekt auf
-
16-10-2019 - |
Frage
Ich habe einen Block in meinem benutzerdefinierten Modul erstellt, aber es funktioniert nicht. Mein Modul funktioniert gut, aber mein Block funktioniert nicht, wenn ich meinen Block von footer.phtml-Datei aufrufe, sie zeigt 'Fataler Fehler: Rufen Sie eine Mitgliedsfunktionssiegel () auf einem Nicht-Objekt an. Eigentlich möchte ich mit meinem benutzerdefinierten Block eine Nachricht in meinem Frontend anzeigen. Ich habe meinen Code unten erwähnt
lokal/monojit/custom/controller/indexcontroller.php
<?php
class Monojit_Custom_IndexController extends Mage_Core_Controller_Front_Action
{
public function indexAction()
{
$this->loadLayout();
$block = $this->getLayout()->createBlock(
'Mage_Core_Block_Template',
'my_block_name_here',
array('template' => 'custom/test.phtml')
);
$this->getLayout()->getBlock('content')->append($block);
$this->renderLayout();
}
}
?>
lokal/monojit/custom/block/mycustomblock.php
<?php
class Monojit_Custom_Block_Mycustomblock extends Mage_Core_Block_Template
{
//public function _prepareLayout()
// {
// return parent::_prepareLayout();
// }
public function _construct() {
parent::_construct();
$this->setTemplate('custom/test.phtml');
}
public function getmessage()
{
$msg = "showing my custom block";
return $msg;
}
}
?>
Lokal/monojit/benutzerdefiniert/etc/config.xml
<?xml version="1.0"?>
<config>
<global>
<modules>
<monojit_custom>
<version>0.1.0</version>
</monojit_custom>
</modules>
<blocks>
<custom>
<rewrite>
<custom>Monojit_Custom_Block_Mycustomblock</custom>
</rewrite>
</custom>
</blocks>
<helpers>
<custom>
<class>Monojit_Custom_Helper</class>
</custom>
</helpers>
</global>
<frontend>
<routers>
<custom>
<use>standard</use>
<args>
<module>Monojit_Custom</module>
<frontName>custom</frontName>
</args>
</custom>
</routers>
<layout>
<updates>
<custom>
<file>custom.xml</file>
</custom>
</updates>
</layout>
</frontend>
</config>
Ich habe ein Thema (kopiert modernes Thema) in Frontend/Standard/Monojit geändert, die die Konfiguration der Administratordesign verändert haben, und erstellt auch den notwendigen Ordner in Skin.Screenshot Pic
Design/Frontend/Standard/Monojit/Vorlage/benutzerdefinierte/test.phtml
//want to fetch data from my block
<p>This is your custom block called programatically.</p>
Localhost/Magento/Index.php/benutzerdefinierte Seite zeigt meine Nachricht richtig an
<?php echo $this->getLayout()->createBlock('custom/mycustomblock')->setTemplate('custom/test.phtml')->toHtml(); ?>
Es zeigt 'Fatal ERROR: Ruf auf eine Mitgliedsfunktions-Siesabteilung () auf einem Nicht-Objekt' Muss ich eine Layout.xml-Datei erstellen? Bitte helfen Sie mir, wie ich mein Problem beheben kann. Danke
Lösung
Setzen Sie den folgenden Code unter <blocks>
Knoten in Ihrer config.xml und versuchen Sie es.
<global>
<blocks>
<custom>
<class>Monojit_Custom_Block</class>
</custom>
. . . .
</global>
Andere Tipps
getLayout () ist keine Methode des Fußzeile -Blockcodes, daher ist er falsch, kein Objekt.
Auf diese Weise einen Kinderblock zu schaffen, ist keine gute Praxis. Sie sollten Ihre Blockdefinition in Ihre Layouts hinzufügen.
In Ihrem Fall würden Sie dies in Ihrer Local.xml -Layout -Datei hinzufügen:
<reference name="footer">
<block type="custom/mycustomblock" name="custom.block" as="custom_block" template="custom/test.phtml"/>
</reference>
Dann können Sie in Ihrer Fußzeile.phtml verwenden $this->getChildHtml('custom_block');
Wenn Sie aus irgendeinem Grund mit dem Platzieren von Code in die Vorlage fortsetzen möchten, passen Sie Ihre Zeile darauf an:
<?php echo Mage::getSingleton('core/layout')->createBlock('custom/mycustomblock')->setTemplate('custom/test.phtml')->toHtml(); ?>
<?php
class My_Booking_IndexController extends Mage_Core_Controller_Front_Action
{
public function indexAction()
{
$this->loadLayout();
$this->renderLayout();
echo $this->getLayout()->createBlock('core/template')->setTemplate('booking/booking.phtml')->toHtml();
}
}