如何使用Magento中的Observers从产品网格中删除MassAction

时间:2015-04-12 00:52:23

标签: php magento events magento-1.x

我想删除"删除"产品网格的批量操作。我试图从我的观察者那里做到这一点。这是我的观察员班级

class NameSpace_Module_Model_Observer {

public function isAddProductDeletePermitted($observer) {
    $block = $observer->getBlock();
    if( $block !== null ) {
        if( $block instanceof Mage_Adminhtml_Block_Cms_Block_Grid) {
            $block->getMassactionBlock()->removeItem('delete');
            // echo "DELETE";
        }
    }
    return $this;
}

这是我的config.xml

<?xml version="1.0"?>
<config>

    . . .

    <global>

        . . .

        <events>
            <adminhtml_block_html_before>
                <observers>
                    <is_add_product_form_permitted>
                        <class>Dotlocal_AdvProductGrid_Model_Observer</class>
                        <method>isAddProductDeletePermitted</method>
                    </is_add_product_form_permitted>
                </observers>
            </adminhtml_block_html_before>
        </events>
    </global>
</config>

我似乎无法让这个工作。我很确定这不起作用,因为我试图在添加它之前删除它。然后我应该观察什么事件?

3 个答案:

答案 0 :(得分:1)

正如我在评论中所说,你正在检查的类型是错误的。

两种可能的解决方案。

您获得了正确的网格,Mage_Adminhtml_Block_Catalog_Product_Grid并且您的代码变为

class Some_Module_Model_Observer
{
    public function isAddProductDeletePermitted ( $observer )
    {
        $block = $observer->getBlock ();
        if ( $block !== null ) {
            if ( $block instanceof Mage_Adminhtml_Block_Catalog_Product_Grid ) {
                $block->getMassactionBlock()->removeItem('delete');
                // echo "DELETE";
            }
        }
        return $this;
    }

}

或者您也可以在每个管理网格上使用通用块Mage_Adminhtml_Block_Widget_Grid),然后使用页面句柄验证您是否在产品列表页面上。

像这样:

class Some_Module_Model_Observer
{
    public function isAddProductDeletePermitted ( $observer )
    {
        $block = $observer->getBlock ();
        $layout_handle = Mage::app()->getLayout()->getUpdate()->getHandles();
        if ( $block !== null && $layout_handle[3] == 'adminhtml_catalog_product_index') {
            if ( $block instanceof Mage_Adminhtml_Block_Widget_Grid ) {
                $block->getMassactionBlock()->removeItem('delete');
                // echo "DELETE";
            }
        }
        return $this;
    }

}

答案 1 :(得分:0)

_prepareMassaction()方法调度事件adminhtml_catalog_product_grid_prepare_massaction以来,您应该可以

<events>
    <adminhtml_catalog_product_grid_prepare_massaction>
        <observers>
            <is_add_product_form_permitted>
                <class>Dotlocal_AdvProductGrid_Model_Observer</class>
                <method>isAddProductDeletePermitted</method>
            </is_add_product_form_permitted>
        </observers>
    </adminhtml_catalog_product_grid_prepare_massaction>
</events>

然后在你的观察者中

class Some_Module_Model_Observer
{
    public function isAddProductDeletePermitted ( $observer )
    {
        $block = $observer->getBlock ();

        if ($block) {
             $block->getMassactionBlock()->removeItem('delete');  
        }
        return $this;
    }

}

请参阅app / code / core / Mage / Adminhtml / Block / Catalog / Product / Grid.php

答案 2 :(得分:0)

class Adminhtml_Block_Sales_Order_Grid extends Mage_Adminhtml_Block_Sales_Order_Grid {

    /**
     * @return Mage_Adminhtml_Block_Sales_Order_Grid|Mage_Adminhtml_Block_Widget_Grid|void
     */
    public function _prepareMassaction()
    {
        parent::_prepareMassaction();

        $this->getMassactionBlock()->removeItem('cancel_order');
    }
}