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.

War es hilfreich?

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();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top