Вопрос

Я создал пользовательский модуль, в котором я только что переопределяю Mage_Catalog_Block_Product класс, чтобы получить getPrice(). Анкет Но он возвращает вызов ошибки в функцию участника getProductId () на необъектив?

Мой PHP -код:

// контроллер

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

// файл блока

<?php    

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

//web.phtml файл

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

//layout.xml файл

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

Кто -нибудь может сказать мне, где я ошибся?

Заранее спасибо.

Это было полезно?

Решение

Взгляните на оригинал getPrice метод
Похоже:

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

Копая глубже, вы окажетесь в Mage_Catalog_Block_Product::getProduct() это выглядит так:

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

В твоем случае $this->getData('product') возвращаться null, и с тех пор null это не экземпляр Mage_Catalog_Model_Product Вы входите в первый if Заявление, и оно вылетает на этой линии: if ($this->getData('product')->getProductId()) { Потому что вы не можете позвонить null->getProductId().

Любой экземпляр Mage_Catalog_Block_Product имеет смысл, если вы прикрепите к нему продукт. Учитывая ваш файл макета, я могу сделать вывод, что вы пытаетесь использовать свой блок без какого -либо продукта.

Вот как ваш Mca_IndexController::indexAction() должен посмотреть:

$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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top