Llamar a una función miembro getProductID () en un no objeto?
-
16-10-2019 - |
Pregunta
He creado módulo personalizado, ya que acabo de anular el Mage_Catalog_Block_Product
clase para obtener el getPrice()
. ¿Pero está devolviendo una llamada de error a una función miembro getProductID () en un no objeto?
Mi código PHP es:
//controlador
<?php
class Course_Mca_IndexController extends Mage_Core_Controller_Front_Action
{
public function indexAction()
{
$this->loadLayout();
$this->renderLayout();
}
}
// Bloquear archivo
<?php
class Course_Mca_Block_Products extends Mage_Catalog_Block_Product
{
public function getPrice()
{
return parent::getPrice();
}
}
//web.phtml archivo
<?php echo $this->getPrice() ?>
//layout.xml archivo
<?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>
¿Alguien puede decirme dónde me equivoqué?
Gracias por adelantado.
Solución
Echa un vistazo al original getPrice
método.
Se parece a esto:
public function getPrice()
{
return $this->getProduct()->getPrice();
}
Cavando más profundo terminas en Mage_Catalog_Block_Product::getProduct()
Eso se ve así:
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');
}
En tu caso $this->getData('product')
devolver null
, y desde null
no es una instancia de Mage_Catalog_Model_Product
Entras en el primero if
declaración y se bloquea en esta línea: if ($this->getData('product')->getProductId()) {
Porque no puedes llamar null->getProductId()
.
Cualquier instancia de Mage_Catalog_Block_Product
Tiene sentido si le adjunta un producto. Teniendo en cuenta su archivo de diseño, puedo concluir que está tratando de usar su bloque sin ningún producto.
Así es como tu Mca_IndexController::indexAction()
Debería mirar:
$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();