Domanda

modulo personalizzato

ho creato, in questo che ho appena sostituire la classe Mage_Catalog_Block_Product per ottenere il getPrice(). Ma è restituendo un errore di chiamata a una funzione membro getProductId () su un non-oggetto?

il mio codice php è:

// controllo

<?php
class Course_Mca_IndexController extends Mage_Core_Controller_Front_Action
{
    public function indexAction()
    {
        $this->loadLayout();
        $this->renderLayout();
    }
}

file di blocco //

<?php    

class Course_Mca_Block_Products extends Mage_Catalog_Block_Product
{
    public function getPrice()
    {
          return parent::getPrice();
    }
}

// web.phtml file

<?php echo $this->getPrice() ?>

// layout.xml file

<?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>

qualcuno può dirmi dove ho sbagliato?

Grazie in anticipo.

È stato utile?

Soluzione

dare un'occhiata al metodo getPrice originale.
Ecco come si presenta:

public function getPrice()
{
    return $this->getProduct()->getPrice();
}

Scavando più a fondo si finisce in Mage_Catalog_Block_Product::getProduct() che assomiglia a questo:

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');
}

Nel tuo caso $this->getData('product') ritorno null, e dal momento che null non è un'istanza di Mage_Catalog_Model_Product si entra nella prima dichiarazione if e si blocca su questa linea: if ($this->getData('product')->getProductId()) { perché non si può chiamare null->getProductId().

Qualsiasi istanza di Mage_Catalog_Block_Product ha un senso se si allega un prodotto ad esso. Considerando il tuo file di layout, posso concludere che si sta tentando di utilizzare il blocco senza alcun prodotto.

Ecco come il vostro Mca_IndexController::indexAction() dovrebbe essere:

$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();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top