Rufen Sie zu einer Mitgliedsfunktion getProductId () auf ein Nicht-Objekt?
-
16-10-2019 - |
Frage
Ich habe ein benutzerdefiniertes Modul erstellt, da ich das gerade überschrieben habe Mage_Catalog_Block_Product
Klasse, um die zu bekommen getPrice()
. Aber es gibt einen Fehleraufruf an eine Mitgliedsfunktion getProductId () in einem Nicht-Objekt zurück?
Mein PHP -Code ist:
//Regler
<?php
class Course_Mca_IndexController extends Mage_Core_Controller_Front_Action
{
public function indexAction()
{
$this->loadLayout();
$this->renderLayout();
}
}
// Blockdatei
<?php
class Course_Mca_Block_Products extends Mage_Catalog_Block_Product
{
public function getPrice()
{
return parent::getPrice();
}
}
//web.phtml Datei
<?php echo $this->getPrice() ?>
//layout.xml Datei
<?xml version="1.0"?>
<layout version="0.1.0">
<mca_index_index>
<reference name="content">
<block type="mca/products" name="mca_mca" template="mca/web.phtml"></block>
</reference>
</mca_index_index>
</layout>
//Course_mca.xml
<?xml version="1.0"?>
<config>
<modules>
<Course_Mca>
<active>true</active>
<codePool>local</codePool>
<depends>
<Mage_Catalog/>
</depends>
</Course_Mca>
</modules>
</config>
//config.xml
<blocks>
<!-- it's not working -->
<!-- <catalog>
<rewrite>
<product>Course_Mca_Block_Products</product>
</rewrite>
</catalog>-->
<!-- it's working -->
<mca>
<class>Course_Mca_Block</class>
</mca>
</blocks>
Kann mir jemand sagen, wo ich falsch gelaufen bin?
Danke im Voraus.
Lösung
Schauen Sie sich das Original an getPrice
Methode.
Es sieht aus wie das:
public function getPrice()
{
return $this->getProduct()->getPrice();
}
Wenn Sie tiefer graben, landen Sie in Mage_Catalog_Block_Product::getProduct()
Das sieht so aus:
public function getProduct()
{
if (!$this->getData('product') instanceof Mage_Catalog_Model_Product) {
if ($this->getData('product')->getProductId()) {
$productId = $this->getData('product')->getProductId();
}
if ($productId) {
$product = Mage::getModel('catalog/product')->load($productId);
if ($product) {
$this->setProduct($product);
}
}
}
return $this->getData('product');
}
In Ihrem Fall $this->getData('product')
Rückkehr null
, und da null
ist keine Instanz von Mage_Catalog_Model_Product
Sie betreten den ersten if
Anweisung und es stürzt in dieser Zeile ab: if ($this->getData('product')->getProductId()) {
Weil du nicht anrufen kannst null->getProductId()
.
Jede Instanz von Mage_Catalog_Block_Product
ist sinnvoll, wenn Sie ein Produkt an diese anbringen. In Anbetracht Ihrer Layoutdatei kann ich zu dem Schluss kommen, dass Sie versuchen, Ihren Block ohne Produkt zu verwenden.
So ist Ihr Ihre Mca_IndexController::indexAction()
sollte aussehen:
$this->loadLayout();
$block = $this->getLayout()->getBlock('mca_mca');
if ($block){
$productId = 15;//for example
$product = Mage::getModel('catalog/product')->setStoreId(Mage::app()->getStore()->getId())->load($productId);
$block->setProduct($product);
}
$this->renderLayout();