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.

¿Fue útil?

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();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top