-
16-10-2019 - |
题
不久前,我在Stackoverflow上发现了一个问题,内容涉及通过小部件允许多个产品。我以为自己,这将是一个不错的选择,而且肯定不会那么困难。可悲的是,我错了:(我设法将大规模动作复选框和按钮显示在小部件上,但随之而来的JavaScript不包括或不工作。
显示网格包括包括质量操作选项,但是当我尝试使用这些项目时,我会收到以下JavaScript错误。
未定义的参考文献:options_fieldset1adc562cf047406a6a634a7c10ae4f7db2_product_idsa765921c1aaf6166666666c2e834683468e0bf_massactionjsobject
所以这是我到目前为止所做的。
创建一个app etc 模块 manners_widgets.xml
<?xml version="1.0"?>
<config>
<modules>
<Manners_Widgets>
<active>true</active>
<codePool>community</codePool>
<depends>
<Mage_Adminhtml />
<Mage_Widget />
</depends>
</Manners_Widgets>
</modules>
</config>
创建一个app code community manners widgets etc config.xml
<?xml version="1.0"?>
<config>
<modules>
<Manners_Widgets>
<version>1.0.0</version>
</Manners_Widgets>
</modules>
<global>
<blocks>
<manners_widgets>
<class>Manners_Widgets_Block</class>
</manners_widgets>
<adminhtml>
<rewrite>
<catalog_product_widget_chooser>Manners_Widgets_Block_Catalog_Product_Widget_Chooser</catalog_product_widget_chooser>
</rewrite>
</adminhtml>
</blocks>
<helpers>
<manners_widgets>
<class>Manners_Widgets_Helper</class>
</manners_widgets>
</helpers>
</global>
</config>
创建一个app code community manners widgets etc widget.xml
<?xml version="1.0"?>
<widgets>
<manners_widgets_products type="manners_widgets/products" translate="name description" module="manners_widgets">
<name>Multiple Products Widget</name>
<description>Widget to display multiple products on one page</description>
<parameters>
<product_ids translate="label">
<visible>1</visible>
<required>1</required>
<label>Product</label>
<type>label</type>
<helper_block>
<type>manners_widgets/catalog_product_widget_chooser</type>
<data>
<button translate="open remove">
<open>Select Products...</open>
</button>
</data>
</helper_block>
</product_ids>
</parameters>
</manners_widgets_products>
</widgets>
最后,我创建了我的块manners_widgets_block_catalog_product_widget_chooser
<?php
class Manners_Widgets_Block_Catalog_Product_Widget_Chooser extends Mage_Adminhtml_Block_Catalog_Product_Widget_Chooser {
/**
*
* @return Mage_Adminhtml_Block_Widget_Grid|void
*/
protected function _prepareColumns() {
$this->addColumn('entity_id', array(
'header' => Mage::helper('catalog')->__('ID'),
'sortable' => true,
'width' => '60px',
'index' => 'entity_id'
));
$this->addColumn('chooser_sku', array(
'header' => Mage::helper('catalog')->__('SKU'),
'name' => 'chooser_sku',
'width' => '80px',
'index' => 'sku'
));
$this->addColumn('chooser_name', array(
'header' => Mage::helper('catalog')->__('Product Name'),
'name' => 'chooser_name',
'index' => 'name'
));
}
/**
* Prepare the massaction
* - Block,
* - Item
*
* @return $this|Mage_Adminhtml_Block_Widget_Grid
*/
protected function _prepareMassaction() {
$this->setMassactionIdField('entity_id');
$this->setMassactionIdFilter('entity_id');
$this->getMassactionBlock()->setFormFieldName('product');
$this->getMassactionBlock()->addItem('delete', array(
'label'=> Mage::helper('catalog')->__('Add Products'),
'url' => $this->getUrl('*/*/addProducts')
));
Mage::dispatchEvent('manners_widgets_catalog_product_grid_prepare_massaction', array('block' => $this));
return $this;
}
/**
* Checkbox Check JS Callback
*
* @return string
*/
public function getCheckboxCheckCallback()
{
return "function (grid, element) {
$(grid.containerId).fire('product:changed', {element: element});
}";
}
/**
* Grid Row JS Callback
*
* @return string
*/
public function getRowClickCallback()
{
$chooserJsObject = $this->getId();
return '
function (grid, event) {
var trElement = Event.findElement(event, "tr");
var productId = trElement.down("td").innerHTML;
var productName = trElement.down("td").next().next().innerHTML;
var optionLabel = productName;
var optionValue = "product/" + productId.replace(/^\s+|\s+$/g,"");
if (grid.categoryId) {
optionValue += "/" + grid.categoryId;
}
if (grid.categoryName) {
optionLabel = grid.categoryName + " / " + optionLabel;
}
'.$chooserJsObject.'.setElementValue(optionValue);
'.$chooserJsObject.'.setElementLabel(optionLabel);
'.$chooserJsObject.'.close();
}
';
}
}
原始Stackoverflow问题
Github仓库
解决方案
首先,这就是为什么您会遇到该错误的原因。
质量动作块按钮具有此单击事件。
$this->getJsObjectName() . ".apply()"
在方法中更深入地挖掘上述代码转化为
{parent_block_id}_massactionJsObject.apply();
(对于小部件选择器,父块ID是一些随机哈希,但这并不重要)。这个想法是上面的对象不存在。
现在是(可能的)解决方案。仅针对小部件选择器更改质量动作块。为此创建一个新类:
<?php
class Manners_Widgets_Block_Catalog_Product_Massaction extends Mage_Adminhtml_Block_Widget_Grid_Massaction{
public function getApplyButtonHtml()
{
return $this->getButtonHtml($this->__('Submit'), "alert('Doh!')");//add this your js function that should do the magic.
}
}
现在,告诉您的电网使用这个新的质量动作块。为此添加int类 Manners_Widgets_Block_Catalog_Product_Widget_Chooser
此方法:
protected function _construct(){
parent::_construct();
$this->setMassactionBlockName('manners_widgets/catalog_product_massaction');
}
现在,当您单击“提交”按钮时,您将获得警报,没有错误。
通过您的操作更改上面代码中的警报。
其他提示
这是一个范围问题。 mage_adminhtml_block_widget_grid_massaction_abstract在mage_adminhtml_block_widget_bstract中使用“ var”声明assactionjsobject
public function getJavaScript()
{
return " var {$this->getJsObjectName()} = new varienGridMassaction('{$this->getHtmlId()}', "
. "{$this->getGridJsObjectName()}, '{$this->getSelectedJson()}'"
. ", '{$this->getFormFieldNameInternal()}', '{$this->getFormFieldName()}');"
. "{$this->getJsObjectName()}.setItems({$this->getItemsJson()}); "
. "{$this->getJsObjectName()}.setGridIds('{$this->getGridIdsJson()}');"
. ($this->getUseAjax() ? "{$this->getJsObjectName()}.setUseAjax(true);" : '')
. ($this->getUseSelectAll() ? "{$this->getJsObjectName()}.setUseSelectAll(true);" : '')
. "{$this->getJsObjectName()}.errorText = '{$this->getErrorText()}';";
}
如果您覆盖此方法并从声明中删除“ var”关键字,则范围将是全局,并且可以从窗口小部件弹出窗口访问的对象。
因此,基本上:
- Override mage_adminhtml_block_widget_grid_massaction with your block
- 覆盖方法getJavaScript删除“ var”
在您的widget_product_chooser块中,将受保护的$ _massactionBlockname与您的按摩块设置
$ _massactionBlockName ='myModule/widget_product_massaction';
我为此挣扎了2天:/希望这会有所帮助
Magento 1.4.1中的新功能。是否在销售>订单页面上进行的任何过滤都可以在击中提交时通过AJAX调用更新。不幸的是,这具有未注明的副作用:在任何AJAX更新大众演员之后(取消,保留,打印发票,打印packingslips等)将无效。取而代之的是,您将被扔回仪表板(或者在管理区域中您当前用户的开始页面)。
Ajax更新后,Magento不会加载页面的完整布局。但是,在布局中,它保留了一个表单密钥来验证请求的提交。由于现在缺少这一点,它将“拒绝”质量表演的请求,然后将您扔回仪表板。
要解决此问题,您可以编辑 app/design/adminhtml/default/default/template/widget/grid/massactions.phtml
并改变
<?php echo $this->getBlockHtml('formkey')?>
至
<div><input name="form_key" type="hidden" value="<?php echo Mage::getSingleton('core/session')->getFormKey() ?>" /></div>
在旁注上:被扔回到仪表板并第二次订购后,它将记住您以前的选择。而且,由于现在已经完成了整页加载,因此质量成分将成功。