Magento - вызов функции-члена createBlock () для необъекта - PullRequest
2 голосов
/ 20 марта 2012

Проще говоря, я получаю эту ошибку в Product Admin of Magento после добавления новой вкладки редактирования.

Fatal error: Call to a member function createBlock() on a non-object in
/var/www/app/code/local/RedoxStudios/ErpTab/Block/Adminhtml/Catalog/Product/Tab.php
on line 11

У меня есть это в моем коде:

<?php
class RedoxStudios_ErpTab_Block_Adminhtml_Catalog_Product_Tab
extends Mage_Adminhtml_Block_Template
implements Mage_Adminhtml_Block_Widget_Tab_Interface {

    /*
     * Set the template for the block
     */
    public function __construct() {
        parent::__construct();
        $this->getLayout()->createBlock('Purchase/Product_Widget_StockDetails_Summary');
        $this->setProduct($this->getProduct());
        $this->setTemplate('Purchase/Product/StockDetails/Summary.phtml');
    }

    /**
    * Return current product instance
    *
    * @return Mage_Catalog_Model_Product
    */

    public function getProduct()
    {
        return Mage::registry('product');
    }
}

Ранее я мог просто вызвать функцию createBlock.Я что-то упускаю из виду, что не могу вызвать эту функцию?


Summary.phtml:

<div class="stock-details-summary">

<table border="0">
    <tr>
        <td class="a-right"><?php echo $this->__('Waiting for delivery'); ?> : </td>
        <td class="a-right"><?php echo ($this->getWaitingForDeliveryQty() ? $this->getWaitingForDeliveryQty() : 0); ?></td>
    </tr>
    <tr>
        <td class="a-right">
            <?php echo $this->__('Manual supply need'); ?> : 
            <?php if ($this->getManualSupplyNeedQty() > 0): ?>
                <i><?php echo $this->getProduct()->getmanual_supply_need_comments(); ?></i>
            <?php endif; ?>
        </td>
        <td class="a-right">
            <?php echo $this->getManualSupplyNeedQty(); ?>
        </td>
    </tr>
    <tr>
        <td class="a-right"><?php echo $this->__('Min qty to purchase'); ?> : </td>
        <td class="a-right"><font color="red"><?php echo $this->getTotalNeededQtyForValidOrdersMinusWaitingForDelivery(); ?></font></td>
    </tr>
    <tr>
        <td class="a-right"><?php echo $this->__('Max qty to purchase'); ?> : </td>
        <td class="a-right" width="60"><font color="red"><?php echo $this->getTotalNeededQtyMinusWaitingForDelivery(); ?></font></td>
    </tr>
    <tr>
        <td class="a-right"><?php echo $this->__('Status'); ?> : </td>
        <td class="a-right"><?php echo $this->getGeneralStatus(); ?></td>
    </tr>
</table>

</div>

1 Ответ

10 голосов
/ 20 марта 2012

Вы неправильно получаете объект макета (Mage_Core_Model_Layout). В контроллерах и блоках действий это $this->getLayout()->createBlock(), везде - Mage::app()->getLayout()->createBlock()

EDIT : Сергей также указал, что объект макета не загружен, и это заставило меня понять, что вы используете php __construct(), а не типичный Magento _construct(). Для экземпляров блока не устанавливается объект макета до тех пор, пока они не будут созданы (и был вызван их конструктор) в Mage_Core_Model_Layout::createBlock() - обратите внимание, что в этом методе экземпляр блока получает макет, установленный на нем, с помощью его метода setLayout(). Это цель метода блока _prepareLayout() - это метод, похожий на конструктор, который запускается после создания экземпляра блока.

Исправления к вашему коду ниже:

<?php
class RedoxStudios_ErpTab_Block_Adminhtml_Catalog_Product_Tab
extends Mage_Adminhtml_Block_Template
implements Mage_Adminhtml_Block_Widget_Tab_Interface {

    /*
     * Set the template for the block
     */
    protected function _construct()
    {
        $this->setTemplate('Purchase/Product/StockDetails/Summary.phtml');
    }

    public function _prepareLayout()
    {
        $this->getLayout()->createBlock('Purchase/Product_Widget_StockDetails_Summary');
        $this->setProduct($this->getProduct());
    }

    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...