ノンオブジェクトでメンバー関数getProductid()を呼び出しますか?

magento.stackexchange https://magento.stackexchange.com/questions/9915

  •  16-10-2019
  •  | 
  •  

質問

カスタムモジュールを作成しました。 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