如何使用 Magento 中的观察者从产品网格中删除 MassAction?
How do I remove a MassAction from the Product Grid using Observers in Magento?
我想从产品网格中删除 "Delete" 批量操作。我正试图从我的观察者那里做到这一点。这是我的观察员class
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>
我似乎无法让它工作。我很确定这不起作用,因为我试图在添加之前将其删除。那我应该观察什么事件呢?
如我评论所述,您检查的类型有误。
两种可能的解决方案。
您获得了正确的网格,即 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;
}
}
因为 _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
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');
}
}
我想从产品网格中删除 "Delete" 批量操作。我正试图从我的观察者那里做到这一点。这是我的观察员class
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>
我似乎无法让它工作。我很确定这不起作用,因为我试图在添加之前将其删除。那我应该观察什么事件呢?
如我评论所述,您检查的类型有误。
两种可能的解决方案。
您获得了正确的网格,即 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;
}
}
因为 _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
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');
}
}