Question

J'ai créé module personnalisé, dans ce que je viens de passer outre la classe Mage_Catalog_Block_Product pour obtenir le getPrice(). Mais il est de retour d'un appel d'erreur à une fonction membre getProductId () sur un non-objet?

mon code php est:

// contrôleur

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

// fichier bloc

<?php    

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

// web.phtml fichier

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

// layout.xml fichier

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

Quelqu'un peut-il me dire où je suis allé mal?

Merci à l'avance.

Était-ce utile?

La solution

jeter un oeil à la méthode getPrice originale.
Il ressemble à ceci:

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

Creuser plus profond que vous finissent dans Mage_Catalog_Block_Product::getProduct() qui ressemble à ceci:

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

Dans votre cas $this->getData('product') retour null, et depuis null n'est pas une instance de Mage_Catalog_Model_Product vous entrez dans la première déclaration de if et il se bloque sur cette ligne: if ($this->getData('product')->getProductId()) { parce que vous ne pouvez pas appeler null->getProductId().

Toute instance de Mage_Catalog_Block_Product est logique si vous attachez un produit à elle. Compte tenu de votre fichier de mise en page, je peux conclure que vous essayez d'utiliser votre bloc sans produit.

Voici comment votre Mca_IndexController::indexAction() devrait ressembler à:

$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();
Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top